[Mesa-dev] [PATCH 2/3] mesa: implement ARB_parallel_shader_compile
Edward O'Callaghan
funfunctor at folklore1984.net
Tue Apr 18 06:08:39 UTC 2017
On 04/18/2017 03:39 PM, Jason Ekstrand wrote:
> On Mon, Apr 17, 2017 at 4:49 PM, Edward O'Callaghan
> <funfunctor at folklore1984.net <mailto:funfunctor at folklore1984.net>> wrote:
>
>
>
> On 04/18/2017 01:13 AM, Jason Ekstrand wrote:
> > I don't see anything in here that actually implements parallel shader
> > compilation. Does radeon already spawn back-end threads to compile
> As far as I am aware that is exactly right.
>
>
> If that's the case, then I didn't see anywhere that you actually hooked
> the maximum number of threads value to the radeon back-end. The
> extension does two things:
>
> 1) Allow for asynchronous reading of compile status
> 2) Allow the user to specify the maximum number of threads for the
> driver to use for shader compiles.
>
> Your implementation does neither of these things.
Correct, actually the most important which is to make glCompile and
glLink to be async not just reading the status, that is what I am
working on locally.
The spec doesn't actually put a hard requirement on the number of
threads to be exactly used, it is purely a hint and implementation
dependent.
That said, it is indeed intended that Compile/Link be threaded so that
is the 90% left yes.
Ilia helped me answer my frontend XML questions that I was stuck with.
Thanks for the feedback guys,
>
>
> > shaders or are we just lying about it? Even if it does, the front-end
> > tends to take significant quantities of time so it'd be nice to
> > parallelize that.
> Indeed the frontend part I believe is where the remaining work is to be
> done.
>
>
> Right. 90% of the work is left to be done.
>
> --Jason
>
>
> >
> > On Mon, Apr 17, 2017 at 5:07 AM, Edward O'Callaghan
> > <funfunctor at folklore1984.net <mailto:funfunctor at folklore1984.net>
> <mailto:funfunctor at folklore1984.net
> <mailto:funfunctor at folklore1984.net>>> wrote:
> >
> > Signed-off-by: Edward O'Callaghan <funfunctor at folklore1984.net <mailto:funfunctor at folklore1984.net>
> > <mailto:funfunctor at folklore1984.net
> <mailto:funfunctor at 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;
> >
> >
> > This seems to only be initialized by st/mesa. Shoule we initialize it
> > to 1 by default for everyone else?
> >
> >
> > };
> >
> >
> > @@ -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;
> >
> >
> > Give that it's a 32-bit unsigned integer, 0xFFFFFFFF >
> > ctx->Const.MaxShaderCompilerThreads so we don't need the extra case.
> >
> >
> > +
> > + 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 at lists.freedesktop.org
> <mailto:mesa-dev at lists.freedesktop.org>
> <mailto:mesa-dev at lists.freedesktop.org
> <mailto:mesa-dev at lists.freedesktop.org>>
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>
> > <https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>>
> >
> >
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170418/e7a327df/attachment-0001.sig>
More information about the mesa-dev
mailing list