This will let me use it in the ARB program code as well. --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 66 +++++++++++++---------- src/mesa/state_tracker/st_nir.h | 4 ++ 2 files changed, 41 insertions(+), 29 deletions(-)
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 911284401e0..c15bd7e511b 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -619,6 +619,41 @@ st_nir_link_shaders(nir_shader **producer, nir_shader **consumer, bool scalar) extern "C" { +void +st_nir_lower_wpos_ytransform(struct nir_shader *nir, + struct gl_program *prog, + struct pipe_screen *pscreen) +{ + if (nir->info.stage != MESA_SHADER_FRAGMENT) + return; + + static const gl_state_index16 wposTransformState[STATE_LENGTH] = { + STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM + }; + nir_lower_wpos_ytransform_options wpos_options = { { 0 } }; + + memcpy(wpos_options.state_tokens, wposTransformState, + sizeof(wpos_options.state_tokens)); + wpos_options.fs_coord_origin_upper_left = + pscreen->get_param(pscreen, + PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT); + wpos_options.fs_coord_origin_lower_left = + pscreen->get_param(pscreen, + PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT); + wpos_options.fs_coord_pixel_center_integer = + pscreen->get_param(pscreen, + PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER); + wpos_options.fs_coord_pixel_center_half_integer = + pscreen->get_param(pscreen, + PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER); + + if (nir_lower_wpos_ytransform(nir, &wpos_options)) { + nir_validate_shader(nir); + _mesa_add_state_reference(prog->Parameters, + wposTransformState); + } +} + bool st_link_nir(struct gl_context *ctx, struct gl_shader_program *shader_program) @@ -697,35 +732,8 @@ st_link_nir(struct gl_context *ctx, nir_shader *nir = shader->Program->nir; - /* fragment shaders may need : */ - if (nir->info.stage == MESA_SHADER_FRAGMENT) { - static const gl_state_index16 wposTransformState[STATE_LENGTH] = { - STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM - }; - nir_lower_wpos_ytransform_options wpos_options = { { 0 } }; - struct pipe_screen *pscreen = st->pipe->screen; - - memcpy(wpos_options.state_tokens, wposTransformState, - sizeof(wpos_options.state_tokens)); - wpos_options.fs_coord_origin_upper_left = - pscreen->get_param(pscreen, - PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT); - wpos_options.fs_coord_origin_lower_left = - pscreen->get_param(pscreen, - PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT); - wpos_options.fs_coord_pixel_center_integer = - pscreen->get_param(pscreen, - PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER); - wpos_options.fs_coord_pixel_center_half_integer = - pscreen->get_param(pscreen, - PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER); - - if (nir_lower_wpos_ytransform(nir, &wpos_options)) { - nir_validate_shader(nir); - _mesa_add_state_reference(shader->Program->Parameters, - wposTransformState); - } - } + NIR_PASS_V(nir, st_nir_lower_wpos_ytransform, shader->Program, + st->pipe->screen); NIR_PASS_V(nir, nir_lower_system_values); diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index aa6e32758e8..10f23c03ef6 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -38,6 +38,10 @@ void st_nir_lower_tex_src_plane(struct nir_shader *shader, unsigned free_slots, unsigned lower_2plane, unsigned lower_3plane); bool st_nir_lower_uniforms_to_ubo(struct nir_shader *shader); +void st_nir_lower_wpos_ytransform(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); -- 2.19.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev