llvmpipe: Fill out samplers even if nr_samplers = 0

Coming in from Vulkan or OpenCL, it's possible for nr_samplers to be
zero if all we ever use is texelFetch().  Annoyingly, samplers and
sampler views are handled by the same function.  Fortunately, it will
work if some of the samplers or sampler views are missing so we can just
pass the maximum.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16435>
This commit is contained in:
Jason Ekstrand 2022-05-10 13:33:07 -05:00 committed by Marge Bot
parent bbd5883c87
commit c10b10942b
3 changed files with 18 additions and 7 deletions

View file

@ -2050,8 +2050,9 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
fake_buf_ptr = LLVMBuildGEP2(builder, LLVMInt8TypeInContext(context), fake_buf, &bld.zero, 1, "");
/* code generated texture sampling */
sampler = draw_llvm_sampler_soa_create(draw_llvm_variant_key_samplers(key), key->nr_samplers);
sampler = draw_llvm_sampler_soa_create(draw_llvm_variant_key_samplers(key),
MAX2(key->nr_samplers,
key->nr_sampler_views));
image = draw_llvm_image_soa_create(draw_llvm_variant_key_images(key),
key->nr_images);
@ -2853,7 +2854,9 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
draw_gs_jit_context_num_ssbos(variant->gallivm, context_ptr);
/* code generated texture sampling */
sampler = draw_llvm_sampler_soa_create(variant->key.samplers, variant->key.nr_samplers);
sampler = draw_llvm_sampler_soa_create(variant->key.samplers,
MAX2(variant->key.nr_samplers,
variant->key.nr_sampler_views));
image = draw_llvm_image_soa_create(draw_gs_llvm_variant_key_images(&variant->key),
variant->key.nr_images);
mask_val = generate_mask_value(variant, gs_type);
@ -3495,7 +3498,9 @@ draw_tcs_llvm_generate(struct draw_llvm *llvm,
ssbos_ptr = draw_tcs_jit_context_ssbos(variant->gallivm, context_ptr);
num_ssbos_ptr =
draw_tcs_jit_context_num_ssbos(variant->gallivm, context_ptr);
sampler = draw_llvm_sampler_soa_create(variant->key.samplers, variant->key.nr_samplers);
sampler = draw_llvm_sampler_soa_create(variant->key.samplers,
MAX2(variant->key.nr_samplers,
variant->key.nr_sampler_views));
image = draw_llvm_image_soa_create(draw_tcs_llvm_variant_key_images(&variant->key),
variant->key.nr_images);
@ -4010,7 +4015,9 @@ draw_tes_llvm_generate(struct draw_llvm *llvm,
ssbos_ptr = draw_tes_jit_context_ssbos(variant->gallivm, context_ptr);
num_ssbos_ptr =
draw_tes_jit_context_num_ssbos(variant->gallivm, context_ptr);
sampler = draw_llvm_sampler_soa_create(variant->key.samplers, variant->key.nr_samplers);
sampler = draw_llvm_sampler_soa_create(variant->key.samplers,
MAX2(variant->key.nr_samplers,
variant->key.nr_sampler_views));
image = draw_llvm_image_soa_create(draw_tes_llvm_variant_key_images(&variant->key),
variant->key.nr_images);
step = lp_build_const_int32(gallivm, vector_length);

View file

@ -180,7 +180,9 @@ generate_compute(struct llvmpipe_context *lp,
builder = gallivm->builder;
assert(builder);
LLVMPositionBuilderAtEnd(builder, block);
sampler = lp_llvm_sampler_soa_create(lp_cs_variant_key_samplers(key), key->nr_samplers);
sampler = lp_llvm_sampler_soa_create(lp_cs_variant_key_samplers(key),
MAX2(key->nr_samplers,
key->nr_sampler_views));
image = lp_llvm_image_soa_create(lp_cs_variant_key_images(key), key->nr_images);
struct lp_build_loop_state loop_state[4];

View file

@ -3173,7 +3173,9 @@ generate_fragment(struct llvmpipe_context *lp,
}
/* code generated texture sampling */
sampler = lp_llvm_sampler_soa_create(lp_fs_variant_key_samplers(key), key->nr_samplers);
sampler = lp_llvm_sampler_soa_create(lp_fs_variant_key_samplers(key),
MAX2(key->nr_samplers,
key->nr_sampler_views));
image = lp_llvm_image_soa_create(lp_fs_variant_key_images(key), key->nr_images);
num_fs = 16 / fs_type.length; /* number of loops per 4x4 stamp */