summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2023-05-05 06:39:44 +1000
committerMarge Bot <emma+marge@anholt.net>2023-05-17 01:19:24 +0000
commit36eb75d281bd0898b4b669969993f38b5fa9515b (patch)
treebcf48bd6021dbf1433308cd75d23520e38d2637c
parentf4c8a520c26e857868fa9e3aec486bae079aabd6 (diff)
downloadmesa-36eb75d281bd0898b4b669969993f38b5fa9515b.tar.gz
llvmpipe: move to common sampler/image binding code
This leaves the cache stuff in place, but we should consider trying to consolidate that. Reviewed-by: Brian Paul <brianp@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22788>
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_cs.c7
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_fs.c7
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_fs.h18
-rw-r--r--src/gallium/drivers/llvmpipe/lp_tex_sample.c200
-rw-r--r--src/gallium/drivers/llvmpipe/lp_tex_sample.h27
5 files changed, 14 insertions, 245 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_state_cs.c b/src/gallium/drivers/llvmpipe/lp_state_cs.c
index cb0b790a3eb..816058bed60 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_cs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_cs.c
@@ -36,6 +36,7 @@
#include "gallivm/lp_bld_gather.h"
#include "gallivm/lp_bld_coro.h"
#include "gallivm/lp_bld_nir.h"
+#include "gallivm/lp_bld_jit_sample.h"
#include "lp_state_cs.h"
#include "lp_context.h"
#include "lp_debug.h"
@@ -187,7 +188,7 @@ generate_compute(struct llvmpipe_context *lp,
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);
+ image = lp_bld_llvm_image_soa_create(lp_cs_variant_key_images(key), key->nr_images);
struct lp_build_loop_state loop_state[4];
LLVMValueRef num_x_loop;
@@ -482,8 +483,8 @@ generate_compute(struct llvmpipe_context *lp,
LLVMBuildRet(builder, coro_hdl);
}
- lp_llvm_sampler_soa_destroy(sampler);
- lp_llvm_image_soa_destroy(image);
+ lp_bld_llvm_sampler_soa_destroy(sampler);
+ lp_bld_llvm_image_soa_destroy(image);
gallivm_verify_function(gallivm, coro);
gallivm_verify_function(gallivm, function);
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
index 5950d4039cb..8730a5963cf 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
@@ -90,6 +90,7 @@
#include "gallivm/lp_bld_format.h"
#include "gallivm/lp_bld_quad.h"
#include "gallivm/lp_bld_gather.h"
+#include "gallivm/lp_bld_jit_sample.h"
#include "lp_bld_alpha.h"
#include "lp_bld_blend.h"
@@ -3291,7 +3292,7 @@ generate_fragment(struct llvmpipe_context *lp,
MAX2(key->nr_samplers,
key->nr_sampler_views));
struct lp_build_image_soa *image =
- lp_llvm_image_soa_create(lp_fs_variant_key_images(key), key->nr_images);
+ lp_bld_llvm_image_soa_create(lp_fs_variant_key_images(key), key->nr_images);
unsigned num_fs = 16 / fs_type.length; /* number of loops per 4x4 stamp */
/* for 1d resources only run "upper half" of stamp */
@@ -3471,8 +3472,8 @@ generate_fragment(struct llvmpipe_context *lp,
}
}
- lp_llvm_sampler_soa_destroy(sampler);
- lp_llvm_image_soa_destroy(image);
+ lp_bld_llvm_sampler_soa_destroy(sampler);
+ lp_bld_llvm_image_soa_destroy(image);
/* Loop over color outputs / color buffers to do blending */
for (unsigned cbuf = 0; cbuf < key->nr_cbufs; cbuf++) {
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.h b/src/gallium/drivers/llvmpipe/lp_state_fs.h
index 550659d007c..456bd30b493 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.h
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.h
@@ -35,6 +35,7 @@
#include "pipe/p_state.h"
#include "tgsi/tgsi_scan.h" /* for tgsi_shader_info */
#include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */
+#include "gallivm/lp_bld_jit_sample.h"
#include "gallivm/lp_bld_tgsi.h" /* for lp_tgsi_info */
#include "lp_bld_interp.h" /* for struct lp_shader_input */
#include "util/u_inlines.h"
@@ -59,23 +60,6 @@ enum lp_fs_kind
};
-struct lp_sampler_static_state
-{
- /*
- * These attributes are effectively interleaved for more sane key handling.
- * However, there might be lots of null space if the amount of samplers and
- * textures isn't the same.
- */
- struct lp_static_sampler_state sampler_state;
- struct lp_static_texture_state texture_state;
-};
-
-
-struct lp_image_static_state
-{
- struct lp_static_texture_state image_state;
-};
-
struct lp_depth_state
{
unsigned enabled:1; /**< depth test enabled? */
diff --git a/src/gallium/drivers/llvmpipe/lp_tex_sample.c b/src/gallium/drivers/llvmpipe/lp_tex_sample.c
index 6fb6cb3f559..f150b65011e 100644
--- a/src/gallium/drivers/llvmpipe/lp_tex_sample.c
+++ b/src/gallium/drivers/llvmpipe/lp_tex_sample.c
@@ -53,52 +53,6 @@
#include "lp_debug.h"
-/**
- * This provides the bridge between the sampler state store in
- * lp_jit_context and lp_jit_texture and the sampler code
- * generator. It provides the texture layout information required by
- * the texture sampler code generator in terms of the state stored in
- * lp_jit_context and lp_jit_texture in runtime.
- */
-struct llvmpipe_sampler_dynamic_state
-{
- struct lp_sampler_dynamic_state base;
-
- const struct lp_sampler_static_state *static_state;
-};
-
-
-/**
- * This is the bridge between our sampler and the TGSI translator.
- */
-struct lp_llvm_sampler_soa
-{
- struct lp_build_sampler_soa base;
-
- struct llvmpipe_sampler_dynamic_state dynamic_state;
- unsigned nr_samplers;
-};
-
-
-struct llvmpipe_image_dynamic_state
-{
- struct lp_sampler_dynamic_state base;
-
- const struct lp_image_static_state *static_state;
-};
-
-
-/**
- * This is the bridge between our images and the TGSI translator.
- */
-struct lp_llvm_image_soa
-{
- struct lp_build_image_soa base;
-
- struct llvmpipe_image_dynamic_state dynamic_state;
- unsigned nr_images;
-};
-
#if LP_USE_TEXTURE_CACHE
static LLVMValueRef
lp_llvm_texture_cache_ptr(struct gallivm_state *gallivm,
@@ -112,166 +66,18 @@ lp_llvm_texture_cache_ptr(struct gallivm_state *gallivm,
return lp_jit_thread_data_cache(gallivm, thread_data_type, thread_data_ptr);
}
#endif
-
-/**
- * Fetch filtered values from texture.
- * The 'texel' parameter returns four vectors corresponding to R, G, B, A.
- */
-static void
-lp_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base,
- struct gallivm_state *gallivm,
- const struct lp_sampler_params *params)
-{
- struct lp_llvm_sampler_soa *sampler = (struct lp_llvm_sampler_soa *)base;
- const unsigned texture_index = params->texture_index;
- const unsigned sampler_index = params->sampler_index;
-
- assert(sampler_index < PIPE_MAX_SAMPLERS);
- assert(texture_index < PIPE_MAX_SHADER_SAMPLER_VIEWS);
-
- if (LP_PERF & PERF_NO_TEX) {
- lp_build_sample_nop(gallivm, params->type, params->coords, params->texel);
- return;
- }
-
- if (params->texture_index_offset) {
- LLVMValueRef unit =
- LLVMBuildAdd(gallivm->builder, params->texture_index_offset,
- lp_build_const_int32(gallivm, texture_index), "");
-
- struct lp_build_sample_array_switch switch_info;
- memset(&switch_info, 0, sizeof(switch_info));
- lp_build_sample_array_init_soa(&switch_info, gallivm, params, unit,
- 0, sampler->nr_samplers);
- // build the switch cases
- for (unsigned i = 0; i < sampler->nr_samplers; i++) {
- lp_build_sample_array_case_soa(&switch_info, i,
- &sampler->dynamic_state.static_state[i].texture_state,
- &sampler->dynamic_state.static_state[i].sampler_state,
- &sampler->dynamic_state.base);
- }
- lp_build_sample_array_fini_soa(&switch_info);
- } else {
- lp_build_sample_soa(&sampler->dynamic_state.static_state[texture_index].texture_state,
- &sampler->dynamic_state.static_state[sampler_index].sampler_state,
- &sampler->dynamic_state.base,
- gallivm, params);
- }
-}
-
-
-/**
- * Fetch the texture size.
- */
-static void
-lp_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
- struct gallivm_state *gallivm,
- const struct lp_sampler_size_query_params *params)
-{
- struct lp_llvm_sampler_soa *sampler = (struct lp_llvm_sampler_soa *)base;
-
- assert(params->texture_unit < PIPE_MAX_SHADER_SAMPLER_VIEWS);
-
- lp_build_size_query_soa(gallivm,
- &sampler->dynamic_state.static_state[params->texture_unit].texture_state,
- &sampler->dynamic_state.base,
- params);
-}
-
-
struct lp_build_sampler_soa *
lp_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state,
unsigned nr_samplers)
{
- assert(static_state);
+ struct lp_build_sampler_soa *sampler;
- struct lp_llvm_sampler_soa *sampler = CALLOC_STRUCT(lp_llvm_sampler_soa);
- if (!sampler)
- return NULL;
-
- sampler->base.emit_tex_sample = lp_llvm_sampler_soa_emit_fetch_texel;
- sampler->base.emit_size_query = lp_llvm_sampler_soa_emit_size_query;
-
- lp_build_jit_fill_sampler_dynamic_state(&sampler->dynamic_state.base);
+ sampler = lp_bld_llvm_sampler_soa_create(static_state, nr_samplers);
#if LP_USE_TEXTURE_CACHE
sampler->dynamic_state.base.cache_ptr = lp_llvm_texture_cache_ptr;
#endif
-
- sampler->dynamic_state.static_state = static_state;
-
- sampler->nr_samplers = nr_samplers;
- return &sampler->base;
-}
-
-
-static void
-lp_llvm_image_soa_emit_op(const struct lp_build_image_soa *base,
- struct gallivm_state *gallivm,
- const struct lp_img_params *params)
-{
- struct lp_llvm_image_soa *image = (struct lp_llvm_image_soa *)base;
- const unsigned image_index = params->image_index;
- assert(image_index < PIPE_MAX_SHADER_IMAGES);
-
- if (params->image_index_offset) {
- struct lp_build_img_op_array_switch switch_info;
- memset(&switch_info, 0, sizeof(switch_info));
- LLVMValueRef unit = LLVMBuildAdd(gallivm->builder,
- params->image_index_offset,
- lp_build_const_int32(gallivm,
- image_index), "");
-
- lp_build_image_op_switch_soa(&switch_info, gallivm, params,
- unit, 0, image->nr_images);
-
- for (unsigned i = 0; i < image->nr_images; i++) {
- lp_build_image_op_array_case(&switch_info, i,
- &image->dynamic_state.static_state[i].image_state,
- &image->dynamic_state.base);
- }
- lp_build_image_op_array_fini_soa(&switch_info);
- } else {
- lp_build_img_op_soa(&image->dynamic_state.static_state[image_index].image_state,
- &image->dynamic_state.base,
- gallivm, params, params->outdata);
- }
-}
-
-
-/**
- * Fetch the texture size.
- */
-static void
-lp_llvm_image_soa_emit_size_query(const struct lp_build_image_soa *base,
- struct gallivm_state *gallivm,
- const struct lp_sampler_size_query_params *params)
-{
- struct lp_llvm_image_soa *image = (struct lp_llvm_image_soa *)base;
-
- assert(params->texture_unit < PIPE_MAX_SHADER_IMAGES);
-
- lp_build_size_query_soa(gallivm,
- &image->dynamic_state.static_state[params->texture_unit].image_state,
- &image->dynamic_state.base,
- params);
+ return sampler;
}
-struct lp_build_image_soa *
-lp_llvm_image_soa_create(const struct lp_image_static_state *static_state,
- unsigned nr_images)
-{
- struct lp_llvm_image_soa *image = CALLOC_STRUCT(lp_llvm_image_soa);
- if (!image)
- return NULL;
-
- image->base.emit_op = lp_llvm_image_soa_emit_op;
- image->base.emit_size_query = lp_llvm_image_soa_emit_size_query;
-
- lp_build_jit_fill_image_dynamic_state(&image->dynamic_state.base);
- image->dynamic_state.static_state = static_state;
-
- image->nr_images = nr_images;
- return &image->base;
-}
diff --git a/src/gallium/drivers/llvmpipe/lp_tex_sample.h b/src/gallium/drivers/llvmpipe/lp_tex_sample.h
index 480aaddaac2..9e8baa0606c 100644
--- a/src/gallium/drivers/llvmpipe/lp_tex_sample.h
+++ b/src/gallium/drivers/llvmpipe/lp_tex_sample.h
@@ -31,37 +31,14 @@
#include "gallivm/lp_bld.h"
-
+struct lp_build_sampler_soa;
struct lp_sampler_static_state;
-struct lp_image_static_state;
-
/**
* Whether texture cache is used for s3tc textures.
*/
#define LP_USE_TEXTURE_CACHE 0
-/**
- * Pure-LLVM texture sampling code generator.
- *
- */
struct lp_build_sampler_soa *
-lp_llvm_sampler_soa_create(const struct lp_sampler_static_state *key,
+lp_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state,
unsigned nr_samplers);
-
-static inline void
-lp_llvm_sampler_soa_destroy(struct lp_build_sampler_soa *sampler)
-{
- FREE(sampler);
-}
-
-struct lp_build_image_soa *
-lp_llvm_image_soa_create(const struct lp_image_static_state *key,
- unsigned nr_images);
-
-static inline void
-lp_llvm_image_soa_destroy(struct lp_build_image_soa *image)
-{
- FREE(image);
-}
-
#endif /* LP_TEX_SAMPLE_H */