mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-22 02:18:10 +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 (cherry picked from commitd8e1409948) Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41540>
This commit is contained in:
parent
d5a8b1aba9
commit
dcb7739057
3 changed files with 6 additions and 19 deletions
|
|
@ -994,7 +994,7 @@
|
|||
"description": "ir3: don't cache driver param instructions",
|
||||
"nominated": true,
|
||||
"nomination_type": 2,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "8b0b81339b9c3806981ee2ec7c08501bbd8bb7a3",
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -2944,28 +2944,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