lavapipe: Add lvp_nir_lower_push_constants

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39496>
This commit is contained in:
Konstantin Seurer 2025-04-25 18:23:01 +02:00 committed by Marge Bot
parent a4bdc0ba0d
commit a12e7c85f5
4 changed files with 43 additions and 14 deletions

View file

@ -16,6 +16,7 @@ liblvp_files = files(
'nir/lvp_nir_lower_exec_graph.c',
'nir/lvp_nir_lower_input_attachments.c',
'nir/lvp_nir_lower_pipeline_layout.c',
'nir/lvp_nir_lower_push_constants.c',
'nir/lvp_nir_lower_ray_queries.c',
'nir/lvp_nir_lower_sparse_residency.c',
'nir/lvp_nir_opt_robustness.c',

View file

@ -114,6 +114,8 @@ void lvp_lower_pipeline_layout(const struct lvp_device *device,
struct lvp_pipeline_layout *layout,
nir_shader *shader);
bool lvp_nir_lower_push_constants(nir_shader *shader);
bool lvp_nir_lower_ray_queries(struct nir_shader *shader);
bool lvp_nir_lower_sparse_residency(struct nir_shader *shader);

View file

@ -196,16 +196,6 @@ lower_load_ubo(nir_builder *b, nir_intrinsic_instr *intrin, void *data_cb)
return true;
}
static void
lower_push_constant(nir_builder *b, nir_intrinsic_instr *intrin, void *data_cb)
{
nir_def *load = nir_load_ubo(b, intrin->def.num_components, intrin->def.bit_size,
nir_imm_int(b, 0), intrin->src[0].ssa,
.range = nir_intrinsic_range(intrin));
nir_def_rewrite_uses(&intrin->def, load);
nir_instr_remove(&intrin->instr);
}
static bool
lower_vri_instr(struct nir_builder *b, nir_instr *instr, void *data_cb)
{
@ -260,10 +250,6 @@ lower_vri_instr(struct nir_builder *b, nir_instr *instr, void *data_cb)
lower_image_intrinsic(b, intrin, data_cb);
return true;
case nir_intrinsic_load_push_constant:
lower_push_constant(b, intrin, data_cb);
return true;
default:
return false;
}

View file

@ -0,0 +1,40 @@
/*
* Copyright © 2025 Valve Corporation
* SPDX-License-Identifier: MIT
*/
#include "lvp_private.h"
#include "lvp_nir.h"
static void
lower_push_constant(nir_builder *b, nir_intrinsic_instr *intrin, void *data_cb)
{
nir_def *load = nir_load_ubo(b, intrin->def.num_components, intrin->def.bit_size,
nir_imm_int(b, 0), intrin->src[0].ssa,
.range = nir_intrinsic_range(intrin));
nir_def_rewrite_uses(&intrin->def, load);
nir_instr_remove(&intrin->instr);
}
static bool
pass(struct nir_builder *b, nir_intrinsic_instr *intr, void *data)
{
b->cursor = nir_before_instr(&intr->instr);
if (intr->intrinsic != nir_intrinsic_load_push_constant)
return false;
nir_def *load = nir_load_ubo(b, intr->def.num_components, intr->def.bit_size,
nir_imm_int(b, 0), intr->src[0].ssa,
.range = nir_intrinsic_range(intr));
nir_def_replace(&intr->def, load);
return true;
}
bool
lvp_nir_lower_push_constants(nir_shader *shader)
{
nir_shader_intrinsics_pass(shader, pass, nir_metadata_control_flow, NULL);
}