ac/llvm: replace structured by vindex != NULL in ac_build_buffer_store_common
"raw" (IDXEN=0) and "structured" (IDXEN=1) do bounds checking differently. From `si_make_buffer_descriptor`: * - For VMEM and inst.IDXEN == 0 or STRIDE == 0, it's in byte units. * - For VMEM and inst.IDXEN == 1 and STRIDE != 0, it's in units of STRIDE. so there is a difference between setting vindex = i32_0 and vindex = NULL. Instead of having the `structured` flag, we can just check if vindex is NULL. Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15098>
This commit is contained in:
@@ -1124,18 +1124,18 @@ static unsigned get_load_cache_policy(struct ac_llvm_context *ctx, unsigned cach
|
|||||||
static void ac_build_buffer_store_common(struct ac_llvm_context *ctx, LLVMValueRef rsrc,
|
static void ac_build_buffer_store_common(struct ac_llvm_context *ctx, LLVMValueRef rsrc,
|
||||||
LLVMValueRef data, LLVMValueRef vindex,
|
LLVMValueRef data, LLVMValueRef vindex,
|
||||||
LLVMValueRef voffset, LLVMValueRef soffset,
|
LLVMValueRef voffset, LLVMValueRef soffset,
|
||||||
unsigned cache_policy, bool use_format, bool structurized)
|
unsigned cache_policy, bool use_format)
|
||||||
{
|
{
|
||||||
LLVMValueRef args[6];
|
LLVMValueRef args[6];
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
args[idx++] = data;
|
args[idx++] = data;
|
||||||
args[idx++] = LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32, "");
|
args[idx++] = LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32, "");
|
||||||
if (structurized)
|
if (vindex)
|
||||||
args[idx++] = vindex ? vindex : ctx->i32_0;
|
args[idx++] = vindex ? vindex : ctx->i32_0;
|
||||||
args[idx++] = voffset ? voffset : ctx->i32_0;
|
args[idx++] = voffset ? voffset : ctx->i32_0;
|
||||||
args[idx++] = soffset ? soffset : ctx->i32_0;
|
args[idx++] = soffset ? soffset : ctx->i32_0;
|
||||||
args[idx++] = LLVMConstInt(ctx->i32, cache_policy, 0);
|
args[idx++] = LLVMConstInt(ctx->i32, cache_policy, 0);
|
||||||
const char *indexing_kind = structurized ? "struct" : "raw";
|
const char *indexing_kind = vindex ? "struct" : "raw";
|
||||||
char name[256], type_name[8];
|
char name[256], type_name[8];
|
||||||
|
|
||||||
ac_build_type_name_for_intr(LLVMTypeOf(data), type_name, sizeof(type_name));
|
ac_build_type_name_for_intr(LLVMTypeOf(data), type_name, sizeof(type_name));
|
||||||
@@ -1153,7 +1153,7 @@ static void ac_build_buffer_store_common(struct ac_llvm_context *ctx, LLVMValueR
|
|||||||
void ac_build_buffer_store_format(struct ac_llvm_context *ctx, LLVMValueRef rsrc, LLVMValueRef data,
|
void ac_build_buffer_store_format(struct ac_llvm_context *ctx, LLVMValueRef rsrc, LLVMValueRef data,
|
||||||
LLVMValueRef vindex, LLVMValueRef voffset, unsigned cache_policy)
|
LLVMValueRef vindex, LLVMValueRef voffset, unsigned cache_policy)
|
||||||
{
|
{
|
||||||
ac_build_buffer_store_common(ctx, rsrc, data, vindex, voffset, NULL, cache_policy, true, true);
|
ac_build_buffer_store_common(ctx, rsrc, data, vindex, voffset, NULL, cache_policy, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* buffer_store_dword(,x2,x3,x4) <- the suffix is selected by the type of vdata. */
|
/* buffer_store_dword(,x2,x3,x4) <- the suffix is selected by the type of vdata. */
|
||||||
@@ -1189,7 +1189,7 @@ void ac_build_buffer_store_dword(struct ac_llvm_context *ctx, LLVMValueRef rsrc,
|
|||||||
offset = LLVMBuildAdd(ctx->builder, offset, LLVMConstInt(ctx->i32, inst_offset, 0), "");
|
offset = LLVMBuildAdd(ctx->builder, offset, LLVMConstInt(ctx->i32, inst_offset, 0), "");
|
||||||
|
|
||||||
ac_build_buffer_store_common(ctx, rsrc, ac_to_float(ctx, vdata), vindex, voffset, offset,
|
ac_build_buffer_store_common(ctx, rsrc, ac_to_float(ctx, vdata), vindex, voffset, offset,
|
||||||
cache_policy, false, false);
|
cache_policy, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1734,8 +1734,7 @@ void ac_build_tbuffer_store_short(struct ac_llvm_context *ctx, LLVMValueRef rsrc
|
|||||||
{
|
{
|
||||||
vdata = LLVMBuildBitCast(ctx->builder, vdata, ctx->i16, "");
|
vdata = LLVMBuildBitCast(ctx->builder, vdata, ctx->i16, "");
|
||||||
|
|
||||||
ac_build_buffer_store_common(ctx, rsrc, vdata, NULL, voffset, soffset, cache_policy, false,
|
ac_build_buffer_store_common(ctx, rsrc, vdata, NULL, voffset, soffset, cache_policy, false);
|
||||||
false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ac_build_tbuffer_store_byte(struct ac_llvm_context *ctx, LLVMValueRef rsrc, LLVMValueRef vdata,
|
void ac_build_tbuffer_store_byte(struct ac_llvm_context *ctx, LLVMValueRef rsrc, LLVMValueRef vdata,
|
||||||
@@ -1743,8 +1742,7 @@ void ac_build_tbuffer_store_byte(struct ac_llvm_context *ctx, LLVMValueRef rsrc,
|
|||||||
{
|
{
|
||||||
vdata = LLVMBuildBitCast(ctx->builder, vdata, ctx->i8, "");
|
vdata = LLVMBuildBitCast(ctx->builder, vdata, ctx->i8, "");
|
||||||
|
|
||||||
ac_build_buffer_store_common(ctx, rsrc, vdata, NULL, voffset, soffset, cache_policy, false,
|
ac_build_buffer_store_common(ctx, rsrc, vdata, NULL, voffset, soffset, cache_policy, false);
|
||||||
false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user