mesa: implement KHR_shader_subgroup Get* values

Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30610>
This commit is contained in:
Qiang Yu 2024-07-23 22:06:25 +08:00
parent 34f4b5e0ea
commit d5bc014493
4 changed files with 46 additions and 0 deletions

View file

@ -1018,6 +1018,12 @@ struct gl_constants
/** Whether pipe_context::draw_vertex_state is supported. */
bool HasDrawVertexState;
/** GL_KHR_shader_subgroup */
GLuint ShaderSubgroupSize;
GLuint ShaderSubgroupSupportedStages;
GLuint ShaderSubgroupSupportedFeatures;
bool ShaderSubgroupQuadAllStages;
};
#endif

View file

@ -591,6 +591,7 @@ EXTRA_EXT(AMD_framebuffer_multisample_advanced);
EXTRA_EXT(ARB_spirv_extensions);
EXTRA_EXT(NV_viewport_swizzle);
EXTRA_EXT(ARB_sparse_texture);
EXTRA_EXT(KHR_shader_subgroup);
static const int extra_ARB_gl_spirv_or_es2_compat[] = {
EXT(ARB_gl_spirv),

View file

@ -696,6 +696,12 @@ descriptor=[
[ "VIEWPORT_SWIZZLE_Y_NV", "LOC_CUSTOM, TYPE_ENUM, 0, extra_NV_viewport_swizzle" ],
[ "VIEWPORT_SWIZZLE_Z_NV", "LOC_CUSTOM, TYPE_ENUM, 0, extra_NV_viewport_swizzle" ],
[ "VIEWPORT_SWIZZLE_W_NV", "LOC_CUSTOM, TYPE_ENUM, 0, extra_NV_viewport_swizzle" ],
# GL_KHR_shader_subgroup
[ "SUBGROUP_SIZE_KHR", "CONTEXT_INT(Const.ShaderSubgroupSize), extra_KHR_shader_subgroup" ],
[ "SUBGROUP_SUPPORTED_STAGES_KHR", "CONTEXT_INT(Const.ShaderSubgroupSupportedStages), extra_KHR_shader_subgroup" ],
[ "SUBGROUP_SUPPORTED_FEATURES_KHR", "CONTEXT_INT(Const.ShaderSubgroupSupportedFeatures), extra_KHR_shader_subgroup" ],
[ "SUBGROUP_QUAD_ALL_STAGES_KHR", "CONTEXT_BOOL(Const.ShaderSubgroupQuadAllStages), extra_KHR_shader_subgroup" ],
]},
# Enums in OpenGL and ES 3.2

View file

@ -73,6 +73,30 @@ static int _clamp(int a, int min, int max)
return a;
}
static unsigned mesa_to_gl_stages(unsigned stages)
{
unsigned ret = 0;
if (stages & BITFIELD_BIT(MESA_SHADER_VERTEX))
ret |= GL_VERTEX_SHADER_BIT;
if (stages & BITFIELD_BIT(MESA_SHADER_TESS_CTRL))
ret |= GL_TESS_CONTROL_SHADER_BIT;
if (stages & BITFIELD_BIT(MESA_SHADER_TESS_EVAL))
ret |= GL_TESS_EVALUATION_SHADER_BIT;
if (stages & BITFIELD_BIT(MESA_SHADER_GEOMETRY))
ret |= GL_GEOMETRY_SHADER_BIT;
if (stages & BITFIELD_BIT(MESA_SHADER_FRAGMENT))
ret |= GL_FRAGMENT_SHADER_BIT;
if (stages & BITFIELD_BIT(MESA_SHADER_COMPUTE))
ret |= GL_COMPUTE_SHADER_BIT;
return ret;
}
/**
* Query driver to get implementation limits.
@ -624,6 +648,15 @@ void st_init_limits(struct pipe_screen *screen,
c->HasDrawVertexState =
screen->get_param(screen, PIPE_CAP_DRAW_VERTEX_STATE);
c->ShaderSubgroupSize =
screen->get_param(screen, PIPE_CAP_SHADER_SUBGROUP_SIZE);
c->ShaderSubgroupSupportedStages =
mesa_to_gl_stages(screen->get_param(screen, PIPE_CAP_SHADER_SUBGROUP_SUPPORTED_STAGES));
c->ShaderSubgroupSupportedFeatures =
screen->get_param(screen, PIPE_CAP_SHADER_SUBGROUP_SUPPORTED_FEATURES);
c->ShaderSubgroupQuadAllStages =
screen->get_param(screen, PIPE_CAP_SHADER_SUBGROUP_QUAD_ALL_STAGES);
}