On Tuesday 17 May 2005 15:47, Brian Paul wrote: > > Note that it can be easy to be miss this problem. One way that should > > trigger the issue in all drivers is: > > 1. Make sure that you hit software rasterization fallbacks (e.g. > > no_rast=true). > > 2. Run any GL application in a window and resize the window. If you make the > > window larger than its initial size, the framebuffer will be clipped > > incorrectly. > > > > I've fixed this by calling _mesa_resize_framebuffer in the same place where > > clip rectangles are recalculated after the DRI lock has been regained. > > However, I'd like to know if this is the correct/canonical/preferred way of > > doing it. > > That actually sounds like the right thing. > > The idea is that when the driver learns that the window has been > resized we need to call _mesa_resize_framebuffer() on the framebuffer > that corresponds to the window. Wherever we recompute the cliprects > in response to a window size change, is also the right place to resize > the Mesa framebuffer. > > This should be addressed in all the DRI drivers. > > If you can provide the details of how/where you're doing this in the > r300 driver, we can look at doing the same in the other drivers.
In the r300 driver, the function radeonGetLock() is the function that
handles all the non-fast cases of LOCK_HARDWARE. In this function, we call
r300RegainedLock() after validating the drawable information.
I have changed r300RegainedLock() to look like this:
static void r300RegainedLock(radeonContextPtr radeon)
{
__DRIdrawablePrivate *dPriv = radeon->dri.drawable;
if (radeon->lastStamp != dPriv->lastStamp) {
/* --- Here is the interesting part --- */
_mesa_resize_framebuffer(radeon->glCtx,
(GLframebuffer*)dPriv->driverPrivate,
dPriv->w, dPriv->h);
... recalculate cliprects and scissor stuff here ...
}
}
Inserting this call to _mesa_resize_framebuffer was the only relevant
change.
cu,
Nicolai
pgpntrjtOrF66.pgp
Description: PGP signature
