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

Reply via email to