nir: Move V3D's "the shader was TGSI, ignore FS output types" flag to NIR.
authorEric Anholt <eric@anholt.net>
Tue, 5 Feb 2019 18:22:30 +0000 (10:22 -0800)
committerEric Anholt <eric@anholt.net>
Tue, 5 Feb 2019 20:12:33 +0000 (12:12 -0800)
Ken's rework of mesa/st builtins to NIR means that we'll have more NIR
shaders with color output types that are mismatched with the render target
types.  Since this is behavior that GLSL doesn't require, add it as a
shader_info option so the driver can know that it needs to ignore the FS
output's base type in favor of the actual render target's.  This prevents
needing additional variants in several mesa/st paths (clear, pbo upload,
pbo download), given that the driver already has to handle the variants
for any TGSI being passed to it (from u_blitter, for example).

Reviewed-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/shader_info.h
src/gallium/auxiliary/nir/tgsi_to_nir.c
src/gallium/drivers/v3d/v3d_context.h
src/gallium/drivers/v3d/v3d_program.c

index c3dbe764961085aa3190efc7a9c04c9cca312019..3d87193875148a4b4e8e5a6b7695e2c90ecddd61 100644 (file)
@@ -199,6 +199,25 @@ typedef struct shader_info {
          bool sample_interlock_ordered;
          bool sample_interlock_unordered;
 
+         /**
+          * Flags whether NIR's base types on the FS color outputs should be
+          * ignored.
+          *
+          * GLSL requires that fragment shader output base types match the
+          * render target's base types for the behavior to be defined.  From
+          * the GL 4.6 spec:
+          *
+          *     "If the values written by the fragment shader do not match the
+          *      format(s) of the corresponding color buffer(s), the result is
+          *      undefined."
+          *
+          * However, for NIR shaders translated from TGSI, we don't have the
+          * output types any more, so the driver will need to do whatever
+          * fixups are necessary to handle effectively untyped data being
+          * output from the FS.
+          */
+         bool untyped_color_outputs;
+
          /** gl_FragDepth layout for ARB_conservative_depth. */
          enum gl_frag_depth_layout depth_layout;
       } fs;
index 10e24387849b090cafc3b610f602223f8baa64f6..4f30714a746d51b165a72aa7cf5ae17abd1b2026 100644 (file)
@@ -1798,6 +1798,9 @@ tgsi_to_nir(const void *tgsi_tokens,
                                   options);
    s = c->build.shader;
 
+   if (s->info.stage == MESA_SHADER_FRAGMENT)
+      s->info.fs.untyped_color_outputs = true;
+
    s->num_inputs = scan.file_max[TGSI_FILE_INPUT] + 1;
    s->num_uniforms = scan.const_file_max[0] + 1;
    s->num_outputs = scan.file_max[TGSI_FILE_OUTPUT] + 1;
index f8f0e64ef9d2a753417c768aa77c29f0b62ce47c..f3309cc3e513dd30d80428fed1d83063f18886b3 100644 (file)
@@ -176,13 +176,6 @@ struct v3d_uncompiled_shader {
         uint16_t tf_specs[16];
         uint16_t tf_specs_psiz[16];
         uint32_t num_tf_specs;
-
-        /**
-         * Flag for if the NIR in this shader originally came from TGSI.  If
-         * so, we need to do some fixups at compile time, due to missing
-         * information in TGSI that exists in NIR.
-         */
-        bool was_tgsi;
 };
 
 struct v3d_compiled_shader {
index 567af2ead440bdadfa5ac971107a5a797d5434ea..bebcf196ee8c82cf8c114e12408e087f2a224dbf 100644 (file)
@@ -277,8 +277,6 @@ v3d_shader_state_create(struct pipe_context *pctx,
                         fprintf(stderr, "\n");
                 }
                 s = tgsi_to_nir(cso->tokens, &v3d_nir_options);
-
-                so->was_tgsi = true;
         }
 
         nir_variable_mode lower_mode = nir_var_all & ~nir_var_uniform;
@@ -488,6 +486,7 @@ v3d_update_compiled_fs(struct v3d_context *v3d, uint8_t prim_mode)
         struct v3d_job *job = v3d->job;
         struct v3d_fs_key local_key;
         struct v3d_fs_key *key = &local_key;
+        nir_shader *s = v3d->prog.bind_fs->base.ir.nir;
 
         if (!(v3d->dirty & (VC5_DIRTY_PRIM_MODE |
                             VC5_DIRTY_BLEND |
@@ -546,7 +545,7 @@ v3d_update_compiled_fs(struct v3d_context *v3d, uint8_t prim_mode)
                         key->f32_color_rb |= 1 << i;
                 }
 
-                if (v3d->prog.bind_fs->was_tgsi) {
+                if (s->info.fs.untyped_color_outputs) {
                         if (util_format_is_pure_uint(cbuf->format))
                                 key->uint_color_rb |= 1 << i;
                         else if (util_format_is_pure_sint(cbuf->format))