nir: Record info->fs.pixel_center_integer in lower_system_values
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 2 Feb 2019 08:43:42 +0000 (00:43 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 5 Feb 2019 21:51:52 +0000 (13:51 -0800)
radeonsi uses a system value for gl_FragCoord rather than an input var.
These get translated into load_frag_coord NIR intrinsics, which lose the
pixel_center_integer and origin_upper_left decorations.  To cope with
this, Tim added a shader_info field for pixel_center_integer, and made
glsl_to_nir set it accordingly.

prog_to_nir also needs to handle these fragcoord conventions.  Instead
of duplicating the logic to set the info field, just move it to
nir_lower_system_values so it'll happen regardless of who makes the NIR.

(For what it's worth, we don't need an info flag for origin_upper_left,
because radeonsi lowers origin conventions in nir_lower_wpos_ytransform
before nir_lower_system_values destroys the variable and qualifiers.)

Reviewed-by: Eric Anholt <eric@anholt.net>
src/compiler/glsl/glsl_to_nir.cpp
src/compiler/nir/nir_lower_system_values.c

index d2db0f9..90aa21f 100644 (file)
@@ -389,11 +389,6 @@ nir_visitor::visit(ir_variable *ir)
    var->data.pixel_center_integer = ir->data.pixel_center_integer;
    var->data.location_frac = ir->data.location_frac;
 
-   if (var->data.pixel_center_integer) {
-      assert(shader->info.stage == MESA_SHADER_FRAGMENT);
-      shader->info.fs.pixel_center_integer = true;
-   }
-
    switch (ir->data.depth_layout) {
    case ir_depth_layout_none:
       var->data.depth_layout = nir_depth_layout_none;
index 68b0ea8..7c1aa5f 100644 (file)
@@ -254,6 +254,12 @@ convert_block(nir_block *block, nir_builder *b)
          break;
       }
 
+      case SYSTEM_VALUE_FRAG_COORD:
+         assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
+         b->shader->info.fs.pixel_center_integer =
+            var->data.pixel_center_integer;
+         break;
+
       default:
          break;
       }