Uploaded image for project: 'Qt for MCUs'
  1. Qt for MCUs
  2. QTMCU-257

MCU enters infinite loop with RGL

    XMLWordPrintable

Details

    Description

      Tested on RH850. 
      See Reproduction for a snippet that can can reproduce the freeze every time.

      The summary is that when you make an "invisible" object by reducing height or width to 0, the object still grabs a DrawBuffer, but never sets gpuActive, so the program gets stuck in a loop. Note, this requires that only the invisible object gets updated--some other object being drawn at the same time may cause a proper draw.

      Details

      platform_rh850.cpp

       unsigned char *getNextDrawBuffer() const
          {
              unsigned char *bits = NULL;
              do {
      //Infinite loop
               bits = (unsigned char *) R_WM_WindowNewDrawBufGet(WM_UNIT, &wmWindow);
              } while (!bits);
              return bits;
          }
      

      platform_rh850.cpp

          void blendRect(DrawingDevice *drawingDevice, const Rect &rect, Rgba32 color, BlendMode blendMode)
          {
      // gpu not active, but zero pixels. We enter the fallback engine (32bpp in our case), which does NOT set gpuactive.
              if (!gpuActive && rect.width() * rect.height() < GPU_PIXEL_THRESHOLD) {
                  drawingDevice->fallbackDrawingEngine()->blendRect(drawingDevice, rect, color, blendMode);
                  return;
              }
      
              const r_drw2d_BlendMode_t drw2dBlendMode = blendMode == DrawingEngine::BlendMode_Source || color.alpha() == 255
                                                             ? R_DRW2D_BLENDMODE_SRC
                                                             : R_DRW2D_BLENDMODE_SRC_OVER;
      
              rh850_blendRect_impl(drawingDevice, rect, color, drw2dBlendMode);
          }
      

       

      Reproduction

      Summary: Drop the width of a rect to zero, move it along the Y axis, then restore the width (with pauses in between).

       SequentialAnimation {
            loops: 1
            running: true
            PauseAnimation {duration: 10000}
            ScriptAction {script: ani.running = true}
          }
      
          property real controlVal: 100
      
          SequentialAnimation {
              id: ani
              loops: -1
              running: false
       
              ScriptAction {
                script: root.controlVal= 0
              }
              PauseAnimation { duration: 100 }
       
              PropertyAnimation {
                target: vis
                property: "y"
                from: root.height / 2
                to: root.height / 2 + 40
                duration: 200
       
              }
              PropertyAnimation {
                target: vis
                property: "y"
                to: root.height / 2
                duration: 200
       
              }
              PauseAnimation { duration: 1 }
              ScriptAction {
                script: root.controlVal= 100
              }
              PauseAnimation { duration: 300 }
       
          }
          Rectangle {
              id: vis
              height: 50
              width: controlVal
              color: "red"
              x: parent.width/2 - width
              y: parent.height / 2
          }
      

      Fixes

      (Rewritten from memory, please double check)

          unsigned char *getNextDrawBuffer() const
          {
              unsigned char *bits = NULL;
              do {
                  bits = (unsigned char *) R_WM_WindowNewDrawBufGet(WM_UNIT, &wmWindow);
                  if (!bits){
                    R_WM_FrameWait(WM_UNIT, 0);
                  }
              } while (!bits);
              return bits;
          } 

      Not Fixes

      //This doesn't work:
      QML:
      visible: width > 0 //Width gets turned into an int CPP side, so the object will still be "visible" at width=0.99 but width is zero. A problem for animations

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            srodal Samuel Rødal
            mairtin.s Mairtin Steinkamp
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes