Re: [Mesa-dev] [PATCH] radv: Implement buffer stores with less than 4 components.

2019-01-07 Thread Samuel Pitoiset

Reviewed-by: Samuel Pitoiset 

On 12/24/18 3:43 PM, Bas Nieuwenhuizen wrote:

We started using it in the btoi paths for r32g32b32, and the LLVM IR
checker will complain about it because we end up with intrinsics with
the wrong type extension in the name.

Fixes: 593996bc02 ("radv: implement buffer to image operations for R32G32B32")
---
  src/amd/common/ac_nir_to_llvm.c | 19 ++-
  1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 6d97212b805..0fa38b83a57 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -2392,24 +2392,33 @@ static void visit_image_store(struct ac_nir_context 
*ctx,
glc = ctx->ac.i1true;
  
  	if (dim == GLSL_SAMPLER_DIM_BUF) {

+   char name[48];
+   const char *types[] = { "f32", "v2f32", "v4f32" };
LLVMValueRef rsrc = get_image_buffer_descriptor(ctx, instr, 
true);
+   LLVMValueRef src = ac_to_float(>ac, get_src(ctx, 
instr->src[3]));
+   unsigned src_channels = ac_get_llvm_num_components(src);
  
-		params[0] = ac_to_float(>ac, get_src(ctx, instr->src[3])); /* data */

+   if (src_channels == 3)
+   src = ac_build_expand(>ac, src, 3, 4);
+
+   params[0] = src; /* data */
params[1] = rsrc;
params[2] = LLVMBuildExtractElement(ctx->ac.builder, get_src(ctx, 
instr->src[1]),
ctx->ac.i32_0, ""); /* 
vindex */
params[3] = ctx->ac.i32_0; /* voffset */
+   snprintf(name, sizeof(name), "%s.%s",
+HAVE_LLVM >= 0x800 ? 
"llvm.amdgcn.struct.buffer.store.format"
+   : "llvm.amdgcn.buffer.store.format",
+types[CLAMP(src_channels, 1, 3) - 1]);
+
if (HAVE_LLVM >= 0x800) {
params[4] = ctx->ac.i32_0; /* soffset */
params[5] = glc ? ctx->ac.i32_1 : ctx->ac.i32_0;
-   ac_build_intrinsic(>ac, 
"llvm.amdgcn.struct.buffer.store.format.v4f32", ctx->ac.voidt,
-  params, 6, 0);
} else {
params[4] = glc;  /* glc */
params[5] = ctx->ac.i1false;  /* slc */
-   ac_build_intrinsic(>ac, 
"llvm.amdgcn.buffer.store.format.v4f32", ctx->ac.voidt,
-  params, 6, 0);
}
+   ac_build_intrinsic(>ac, name, ctx->ac.voidt, params, 6, 0);
} else {
struct ac_image_args args = {};
args.opcode = ac_image_store;

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] radv: Implement buffer stores with less than 4 components.

2018-12-24 Thread Bas Nieuwenhuizen
We started using it in the btoi paths for r32g32b32, and the LLVM IR
checker will complain about it because we end up with intrinsics with
the wrong type extension in the name.

Fixes: 593996bc02 ("radv: implement buffer to image operations for R32G32B32")
---
 src/amd/common/ac_nir_to_llvm.c | 19 ++-
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 6d97212b805..0fa38b83a57 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -2392,24 +2392,33 @@ static void visit_image_store(struct ac_nir_context 
*ctx,
glc = ctx->ac.i1true;
 
if (dim == GLSL_SAMPLER_DIM_BUF) {
+   char name[48];
+   const char *types[] = { "f32", "v2f32", "v4f32" };
LLVMValueRef rsrc = get_image_buffer_descriptor(ctx, instr, 
true);
+   LLVMValueRef src = ac_to_float(>ac, get_src(ctx, 
instr->src[3]));
+   unsigned src_channels = ac_get_llvm_num_components(src);
 
-   params[0] = ac_to_float(>ac, get_src(ctx, instr->src[3])); 
/* data */
+   if (src_channels == 3)
+   src = ac_build_expand(>ac, src, 3, 4);
+
+   params[0] = src; /* data */
params[1] = rsrc;
params[2] = LLVMBuildExtractElement(ctx->ac.builder, 
get_src(ctx, instr->src[1]),
ctx->ac.i32_0, ""); /* 
vindex */
params[3] = ctx->ac.i32_0; /* voffset */
+   snprintf(name, sizeof(name), "%s.%s",
+HAVE_LLVM >= 0x800 ? 
"llvm.amdgcn.struct.buffer.store.format"
+   : "llvm.amdgcn.buffer.store.format",
+types[CLAMP(src_channels, 1, 3) - 1]);
+
if (HAVE_LLVM >= 0x800) {
params[4] = ctx->ac.i32_0; /* soffset */
params[5] = glc ? ctx->ac.i32_1 : ctx->ac.i32_0;
-   ac_build_intrinsic(>ac, 
"llvm.amdgcn.struct.buffer.store.format.v4f32", ctx->ac.voidt,
-  params, 6, 0);
} else {
params[4] = glc;  /* glc */
params[5] = ctx->ac.i1false;  /* slc */
-   ac_build_intrinsic(>ac, 
"llvm.amdgcn.buffer.store.format.v4f32", ctx->ac.voidt,
-  params, 6, 0);
}
+   ac_build_intrinsic(>ac, name, ctx->ac.voidt, params, 6, 0);
} else {
struct ac_image_args args = {};
args.opcode = ac_image_store;
-- 
2.19.2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev