[Mesa-dev] [PATCH v2] mesa: remove link validation that should be done elsewhere
Timothy Arceri
timothy.arceri at collabora.com
Tue Jan 19 12:49:00 PST 2016
On Fri, 2016-01-15 at 08:50 +0200, Tapani Pälli wrote:
>
> On 01/06/2016 03:40 AM, Timothy Arceri wrote:
> > Even if re-linking fails rendering shouldn't fail as the previous
> > succesfully linked program will still be available. It also
> > shouldn't
> > be possible to have an unlinked program as part of the current
> > rendering
> > state.
> >
> > This fixes a subtest in:
> > ES31-CTS.sepshaderobjs.StateInteraction
>
> Which is the last one, after this change this horrible test from
> depths
> of hell starts to finally pass!
hehe
>
> It would be cool if Ian and Brian could comment a bit here why these
> checks were originally done and if they can be safely removed, was is
> just to play 'extra safe'?
I looked at the history a while back so to save everyone some time here
it is.
This was added way back in 2009 by Brian:
commit 56c4226fcc54158eb7fe54eeb13539a979ec155c
Author: Brian Paul <brianp at vmware.com>
Date: Fri Aug 14 10:45:17 2009 -0600
mesa: new _mesa_valid_to_render() function
Tests if the current shader/program is valid and that the
framebuffer is
complete. To be called by glBegin, glDrawArrays, etc.
There seems to have been only two major changes since then:
commit 84eba3ef71dfa822e5ff0463032cdd2e3515b888
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Wed Oct 13 13:58:44 2010 -0700
Track separate programs for each stage
The assumption is that all stages are the same program or that
varyings are passed between stages using built-in varyings.
commit 79146065f9261a9004359338f1a7b8b5a534ebc3
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Fri Feb 7 21:13:02 2014 -0800
mesa: Refactor per-stage link check to its own function
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
To me it looks like this was just added to play safe when adding other
valid to render checks.
>
>
> > This change should improve performance on CPU limited benchmarks as
> > noted
> > in commit d6c6b186cf308f.
> >
> > From Section 7.3 (Program Objects) of the OpenGL 4.5 spec:
> >
> > "If a program object that is active for any shader stage is re
> > -linked
> > unsuccessfully, the link status will be set to FALSE, but any
> > existing
> > executables and associated state will remain part of the
> > current rendering
> > state until a subsequent call to UseProgram, UseProgramStages,
> > or
> > BindProgramPipeline removes them from use. If such a program
> > is attached to
> > any program pipeline object, the existing executables and
> > associated state
> > will remain part of the program pipeline object until a
> > subsequent call to
> > UseProgramStages removes them from use. An unsuccessfully
> > linked program may
> > not be made part of the current rendering state by UseProgram
> > or added to
> > program pipeline objects by UseProgramStages until it is
> > successfully
> > re-linked."
> >
> > "void UseProgram(uint program);
> >
> > ...
> >
> > An INVALID_OPERATION error is generated if program has not been
> > linked, or
> > was last linked unsuccessfully. The current rendering state is
> > not modified."
> >
> > V2: apply the rule to both core and compat.
> >
> > Cc: Tapani Pälli <tapani.palli at intel.com>
> > Cc: Ian Romanick <ian.d.romanick at intel.com>
> > Cc: Brian Paul <brianp at vmware.com>
> > ---
> > src/mesa/main/context.c | 63 +++---------------------------------
> > -------------
> > 1 file changed, 3 insertions(+), 60 deletions(-)
> >
> > diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> > index be983d4..f3fd01f 100644
> > --- a/src/mesa/main/context.c
> > +++ b/src/mesa/main/context.c
> > @@ -1930,31 +1930,6 @@ _mesa_check_blend_func_error(struct
> > gl_context *ctx)
> > return GL_TRUE;
> > }
> >
> > -static bool
> > -shader_linked_or_absent(struct gl_context *ctx,
> > - const struct gl_shader_program *shProg,
> > - bool *shader_present, const char *where)
> > -{
> > - if (shProg) {
> > - *shader_present = true;
> > -
> > - if (!shProg->LinkStatus) {
> > - _mesa_error(ctx, GL_INVALID_OPERATION, "%s(shader not
> > linked)", where);
> > - return false;
> > - }
> > -#if 0 /* not normally enabled */
> > - {
> > - char errMsg[100];
> > - if (!_mesa_validate_shader_program(ctx, shProg, errMsg))
> > {
> > - _mesa_warning(ctx, "Shader program %u is invalid: %s",
> > - shProg->Name, errMsg);
> > - }
> > - }
> > -#endif
> > - }
> > -
> > - return true;
> > -}
> >
> > /**
> > * Prior to drawing anything with glBegin, glDrawArrays, etc.
> > this function
> > @@ -1967,54 +1942,22 @@ shader_linked_or_absent(struct gl_context
> > *ctx,
> > GLboolean
> > _mesa_valid_to_render(struct gl_context *ctx, const char *where)
> > {
> > - unsigned i;
> > -
> > /* This depends on having up to date derived state (shaders)
> > */
> > if (ctx->NewState)
> > _mesa_update_state(ctx);
> >
> > - if (ctx->API == API_OPENGL_CORE || ctx->API == API_OPENGLES2) {
> > - bool from_glsl_shader[MESA_SHADER_COMPUTE] = { false };
> > -
> > - for (i = 0; i < MESA_SHADER_COMPUTE; i++) {
> > - if (!shader_linked_or_absent(ctx, ctx->_Shader
> > ->CurrentProgram[i],
> > - &from_glsl_shader[i],
> > where))
> > - return GL_FALSE;
> > - }
> > -
> > - /* In OpenGL Core Profile and OpenGL ES 2.0 / 3.0, there are
> > no assembly
> > - * shaders. Don't check state related to those.
> > - */
> > - } else {
> > - bool has_vertex_shader = false;
> > - bool has_fragment_shader = false;
> > -
> > - /* In OpenGL Compatibility Profile, there is only vertex
> > shader and
> > - * fragment shader. We take this path also for API_OPENGLES
> > because
> > - * optimizing that path would make the other (more common)
> > paths
> > - * slightly slower.
> > - */
> > - if (!shader_linked_or_absent(ctx,
> > - ctx->_Shader
> > ->CurrentProgram[MESA_SHADER_VERTEX],
> > - &has_vertex_shader, where))
> > - return GL_FALSE;
> > -
> > - if (!shader_linked_or_absent(ctx,
> > - ctx->_Shader
> > ->CurrentProgram[MESA_SHADER_FRAGMENT],
> > - &has_fragment_shader, where))
> > - return GL_FALSE;
> > -
> > + if (ctx->API == API_OPENGL_COMPAT) {
> > /* Any shader stages that are not supplied by the GLSL
> > shader and have
> > * assembly shaders enabled must now be validated.
> > */
> > - if (!has_vertex_shader
> > + if (!ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX]
> > && ctx->VertexProgram.Enabled && !ctx
> > ->VertexProgram._Enabled) {
> > _mesa_error(ctx, GL_INVALID_OPERATION,
> > "%s(vertex program not valid)", where);
> > return GL_FALSE;
> > }
> >
> > - if (!has_fragment_shader) {
> > + if (!ctx->_Shader->CurrentProgram[MESA_SHADER_FRAGMENT]) {
> > if (ctx->FragmentProgram.Enabled && !ctx
> > ->FragmentProgram._Enabled) {
> > _mesa_error(ctx, GL_INVALID_OPERATION,
> > "%s(fragment program not valid)", where);
> >
More information about the mesa-dev
mailing list