radeonsi: fix shader size and handling
authorChristian König <deathsimple@vodafone.de>
Tue, 24 Jul 2012 16:50:49 +0000 (18:50 +0200)
committerChristian König <deathsimple@vodafone.de>
Mon, 30 Jul 2012 12:45:08 +0000 (14:45 +0200)
We should always upload the shader here.

Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeonsi/radeonsi_shader.c

index 70081370b3ea2dfc8328a18631dbb0dc38bc141a..cc4777ffd4d547f6a3627f4944ee668847e5e435 100644 (file)
@@ -554,6 +554,7 @@ int si_pipe_shader_create(
        unsigned char * inst_bytes;
        unsigned inst_byte_count;
        unsigned i;
+       uint32_t *ptr;
        bool dump;
 
        dump = debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE);
@@ -608,23 +609,22 @@ int si_pipe_shader_create(
        tgsi_parse_free(&si_shader_ctx.parse);
 
        /* copy new shader */
+       si_resource_reference(&shader->bo, NULL);
+       shader->bo = si_resource_create_custom(ctx->screen, PIPE_USAGE_IMMUTABLE,
+                                              inst_byte_count - 12);
        if (shader->bo == NULL) {
-               uint32_t *ptr;
+               return -ENOMEM;
+       }
 
-               shader->bo = si_resource_create_custom(ctx->screen, PIPE_USAGE_IMMUTABLE, inst_byte_count);
-               if (shader->bo == NULL) {
-                       return -ENOMEM;
-               }
-               ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
-               if (0 /*R600_BIG_ENDIAN*/) {
-                       for (i = 0; i < (inst_byte_count-12)/4; ++i) {
-                               ptr[i] = util_bswap32(*(uint32_t*)(inst_bytes+12 + i*4));
-                       }
-               } else {
-                       memcpy(ptr, inst_bytes + 12, inst_byte_count - 12);
+       ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
+       if (0 /*R600_BIG_ENDIAN*/) {
+               for (i = 0; i < (inst_byte_count-12)/4; ++i) {
+                       ptr[i] = util_bswap32(*(uint32_t*)(inst_bytes+12 + i*4));
                }
-               rctx->ws->buffer_unmap(shader->bo->cs_buf);
+       } else {
+               memcpy(ptr, inst_bytes + 12, inst_byte_count - 12);
        }
+       rctx->ws->buffer_unmap(shader->bo->cs_buf);
 
        free(inst_bytes);