radeonsi: don't use constbuf and set cache policy for 12-byte clear shader
This removes the constant buffer and sets the cache policy like other compute shaders. Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9795>
This commit is contained in:
parent
7d14eb623b
commit
5701baa34b
|
@ -126,9 +126,6 @@ static void si_compute_clear_12bytes_buffer(struct si_context *sctx, struct pipe
|
||||||
assert(size % 4 == 0);
|
assert(size % 4 == 0);
|
||||||
unsigned size_12 = DIV_ROUND_UP(size, 12);
|
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))
|
if (!(flags & SI_OP_SKIP_CACHE_INV_BEFORE))
|
||||||
sctx->flags |= si_get_flush_flags(sctx, coher, SI_COMPUTE_DST_CACHE_POLICY);
|
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)))
|
(1u << si_get_shaderbuf_slot(0)))
|
||||||
saved_writable_mask = 1;
|
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;
|
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};
|
struct pipe_shader_buffer sb = {0};
|
||||||
sb.buffer = dst;
|
sb.buffer = dst;
|
||||||
sb.buffer_offset = dst_offset;
|
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);
|
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};
|
struct pipe_grid_info info = {0};
|
||||||
|
|
||||||
if (!sctx->cs_clear_12bytes_buffer)
|
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);
|
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_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);
|
pipe_resource_reference(&saved_sb.buffer, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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_WIDTH 64\n"
|
||||||
"PROPERTY CS_FIXED_BLOCK_HEIGHT 1\n"
|
"PROPERTY CS_FIXED_BLOCK_HEIGHT 1\n"
|
||||||
"PROPERTY CS_FIXED_BLOCK_DEPTH 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[0], THREAD_ID\n"
|
||||||
"DCL SV[1], BLOCK_ID\n"
|
"DCL SV[1], BLOCK_ID\n"
|
||||||
|
"DCL SV[2], CS_USER_DATA_AMD\n"
|
||||||
"DCL BUFFER[0]\n"
|
"DCL BUFFER[0]\n"
|
||||||
"DCL CONST[0][0..0]\n" // 0:xyzw
|
|
||||||
"DCL TEMP[0..0]\n"
|
"DCL TEMP[0..0]\n"
|
||||||
"IMM[0] UINT32 {64, 1, 12, 0}\n"
|
"IMM[0] UINT32 {64, 1, 12, 0}\n"
|
||||||
"UMAD TEMP[0].x, SV[1].xyzz, IMM[0].xyyy, SV[0].xyzz\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
|
"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";
|
"END\n";
|
||||||
|
char final_text[2048];
|
||||||
struct tgsi_token tokens[1024];
|
struct tgsi_token tokens[1024];
|
||||||
struct pipe_compute_state state = {0};
|
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);
|
assert(false);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue