diff --git a/src/mesa/main/consts_exts.h b/src/mesa/main/consts_exts.h index 62589b6aa1c..05d13717c5e 100644 --- a/src/mesa/main/consts_exts.h +++ b/src/mesa/main/consts_exts.h @@ -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 diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index 622cb550261..35b79b35828 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -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), diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py index 267efa5b3be..5c29350d434 100644 --- a/src/mesa/main/get_hash_params.py +++ b/src/mesa/main/get_hash_params.py @@ -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 diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 8dd586e47f8..4cc5a43f654 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -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); }