Signed-off-by: Chris Forbes <chr...@ijw.co.nz> --- src/mesa/main/pipelineobj.c | 53 +++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 16 deletions(-)
diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c index c902107..b91289e 100644 --- a/src/mesa/main/pipelineobj.c +++ b/src/mesa/main/pipelineobj.c @@ -662,6 +662,38 @@ program_stages_all_active(struct gl_pipeline_object *pipe, return status; } +static bool +program_stages_interleaved_illegally(struct gl_pipeline_object *pipe) +{ + struct gl_shader_program *prev = NULL; + unsigned i, j; + + /* Look for programs bound to stages: A -> B -> A, with + * any intervening sequence of unrelated programs or + * empty stages + */ + + for (i = 0; i < MESA_SHADER_STAGES; i++) { + /* Empty stages anywhere in the pipe are OK */ + if (!pipe->CurrentProgram[i]) + continue; + + if (prev && pipe->CurrentProgram[i] != prev) { + /* We've seen an A -> B transition; look at the rest of + * the pipe to see if we ever see A again. + */ + for (j = i + 1; j < MESA_SHADER_STAGES; j++) { + if (pipe->CurrentProgram[j] == prev) + return true; + } + } + + prev = pipe->CurrentProgram[i]; + } + + return false; +} + extern GLboolean _mesa_validate_program_pipeline(struct gl_context* ctx, struct gl_pipeline_object *pipe, @@ -714,22 +746,11 @@ _mesa_validate_program_pipeline(struct gl_context* ctx, * Without Tesselation, the only case where this can occur is the geometry * shader between the fragment shader and vertex shader. */ - if (pipe->CurrentProgram[MESA_SHADER_GEOMETRY] - && pipe->CurrentProgram[MESA_SHADER_FRAGMENT] - && pipe->CurrentProgram[MESA_SHADER_VERTEX]) { - if (pipe->CurrentProgram[MESA_SHADER_VERTEX]->Name == pipe->CurrentProgram[MESA_SHADER_FRAGMENT]->Name && - pipe->CurrentProgram[MESA_SHADER_GEOMETRY]->Name != pipe->CurrentProgram[MESA_SHADER_VERTEX]->Name) { - pipe->InfoLog = - ralloc_asprintf(pipe, - "Program %d is active for geometry stage between " - "two stages for which another program %d is " - "active", - pipe->CurrentProgram[MESA_SHADER_GEOMETRY]->Name, - pipe->CurrentProgram[MESA_SHADER_VERTEX]->Name); - goto err; - } - - /* XXX tess */ + if (program_stages_interleaved_illegally(pipe)) { + pipe->InfoLog = ralloc_strdup(pipe, "Program is active for multiple shader" + "stages with an intervening stage provided" + "by another program"); + goto err; } /* Section 2.11.11 (Shader Execution), subheading "Validation," of the -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev