Signed-off-by: Edward O'Callaghan <funfunc...@folklore1984.net> --- src/mesa/main/get.c | 4 ++++ src/mesa/main/mtypes.h | 6 ++++++ src/mesa/main/shaderapi.c | 20 ++++++++++++++++++++ src/mesa/main/shaderapi.h | 3 +++ src/mesa/main/shared.c | 3 +++ src/mesa/state_tracker/st_extensions.c | 4 ++++ 6 files changed, 40 insertions(+)
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index cf3ee63..91f21ce 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -2332,6 +2332,10 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v) return TYPE_INT; } + case GL_MAX_SHADER_COMPILER_THREADS_ARB: + v->value_int = ctx->Shared->MaxCompileThreads; + return TYPE_INT; + case GL_MAX_COMPUTE_WORK_GROUP_COUNT: if (!_mesa_has_compute_shaders(ctx)) goto invalid_enum; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 4a76de5..33cf33d 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3227,6 +3227,9 @@ struct gl_shared_state * Once this field becomes true, it is never reset to false. */ bool ShareGroupReset; + + /* GL_ARB_parallel_shader_compile */ + int MaxCompileThreads; }; @@ -3880,6 +3883,9 @@ struct gl_constants GLuint MaxImageSamples; GLuint MaxCombinedImageUniforms; + /** GL_ARB_parallel_shader_compile */ + GLuint MaxShaderCompilerThreads; + /** GL_ARB_compute_shader */ GLuint MaxComputeWorkGroupCount[3]; /* Array of x, y, z dimensions */ GLuint MaxComputeWorkGroupSize[3]; /* Array of x, y, z dimensions */ diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 187475f..051390a 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -631,6 +631,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, case GL_DELETE_STATUS: *params = shProg->DeletePending; return; + case GL_COMPLETION_STATUS_ARB: case GL_LINK_STATUS: *params = shProg->data->LinkStatus ? GL_TRUE : GL_FALSE; return; @@ -898,6 +899,7 @@ get_shaderiv(struct gl_context *ctx, GLuint name, GLenum pname, GLint *params) case GL_DELETE_STATUS: *params = shader->DeletePending; break; + case GL_COMPLETION_STATUS_ARB: case GL_COMPILE_STATUS: *params = shader->CompileStatus ? GL_TRUE : GL_FALSE; break; @@ -2234,6 +2236,24 @@ _mesa_copy_linked_program_data(const struct gl_shader_program *src, } /** + * ARB_parallel_shader_compile + */ +GLvoid GLAPIENTRY +_mesa_MaxShaderCompilerThreadsARB(GLuint count) +{ + GET_CURRENT_CONTEXT(ctx); + + /** + * Additions to Chapter 7 "Programs and Shaders": + * a <count> of 0xFFFFFFFF requests an implementation-specific maximum. + */ + if (count == 0xFFFFFFFF || count > ctx->Const.MaxShaderCompilerThreads) + count = ctx->Const.MaxShaderCompilerThreads; + + ctx->Shared->MaxCompileThreads = count; +} + +/** * ARB_separate_shader_objects: Compile & Link Program */ GLuint GLAPIENTRY diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h index 99b4fe8..1ec287a 100644 --- a/src/mesa/main/shaderapi.h +++ b/src/mesa/main/shaderapi.h @@ -225,6 +225,9 @@ _mesa_copy_linked_program_data(const struct gl_shader_program *src, extern bool _mesa_validate_shader_target(const struct gl_context *ctx, GLenum type); +/* ARB_parallel_shader_compile */ +extern GLvoid GLAPIENTRY +_mesa_MaxShaderCompilerThreadsARB(GLuint count); /* GL_ARB_separate_shader_objects */ extern GLuint GLAPIENTRY diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c index 5344812..586502e 100644 --- a/src/mesa/main/shared.c +++ b/src/mesa/main/shared.c @@ -126,6 +126,9 @@ _mesa_alloc_shared_state(struct gl_context *ctx) shared->SyncObjects = _mesa_set_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal); + /* GL_ARB_parallel_shader_compile */ + shared->MaxCompileThreads = 0xFFFFFFFF; + return shared; } diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 1df2ba7..61391f8 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -35,6 +35,7 @@ #include "pipe/p_defines.h" #include "pipe/p_screen.h" #include "util/u_math.h" +#include "util/u_cpu_detect.h" #include "st_context.h" #include "st_debug.h" @@ -897,6 +898,9 @@ void st_init_extensions(struct pipe_screen *screen, if (consts->GLSLVersion >= 410) extensions->ARB_shader_precision = GL_TRUE; + /* GL_ARB_parallel_shader_compile */ + consts->MaxShaderCompilerThreads = util_cpu_caps.nr_cpus > 1 ? util_cpu_caps.nr_cpus : 0; + /* This extension needs full OpenGL 3.2, but we don't know if that's * supported at this point. Only check the GLSL version. */ if (consts->GLSLVersion >= 150 && -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev