summaryrefslogtreecommitdiffstats
path: root/src/glsl/nir
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2015-09-16 12:56:58 -0400
committerRob Clark <[email protected]>2015-09-18 21:07:49 -0400
commitfaf5f174ddbc7680f6947ceababb94fdb552bcdb (patch)
treee397325f701a364dcc5010016ccee4a4a852485c /src/glsl/nir
parentf83ba7bc41a381a0e52c456431dbe1a15176ffb4 (diff)
nir/lower_tex: support projector lowering per sampler type
Some hardware, such as adreno a3xx, supports txp on some but not all sampler types. In this case we want more fine grained control over which texture projectors get lowered. v2: split out nir_lower_tex_options struct to make it easier to add the additional parameters coming in the following patches Signed-off-by: Rob Clark <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/glsl/nir')
-rw-r--r--src/glsl/nir/nir.h13
-rw-r--r--src/glsl/nir/nir_lower_tex.c26
2 files changed, 30 insertions, 9 deletions
diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
index c484d8e81ce..4600fb0a744 100644
--- a/src/glsl/nir/nir.h
+++ b/src/glsl/nir/nir.h
@@ -1836,7 +1836,18 @@ void nir_lower_samplers(nir_shader *shader,
const struct gl_shader_program *shader_program);
void nir_lower_system_values(nir_shader *shader);
-void nir_lower_tex(nir_shader *shader);
+
+typedef struct nir_lower_tex_options {
+ /**
+ * bitmask of (1 << GLSL_SAMPLER_DIM_x) to control for which
+ * sampler types a texture projector is lowered.
+ */
+ unsigned lower_txp;
+} nir_lower_tex_options;
+
+void nir_lower_tex(nir_shader *shader,
+ const nir_lower_tex_options *options);
+
void nir_lower_idiv(nir_shader *shader);
void nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables);
diff --git a/src/glsl/nir/nir_lower_tex.c b/src/glsl/nir/nir_lower_tex.c
index b3efb972cfe..281fc9f3e8f 100644
--- a/src/glsl/nir/nir_lower_tex.c
+++ b/src/glsl/nir/nir_lower_tex.c
@@ -30,6 +30,11 @@
#include "nir.h"
#include "nir_builder.h"
+typedef struct {
+ nir_builder b;
+ const nir_lower_tex_options *options;
+} lower_tex_state;
+
static void
project_src(nir_builder *b, nir_tex_instr *tex)
{
@@ -109,37 +114,42 @@ project_src(nir_builder *b, nir_tex_instr *tex)
static bool
nir_lower_tex_block(nir_block *block, void *void_state)
{
- nir_builder *b = void_state;
+ lower_tex_state *state = void_state;
+ nir_builder *b = &state->b;
nir_foreach_instr_safe(block, instr) {
if (instr->type != nir_instr_type_tex)
continue;
nir_tex_instr *tex = nir_instr_as_tex(instr);
+ bool lower_txp = !!(state->options->lower_txp & (1 << tex->sampler_dim));
+
+ if (lower_txp)
+ project_src(b, tex);
- project_src(b, tex);
}
return true;
}
static void
-nir_lower_tex_impl(nir_function_impl *impl)
+nir_lower_tex_impl(nir_function_impl *impl, lower_tex_state *state)
{
- nir_builder b;
- nir_builder_init(&b, impl);
+ nir_builder_init(&state->b, impl);
- nir_foreach_block(impl, nir_lower_tex_block, &b);
+ nir_foreach_block(impl, nir_lower_tex_block, state);
nir_metadata_preserve(impl, nir_metadata_block_index |
nir_metadata_dominance);
}
void
-nir_lower_tex(nir_shader *shader)
+nir_lower_tex(nir_shader *shader, const nir_lower_tex_options *options)
{
+ lower_tex_state state;
+ state.options = options;
nir_foreach_overload(shader, overload) {
if (overload->impl)
- nir_lower_tex_impl(overload->impl);
+ nir_lower_tex_impl(overload->impl, &state);
}
}