/** * Link a program's shaders. */ static void link_program(struct gl_context *ctx, GLuint program) { struct gl_shader_program *shProg; struct gl_transform_feedback_object *obj = ctx->TransformFeedback.CurrentObject; shProg = _mesa_lookup_shader_program_err(ctx, program, "glLinkProgram"); if (!shProg) return; if (obj->Active && (shProg == ctx->Shader.CurrentVertexProgram || shProg == ctx->Shader.CurrentGeometryProgram || shProg == ctx->Shader.CurrentFragmentProgram)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glLinkProgram(transform feedback active)"); return; } FLUSH_VERTICES(ctx, _NEW_PROGRAM); _mesa_glsl_link_shader(ctx, shProg); if (shProg->LinkStatus == GL_FALSE && (ctx->Shader.Flags & GLSL_REPORT_ERRORS)) { _mesa_debug(ctx, "Error linking program %u:\n%s\n", shProg->Name, shProg->InfoLog); } /* debug code */ if (0) { GLuint i; printf("Link %u shaders in program %u: %s\n", shProg->NumShaders, shProg->Name, shProg->LinkStatus ? "Success" : "Failed"); for (i = 0; i < shProg->NumShaders; i++) { printf(" shader %u, type 0x%x\n", shProg->Shaders[i]->Name, shProg->Shaders[i]->Type); } } }
/** * Link a program's shaders. */ static void link_program(struct gl_context *ctx, GLuint program) { struct gl_shader_program *shProg; shProg = _mesa_lookup_shader_program_err(ctx, program, "glLinkProgram"); if (!shProg) return; /* From the ARB_transform_feedback2 specification: * "The error INVALID_OPERATION is generated by LinkProgram if <program> is * the name of a program being used by one or more transform feedback * objects, even if the objects are not currently bound or are paused." */ if (_mesa_transform_feedback_is_using_program(ctx, shProg)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glLinkProgram(transform feedback is using the program)"); return; } FLUSH_VERTICES(ctx, _NEW_PROGRAM); _mesa_glsl_link_shader(ctx, shProg); if (shProg->LinkStatus == GL_FALSE && (ctx->Shader.Flags & GLSL_REPORT_ERRORS)) { _mesa_debug(ctx, "Error linking program %u:\n%s\n", shProg->Name, shProg->InfoLog); } /* debug code */ if (0) { GLuint i; printf("Link %u shaders in program %u: %s\n", shProg->NumShaders, shProg->Name, shProg->LinkStatus ? "Success" : "Failed"); for (i = 0; i < shProg->NumShaders; i++) { printf(" shader %u, type 0x%x\n", shProg->Shaders[i]->Name, shProg->Shaders[i]->Type); } } }