nir/lower_tex: support projector lowering per sampler type
authorRob Clark <robclark@freedesktop.org>
Wed, 16 Sep 2015 16:56:58 +0000 (12:56 -0400)
committerRob Clark <robclark@freedesktop.org>
Sat, 19 Sep 2015 01:07:49 +0000 (21:07 -0400)
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 <robclark@freedesktop.org>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/nir/nir.h
src/glsl/nir/nir_lower_tex.c
src/mesa/drivers/dri/i965/brw_nir.c

index c484d8e81ce43db392901c6e1da0c9ccf65b703b..4600fb0a744796aa40f8a5d9e4f28dce046c7b81 100644 (file)
@@ -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);
index b3efb972cfe2b5bfb1ec652cd6e071c1a4e66dc2..281fc9f3e8f0444d3d64131d942071a3f5440455 100644 (file)
 #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);
    }
 }
index 0d5b6dd7291c2ad0de5eb66eb520806cbaefba89..b47b87e07dd58d7c0d485610b09ba8000cc87599 100644 (file)
@@ -80,6 +80,9 @@ brw_create_nir(struct brw_context *brw,
    struct gl_context *ctx = &brw->ctx;
    const nir_shader_compiler_options *options =
       ctx->Const.ShaderCompilerOptions[stage].NirOptions;
+   static const nir_lower_tex_options tex_options = {
+      .lower_txp = ~0,
+   };
    struct gl_shader *shader = shader_prog ? shader_prog->_LinkedShaders[stage] : NULL;
    bool debug_enabled = INTEL_DEBUG & intel_debug_flag_for_shader_stage(stage);
    nir_shader *nir;
@@ -96,7 +99,7 @@ brw_create_nir(struct brw_context *brw,
    nir_lower_global_vars_to_local(nir);
    nir_validate_shader(nir);
 
-   nir_lower_tex(nir);
+   nir_lower_tex(nir, &tex_options);
    nir_validate_shader(nir);
 
    nir_normalize_cubemap_coords(nir);