Well I think I have the correct patch for this. We should call 
radeonSetCliprects inside radeonMakeCurrent to update to
the new pClipRects whenever lastStamps change.

Probably this should also be applied to r200. Haven't seen for other drivers.

Comments?

P.S.
Should I try to get an account? 

On Friday 02 February 2007 19:36, Panagiotis Papadakos wrote:
> Well this patch is not correct since it leads to memory leaks, probably due
> to succeeding calls to dri_interface->getDrawableInfo. So I created the
> attached patch, but again valgrind warns for invalid reads.
>
> Anyone understands why?
>
> Thanks
>
> P.S. Sorry but I am new to the code!
>
> On Thursday 01 February 2007 19:19, Panagiotis Papadakos wrote:
> > Checking with valgrind I got some invalid reads. The message was like the
> > following:
> >
> > ==6988== Invalid read of size 4
> > ==6988==    at 0x4B3C7FD: intersect_rect (radeon_state.c:61)
> > ==6988==    by 0x4B3C9DA: radeonRecalcScissorRects (radeon_state.c:108)
> > ==6988==    by 0x4B3CAEC: radeonUpdateScissor (radeon_state.c:131)
> > ==6988==    by 0x4B3CD04: radeonEnable (radeon_state.c:205)
> > ==6988==    by 0x4B4B1C1: r300Enable (r300_state.c:542)
> > ==6988==    by 0x4D13827: _mesa_set_enable (enable.c:956)
> > ==6988==    by 0x4D138A6: _mesa_Enable (enable.c:971)
> > ==6988==    by 0x4769879: glEnable (glapitemp.h:1160)
> > ==6988==    by 0x4613A5F:
> > osgUtil::RenderStage::drawImplementation(osg::RenderInfo&,
> > osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so) ==6988==    by
> > 0x4607658: osgUtil::RenderBin::draw(osg::RenderInfo&,
> > osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so) ==6988==    by
> > 0x46133BC: osgUtil::RenderStage::drawInner(osg::RenderInfo&,
> > osgUtil::RenderLeaf*&, bool&) (in /usr/lib/libosgUtil.so) ==6988==    by
> > 0x4612E6C: osgUtil::RenderStage::draw(osg::RenderInfo&,
> > osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so) ==6988==  Address
> > 0x4AF585C is 4 bytes inside a block of size 8 free'd ==6988==    at
> > 0x402303F: free (vg_replace_malloc.c:233)
> > ==6988==    by 0x4BAF503: _mesa_free (imports.c:93)
> > ==6988==    by 0x4B2FF84: __driUtilUpdateDrawableInfo (dri_util.c:430)
> > ==6988==    by 0x4B2FD46: DoBindContext (dri_util.c:339)
> > ==6988==    by 0x4B2FF00: driBindContext (dri_util.c:383)
> > ==6988==    by 0x4735921: BindContextWrapper (glxext.c:1620)
> > ==6988==    by 0x4735A53: MakeContextCurrent (glxext.c:1674)
> > ==6988==    by 0x4735D7C: glXMakeCurrent (glxext.c:1796)
> > ==6988==    by 0x47D8BB3: Producer::RenderSurface::makeCurrent(bool) (in
> > /usr/lib/libProducer.so) ==6988==    by 0x47DEEC6:
> > Producer::Camera::_frame(bool) (in /usr/lib/libProducer.so) ==6988==   
> > by 0x47DF75F: Producer::Camera::frame(bool) (in /usr/lib/libProducer.so)
> > ==6988==    by 0x47E2589: Producer::CameraGroup::_singleThreadedFrame()
> > (in /usr/lib/libProducer.so)
> >
> > So I searched a bit, and I created the following patch, which touches
> > src/mesa/drivers/dri/common/dri_util.c, and more specifically
> > __driUtilUpdateDrawableInfo, calling _mesa_free for pdp->pClipRects and
> > pdp->pBackClipRects only inside if.
> >
> > Does this look sane?
> >
> > Valgrind does not warn anymore.

-- 
Papadakos Panagiotis
diff --git a/src/mesa/drivers/dri/r300/radeon_context.c b/src/mesa/drivers/dri/r300/radeon_context.c
index 3a6bde8..10a8d35 100644
--- a/src/mesa/drivers/dri/r300/radeon_context.c
+++ b/src/mesa/drivers/dri/r300/radeon_context.c
@@ -52,6 +52,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE
 #include "radeon_reg.h"
 
 #include "r300_state.h"
+#include "radeon_state.h"
 
 #include "utils.h"
 #include "vblank.h"
@@ -272,13 +273,15 @@ GLboolean radeonMakeCurrent(__DRIcontext
 					      &radeon->vbl_seq);
 		}
 
-		if (radeon->dri.drawable != driDrawPriv ||
-		    radeon->dri.readable != driReadPriv) {
+		if(radeon->lastStamp != driDrawPriv->lastStamp ||
+		   radeon->lastStamp != driReadPriv->lastStamp) {
 			radeon->dri.drawable = driDrawPriv;
 			radeon->dri.readable = driReadPriv;
 
-			r300UpdateWindow(radeon->glCtx);
-			r300UpdateViewportOffset(radeon->glCtx);
+			radeonSetCliprects(radeon);
+			radeon->lastStamp = driDrawPriv->lastStamp;
+			r300UpdateWindow( radeon->glCtx );
+			r300UpdateViewportOffset( radeon->glCtx );
 		}
 
 		_mesa_make_current(radeon->glCtx,
diff --git a/src/mesa/drivers/dri/r300/radeon_lock.c b/src/mesa/drivers/dri/r300/radeon_lock.c
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to