On 03/13/2014 10:52 AM, Eric Anholt wrote: > Ian Romanick <i...@freedesktop.org> writes: > >> -----BEGIN PGP SIGNED MESSAGE----- >> Hash: SHA1 >> >> On 03/05/2014 01:00 PM, Eric Anholt wrote: >>> Ian Romanick <i...@freedesktop.org> writes: >>> >>>> From: Gregory Hainaut <gregory.hain...@gmail.com> >>>> >>>> Implementation note: I don't use context for ralloc (don't know >>>> how). >>>> >>>> The check on PROGRAM_SEPARABLE flags is also done when the >>>> pipeline isn't bound. It doesn't make any sense in a DSA style >>>> API. >>>> >>>> Maybe we could replace _mesa_validate_program by >>>> _mesa_validate_program_pipeline. For example we could recreate a >>>> dummy pipeline object. However the new function checks also the >>>> TEXTURE_IMAGE_UNIT number not sure of the impact. >>>> >>>> V2: Fix memory leak with ralloc_strdup Formatting improvement >>>> >>>> V3 (idr): * Actually fix the leak of the InfoLog. :) * Directly >>>> generate logs in to gl_pipeline_object::InfoLog via >>>> ralloc_asprintf isntead of using a temporary buffer. * Split out >>>> from previous uber patch. * Change spec references to include >>>> section numbers, etc. * Fix a bug in checking that a different >>>> program isn't active in a stage between two stages that have the >>>> same program. Specifically, >>>> >>>> if (pipe->CurrentVertexProgram->Name == >>>> pipe->CurrentGeometryProgram->Name && >>>> pipe->CurrentGeometryProgram->Name != >>>> pipe->CurrentVertexProgram->Name) >>>> >>>> should have been >>>> >>>> if (pipe->CurrentVertexProgram->Name == >>>> pipe->CurrentFragmentProgram->Name && >>>> pipe->CurrentGeometryProgram->Name != >>>> pipe->CurrentVertexProgram->Name) >>>> >>>> v4 (idr): Rework to use CurrentProgram array in loops. >>>> >>>> Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> >>> >>>> diff --git a/src/mesa/main/pipelineobj.c >>>> b/src/mesa/main/pipelineobj.c index 3db97c0..d371e88 100644 --- >>>> a/src/mesa/main/pipelineobj.c +++ b/src/mesa/main/pipelineobj.c >>> >>>> + /* Section 2.11.11 (Shader Execution), subheading >>>> "Validation," of the + * OpenGL 4.1 spec says: + * + * >>>> "[INVALID_OPERATION] is generated by any command that transfers + >>>> * vertices to the GL if: + * + * ... + * + >>>> * - Any two active samplers in the current program object >>>> are of + * different types, but refer to the same >>>> texture image unit. + * + * - The number of active >>>> samplers in the program exceeds the + * maximum >>>> number of texture image units allowed." + */ + if >>>> (!_mesa_sampler_uniforms_pipeline_are_valid(pipe)) + goto >>>> err; + + pipe->Validated = GL_TRUE; + return GL_TRUE; >>> >>> What ensures that the sampler validate will be redone when sampler >>> uniforms change? >> >> _mesa_valid_to_render calls _mesa_validate_program_pipeline. If the >> application calls glValidateProgramPipeline (getting an error), >> changes the uniform, then calls glDrawArrays, the program will get >> revalidated. > > I was thinking of the transition from a working pipeline with > non-overlapping samplers to overlapping samplers of different types.
Ah... you were wise to be suspicious of that. It turns out, we already have a problem in that case with non-separable programs. There appear to be some additional problems in the separable case. I sent a couple piglit tests out that reproduce these issues. I think I'd like to 1. Fix the new problems in _mesa_ValidateProgramPipeline. 2. Push _mesa_ValidateProgramPipeline. 3. Fix the pre-existing problems. Sound like a good plan?
signature.asc
Description: OpenPGP digital signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev