if (last_vert_stage)
prog->last_vert_prog = prog->_LinkedShaders[last_vert_stage - 1]->Program;
+
+ /* Some shaders have to be linked with some other shaders present. */
+ if (!prog->SeparateShader) {
+ static const struct {
+ gl_shader_stage a, b;
+ } stage_pairs[] = {
+ { MESA_SHADER_GEOMETRY, MESA_SHADER_VERTEX },
+ { MESA_SHADER_TESS_EVAL, MESA_SHADER_VERTEX },
+ { MESA_SHADER_TESS_CTRL, MESA_SHADER_VERTEX },
+ { MESA_SHADER_TESS_CTRL, MESA_SHADER_TESS_EVAL },
+ };
+
+ for (unsigned i = 0; i < ARRAY_SIZE(stage_pairs); i++) {
+ gl_shader_stage a = stage_pairs[i].a;
+ gl_shader_stage b = stage_pairs[i].b;
+ if ((prog->data->linked_stages & ((1 << a) | (1 << b))) == (1 << a)) {
+ ralloc_asprintf_append(&prog->data->InfoLog,
+ "%s shader must be linked with %s shader\n",
+ _mesa_shader_stage_to_string(a),
+ _mesa_shader_stage_to_string(b));
+ prog->data->LinkStatus = LINKING_FAILURE;
+ return;
+ }
+ }
+ }
}
nir_shader *