Mesa (master): radeon: Minimize dri2GetBuffers calls.

Michel Dänzer daenzer at kemper.freedesktop.org
Sun Aug 30 10:54:30 UTC 2009


Module: Mesa
Branch: master
Commit: eb9b40caca7ea534849d2321d6689e7b56e811fa
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=eb9b40caca7ea534849d2321d6689e7b56e811fa

Author: Michel Dänzer <daenzer at vmware.com>
Date:   Sun Aug 30 12:37:10 2009 +0200

radeon: Minimize dri2GetBuffers calls.

---

 src/mesa/drivers/dri/r300/r300_draw.c              |    6 +++
 src/mesa/drivers/dri/r300/r300_ioctl.c             |    8 ++++-
 src/mesa/drivers/dri/radeon/radeon_common.c        |   33 ++++++++++++++++---
 src/mesa/drivers/dri/radeon/radeon_common.h        |    1 +
 .../drivers/dri/radeon/radeon_common_context.c     |   19 +++++++----
 .../drivers/dri/radeon/radeon_common_context.h     |    1 +
 src/mesa/drivers/dri/radeon/radeon_fbo.c           |    6 +--
 7 files changed, 56 insertions(+), 18 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/r300_draw.c b/src/mesa/drivers/dri/r300/r300_draw.c
index 2e475b1..9c791c7 100644
--- a/src/mesa/drivers/dri/r300/r300_draw.c
+++ b/src/mesa/drivers/dri/r300/r300_draw.c
@@ -688,6 +688,12 @@ static void r300DrawPrims(GLcontext *ctx,
 		return;
 	}
 
+	if (!ctx->DrawBuffer->Name) {
+		struct radeon_framebuffer *radeon_fb = (struct radeon_framebuffer*)ctx->DrawBuffer;
+
+		radeon_fb->keep_buffers = GL_TRUE;
+	}
+
 	/* Make an attempt at drawing */
 	retval = r300TryDrawPrims(ctx, arrays, prim, nr_prims, ib, min_index, max_index);
 
diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c
index 3303078..a7a363b 100644
--- a/src/mesa/drivers/dri/r300/r300_ioctl.c
+++ b/src/mesa/drivers/dri/r300/r300_ioctl.c
@@ -715,6 +715,12 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
 			return;
 	}
 
+	if (!fb->Name) {
+		struct radeon_framebuffer *radeon_fb = (struct radeon_framebuffer*)fb;
+
+		radeon_fb->keep_buffers = GL_TRUE;
+	}
+
 	/* Flush swtcl vertices if necessary, because we will change hardware
 	 * state during clear. See also the state-related comment in
 	 * r300EmitClearState.
@@ -778,5 +784,5 @@ void r300InitIoctlFuncs(struct dd_function_table *functions)
 {
 	functions->Clear = r300Clear;
 	functions->Finish = radeonFinish;
-	functions->Flush = radeonFlush;
+	functions->Flush = radeonGlFlush;
 }
diff --git a/src/mesa/drivers/dri/radeon/radeon_common.c b/src/mesa/drivers/dri/radeon/radeon_common.c
index ee0cbf6..042871c 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common.c
+++ b/src/mesa/drivers/dri/radeon/radeon_common.c
@@ -273,6 +273,10 @@ void radeonUpdateScissor( GLcontext *ctx )
 	rmesa->state.scissor.rect.x2 = CLAMP(x2,  min_x, max_x);
 	rmesa->state.scissor.rect.y2 = CLAMP(y2,  min_y, max_y);
 
+if (rmesa->state.scissor.rect.y1 > rmesa->state.scissor.rect.y2)
+fprintf(stderr, "%s: (%d, %d) - (%d, %d)\n", __func__, rmesa->state.scissor.rect.x1,
+        rmesa->state.scissor.rect.y1, rmesa->state.scissor.rect.x2,
+        rmesa->state.scissor.rect.y2);
 	radeonRecalcScissorRects( rmesa );
 }
 
@@ -570,6 +574,8 @@ void radeonCopyBuffer( __DRIdrawablePrivate *dPriv,
 	}
 
 	UNLOCK_HARDWARE( rmesa );
+
+        rfb->keep_buffers = GL_FALSE;
 }
 
 static int radeonScheduleSwap(__DRIdrawablePrivate *dPriv, GLboolean *missed_target)
@@ -957,13 +963,18 @@ void radeon_viewport(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei he
 	if (!driContext->driScreenPriv->dri2.enabled)
 		return;
 
-	if (!radeon->meta.internal_viewport_call && ctx->DrawBuffer->Name == 0) {
+	if (ctx->DrawBuffer->Name == 0) {
+		struct radeon_framebuffer *radeon_fb = (struct radeon_framebuffer*)ctx->DrawBuffer;
+
 		if (radeon->is_front_buffer_rendering) {
 			ctx->Driver.Flush(ctx);
 		}
-		radeon_update_renderbuffers(driContext, driContext->driDrawablePriv);
-		if (driContext->driDrawablePriv != driContext->driReadablePriv)
-			radeon_update_renderbuffers(driContext, driContext->driReadablePriv);
+
+		if (!radeon->meta.internal_viewport_call && !radeon_fb->keep_buffers) {
+			radeon_update_renderbuffers(driContext, driContext->driDrawablePriv);
+			if (driContext->driDrawablePriv != driContext->driReadablePriv)
+				radeon_update_renderbuffers(driContext, driContext->driReadablePriv);
+		}
 	}
 
 	old_viewport = ctx->Driver.Viewport;
@@ -1209,6 +1220,17 @@ void radeonFlush(GLcontext *ctx)
 
 }
 
+void radeonGlFlush(GLcontext *ctx)
+{
+	struct radeon_framebuffer *radeon_fb = (struct radeon_framebuffer*)ctx->DrawBuffer;
+
+	radeonFlush(ctx);
+
+	if (radeon_fb->base.Name == 0) {
+		radeon_fb->keep_buffers = GL_FALSE;
+	}
+}
+
 /* Make sure all commands have been sent to the hardware and have
  * completed processing.
  */
@@ -1218,8 +1240,7 @@ void radeonFinish(GLcontext * ctx)
 	struct gl_framebuffer *fb = ctx->DrawBuffer;
 	int i;
 
-	if (ctx->Driver.Flush)
-		ctx->Driver.Flush(ctx); /* +r6/r7 */
+	ctx->Driver.Flush(ctx);
 
 	if (radeon->radeonScreen->kernel_mm) {
 		for (i = 0; i < fb->_NumColorDrawBuffers; i++) {
diff --git a/src/mesa/drivers/dri/radeon/radeon_common.h b/src/mesa/drivers/dri/radeon/radeon_common.h
index ba983e5..ae2c0c3 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common.h
+++ b/src/mesa/drivers/dri/radeon/radeon_common.h
@@ -24,6 +24,7 @@ void radeonCopySubBuffer(__DRIdrawablePrivate * dPriv,
 void radeonUpdatePageFlipping(radeonContextPtr rmesa);
 
 void radeonFlush(GLcontext *ctx);
+void radeonGlFlush(GLcontext *ctx);
 void radeonFinish(GLcontext * ctx);
 void radeonEmitState(radeonContextPtr radeon);
 GLuint radeonCountStateEmitSize(radeonContextPtr radeon);
diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c
index b76efa8..10bde8c 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common_context.c
+++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c
@@ -726,6 +726,8 @@ radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
 	}
 
 	driUpdateFramebufferSize(radeon->glCtx, drawable);
+
+	draw->keep_buffers = GL_TRUE;
 }
 
 /* Force the context `c' to be the current context and associate with it
@@ -751,24 +753,27 @@ GLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv,
 	readfb = driReadPriv->driverPrivate;
 
 	if (driContextPriv->driScreenPriv->dri2.enabled) {
-		radeon_update_renderbuffers(driContextPriv, driDrawPriv);
-		if (driDrawPriv != driReadPriv)
-			radeon_update_renderbuffers(driContextPriv, driReadPriv);
+		if (0 || !drfb->keep_buffers) {
+			radeon_update_renderbuffers(driContextPriv, driDrawPriv);
+			if (driDrawPriv != driReadPriv)
+				radeon_update_renderbuffers(driContextPriv, driReadPriv);
+                }
+
 		_mesa_reference_renderbuffer(&radeon->state.color.rb,
 			&(radeon_get_renderbuffer(&drfb->base, BUFFER_BACK_LEFT)->base));
 		_mesa_reference_renderbuffer(&radeon->state.depth.rb,
 			&(radeon_get_renderbuffer(&drfb->base, BUFFER_DEPTH)->base));
 	} else {
 		radeon_make_renderbuffer_current(radeon, drfb);
+
+		driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
+		if (driReadPriv != driDrawPriv)
+			driUpdateFramebufferSize(radeon->glCtx, driReadPriv);
 	}
 
 	if (RADEON_DEBUG & DEBUG_DRI)
 	     fprintf(stderr, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__, radeon->glCtx, drfb, readfb);
 
-	driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
-	if (driReadPriv != driDrawPriv)
-		driUpdateFramebufferSize(radeon->glCtx, driReadPriv);
-
 	_mesa_make_current(radeon->glCtx, &drfb->base, readfb);
 
 	_mesa_update_state(radeon->glCtx);
diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.h b/src/mesa/drivers/dri/radeon/radeon_common_context.h
index 09430cf..3821952 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common_context.h
+++ b/src/mesa/drivers/dri/radeon/radeon_common_context.h
@@ -131,6 +131,7 @@ struct radeon_framebuffer
 	GLint pf_current_page;
 	GLint pf_num_pages;
 
+	GLboolean keep_buffers;
 };
 
 
diff --git a/src/mesa/drivers/dri/radeon/radeon_fbo.c b/src/mesa/drivers/dri/radeon/radeon_fbo.c
index 79171bc..be4bc54 100644
--- a/src/mesa/drivers/dri/radeon/radeon_fbo.c
+++ b/src/mesa/drivers/dri/radeon/radeon_fbo.c
@@ -169,8 +169,7 @@ radeon_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
       return GL_FALSE;
    }
 
-  if (ctx->Driver.Flush)
-	  ctx->Driver.Flush(ctx); /* +r6/r7 */
+   ctx->Driver.Flush(ctx);
 
   if (rrb->bo)
     radeon_bo_unref(rrb->bo);
@@ -380,8 +379,7 @@ radeon_framebuffer_renderbuffer(GLcontext * ctx,
                                GLenum attachment, struct gl_renderbuffer *rb)
 {
 
-	if (ctx->Driver.Flush)
-		ctx->Driver.Flush(ctx); /* +r6/r7 */
+   radeonFlush(ctx); /* +r6/r7! */
 
    _mesa_framebuffer_renderbuffer(ctx, fb, attachment, rb);
    radeon_draw_buffer(ctx, fb);




More information about the mesa-commit mailing list