mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-15 16:28:04 +02:00
ir3: don't cache driver param instructions
We create driver param instructions once we encounter their first use
and cache them for further uses. This creates problems when the first
use occurs in a block that doesn't dominate all further uses. This was
hit in practice with a driver param that was used both in the preamble
and in the main shader.
Fix this by simply not caching driver params. Since they are simply movs
from const regs, ir3_cp or ir3_cse should clean up most cases of
multiple uses.
Signed-off-by: Job Noorman <jnoorman@igalia.com>
Fixes: 8b0b81339b ("freedreno/ir3: add NIR compiler")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/15418
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41484>
This commit is contained in:
parent
131eb49121
commit
d8e1409948
2 changed files with 5 additions and 18 deletions
|
|
@ -3028,28 +3028,16 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
|
|||
break;
|
||||
case nir_intrinsic_load_base_vertex:
|
||||
case nir_intrinsic_load_first_vertex:
|
||||
if (!ctx->basevertex) {
|
||||
ctx->basevertex = create_driver_param(ctx, IR3_DP_VS(vtxid_base));
|
||||
}
|
||||
dst[0] = ctx->basevertex;
|
||||
dst[0] = create_driver_param(ctx, IR3_DP_VS(vtxid_base));
|
||||
break;
|
||||
case nir_intrinsic_load_is_indexed_draw:
|
||||
if (!ctx->is_indexed_draw) {
|
||||
ctx->is_indexed_draw = create_driver_param(ctx, IR3_DP_VS(is_indexed_draw));
|
||||
}
|
||||
dst[0] = ctx->is_indexed_draw;
|
||||
dst[0] = create_driver_param(ctx, IR3_DP_VS(is_indexed_draw));
|
||||
break;
|
||||
case nir_intrinsic_load_draw_id:
|
||||
if (!ctx->draw_id) {
|
||||
ctx->draw_id = create_driver_param(ctx, IR3_DP_VS(draw_id));
|
||||
}
|
||||
dst[0] = ctx->draw_id;
|
||||
dst[0] = create_driver_param(ctx, IR3_DP_VS(draw_id));
|
||||
break;
|
||||
case nir_intrinsic_load_base_instance:
|
||||
if (!ctx->base_instance) {
|
||||
ctx->base_instance = create_driver_param(ctx, IR3_DP_VS(instid_base));
|
||||
}
|
||||
dst[0] = ctx->base_instance;
|
||||
dst[0] = create_driver_param(ctx, IR3_DP_VS(instid_base));
|
||||
break;
|
||||
case nir_intrinsic_load_view_index:
|
||||
if (!ctx->view_index) {
|
||||
|
|
|
|||
|
|
@ -67,8 +67,7 @@ struct ir3_context {
|
|||
struct ir3_instruction *frag_face, *frag_coord;
|
||||
|
||||
/* For vertex shaders, keep track of the system values sources */
|
||||
struct ir3_instruction *vertex_id, *basevertex, *instance_id, *base_instance,
|
||||
*draw_id, *view_index, *is_indexed_draw;
|
||||
struct ir3_instruction *vertex_id, *instance_id, *view_index;
|
||||
|
||||
/* For fragment shaders: */
|
||||
struct ir3_instruction *samp_id, *samp_mask_in;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue