radeon,r200: fix buffer validation after CS flush
authorMarek Olšák <marek.olsak@amd.com>
Fri, 1 Aug 2014 17:36:37 +0000 (19:36 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Sat, 9 Aug 2014 21:41:15 +0000 (23:41 +0200)
This validates all bound buffers (CB, ZB, textures, DMA) at the beginning
of CS. This fixes "bo->space_accouned" assertion failures.

Tested by: Jochen Rollwagen <joro-2013@t-online.de>
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/r200/r200_state.c
src/mesa/drivers/dri/r200/r200_state.h
src/mesa/drivers/dri/radeon/radeon_common.c
src/mesa/drivers/dri/radeon/radeon_common_context.h
src/mesa/drivers/dri/radeon/radeon_context.c
src/mesa/drivers/dri/radeon/radeon_state.c
src/mesa/drivers/dri/radeon/radeon_state.h

index 71dfcf337f054839fdb4baa2c0343dfe6cb6ef5a..d5749f3e10d39541a0d7aa3065353ce270c5304b 100644 (file)
@@ -190,6 +190,7 @@ static void r200_init_vtbl(radeonContextPtr radeon)
    radeon->vtbl.check_blit = r200_check_blit;
    radeon->vtbl.blit = r200_blit;
    radeon->vtbl.is_format_renderable = radeonIsFormatRenderable;
+   radeon->vtbl.revalidate_all_buffers = r200ValidateBuffers;
 }
 
 
index 2c7b652952a438e2181b427efa43614a3a8cfb5d..983430fe30129a217c783d14f4183dc24f58cade 100644 (file)
@@ -2210,7 +2210,7 @@ static void update_texturematrix( struct gl_context *ctx )
    }
 }
 
-static GLboolean r200ValidateBuffers(struct gl_context *ctx)
+GLboolean r200ValidateBuffers(struct gl_context *ctx)
 {
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
    struct radeon_renderbuffer *rrb;
index db0f01f30e7c2e86dadea754a52eb1f857850c2c..a396b06c8fba5b66d888b4e36f857e757e82fe46 100644 (file)
@@ -47,6 +47,7 @@ extern void r200UpdateViewportOffset( struct gl_context *ctx );
 extern void r200UpdateWindow( struct gl_context *ctx );
 extern void r200UpdateDrawBuffer(struct gl_context *ctx);
 
+extern GLboolean r200ValidateBuffers(struct gl_context *ctx);
 extern GLboolean r200ValidateState( struct gl_context *ctx );
 
 extern void r200_vtbl_update_scissor( struct gl_context *ctx );
index 67c6dc7b2a7401cd219c5a3a7f27632bf086d818..515e55a5a6fb002ba0c3004e20f96f04cffe7148 100644 (file)
@@ -532,17 +532,6 @@ static INLINE void radeonEmitAtoms(radeonContextPtr radeon, GLboolean emitAll)
        COMMIT_BATCH();
 }
 
-static GLboolean radeon_revalidate_bos(struct gl_context *ctx)
-{
-       radeonContextPtr radeon = RADEON_CONTEXT(ctx);
-       int ret;
-
-       ret = radeon_cs_space_check(radeon->cmdbuf.cs);
-       if (ret == RADEON_CS_SPACE_FLUSH)
-               return GL_FALSE;
-       return GL_TRUE;
-}
-
 void radeonEmitState(radeonContextPtr radeon)
 {
        radeon_print(RADEON_STATE, RADEON_NORMAL, "%s\n", __FUNCTION__);
@@ -661,9 +650,8 @@ int rcommonFlushCmdBufLocked(radeonContextPtr rmesa, const char *caller)
        radeon_cs_erase(rmesa->cmdbuf.cs);
        rmesa->cmdbuf.flushing = 0;
 
-       if (radeon_revalidate_bos(&rmesa->glCtx) == GL_FALSE) {
+       if (!rmesa->vtbl.revalidate_all_buffers(&rmesa->glCtx))
                fprintf(stderr,"failed to revalidate buffers\n");
-       }
 
        return ret;
 }
index 6cd15356634208ab0702ed43dc574b571251f988..ac3e7b529b2c9d69ae90dd7ba1c7d06dc4170c51 100644 (file)
@@ -496,6 +496,7 @@ struct radeon_context {
                         unsigned reg_height,
                         unsigned flip_y);
           unsigned (*is_format_renderable)(mesa_format mesa_format);
+          GLboolean (*revalidate_all_buffers)(struct gl_context *ctx);
    } vtbl;
 };
 
index 1ceb4ab869e2ea6fbbfb2c32bc3902086e02c6ec..edd94e2ae9fae5d2e1167307790569b99019e935 100644 (file)
@@ -157,6 +157,7 @@ static void r100_init_vtbl(radeonContextPtr radeon)
    radeon->vtbl.check_blit = r100_check_blit;
    radeon->vtbl.blit = r100_blit;
    radeon->vtbl.is_format_renderable = radeonIsFormatRenderable;
+   radeon->vtbl.revalidate_all_buffers = r100ValidateBuffers;
 }
 
 /* Create the device specific context.
index f6bc5df0e47a04a1ce69b3457a47363c2e920100..843b041ab5bc7f512aef8202de33feee4e0d7e71 100644 (file)
@@ -1992,7 +1992,7 @@ static void update_texturematrix( struct gl_context *ctx )
    }
 }
 
-static GLboolean r100ValidateBuffers(struct gl_context *ctx)
+GLboolean r100ValidateBuffers(struct gl_context *ctx)
 {
    r100ContextPtr rmesa = R100_CONTEXT(ctx);
    struct radeon_renderbuffer *rrb;
index cb98969c492f4107e8c4663036446710fd017088..41e5de65ee4a0a766c9aa7603f747ea5ca7f1a61 100644 (file)
@@ -50,6 +50,7 @@ extern void radeonUpdateDrawBuffer( struct gl_context *ctx );
 extern void radeonUploadTexMatrix( r100ContextPtr rmesa,
                                   int unit, GLboolean swapcols );
 
+extern GLboolean r100ValidateBuffers(struct gl_context *ctx);
 extern GLboolean radeonValidateState( struct gl_context *ctx );