From a47c70ce42edb004f55b0d001327a5ca6cb93c3a Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Wed, 5 Mar 2025 11:11:57 +0800 Subject: [PATCH] mesa: add mesh shader states Reviewed-by: Mike Blumenkrantz Part-of: --- src/mesa/main/mtypes.h | 26 ++++++++++++++ src/mesa/state_tracker/st_atom_atomicbuf.c | 18 ++++++++++ src/mesa/state_tracker/st_atom_constbuf.c | 40 ++++++++++++++++++++- src/mesa/state_tracker/st_atom_image.c | 16 +++++++++ src/mesa/state_tracker/st_atom_list.h | 16 +++++++++ src/mesa/state_tracker/st_atom_sampler.c | 24 +++++++++++++ src/mesa/state_tracker/st_atom_shader.c | 18 ++++++++++ src/mesa/state_tracker/st_atom_storagebuf.c | 16 +++++++++ src/mesa/state_tracker/st_atom_texture.c | 18 ++++++++++ src/mesa/state_tracker/st_context.h | 2 ++ 10 files changed, 193 insertions(+), 1 deletion(-) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index f0ed5698f82..9e647c157b6 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2202,6 +2202,30 @@ struct gl_compute_program_state }; +/** + * Context state for task programs. + */ +struct gl_task_program_state +{ + /** Currently enabled and valid program (including internal programs + * and compiled shader programs). + */ + struct gl_program *_Current; +}; + + +/** + * Context state for mesh programs. + */ +struct gl_mesh_program_state +{ + /** Currently enabled and valid program (including internal programs + * and compiled shader programs). + */ + struct gl_program *_Current; +}; + + /** * ATI_fragment_shader runtime state */ @@ -3415,6 +3439,8 @@ struct gl_context struct gl_tess_ctrl_program_state TessCtrlProgram; struct gl_tess_eval_program_state TessEvalProgram; struct gl_ati_fragment_shader_state ATIFragmentShader; + struct gl_task_program_state TaskProgram; + struct gl_mesh_program_state MeshProgram; struct gl_pipeline_shader_state Pipeline; /**< GLSL pipeline shader object state */ struct gl_pipeline_object Shader; /**< GLSL shader object state */ diff --git a/src/mesa/state_tracker/st_atom_atomicbuf.c b/src/mesa/state_tracker/st_atom_atomicbuf.c index 9d5b9328791..cf42e1e7280 100644 --- a/src/mesa/state_tracker/st_atom_atomicbuf.c +++ b/src/mesa/state_tracker/st_atom_atomicbuf.c @@ -151,6 +151,24 @@ st_bind_cs_atomics(struct st_context *st) st_bind_atomics(st, prog, MESA_SHADER_COMPUTE); } +void +st_bind_ts_atomics(struct st_context *st) +{ + struct gl_program *prog = + st->ctx->_Shader->CurrentProgram[MESA_SHADER_TASK]; + + st_bind_atomics(st, prog, MESA_SHADER_TASK); +} + +void +st_bind_ms_atomics(struct st_context *st) +{ + struct gl_program *prog = + st->ctx->_Shader->CurrentProgram[MESA_SHADER_MESH]; + + st_bind_atomics(st, prog, MESA_SHADER_MESH); +} + void st_bind_hw_atomic_buffers(struct st_context *st) { diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c index 0dbfb6e836e..115ed521fb3 100644 --- a/src/mesa/state_tracker/st_atom_constbuf.c +++ b/src/mesa/state_tracker/st_atom_constbuf.c @@ -81,7 +81,9 @@ st_upload_constants(struct st_context *st, struct gl_program *prog, mesa_shader_ stage == MESA_SHADER_GEOMETRY || stage == MESA_SHADER_TESS_CTRL || stage == MESA_SHADER_TESS_EVAL || - stage == MESA_SHADER_COMPUTE); + stage == MESA_SHADER_COMPUTE || + stage == MESA_SHADER_TASK || + stage == MESA_SHADER_MESH); /* update the ATI constants before rendering */ if (stage == MESA_SHADER_FRAGMENT && prog->ati_fs) { @@ -264,6 +266,24 @@ st_update_cs_constants(struct st_context *st) MESA_SHADER_COMPUTE); } +/* Task shader: + */ +void +st_update_ts_constants(struct st_context *st) +{ + st_upload_constants(st, st->ctx->TaskProgram._Current, + MESA_SHADER_TASK); +} + +/* Mesh shader: + */ +void +st_update_ms_constants(struct st_context *st) +{ + st_upload_constants(st, st->ctx->MeshProgram._Current, + MESA_SHADER_MESH); +} + static void st_bind_ubos(struct st_context *st, struct gl_program *prog, mesa_shader_stage shader_type) @@ -361,3 +381,21 @@ st_bind_cs_ubos(struct st_context *st) st_bind_ubos(st, prog, MESA_SHADER_COMPUTE); } + +void +st_bind_ts_ubos(struct st_context *st) +{ + struct gl_program *prog = + st->ctx->_Shader->CurrentProgram[MESA_SHADER_TASK]; + + st_bind_ubos(st, prog, MESA_SHADER_TASK); +} + +void +st_bind_ms_ubos(struct st_context *st) +{ + struct gl_program *prog = + st->ctx->_Shader->CurrentProgram[MESA_SHADER_MESH]; + + st_bind_ubos(st, prog, MESA_SHADER_MESH); +} diff --git a/src/mesa/state_tracker/st_atom_image.c b/src/mesa/state_tracker/st_atom_image.c index a7b102ee744..95f5f89a505 100644 --- a/src/mesa/state_tracker/st_atom_image.c +++ b/src/mesa/state_tracker/st_atom_image.c @@ -222,3 +222,19 @@ void st_bind_cs_images(struct st_context *st) st_bind_images(st, prog, MESA_SHADER_COMPUTE); } + +void st_bind_ts_images(struct st_context *st) +{ + struct gl_program *prog = + st->ctx->_Shader->CurrentProgram[MESA_SHADER_TASK]; + + st_bind_images(st, prog, MESA_SHADER_TASK); +} + +void st_bind_ms_images(struct st_context *st) +{ + struct gl_program *prog = + st->ctx->_Shader->CurrentProgram[MESA_SHADER_MESH]; + + st_bind_images(st, prog, MESA_SHADER_MESH); +} diff --git a/src/mesa/state_tracker/st_atom_list.h b/src/mesa/state_tracker/st_atom_list.h index a4d55837034..1e4b79742a1 100644 --- a/src/mesa/state_tracker/st_atom_list.h +++ b/src/mesa/state_tracker/st_atom_list.h @@ -7,6 +7,8 @@ ST_STATE(ST_NEW_GS_STATE, st_update_gp) ST_STATE(ST_NEW_TES_STATE, st_update_tep) ST_STATE(ST_NEW_TCS_STATE, st_update_tcp) ST_STATE(ST_NEW_VS_STATE, st_update_vp) +ST_STATE(ST_NEW_TS_STATE, st_update_tp) +ST_STATE(ST_NEW_MS_STATE, st_update_mp) ST_STATE(ST_NEW_POLY_STIPPLE, st_update_polygon_stipple) ST_STATE(ST_NEW_WINDOW_RECTANGLES, st_update_window_rectangles) @@ -17,6 +19,8 @@ ST_STATE(ST_NEW_FS_SAMPLER_VIEWS, st_update_fragment_textures) ST_STATE(ST_NEW_GS_SAMPLER_VIEWS, st_update_geometry_textures) ST_STATE(ST_NEW_TCS_SAMPLER_VIEWS, st_update_tessctrl_textures) ST_STATE(ST_NEW_TES_SAMPLER_VIEWS, st_update_tesseval_textures) +ST_STATE(ST_NEW_TS_SAMPLER_VIEWS, st_update_task_textures) +ST_STATE(ST_NEW_MS_SAMPLER_VIEWS, st_update_mesh_textures) /* Non-compute samplers. */ ST_STATE(ST_NEW_VS_SAMPLERS, st_update_vertex_samplers) /* depends on update_*_texture for swizzle */ @@ -24,12 +28,16 @@ ST_STATE(ST_NEW_TCS_SAMPLERS, st_update_tessctrl_samplers) /* depends on update_ ST_STATE(ST_NEW_TES_SAMPLERS, st_update_tesseval_samplers) /* depends on update_*_texture for swizzle */ ST_STATE(ST_NEW_GS_SAMPLERS, st_update_geometry_samplers) /* depends on update_*_texture for swizzle */ ST_STATE(ST_NEW_FS_SAMPLERS, st_update_fragment_samplers) /* depends on update_*_texture for swizzle */ +ST_STATE(ST_NEW_TS_SAMPLERS, st_update_task_samplers) /* depends on update_*_texture for swizzle */ +ST_STATE(ST_NEW_MS_SAMPLERS, st_update_mesh_samplers) /* depends on update_*_texture for swizzle */ ST_STATE(ST_NEW_VS_IMAGES, st_bind_vs_images) ST_STATE(ST_NEW_TCS_IMAGES, st_bind_tcs_images) ST_STATE(ST_NEW_TES_IMAGES, st_bind_tes_images) ST_STATE(ST_NEW_GS_IMAGES, st_bind_gs_images) ST_STATE(ST_NEW_FS_IMAGES, st_bind_fs_images) +ST_STATE(ST_NEW_TS_IMAGES, st_bind_ts_images) +ST_STATE(ST_NEW_MS_IMAGES, st_bind_ms_images) ST_STATE(ST_NEW_FB_STATE, st_update_framebuffer_state) /* depends on update_*_texture and bind_*_images */ ST_STATE(ST_NEW_BLEND, st_update_blend) /* depends on update_framebuffer_state */ @@ -44,18 +52,24 @@ ST_STATE(ST_NEW_TCS_CONSTANTS, st_update_tcs_constants) ST_STATE(ST_NEW_TES_CONSTANTS, st_update_tes_constants) ST_STATE(ST_NEW_GS_CONSTANTS, st_update_gs_constants) ST_STATE(ST_NEW_FS_CONSTANTS, st_update_fs_constants) +ST_STATE(ST_NEW_TS_CONSTANTS, st_update_ts_constants) +ST_STATE(ST_NEW_MS_CONSTANTS, st_update_ms_constants) ST_STATE(ST_NEW_VS_UBOS, st_bind_vs_ubos) ST_STATE(ST_NEW_TCS_UBOS, st_bind_tcs_ubos) ST_STATE(ST_NEW_TES_UBOS, st_bind_tes_ubos) ST_STATE(ST_NEW_FS_UBOS, st_bind_fs_ubos) ST_STATE(ST_NEW_GS_UBOS, st_bind_gs_ubos) +ST_STATE(ST_NEW_TS_UBOS, st_bind_ts_ubos) +ST_STATE(ST_NEW_MS_UBOS, st_bind_ms_ubos) ST_STATE(ST_NEW_VS_ATOMICS, st_bind_vs_atomics) ST_STATE(ST_NEW_TCS_ATOMICS, st_bind_tcs_atomics) ST_STATE(ST_NEW_TES_ATOMICS, st_bind_tes_atomics) ST_STATE(ST_NEW_FS_ATOMICS, st_bind_fs_atomics) ST_STATE(ST_NEW_GS_ATOMICS, st_bind_gs_atomics) +ST_STATE(ST_NEW_TS_ATOMICS, st_bind_ts_atomics) +ST_STATE(ST_NEW_MS_ATOMICS, st_bind_ms_atomics) /* SSBOs depend on the _atomics having been updated first in the * !has_hw_atomics case. @@ -65,6 +79,8 @@ ST_STATE(ST_NEW_TCS_SSBOS, st_bind_tcs_ssbos) ST_STATE(ST_NEW_TES_SSBOS, st_bind_tes_ssbos) ST_STATE(ST_NEW_FS_SSBOS, st_bind_fs_ssbos) ST_STATE(ST_NEW_GS_SSBOS, st_bind_gs_ssbos) +ST_STATE(ST_NEW_TS_SSBOS, st_bind_ts_ssbos) +ST_STATE(ST_NEW_MS_SSBOS, st_bind_ms_ssbos) ST_STATE(ST_NEW_PIXEL_TRANSFER, st_update_pixel_transfer) ST_STATE(ST_NEW_TESS_STATE, st_update_tess) diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index f3e8b219299..8b30c72aa83 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -431,3 +431,27 @@ st_update_compute_samplers(struct st_context *st) ctx->ComputeProgram._Current, NULL, NULL); } } + + +void +st_update_task_samplers(struct st_context *st) +{ + const struct gl_context *ctx = st->ctx; + + if (ctx->TaskProgram._Current) { + update_shader_samplers(st, MESA_SHADER_TASK, + ctx->TaskProgram._Current, NULL, NULL); + } +} + + +void +st_update_mesh_samplers(struct st_context *st) +{ + const struct gl_context *ctx = st->ctx; + + if (ctx->MeshProgram._Current) { + update_shader_samplers(st, MESA_SHADER_MESH, + ctx->MeshProgram._Current, NULL, NULL); + } +} diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c index e899572c888..39bfbe27588 100644 --- a/src/mesa/state_tracker/st_atom_shader.c +++ b/src/mesa/state_tracker/st_atom_shader.c @@ -347,3 +347,21 @@ st_update_cp(struct st_context *st) MESA_SHADER_COMPUTE, &st->cp); cso_set_compute_shader_handle(st->cso_context, shader); } + +void +st_update_tp(struct st_context *st) +{ + void *shader = st_update_common_program(st, + st->ctx->TaskProgram._Current, + MESA_SHADER_TASK, &st->tp); + cso_set_task_shader_handle(st->cso_context, shader); +} + +void +st_update_mp(struct st_context *st) +{ + void *shader = st_update_common_program(st, + st->ctx->MeshProgram._Current, + MESA_SHADER_MESH, &st->mp); + cso_set_mesh_shader_handle(st->cso_context, shader); +} diff --git a/src/mesa/state_tracker/st_atom_storagebuf.c b/src/mesa/state_tracker/st_atom_storagebuf.c index 7f8e2b07a0d..d8a3dc49561 100644 --- a/src/mesa/state_tracker/st_atom_storagebuf.c +++ b/src/mesa/state_tracker/st_atom_storagebuf.c @@ -138,3 +138,19 @@ void st_bind_cs_ssbos(struct st_context *st) st_bind_ssbos(st, prog, MESA_SHADER_COMPUTE); } + +void st_bind_ts_ssbos(struct st_context *st) +{ + struct gl_program *prog = + st->ctx->_Shader->CurrentProgram[MESA_SHADER_TASK]; + + st_bind_ssbos(st, prog, MESA_SHADER_TASK); +} + +void st_bind_ms_ssbos(struct st_context *st) +{ + struct gl_program *prog = + st->ctx->_Shader->CurrentProgram[MESA_SHADER_MESH]; + + st_bind_ssbos(st, prog, MESA_SHADER_MESH); +} diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index 9308d69da9a..60b347ead39 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -424,3 +424,21 @@ st_update_compute_textures(struct st_context *st) ctx->ComputeProgram._Current); } } + +void +st_update_task_textures(struct st_context *st) +{ + const struct gl_context *ctx = st->ctx; + + if (ctx->TaskProgram._Current) + update_textures(st, MESA_SHADER_TASK, ctx->TaskProgram._Current); +} + +void +st_update_mesh_textures(struct st_context *st) +{ + const struct gl_context *ctx = st->ctx; + + if (ctx->MeshProgram._Current) + update_textures(st, MESA_SHADER_MESH, ctx->MeshProgram._Current); +} diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 8652e5a55d8..e2dba2da6ea 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -273,6 +273,8 @@ struct st_context struct gl_program *gp; /**< Currently bound geometry program */ struct gl_program *fp; /**< Currently bound fragment program */ struct gl_program *cp; /**< Currently bound compute program */ + struct gl_program *tp; /**< Currently bound task program */ + struct gl_program *mp; /**< Currently bound mesh program */ }; struct gl_program *current_program[MESA_SHADER_MESH_STAGES]; };