diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c index 0e14a6be9e2..9142e3a0b1e 100644 --- a/src/gallium/drivers/radeonsi/si_compute_blit.c +++ b/src/gallium/drivers/radeonsi/si_compute_blit.c @@ -126,9 +126,6 @@ static void si_compute_clear_12bytes_buffer(struct si_context *sctx, struct pipe assert(size % 4 == 0); unsigned size_12 = DIV_ROUND_UP(size, 12); - unsigned data[4] = {0}; - memcpy(data, clear_value, 12); - if (!(flags & SI_OP_SKIP_CACHE_INV_BEFORE)) sctx->flags |= si_get_flush_flags(sctx, coher, SI_COMPUTE_DST_CACHE_POLICY); @@ -140,16 +137,8 @@ static void si_compute_clear_12bytes_buffer(struct si_context *sctx, struct pipe (1u << si_get_shaderbuf_slot(0))) saved_writable_mask = 1; - struct pipe_constant_buffer saved_cb = {}; - si_get_pipe_constant_buffer(sctx, PIPE_SHADER_COMPUTE, 0, &saved_cb); - void *saved_cs = sctx->cs_shader_state.program; - struct pipe_constant_buffer cb = {}; - cb.buffer_size = sizeof(data); - cb.user_buffer = data; - ctx->set_constant_buffer(ctx, PIPE_SHADER_COMPUTE, 0, false, &cb); - struct pipe_shader_buffer sb = {0}; sb.buffer = dst; sb.buffer_offset = dst_offset; @@ -157,6 +146,8 @@ static void si_compute_clear_12bytes_buffer(struct si_context *sctx, struct pipe ctx->set_shader_buffers(ctx, PIPE_SHADER_COMPUTE, 0, 1, &sb, 0x1); + memcpy(sctx->cs_user_data, clear_value, 12); + struct pipe_grid_info info = {0}; if (!sctx->cs_clear_12bytes_buffer) @@ -173,8 +164,6 @@ static void si_compute_clear_12bytes_buffer(struct si_context *sctx, struct pipe si_launch_grid_internal(sctx, &info, saved_cs, flags); ctx->set_shader_buffers(ctx, PIPE_SHADER_COMPUTE, 0, 1, &saved_sb, saved_writable_mask); - ctx->set_constant_buffer(ctx, PIPE_SHADER_COMPUTE, 0, true, &saved_cb); - pipe_resource_reference(&saved_sb.buffer, NULL); } diff --git a/src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c b/src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c index 94d86686f2c..48fafdbb0ee 100644 --- a/src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c +++ b/src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c @@ -686,21 +686,25 @@ void *si_clear_12bytes_buffer_shader(struct pipe_context *ctx) "PROPERTY CS_FIXED_BLOCK_WIDTH 64\n" "PROPERTY CS_FIXED_BLOCK_HEIGHT 1\n" "PROPERTY CS_FIXED_BLOCK_DEPTH 1\n" + "PROPERTY CS_USER_DATA_COMPONENTS_AMD 3\n" "DCL SV[0], THREAD_ID\n" "DCL SV[1], BLOCK_ID\n" + "DCL SV[2], CS_USER_DATA_AMD\n" "DCL BUFFER[0]\n" - "DCL CONST[0][0..0]\n" // 0:xyzw "DCL TEMP[0..0]\n" "IMM[0] UINT32 {64, 1, 12, 0}\n" "UMAD TEMP[0].x, SV[1].xyzz, IMM[0].xyyy, SV[0].xyzz\n" "UMUL TEMP[0].x, TEMP[0].xyzz, IMM[0].zzzz\n" // 12 bytes - "STORE BUFFER[0].xyz, TEMP[0].xxxx, CONST[0][0].xyzw\n" + "STORE BUFFER[0].xyz, TEMP[0].xxxx, SV[2].xyzz%s\n" "END\n"; - + char final_text[2048]; struct tgsi_token tokens[1024]; struct pipe_compute_state state = {0}; - if (!tgsi_text_translate(text, tokens, ARRAY_SIZE(tokens))) { + snprintf(final_text, sizeof(final_text), text, + SI_COMPUTE_DST_CACHE_POLICY != L2_LRU ? ", STREAM_CACHE_POLICY" : ""); + + if (!tgsi_text_translate(final_text, tokens, ARRAY_SIZE(tokens))) { assert(false); return NULL; }