From b1c63365fcdcb29c4d53c1e895a0703005e15bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 24 Dec 2024 13:21:48 -0500 Subject: [PATCH] st/mesa: switch PBO create_fs to IO intrinsics Reviewed-by: Alyssa Rosenzweig Part-of: --- src/mesa/state_tracker/st_pbo.c | 41 +++++++++++++++------------------ 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c index ece71d62a36..04fd6bbca95 100644 --- a/src/mesa/state_tracker/st_pbo.c +++ b/src/mesa/state_tracker/st_pbo.c @@ -394,16 +394,14 @@ create_fs(struct st_context *st, bool download, enum pipe_format format, bool need_layer) { - struct pipe_screen *screen = st->screen; const nir_shader_compiler_options *options = st_get_nir_compiler_options(st, MESA_SHADER_FRAGMENT); - bool pos_is_sysval = - screen->get_param(screen, PIPE_CAP_FS_POSITION_IS_SYSVAL); nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, options, download ? "st/pbo download FS" : "st/pbo upload FS"); + b.shader->info.io_lowered = true; nir_def *zero = nir_imm_int(&b, 0); @@ -413,14 +411,18 @@ create_fs(struct st_context *st, bool download, b.shader->num_uniforms += 4; nir_def *param = nir_load_var(&b, param_var); - nir_variable *fragcoord; - if (pos_is_sysval) - fragcoord = nir_create_variable_with_location(b.shader, nir_var_system_value, - SYSTEM_VALUE_FRAG_COORD, glsl_vec4_type()); - else - fragcoord = nir_create_variable_with_location(b.shader, nir_var_shader_in, - VARYING_SLOT_POS, glsl_vec4_type()); - nir_def *coord = nir_load_var(&b, fragcoord); + nir_def *coord; + if (st->ctx->Const.GLSLFragCoordIsSysVal) { + nir_variable *fragcoord = + nir_create_variable_with_location(b.shader, nir_var_system_value, + SYSTEM_VALUE_FRAG_COORD, glsl_vec4_type()); + coord = nir_load_var(&b, fragcoord); + } else { + nir_def *baryc = nir_load_barycentric_pixel(&b, 32, .interp_mode = INTERP_MODE_SMOOTH); + coord = nir_load_interpolated_input(&b, 4, 32, baryc, + nir_imm_int(&b, 0), + .io_semantics.location = VARYING_SLOT_POS); + } /* When st->pbo.layers == false, it is guaranteed we only have a single * layer. But we still need the "layer" variable to add the "array" @@ -435,12 +437,10 @@ create_fs(struct st_context *st, bool download, target == PIPE_TEXTURE_CUBE_ARRAY) { if (need_layer) { assert(st->pbo.layers); - nir_variable *var = nir_create_variable_with_location(b.shader, nir_var_shader_in, - VARYING_SLOT_LAYER, glsl_int_type()); - var->data.interpolation = INTERP_MODE_FLAT; - layer = nir_load_var(&b, var); - } - else { + layer = nir_load_input(&b, 1, 32, nir_imm_int(&b, 0), + .dest_type = nir_type_int32, + .io_semantics.location = VARYING_SLOT_LAYER); + } else { layer = zero; } } @@ -562,11 +562,8 @@ create_fs(struct st_context *st, bool download, .src_type = nir_types[conversion], .image_dim = GLSL_SAMPLER_DIM_BUF); } else { - nir_variable *color = - nir_create_variable_with_location(b.shader, nir_var_shader_out, - FRAG_RESULT_COLOR, glsl_vec4_type()); - - nir_store_var(&b, color, result, TGSI_WRITEMASK_XYZW); + nir_store_output(&b, result, nir_imm_int(&b, 0), + .io_semantics.location = FRAG_RESULT_COLOR); } return st_nir_finish_builtin_shader(st, b.shader);