Mesa (main): ac/llvm: handle write mask for nir_intrinsic_store_buffer_amd
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jun 27 03:16:29 UTC 2022
Module: Mesa
Branch: main
Commit: 8f8d06bd059614c7b970549f02600e465d1f3d5b
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8f8d06bd059614c7b970549f02600e465d1f3d5b
Author: Qiang Yu <yuq825 at gmail.com>
Date: Wed May 25 19:35:15 2022 +0800
ac/llvm: handle write mask for nir_intrinsic_store_buffer_amd
tess lowering may generate buffer store with partial write mask.
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Signed-off-by: Qiang Yu <yuq825 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16705>
---
src/amd/llvm/ac_nir_to_llvm.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c
index 920fd5a0e19..7fc61f40936 100644
--- a/src/amd/llvm/ac_nir_to_llvm.c
+++ b/src/amd/llvm/ac_nir_to_llvm.c
@@ -4241,10 +4241,19 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
if (slc)
cache_policy |= ac_slc;
- LLVMValueRef voffset = LLVMBuildAdd(ctx->ac.builder, addr_voffset,
- LLVMConstInt(ctx->ac.i32, const_offset, 0), "");
- ac_build_buffer_store_dword(&ctx->ac, descriptor, store_data, NULL, voffset, addr_soffset,
- cache_policy);
+ unsigned writemask = nir_intrinsic_write_mask(instr);
+ while (writemask) {
+ int start, count;
+ u_bit_scan_consecutive_range(&writemask, &start, &count);
+
+ LLVMValueRef voffset = LLVMBuildAdd(
+ ctx->ac.builder, addr_voffset,
+ LLVMConstInt(ctx->ac.i32, const_offset + start * 4, 0), "");
+
+ LLVMValueRef data = extract_vector_range(&ctx->ac, store_data, start, count);
+ ac_build_buffer_store_dword(&ctx->ac, descriptor, data, NULL, voffset, addr_soffset,
+ cache_policy);
+ }
break;
}
case nir_intrinsic_has_input_vertex_amd: {
More information about the mesa-commit
mailing list