Roland Scheidegger wrote:
> On 21.08.2009 11:45, Tom Cooksey wrote:
>> Hello,
>>
>> I'm a Qt developer.
>>
>> We want all Qt rendering to be done using OpenGL 2. We have this working 
>> pretty well (a few artifacts still here and there). However, we've found 
>> some 
>> fundamental problems using GL for regular widget rendering. Normally I 
>> wouldn't bother this list, but I've recently seen that someone's writing a 
>> new 
>> GL back end to Cairo, so I guess those guys are going to hit the exact same 
>> issues.
>>
>> The problem is partial updates. From what we've seen it's typical for 
>> applications to only update a small region of their top-level-widget at a 
>> time 
>> (E.g. a flashing cursor in a text edit). As Qt only creates a single X 
>> window 
>> per top-level widget, this means a sub-region of a single X window.
>>
>> When using glX, we have no guarantee over what state the back buffer will be 
>> in 
>> after swap buffers. So, whenever an application needs to update, it must re-
>> render the entire window. This makes things slow (we have to invoke every 
>> child widget's paint event). To overcome this, we try to use a 3rd buffer as 
>> a 
>> back buffer, usually a multi-sampled FBO or PBuffer. We direct rendering to 
>> the 
>> FBO/PBuffer, bind it as a texture (after blitting it to a non multi-sampled 
>> FBO 
>> if needed), draw the whole buffer to the window's back buffer then call swap 
>> buffers. Eughhh! But at least the PBuffer/FBO contents aren't destroyed. 
>> What 
>> would be really nice is to be able to have an EGL_SWAP_BEHAVIOR == 
>> EGL_BUFFER_PRESERVED equivalent on glX. I notice there's an EGL 
>> implementation 
>> being worked on in Mesa trunk so perhaps we should switch to EGL rather than 
>> glX?
>>
>> Anyway, lets assume that swap buffers keeps the contents of the back buffer. 
>> There's another issue, although not as detrimental as the first. When we 
>> issue 
>> swap buffers, glX/EGL has to assume the entire window's contents has 
>> changed. 
>> That has 2 effects: 1) XDamage regions are generated for the whole window: 
>> When 
>> a composition manager is running, this means it has to re-compose the entire 
>> window, even though only a few pixels may have changed (which it might have 
>> to 
>> do anyway, see above :-)). 2) I'm led to believe that DRI2 implements swap 
>> buffers as a blit and so must blit the entire back buffer to the front.
>>
>> I think I can work around this by making a glx context current on a 
>> GLXPixamp 
>> (from a XPixmap). Pixmaps are single buffered and so don't get destroyed on 
>> swap buffers (in fact I don't even call swap buffers). I can then post 
>> updates 
>> using XCopyArea which will also cause the Xserver to generate an appropriate 
>> XDamage region for the compositor. The only down side is that I have to 
>> glFinish before calling XCopyArea. While I have this working, it seems a 
>> little hacky and isn't widely supported (I have it working on 1 driver build 
>> for 1 bit of hardware).
>>
>> It seems like a glXSwapPartialBuffers which takes an array of dirty rects 
>> would 
>> be preferable. The implementation could ignore the rects completely if it so 
>> chooses or only use them to generate the damage region. Or, if it's on DRI2, 
>> it can choose to only copy the sub-region from the back to the front. 
>> Eventually it could also use the rects as a metric to figure out if it 
>> should 
>> flip or blit (flip if there's >30% region changed, blit otherwise).
>>
> 
> Would glx_mesa_copy_sub_buffer help? It only takes one rect though, not
> a list.

BTW, a region of the back buffer can be copied to the front buffer 
with glCopyPixels() or glBlitFramebuffer() too.

-Brian

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to