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