Do nir_lower_viewport_transform when driver set PIPE_CAP_NIR_VS_LOWER_VIEWPORT_TRANSFORM in vertex shader.
Signed-off-by: Qiang Yu <yuq...@gmail.com> --- src/gallium/auxiliary/util/u_screen.c | 3 +++ src/gallium/include/pipe/p_defines.h | 1 + src/mesa/state_tracker/st_glsl_to_nir.cpp | 23 +++++++++++++++++++++++ src/mesa/state_tracker/st_nir.h | 4 ++++ src/mesa/state_tracker/st_program.c | 1 + 5 files changed, 32 insertions(+) diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c index b902c083ad4..c3b8252197f 100644 --- a/src/gallium/auxiliary/util/u_screen.c +++ b/src/gallium/auxiliary/util/u_screen.c @@ -344,6 +344,9 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen, case PIPE_CAP_COMPUTE_GRID_INFO_LAST_BLOCK: return 0; + case PIPE_CAP_NIR_VS_LOWER_VIEWPORT_TRANSFORM: + return 0; + default: unreachable("bad PIPE_CAP_*"); } diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index ebc44d7a75e..1d6b69453e8 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -864,6 +864,7 @@ enum pipe_cap PIPE_CAP_NIR_COMPACT_ARRAYS, PIPE_CAP_MAX_VARYINGS, PIPE_CAP_COMPUTE_GRID_INFO_LAST_BLOCK, + PIPE_CAP_NIR_VS_LOWER_VIEWPORT_TRANSFORM, }; /** diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index e5d5fe21e27..87e457dccbf 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -738,6 +738,26 @@ st_nir_lower_wpos_ytransform(struct nir_shader *nir, } } +void +st_nir_lower_viewport_transform(struct nir_shader *nir, + struct gl_program *prog, + struct pipe_screen *pscreen) +{ + if (nir->info.stage != MESA_SHADER_VERTEX || + !pscreen->get_param(pscreen, PIPE_CAP_NIR_VS_LOWER_VIEWPORT_TRANSFORM)) + return; + + static const nir_lower_viewport_transform_options viewport_options = { + .scale = { STATE_INTERNAL, STATE_VIEWPORT_SCALE }, + .translate = { STATE_INTERNAL, STATE_VIEWPORT_TRANSLATE }, + }; + + NIR_PASS_V(nir, nir_lower_viewport_transform, &viewport_options); + + _mesa_add_state_reference(prog->Parameters, viewport_options.scale); + _mesa_add_state_reference(prog->Parameters, viewport_options.translate); +} + bool st_link_nir(struct gl_context *ctx, struct gl_shader_program *shader_program) @@ -793,6 +813,9 @@ st_link_nir(struct gl_context *ctx, NIR_PASS_V(nir, st_nir_lower_wpos_ytransform, shader->Program, st->pipe->screen); + NIR_PASS_V(nir, st_nir_lower_viewport_transform, shader->Program, + st->pipe->screen); + NIR_PASS_V(nir, nir_lower_system_values); NIR_PASS_V(nir, nir_lower_clip_cull_distance_arrays); diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index 94eae84402e..100ab0f7125 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -41,6 +41,10 @@ void st_nir_lower_wpos_ytransform(struct nir_shader *nir, struct gl_program *prog, struct pipe_screen *pscreen); +void st_nir_lower_viewport_transform(struct nir_shader *nir, + struct gl_program *prog, + struct pipe_screen *pscreen); + void st_finalize_nir(struct st_context *st, struct gl_program *prog, struct gl_shader_program *shader_program, struct nir_shader *nir); diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 9f6e492d6fb..cf1ae6e65a8 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -442,6 +442,7 @@ st_translate_prog_to_nir(struct st_context *st, struct gl_program *prog, nir_validate_shader(nir, "after st/ptn lower_regs_to_ssa"); NIR_PASS_V(nir, st_nir_lower_wpos_ytransform, prog, st->pipe->screen); + NIR_PASS_V(nir, st_nir_lower_viewport_transform, prog, st->pipe->screen); NIR_PASS_V(nir, nir_lower_system_values); /* Optimise NIR */ -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev