glsl: simplify required stages for linking rules

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Timothy Arceri 2016-01-27 15:42:58 +11:00
parent 20823992b4
commit 55fa3c44bc

View file

@ -4182,50 +4182,48 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
/* Some shaders have to be linked with some other shaders present. /* Some shaders have to be linked with some other shaders present.
*/ */
if (num_shaders[MESA_SHADER_GEOMETRY] > 0 && if (!prog->SeparateShader) {
num_shaders[MESA_SHADER_VERTEX] == 0 && if (num_shaders[MESA_SHADER_GEOMETRY] > 0 &&
!prog->SeparateShader) { num_shaders[MESA_SHADER_VERTEX] == 0) {
linker_error(prog, "Geometry shader must be linked with " linker_error(prog, "Geometry shader must be linked with "
"vertex shader\n"); "vertex shader\n");
goto done; goto done;
} }
if (num_shaders[MESA_SHADER_TESS_EVAL] > 0 && if (num_shaders[MESA_SHADER_TESS_EVAL] > 0 &&
num_shaders[MESA_SHADER_VERTEX] == 0 && num_shaders[MESA_SHADER_VERTEX] == 0) {
!prog->SeparateShader) { linker_error(prog, "Tessellation evaluation shader must be linked "
linker_error(prog, "Tessellation evaluation shader must be linked with " "with vertex shader\n");
"vertex shader\n"); goto done;
goto done; }
} if (num_shaders[MESA_SHADER_TESS_CTRL] > 0 &&
if (num_shaders[MESA_SHADER_TESS_CTRL] > 0 && num_shaders[MESA_SHADER_VERTEX] == 0) {
num_shaders[MESA_SHADER_VERTEX] == 0 && linker_error(prog, "Tessellation control shader must be linked with "
!prog->SeparateShader) { "vertex shader\n");
linker_error(prog, "Tessellation control shader must be linked with " goto done;
"vertex shader\n"); }
goto done;
}
/* The spec is self-contradictory here. It allows linking without a tess /* The spec is self-contradictory here. It allows linking without a tess
* eval shader, but that can only be used with transform feedback and * eval shader, but that can only be used with transform feedback and
* rasterization disabled. However, transform feedback isn't allowed * rasterization disabled. However, transform feedback isn't allowed
* with GL_PATCHES, so it can't be used. * with GL_PATCHES, so it can't be used.
* *
* More investigation showed that the idea of transform feedback after * More investigation showed that the idea of transform feedback after
* a tess control shader was dropped, because some hw vendors couldn't * a tess control shader was dropped, because some hw vendors couldn't
* support tessellation without a tess eval shader, but the linker section * support tessellation without a tess eval shader, but the linker
* wasn't updated to reflect that. * section wasn't updated to reflect that.
* *
* All specifications (ARB_tessellation_shader, GL 4.0-4.5) have this * All specifications (ARB_tessellation_shader, GL 4.0-4.5) have this
* spec bug. * spec bug.
* *
* Do what's reasonable and always require a tess eval shader if a tess * Do what's reasonable and always require a tess eval shader if a tess
* control shader is present. * control shader is present.
*/ */
if (num_shaders[MESA_SHADER_TESS_CTRL] > 0 && if (num_shaders[MESA_SHADER_TESS_CTRL] > 0 &&
num_shaders[MESA_SHADER_TESS_EVAL] == 0 && num_shaders[MESA_SHADER_TESS_EVAL] == 0) {
!prog->SeparateShader) { linker_error(prog, "Tessellation control shader must be linked with "
linker_error(prog, "Tessellation control shader must be linked with " "tessellation evaluation shader\n");
"tessellation evaluation shader\n"); goto done;
goto done; }
} }
/* Compute shaders have additional restrictions. */ /* Compute shaders have additional restrictions. */