radeonsi: use the ac helper for index buffer stores in the culling shader
authorMarek Olšák <marek.olsak@amd.com>
Mon, 3 Jun 2019 23:43:44 +0000 (19:43 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 12 Jun 2019 00:05:21 +0000 (20:05 -0400)
src/amd/common/ac_llvm_build.c
src/amd/common/ac_llvm_build.h
src/amd/common/ac_nir_to_llvm.c
src/gallium/drivers/radeonsi/si_compute_prim_discard.c
src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c

index 0972406b5cba84b752c392ca83c3066ca96efbb9..88e89d1dfb4eacf350a2fbc5afec4447eda9b060 100644 (file)
@@ -1194,16 +1194,17 @@ ac_build_buffer_store_format(struct ac_llvm_context *ctx,
                             LLVMValueRef voffset,
                             unsigned num_channels,
                             bool glc,
+                            bool slc,
                             bool writeonly_memory)
 {
        if (HAVE_LLVM >= 0x800) {
                ac_build_llvm8_buffer_store_common(ctx, rsrc, data, vindex,
                                                   voffset, NULL, num_channels,
-                                                  ctx->f32, glc, false,
+                                                  ctx->f32, glc, slc,
                                                   writeonly_memory, true, true);
        } else {
                ac_build_llvm7_buffer_store_common(ctx, rsrc, data, vindex, voffset,
-                                                  num_channels, glc, false,
+                                                  num_channels, glc, slc,
                                                   writeonly_memory, true);
        }
 }
index 5ed9a112457ae5f34e6fc3562fa5f6bf135ab5e5..bbdb01184e6317c27c2642fd902e65ed6b8f7000 100644 (file)
@@ -282,6 +282,7 @@ ac_build_buffer_store_format(struct ac_llvm_context *ctx,
                             LLVMValueRef voffset,
                             unsigned num_channels,
                             bool glc,
+                            bool slc,
                             bool writeonly_memory);
 
 LLVMValueRef
index 360e139bf5f25b94a7e0ca55bf72a59212fcd7e2..67dca7cabde77461e2e1a745c162763f3feaa7ca 100644 (file)
@@ -2556,7 +2556,7 @@ static void visit_image_store(struct ac_nir_context *ctx,
 
                ac_build_buffer_store_format(&ctx->ac, rsrc, src, vindex,
                                             ctx->ac.i32_0, src_channels,
-                                            args.cache_policy & ac_glc,
+                                            args.cache_policy & ac_glc, false,
                                             writeonly_memory);
        } else {
                args.opcode = ac_image_store;
index 362c63c2e44ba45328188a91d8345d7a81aa4fe2..3bed818d5add30a4ebac7b4b8dcde083745ff288 100644 (file)
@@ -856,18 +856,15 @@ void si_build_prim_discard_compute_shader(struct si_shader_context *ctx)
                }
 
                /* Write indices for accepted primitives. */
-               LLVMValueRef buf_args[] = {
-                       ac_to_float(&ctx->ac, ac_build_expand_to_vec4(&ctx->ac,
-                                               ac_build_gather_values(&ctx->ac, index, 3), 3)),
-                       output_indexbuf,
-                       LLVMBuildAdd(builder, start, prim_index, ""),
-                       ctx->i32_0, /* voffset */
-                       ctx->i1true, /* glc */
-                       LLVMConstInt(ctx->i1, INDEX_STORES_USE_SLC, 0),
-               };
-               ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.buffer.store.format.v4f32",
-                                  ctx->voidt, buf_args, 6,
-                                  ac_get_store_intr_attribs(true));
+               LLVMValueRef vindex = LLVMBuildAdd(builder, start, prim_index, "");
+               LLVMValueRef vdata = ac_build_gather_values(&ctx->ac, index, 3);
+
+               if (!ac_has_vec3_support(ctx->ac.chip_class, true))
+                       vdata = ac_build_expand_to_vec4(&ctx->ac, vdata, 3);
+
+               ac_build_buffer_store_format(&ctx->ac, output_indexbuf, vdata,
+                                            vindex, ctx->i32_0, 3, true,
+                                            INDEX_STORES_USE_SLC, true);
        }
        lp_build_endif(&if_accepted);
 
index 2cf1f902cee6c391ea8d3c3febc59f78db834841..5f60d8dc33ff4fb5df14b1e14696ccd70a2f02a1 100644 (file)
@@ -728,7 +728,7 @@ static void store_emit(
                                             ac_build_gather_values(&ctx->ac, chans, num_channels),
                                             vindex, ctx->i32_0 /* voffset */,
                                             num_channels,
-                                            !!(args.cache_policy & ac_glc),
+                                            !!(args.cache_policy & ac_glc), false,
                                             writeonly_memory);
        } else {
                args.opcode = ac_image_store;