/** * For GL_EXT_separate_shader_objects */ void GLAPIENTRY _mesa_UseShaderProgramEXT(GLenum type, GLuint program) { GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg = NULL; ASSERT_OUTSIDE_BEGIN_END(ctx); if (!validate_shader_target(ctx, type)) { _mesa_error(ctx, GL_INVALID_ENUM, "glUseShaderProgramEXT(type)"); return; } if (ctx->TransformFeedback.CurrentObject->Active && !ctx->TransformFeedback.CurrentObject->Paused) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUseShaderProgramEXT(transform feedback is active)"); return; } if (program) { shProg = _mesa_lookup_shader_program_err(ctx, program, "glUseShaderProgramEXT"); if (shProg == NULL) return; if (!shProg->LinkStatus) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUseShaderProgramEXT(program not linked)"); return; } } _mesa_use_shader_program(ctx, type, shProg); }
/** * For GL_EXT_separate_shader_objects */ void GLAPIENTRY _mesa_UseShaderProgramEXT(GLenum type, GLuint program) { GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg = NULL; if (!validate_shader_target(ctx, type)) { _mesa_error(ctx, GL_INVALID_ENUM, "glUseShaderProgramEXT(type)"); return; } if (_mesa_is_xfb_active_and_unpaused(ctx)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUseShaderProgramEXT(transform feedback is active)"); return; } if (program) { shProg = _mesa_lookup_shader_program_err(ctx, program, "glUseShaderProgramEXT"); if (shProg == NULL) return; if (!shProg->LinkStatus) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUseShaderProgramEXT(program not linked)"); return; } } _mesa_use_shader_program(ctx, type, shProg); }
static GLuint create_shader(struct gl_context *ctx, GLenum type) { struct gl_shader *sh; GLuint name; if (!validate_shader_target(ctx, type)) { _mesa_error(ctx, GL_INVALID_ENUM, "CreateShader(type)"); return 0; } name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1); sh = ctx->Driver.NewShader(ctx, name, type); _mesa_HashInsert(ctx->Shared->ShaderObjects, name, sh); return name; }