[Mesa-dev] [PATCH 15/20] radeonsi: implement coherent memory access (v2)
Nicolai Hähnle
nhaehnle at gmail.com
Wed Mar 16 20:45:02 UTC 2016
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
v2: set glc=1 for volatile also on buffers
---
volatile should behave like coherent in this regard, which it already did
for images in v1.
---
src/gallium/drivers/radeonsi/si_shader.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 33024b0..6d93a55 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -2832,14 +2832,18 @@ static void image_append_args(
unsigned target,
bool atomic)
{
+ const struct tgsi_full_instruction *inst = emit_data->inst;
LLVMValueRef i1false = LLVMConstInt(ctx->i1, 0, 0);
LLVMValueRef i1true = LLVMConstInt(ctx->i1, 1, 0);
emit_data->args[emit_data->arg_count++] = i1false; /* r128 */
emit_data->args[emit_data->arg_count++] =
tgsi_is_array_image(target) ? i1true : i1false; /* da */
- if (!atomic)
- emit_data->args[emit_data->arg_count++] = i1false; /* glc */
+ if (!atomic) {
+ emit_data->args[emit_data->arg_count++] =
+ inst->Memory.Qualifier & (TGSI_MEMORY_COHERENT | TGSI_MEMORY_VOLATILE) ?
+ i1true : i1false; /* glc */
+ }
emit_data->args[emit_data->arg_count++] = i1false; /* slc */
}
@@ -2858,8 +2862,10 @@ static void buffer_append_args(
{
struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
+ const struct tgsi_full_instruction *inst = emit_data->inst;
LLVMTypeRef v2i128 = LLVMVectorType(ctx->i128, 2);
LLVMValueRef i1false = LLVMConstInt(ctx->i1, 0, 0);
+ LLVMValueRef i1true = LLVMConstInt(ctx->i1, 1, 0);
rsrc = LLVMBuildBitCast(gallivm->builder, rsrc, v2i128, "");
rsrc = LLVMBuildExtractElement(gallivm->builder, rsrc, bld_base->uint_bld.one, "");
@@ -2868,8 +2874,11 @@ static void buffer_append_args(
emit_data->args[emit_data->arg_count++] = rsrc;
emit_data->args[emit_data->arg_count++] = index; /* vindex */
emit_data->args[emit_data->arg_count++] = bld_base->uint_bld.zero; /* voffset */
- if (!atomic)
- emit_data->args[emit_data->arg_count++] = i1false; /* glc */
+ if (!atomic) {
+ emit_data->args[emit_data->arg_count++] =
+ inst->Memory.Qualifier & (TGSI_MEMORY_COHERENT | TGSI_MEMORY_VOLATILE) ?
+ i1true : i1false; /* glc */
+ }
emit_data->args[emit_data->arg_count++] = i1false; /* slc */
}
--
2.5.0
More information about the mesa-dev
mailing list