static bool gl_glsl_compile_program( void *data, unsigned idx, void *program_data, struct shader_program_info *program_info) { glsl_shader_data_t *glsl = (glsl_shader_data_t*)data; struct shader_program_glsl_data *program = (struct shader_program_glsl_data*)program_data; GLuint prog = glCreateProgram(); if (!program) program = &glsl->prg[idx]; if (!prog) goto error; if (program_info->vertex) { RARCH_LOG("[GLSL]: Found GLSL vertex shader.\n"); program->vprg = glCreateShader(GL_VERTEX_SHADER); if (!gl_glsl_compile_shader( glsl, program->vprg, "#define VERTEX\n#define PARAMETER_UNIFORM\n", program_info->vertex)) { RARCH_ERR("Failed to compile vertex shader #%u\n", idx); goto error; } glAttachShader(prog, program->vprg); } if (program_info->fragment) { RARCH_LOG("[GLSL]: Found GLSL fragment shader.\n"); program->fprg = glCreateShader(GL_FRAGMENT_SHADER); if (!gl_glsl_compile_shader(glsl, program->fprg, "#define FRAGMENT\n#define PARAMETER_UNIFORM\n", program_info->fragment)) { RARCH_ERR("Failed to compile fragment shader #%u\n", idx); goto error; } glAttachShader(prog, program->fprg); } if (program_info->vertex || program_info->fragment) { RARCH_LOG("[GLSL]: Linking GLSL program.\n"); if (!gl_glsl_link_program(prog)) goto error; /* Clean up dead memory. We're not going to relink the program. * Detaching first seems to kill some mobile drivers * (according to the intertubes anyways). */ if (program->vprg) glDeleteShader(program->vprg); if (program->fprg) glDeleteShader(program->fprg); program->vprg = 0; program->fprg = 0; glUseProgram(prog); glUniform1i(gl_glsl_get_uniform(glsl, prog, "Texture"), 0); glUseProgram(0); } program->id = prog; return true; error: RARCH_ERR("Failed to link program #%u.\n", idx); program->id = 0; return false; }
static GLuint gl_glsl_compile_program(glsl_shader_data_t *glsl, const char *vertex, const char *fragment, unsigned i) { GLuint vert = 0, frag = 0, prog = glCreateProgram(); if (!prog) return 0; if (vertex) { RARCH_LOG("Found GLSL vertex shader.\n"); vert = glCreateShader(GL_VERTEX_SHADER); if (!gl_glsl_compile_shader( glsl, vert, "#define VERTEX\n#define PARAMETER_UNIFORM\n", vertex)) { RARCH_ERR("Failed to compile vertex shader #%u\n", i); return 0; } glAttachShader(prog, vert); } if (fragment) { RARCH_LOG("Found GLSL fragment shader.\n"); frag = glCreateShader(GL_FRAGMENT_SHADER); if (!gl_glsl_compile_shader(glsl, frag, "#define FRAGMENT\n#define PARAMETER_UNIFORM\n", fragment)) { RARCH_ERR("Failed to compile fragment shader #%u\n", i); return 0; } glAttachShader(prog, frag); } if (vertex || fragment) { RARCH_LOG("Linking GLSL program.\n"); if (!gl_glsl_link_program(prog)) { RARCH_ERR("Failed to link program #%u.\n", i); return 0; } /* Clean up dead memory. We're not going to relink the program. * Detaching first seems to kill some mobile drivers * (according to the intertubes anyways). */ if (vert) glDeleteShader(vert); if (frag) glDeleteShader(frag); glUseProgram(prog); glUniform1i(gl_glsl_get_uniform(glsl, prog, "Texture"), 0); glUseProgram(0); } return prog; }