summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2016-03-12 21:32:34 -0500
committerNicolai Hähnle <nicolai.haehnle@amd.com>2016-03-21 11:31:23 -0500
commitc88de4d538a8e2b8bcaf206bbc1b02c35061cfce (patch)
tree5ce9ba8d768f4226d385736680532a815e7038c2
parenta2b99f5c2ff8802c46bf7bb450a8af71baba0daa (diff)
radeonsi: implement coherent memory access (v2)
v2: set glc=1 for volatile also on buffers Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index ca90178f07..db0cc5bbf6 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 */
}