[Mesa-dev] [PATCH] radeonsi: set GLC on stores to write-only memory
Nicolai Hähnle
nhaehnle at gmail.com
Mon May 28 07:52:31 UTC 2018
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
The only effect this has is that written cache lines are immediately
freed in L1$. We're not going to read the data again, so it's better
to leave room for other things in the cache.
---
src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
index f4140bb0e2d..c06d0c6edfa 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
@@ -714,20 +714,26 @@ static void store_emit_buffer(
offset = base_offset;
if (start != 0) {
offset = LLVMBuildAdd(
builder, offset,
LLVMConstInt(ctx->i32, start * 4, 0), "");
}
emit_data->args[0] = data;
emit_data->args[3] = offset;
+ if (writeonly_memory) {
+ /* Set GLC for write-only memory, so that we don't
+ * leave cache lines in L1$. */
+ emit_data->args[3] = ctx->ac.i1true;
+ }
+
lp_build_intrinsic(
builder, intrinsic_name, emit_data->dst_type,
emit_data->args, emit_data->arg_count,
ac_get_store_intr_attribs(writeonly_memory));
}
}
static void store_emit_memory(
struct si_shader_context *ctx,
struct lp_build_emit_data *emit_data)
@@ -793,24 +799,28 @@ static void store_emit(
args.opcode = ac_image_store;
args.data[0] = emit_data->args[0];
args.resource = emit_data->args[1];
memcpy(args.coords, &emit_data->args[2], sizeof(args.coords));
args.dim = ac_image_dim_from_tgsi_target(ctx->screen, inst->Memory.Texture);
args.attributes = ac_get_store_intr_attribs(writeonly_memory);
args.dmask = 0xf;
/* Workaround for 8bit/16bit TC L1 write corruption bug on SI.
* All store opcodes not aligned to a dword are affected.
+ *
+ * Also set GLC for writeonly memory, so that we don't leave
+ * cache lines in L1.
*/
bool force_glc = ctx->screen->info.chip_class == SI;
if (force_glc ||
- inst->Memory.Qualifier & (TGSI_MEMORY_COHERENT | TGSI_MEMORY_VOLATILE))
+ inst->Memory.Qualifier & (TGSI_MEMORY_COHERENT | TGSI_MEMORY_VOLATILE) ||
+ writeonly_memory)
args.cache_policy = ac_glc;
emit_data->output[emit_data->chan] =
ac_build_image_opcode(&ctx->ac, &args);
}
}
static void atomic_fetch_args(
struct lp_build_tgsi_context * bld_base,
struct lp_build_emit_data * emit_data)
--
2.14.1
More information about the mesa-dev
mailing list