Ian Romanick <i...@freedesktop.org> writes: > From: Gregory Hainaut <gregory.hain...@gmail.com> > > Now arb_separate_shader_object-GetProgramPipelineiv should pass. > > V3 (idr): > * Change spec references to core OpenGL versions instead of issues in > the extension spec. > * Split out from previous uber patch. > > v4 (idr): Use _mesa_has_geometry_shaders in _mesa_UseProgramStages to > detect availability of geometry shaders. > > Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/mesa/main/pipelineobj.c | 115 > ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 115 insertions(+) > > diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c > index 849c781..7149578 100644 > --- a/src/mesa/main/pipelineobj.c > +++ b/src/mesa/main/pipelineobj.c
> + GLbitfield any_valid_stages = GL_VERTEX_SHADER_BIT | > GL_FRAGMENT_SHADER_BIT; > + if (_mesa_has_geometry_shaders(ctx)) > + any_valid_stages |= GL_GEOMETRY_SHADER_BIT; > + > + if (stages != GL_ALL_SHADER_BITS && (stages & ~any_valid_stages) != 0) { Weird double space before &. > + _mesa_error(ctx, GL_INVALID_VALUE, "glUseProgramStages(Stages)"); > + return; > + } > + if (program) { > + /* Section 2.11.1 (Shader Objects) of the OpenGL 3.1 spec (and probably > + * earlier) says: > + * > + * "Commands that accept shader or program object names will > + * generate the error INVALID_VALUE if the provided name is not the > + * name of either a shader or program object and INVALID_OPERATION > + * if the provided name identifies an object that is not the > + * expected type." > + */ > + struct gl_shader *sh = _mesa_lookup_shader(ctx, program); > + if (sh != NULL) { > + _mesa_error(ctx, GL_INVALID_OPERATION, > + "glUseProgramStages(progam is a shader object)"); > + return; > + } This block could get dropped into the shProg == NULL case below, right? The code confused me as is. > + > + shProg = _mesa_lookup_shader_program(ctx, program); > + if (shProg == NULL) { > + _mesa_error(ctx, GL_INVALID_VALUE, > + "glUseProgramStages(progam is not a program object)"); > + return; > + } > + /* Section 2.11.4 (Program Pipeline Objects) of the OpenGL 4.1 spec > + * says: > + * > + * "If UseProgramStages is called with program set to zero or with a > + * program object that contains no executable code for the given > + * stages, it is as if the pipeline object has no programmable stage > + * configured for the indicated shader stages." > + */ > + if ((stages & GL_VERTEX_SHADER_BIT) != 0) > + _mesa_use_shader_program(ctx, GL_VERTEX_SHADER, shProg, pipe); > + > + if ((stages & GL_FRAGMENT_SHADER_BIT) != 0) > + _mesa_use_shader_program(ctx, GL_FRAGMENT_SHADER, shProg, pipe); > + > + if ((stages & GL_GEOMETRY_SHADER_BIT) != 0) > + _mesa_use_shader_program(ctx, GL_GEOMETRY_SHADER, shProg, pipe); > } The spec cite here doesn't seem to be explaining the code it's next to, to me.
pgpQVqnX5dP4Y.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev