From c10b10942b8bdd88fc33d42b0022858c7c175f8b Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 10 May 2022 13:33:07 -0500 Subject: [PATCH] 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 Part-of: --- src/gallium/auxiliary/draw/draw_llvm.c | 17 ++++++++++++----- src/gallium/drivers/llvmpipe/lp_state_cs.c | 4 +++- src/gallium/drivers/llvmpipe/lp_state_fs.c | 4 +++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index ee4ff8178a8..4ad04ff8cd5 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -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); diff --git a/src/gallium/drivers/llvmpipe/lp_state_cs.c b/src/gallium/drivers/llvmpipe/lp_state_cs.c index 56f75fed47e..273dd8b944b 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_cs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_cs.c @@ -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]; diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index d2d59bc9553..1a61974c7fb 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -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 */