spirv: Add an option for making FragCoord a sysval
authorConnor Abbott <cwabbott0@gmail.com>
Mon, 13 May 2019 13:32:26 +0000 (15:32 +0200)
committerConnor Abbott <cwabbott0@gmail.com>
Mon, 8 Jul 2019 12:14:53 +0000 (14:14 +0200)
On AMD, FragCoord should be a sysval because it is handled separately
from all the other inputs. We were already doing this in radeonsi, but
we weren't doing it with radv. It'll be much more annoying to handle
VARYING_SLOT_POS in fragment shaders when we let NIR lower FS inputs for
us, so here we add an option so that radv can get it as a system value.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/compiler/spirv/nir_spirv.h
src/compiler/spirv/vtn_variables.c

index c4381bdf62e3e0283e72b2ae11c39277587d91e8..d427a9a1973aebd45a8aea23608a0e21ff7a5724 100644 (file)
@@ -70,6 +70,11 @@ struct spirv_to_nir_options {
    /* Whether or not to lower all UBO/SSBO access to offsets up-front. */
    bool lower_ubo_ssbo_access_to_offsets;
 
+   /* Whether to make FragCoord to a system value, the same as
+    * GLSLFragCoordIsSysVal in GLSL.
+    */
+   bool frag_coord_is_sysval;
+
    struct spirv_supported_capabilities caps;
 
    /* Address format for various kinds of pointers. */
index b7ec2edd06ca7bb091344470931e42a31c53cb3d..d2d684f11bb6d10b670cdd0550fcc68472ed159d 100644 (file)
@@ -1295,8 +1295,13 @@ vtn_get_builtin_location(struct vtn_builder *b,
       set_mode_system_value(b, mode);
       break;
    case SpvBuiltInFragCoord:
-      *location = VARYING_SLOT_POS;
       vtn_assert(*mode == nir_var_shader_in);
+      if (b->options && b->options->frag_coord_is_sysval) {
+         *mode = nir_var_system_value;
+         *location = SYSTEM_VALUE_FRAG_COORD;
+      } else {
+         *location = VARYING_SLOT_POS;
+      }
       break;
    case SpvBuiltInPointCoord:
       *location = VARYING_SLOT_PNTC;