Module: Mesa Branch: staging/23.0 Commit: c0592be5973c2d6e9aea923cadeb1f0355db4788 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c0592be5973c2d6e9aea923cadeb1f0355db4788
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) Conflicts: src/gallium/drivers/zink/ci/zink-lvp-fails.txt src/gallium/drivers/zink/zink_compiler.c --- .pick_status.json | 2 +- src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt | 6 ---- src/gallium/drivers/zink/ci/zink-lvp-fails.txt | 4 --- .../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(+), 26 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 6e4d1abee58..16ecb8c31a9 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": 1, "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..9f07afdb0f6 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,6 @@ 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;
