ac/llvm: add support for texturing with clamped LOD
This is a requirement for the shaderResourceMinLod feature which allows to clamp LOD. This uses all image_sample_*_cl variants. All dEQP-VK.glsl.texture_functions.texture*clamp.* pass. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4989>
This commit is contained in:

committed by
Marge Bot

parent
aaf5706aa3
commit
0d63a1a84d
@@ -2373,6 +2373,9 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
|
||||
(a->lod ? 1 : 0) +
|
||||
(a->level_zero ? 1 : 0) +
|
||||
(a->derivs[0] ? 1 : 0) <= 1);
|
||||
assert((a->min_lod ? 1 : 0) +
|
||||
(a->lod ? 1 : 0) +
|
||||
(a->level_zero ? 1 : 0) <= 1);
|
||||
|
||||
if (a->opcode == ac_image_get_lod) {
|
||||
switch (dim) {
|
||||
@@ -2428,6 +2431,9 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
|
||||
args[num_args++] = LLVMBuildBitCast(ctx->builder, a->coords[i], coord_type, "");
|
||||
if (a->lod)
|
||||
args[num_args++] = LLVMBuildBitCast(ctx->builder, a->lod, coord_type, "");
|
||||
if (a->min_lod)
|
||||
args[num_args++] = LLVMBuildBitCast(ctx->builder, a->min_lod, coord_type, "");
|
||||
|
||||
overload[num_overloads++] = sample ? ".f32" : ".i32";
|
||||
|
||||
args[num_args++] = a->resource;
|
||||
@@ -2481,7 +2487,7 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
|
||||
char intr_name[96];
|
||||
snprintf(intr_name, sizeof(intr_name),
|
||||
"llvm.amdgcn.image.%s%s" /* base name */
|
||||
"%s%s%s" /* sample/gather modifiers */
|
||||
"%s%s%s%s" /* sample/gather modifiers */
|
||||
".%s.%s%s%s%s", /* dimension and type overloads */
|
||||
name, atomic_subop,
|
||||
a->compare ? ".c" : "",
|
||||
@@ -2489,6 +2495,7 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
|
||||
lod_suffix ? ".l" :
|
||||
a->derivs[0] ? ".d" :
|
||||
a->level_zero ? ".lz" : "",
|
||||
a->min_lod ? ".cl" : "",
|
||||
a->offset ? ".o" : "",
|
||||
dimname,
|
||||
atomic ? "i32" : "v4f32",
|
||||
|
@@ -561,6 +561,7 @@ struct ac_image_args {
|
||||
LLVMValueRef derivs[6];
|
||||
LLVMValueRef coords[4];
|
||||
LLVMValueRef lod; // also used by ac_image_get_resinfo
|
||||
LLVMValueRef min_lod;
|
||||
};
|
||||
|
||||
LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
|
||||
|
@@ -4468,6 +4468,9 @@ static void visit_tex(struct ac_nir_context *ctx, nir_tex_instr *instr)
|
||||
case nir_tex_src_ddy:
|
||||
ddy = get_src(ctx, instr->src[i].src);
|
||||
break;
|
||||
case nir_tex_src_min_lod:
|
||||
args.min_lod = get_src(ctx, instr->src[i].src);
|
||||
break;
|
||||
case nir_tex_src_texture_offset:
|
||||
case nir_tex_src_sampler_offset:
|
||||
case nir_tex_src_plane:
|
||||
|
Reference in New Issue
Block a user