nvk: Convert system values for gl_PointCoord and PointCoord into inputs
authorRebecca Mckeever <rebecca.mckeever@collabora.com>
Tue, 22 Nov 2022 00:45:01 +0000 (18:45 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:32:02 +0000 (21:32 +0000)
Currently, any attempt to use gl_PointCoord (GLSL) or PointCoord (SPIR-V)
results in an assert in codegen:

ERROR: unknown nir_intrinsic_op load_point_coord

This patch addresses the error by converting nir_intrinsic_load_point_coord
system value into VARYING_SLOT_PNTC. The following tests now pass:

dEQP-VK.glsl.builtin_var.simple.pointcoord
dEQP-VK.glsl.builtin_var.simple.pointcoord_uniform_frag
dEQP-VK.glsl.builtin_var.simple.pointcoord_uniform_vert

Closes: https://gitlab.freedesktop.org/nouveau/mesa/-/issues/33
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/vulkan/nvk_shader.c

index 1c5d2d9..41039e1 100644 (file)
@@ -203,6 +203,12 @@ lower_fragcoord_instr(nir_builder *b, nir_instr *instr, UNUSED void *_data)
                                  VARYING_SLOT_POS);
       val = nir_load_var(b, var);
       break;
+   case nir_intrinsic_load_point_coord:
+      var = find_or_create_input(b, glsl_vector_type(GLSL_TYPE_FLOAT, 2),
+                                 "gl_PointCoord",
+                                 VARYING_SLOT_PNTC);
+      val = nir_load_var(b, var);
+      break;
    case nir_intrinsic_load_sample_pos:
       var = find_or_create_input(b, glsl_vec4_type(),
                                  "gl_FragCoord",