Module: Mesa
Branch: main
Commit: c10b10942b8bdd88fc33d42b0022858c7c175f8b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=c10b10942b8bdd88fc33d42b0022858c7c175f8b

Author: Jason Ekstrand <[email protected]>
Date:   Tue May 10 13:33:07 2022 -0500

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 <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16435>

---

 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 */

Reply via email to