Module: Mesa
Branch: staging/23.0
Commit: ad2d05320112e6ed26bebbca3f83f10bac08a547
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ad2d05320112e6ed26bebbca3f83f10bac08a547

Author: SoroushIMG <[email protected]>
Date:   Wed Feb  1 20:37:26 2023 +0000

zink: fix pointcoord y inversion

Point sprite coordinates in general need to be inverted,
not just the texcoords converted to point sprite.

Move point coord y inversion out to its own pass.
Fixes GTF-GL46.gtf21.GL2FixedTests.point_sprites.point_sprites
with FBO dEQP surface.

cc: mesa-stable

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21050>
(cherry-picked from commit 782f1e9e010452850853b9791e673f2e1a7a671e)

---

 .pick_status.json                                  |  2 +-
 src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt |  6 ----
 src/gallium/drivers/zink/ci/zink-lvp-fails.txt     |  3 --
 .../drivers/zink/ci/zink-radv-navi10-fails.txt     |  3 --
 .../drivers/zink/ci/zink-radv-vangogh-fails.txt    |  3 --
 src/gallium/drivers/zink/zink_compiler.c           | 34 +++++++++++++++++++---
 src/gallium/drivers/zink/zink_program.h            |  8 ++---
 src/gallium/drivers/zink/zink_shader_keys.h        |  2 +-
 8 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 6e4d1abee58..3d34b11f653 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -769,7 +769,7 @@
         "description": "zink: fix pointcoord y inversion",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 3,
         "main_sha": null,
         "because_sha": null
     },
diff --git a/src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt 
b/src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt
index 2f0ba71354c..1732b5c6d3c 100644
--- a/src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt
+++ b/src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt
@@ -202,8 +202,6 @@ glx@glx-visuals-depth -pixmap,Crash
 glx@glx-visuals-stencil -pixmap,Crash
 glx@glx-visuals-stencil,Crash
 
-shaders@glsl-fs-pointcoord,Fail
-
 shaders@point-vertex-id divisor,Fail
 shaders@point-vertex-id gl_instanceid divisor,Fail
 shaders@point-vertex-id gl_instanceid,Fail
@@ -340,16 +338,12 @@ spec@!opengl [email protected] line cull-back 
pv-first,Fail
 spec@!opengl [email protected] line cull-front pv-first,Fail
 spec@!opengl [email protected] pv-first,Fail
 
-spec@!opengl es 2.0@glsl-fs-pointcoord,Fail
-
 
spec@arb_arrays_of_arrays@execution@image_store@basic-imagestore-mixed-const-non-const-uniform-index,Fail
 
spec@arb_arrays_of_arrays@execution@image_store@basic-imagestore-mixed-const-non-const-uniform-index2,Fail
 
spec@arb_arrays_of_arrays@execution@image_store@basic-imagestore-non-const-uniform-index,Fail
 
 spec@arb_framebuffer_object@fbo-blit-scaled-linear,Fail
 
-spec@arb_framebuffer_object@fbo-gl_pointcoord,Fail
-
 spec@arb_gl_spirv@execution@xfb@vs_block_array,Fail
 
 spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-tf-separate,Fail
diff --git a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt 
b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
index ed5c2c92282..54d5bbc7e08 100644
--- a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
+++ b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
@@ -53,7 +53,6 @@ glx@glx_ext_import_context@imported context has same context 
id,Fail
 glx@glx_ext_import_context@make current- multi process,Fail
 glx@glx_ext_import_context@make current- single process,Fail
 glx@glx_ext_import_context@query context info,Fail
-shaders@glsl-fs-pointcoord,Fail
 shaders@point-vertex-id divisor,Fail
 shaders@point-vertex-id gl_instanceid,Fail
 shaders@point-vertex-id gl_instanceid divisor,Fail
@@ -92,9 +91,7 @@ spec@!opengl [email protected],Fail
 spec@!opengl 2.1@pbo,Fail
 spec@!opengl 2.1@pbo@test_polygon_stip,Fail
 spec@!opengl 2.1@polygon-stipple-fs,Fail
-spec@!opengl es 2.0@glsl-fs-pointcoord,Fail
 spec@arb_depth_texture@depth-tex-modes,Fail
-spec@arb_framebuffer_object@fbo-gl_pointcoord,Fail
 spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-tf-separate,Fail
 spec@arb_pipeline_statistics_query@arb_pipeline_statistics_query-frag,Fail
 spec@arb_point_sprite@arb_point_sprite-checkerboard,Fail
diff --git a/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt 
b/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt
index d1e7becb1d3..a43be002447 100644
--- a/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt
+++ b/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt
@@ -39,7 +39,6 @@ glx@glx-swap-pixmap-bad,Fail
 spec@arb_framebuffer_object@fbo-blit-scaled-linear,Fail
 
 
-shaders@glsl-fs-pointcoord,Fail
 shaders@point-vertex-id divisor,Fail
 shaders@point-vertex-id gl_instanceid divisor,Fail
 shaders@point-vertex-id gl_instanceid,Fail
@@ -60,7 +59,6 @@ spec@arb_fragment_program_shadow@txp-shadow2d,Fail
 spec@arb_fragment_program_shadow@txp-shadow2drect,Fail
 spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query,Fail
 
spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query@MS8,Fail
-spec@arb_framebuffer_object@fbo-gl_pointcoord,Fail
 spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-tf-separate,Fail
 
spec@arb_gpu_shader_fp64@execution@conversion@frag-conversion-explicit-dmat2-mat2,Fail
 
spec@arb_gpu_shader_fp64@execution@conversion@frag-conversion-explicit-dmat2x3-mat2x3,Fail
@@ -389,7 +387,6 @@ spec@!opengl 2.1@pbo,Fail
 spec@!opengl 2.1@pbo@test_polygon_stip,Fail
 spec@!opengl 2.1@polygon-stipple-fs,Fail
 spec@!opengl 3.0@clearbuffer-depth-cs-probe,Fail
-spec@!opengl es 2.0@glsl-fs-pointcoord,Fail
 spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail
 spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail
 
diff --git a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt 
b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt
index 40ecddaa87d..4bce7fa6115 100644
--- a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt
+++ b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt
@@ -39,7 +39,6 @@ glx@glx-swap-pixmap-bad,Fail
 spec@arb_framebuffer_object@fbo-blit-scaled-linear,Fail
 
 
-shaders@glsl-fs-pointcoord,Fail
 shaders@point-vertex-id divisor,Fail
 shaders@point-vertex-id gl_instanceid divisor,Fail
 shaders@point-vertex-id gl_instanceid,Fail
@@ -60,7 +59,6 @@ spec@arb_fragment_program_shadow@txp-shadow2d,Fail
 spec@arb_fragment_program_shadow@txp-shadow2drect,Fail
 spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query,Fail
 
spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query@MS8,Fail
-spec@arb_framebuffer_object@fbo-gl_pointcoord,Fail
 spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-tf-separate,Fail
 
spec@arb_gpu_shader_fp64@execution@conversion@frag-conversion-explicit-dmat2-mat2,Fail
 
spec@arb_gpu_shader_fp64@execution@conversion@frag-conversion-explicit-dmat2x3-mat2x3,Fail
@@ -389,7 +387,6 @@ spec@!opengl 2.1@pbo,Fail
 spec@!opengl 2.1@pbo@test_polygon_stip,Fail
 spec@!opengl 2.1@polygon-stipple-fs,Fail
 spec@!opengl 3.0@clearbuffer-depth-cs-probe,Fail
-spec@!opengl es 2.0@glsl-fs-pointcoord,Fail
 spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail
 spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail
 
diff --git a/src/gallium/drivers/zink/zink_compiler.c 
b/src/gallium/drivers/zink/zink_compiler.c
index 39be4f5ba42..7987590ffcb 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -2784,6 +2784,32 @@ prune_io(nir_shader *nir)
    NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_shader_temp, NULL);
 }
 
+static bool
+invert_point_coord_instr(nir_builder *b, nir_instr *instr, void *data)
+{
+   if (instr->type != nir_instr_type_intrinsic)
+      return false;
+   nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
+   if (intr->intrinsic != nir_intrinsic_load_deref)
+      return false;
+   nir_variable *deref_var = nir_intrinsic_get_var(intr, 0);
+   if (deref_var->data.location != VARYING_SLOT_PNTC)
+      return false;
+   b->cursor = nir_after_instr(instr);
+   nir_ssa_def *def = nir_vec2(b, nir_channel(b, &intr->dest.ssa, 0),
+                                  nir_fsub(b, nir_imm_float(b, 1.0), 
nir_channel(b, &intr->dest.ssa, 1)));
+   nir_ssa_def_rewrite_uses_after(&intr->dest.ssa, def, def->parent_instr);
+   return true;
+}
+
+static bool
+invert_point_coord(nir_shader *nir)
+{
+   if (!(nir->info.inputs_read & BITFIELD64_BIT(VARYING_SLOT_PNTC)))
+      return false;
+   return nir_shader_instructions_pass(nir, invert_point_coord_instr, 
nir_metadata_dominance, NULL);
+}
+
 VkShaderModule
 zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, 
nir_shader *base_nir, const struct zink_shader_key *key)
 {
@@ -2894,10 +2920,10 @@ zink_shader_compile(struct zink_screen *screen, struct 
zink_shader *zs, nir_shad
          if (zink_fs_key_base(key)->force_dual_color_blend && 
nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_DATA1)) {
             NIR_PASS_V(nir, lower_dual_blend);
          }
-         if (zink_fs_key_base(key)->coord_replace_bits) {
-            NIR_PASS_V(nir, nir_lower_texcoord_replace, 
zink_fs_key_base(key)->coord_replace_bits,
-                     false, zink_fs_key_base(key)->coord_replace_yinvert);
-         }
+         if (zink_fs_key_base(key)->coord_replace_bits)
+            NIR_PASS_V(nir, nir_lower_texcoord_replace, 
zink_fs_key_base(key)->coord_replace_bits, false, false);
+         if (zink_fs_key_base(key)->point_coord_yinvert)
+            NIR_PASS_V(nir, invert_point_coord);
          if (zink_fs_key_base(key)->force_persample_interp || 
zink_fs_key_base(key)->fbfetch_ms) {
             nir_foreach_shader_in_variable(var, nir)
                var->data.sample = true;
diff --git a/src/gallium/drivers/zink/zink_program.h 
b/src/gallium/drivers/zink/zink_program.h
index 806d722d014..0e76b8b2590 100644
--- a/src/gallium/drivers/zink/zink_program.h
+++ b/src/gallium/drivers/zink/zink_program.h
@@ -346,12 +346,12 @@ static inline void
 zink_set_fs_point_coord_key(struct zink_context *ctx)
 {
    const struct zink_fs_key_base *fs = zink_get_fs_base_key(ctx);
-   bool disable = ctx->gfx_pipeline_state.rast_prim != PIPE_PRIM_POINTS || 
!ctx->rast_state->base.sprite_coord_enable;
+   bool disable = ctx->gfx_pipeline_state.rast_prim != PIPE_PRIM_POINTS;
    uint8_t coord_replace_bits = disable ? 0 : 
ctx->rast_state->base.sprite_coord_enable;
-   bool coord_replace_yinvert = disable ? false : 
!!ctx->rast_state->base.sprite_coord_mode;
-   if (fs->coord_replace_bits != coord_replace_bits || 
fs->coord_replace_yinvert != coord_replace_yinvert) {
+   bool point_coord_yinvert = disable ? false : 
!!ctx->rast_state->base.sprite_coord_mode;
+   if (fs->coord_replace_bits != coord_replace_bits || fs->point_coord_yinvert 
!= point_coord_yinvert) {
       zink_set_fs_base_key(ctx)->coord_replace_bits = coord_replace_bits;
-      zink_set_fs_base_key(ctx)->coord_replace_yinvert = coord_replace_yinvert;
+      zink_set_fs_base_key(ctx)->point_coord_yinvert = point_coord_yinvert;
    }
 }
 
diff --git a/src/gallium/drivers/zink/zink_shader_keys.h 
b/src/gallium/drivers/zink/zink_shader_keys.h
index 6c19a021a0f..8e9565d8a06 100644
--- a/src/gallium/drivers/zink/zink_shader_keys.h
+++ b/src/gallium/drivers/zink/zink_shader_keys.h
@@ -67,7 +67,7 @@ struct zink_gs_key {
 };
 
 struct zink_fs_key_base {
-   bool coord_replace_yinvert : 1;
+   bool point_coord_yinvert : 1;
    bool samples : 1;
    bool force_dual_color_blend : 1;
    bool force_persample_interp : 1;

Reply via email to