Module: Mesa Branch: master Commit: eb9b40caca7ea534849d2321d6689e7b56e811fa URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=eb9b40caca7ea534849d2321d6689e7b56e811fa
Author: Michel Dänzer <daen...@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); _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit