Support aliased pass names from CGP/GLSLP.

This commit is contained in:
Themaister 2014-05-23 15:02:12 +02:00
parent b0e014adc6
commit dab36b5870
5 changed files with 43 additions and 47 deletions

View File

@ -978,6 +978,7 @@ static void gl_frame_fbo(void *data, const struct gl_tex_info *tex_info)
fbo_info->tex_size[0] = prev_rect->width;
fbo_info->tex_size[1] = prev_rect->height;
memcpy(fbo_info->coord, fbo_tex_coords, sizeof(fbo_tex_coords));
fbo_tex_info_cnt++;
glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->fbo[i]);
@ -1002,8 +1003,6 @@ static void gl_frame_fbo(void *data, const struct gl_tex_info *tex_info)
gl_shader_set_coords(gl, &gl->coords, &gl->mvp);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
fbo_tex_info_cnt++;
}
#if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES)
@ -1018,6 +1017,16 @@ static void gl_frame_fbo(void *data, const struct gl_tex_info *tex_info)
set_texture_coords(fbo_tex_coords, xamt, yamt);
// Push final FBO to list.
fbo_info = &fbo_tex_info[gl->fbo_pass - 1];
fbo_info->tex = gl->fbo_texture[gl->fbo_pass - 1];
fbo_info->input_size[0] = prev_rect->img_width;
fbo_info->input_size[1] = prev_rect->img_height;
fbo_info->tex_size[0] = prev_rect->width;
fbo_info->tex_size[1] = prev_rect->height;
memcpy(fbo_info->coord, fbo_tex_coords, sizeof(fbo_tex_coords));
fbo_tex_info_cnt++;
// Render our FBO texture to back buffer.
gl_bind_backbuffer();
if (gl->shader)

View File

@ -287,7 +287,7 @@ static void gl_cg_set_params(void *data, unsigned width, unsigned height,
}
// Set FBO textures.
if (active_index > 2)
if (active_index)
{
for (i = 0; i < fbo_info_cnt; i++)
{
@ -756,13 +756,16 @@ static void set_program_attributes(unsigned i)
prg[i].prev[j].coord = cgGetNamedParameter(prg[i].vprg, attr_buf_coord);
}
for (j = 0; j < i - 1; j++)
for (j = 0; j + 1 < i; j++)
{
char pass_str[64];
snprintf(pass_str, sizeof(pass_str), "PASS%u", j + 1);
set_pass_attrib(&prg[i], &prg[i].fbo[j], pass_str);
snprintf(pass_str, sizeof(pass_str), "PASSPREV%u", i - (j + 1));
set_pass_attrib(&prg[i], &prg[i].fbo[j], pass_str);
if (*cg_shader->pass[j].alias)
set_pass_attrib(&prg[i], &prg[i].fbo[j], cg_shader->pass[j].alias);
}
}

View File

@ -566,6 +566,9 @@ static void find_uniforms(unsigned pass, GLuint prog, struct shader_uniforms *un
find_uniforms_frame(prog, &uni->pass[i], frame_base);
snprintf(frame_base, sizeof(frame_base), "PassPrev%u", pass - (i + 1));
find_uniforms_frame(prog, &uni->pass[i], frame_base);
if (*glsl_shader->pass[i].alias)
find_uniforms_frame(prog, &uni->pass[i], glsl_shader->pass[i].alias);
}
clear_uniforms_frame(&uni->prev[0]);
@ -818,12 +821,6 @@ static void gl_glsl_set_params(void *data, unsigned width, unsigned height,
const struct gl_tex_info *fbo_info, unsigned fbo_info_cnt)
{
(void)data;
// We enforce a certain layout for our various texture types in the texunits.
// - Regular frame (Texture) (always bound).
// - LUT textures (always bound).
// - Original texture (always bound if meaningful).
// - FBO textures (always bound if available).
// - Previous textures.
if (!glsl_enable || (gl_program[active_index] == 0))
return;
@ -861,21 +858,22 @@ static void gl_glsl_set_params(void *data, unsigned width, unsigned height,
if (uni->frame_direction >= 0)
glUniform1i(uni->frame_direction, g_extern.frame_is_reverse ? -1 : 1);
unsigned texunit = 1;
for (i = 0; i < glsl_shader->luts; i++)
{
if (uni->lut_texture[i] >= 0)
{
// Have to rebind as HW render could override this.
glActiveTexture(GL_TEXTURE0 + i + 1);
glActiveTexture(GL_TEXTURE0 + texunit);
glBindTexture(GL_TEXTURE_2D, gl_teximage[i]);
glUniform1i(uni->lut_texture[i], i + 1);
glUniform1i(uni->lut_texture[i], texunit);
texunit++;
}
}
unsigned texunit = glsl_shader->luts + 1;
// Set original texture unless we're in first pass (pointless).
if (active_index > 1)
// Set original texture.
if (active_index)
{
if (uni->orig.texture >= 0)
{
@ -883,10 +881,9 @@ static void gl_glsl_set_params(void *data, unsigned width, unsigned height,
glActiveTexture(GL_TEXTURE0 + texunit);
glUniform1i(uni->orig.texture, texunit);
glBindTexture(GL_TEXTURE_2D, info->tex);
texunit++;
}
texunit++;
if (uni->orig.texture_size >= 0)
glUniform2fv(uni->orig.texture_size, 1, info->tex_size);
@ -906,20 +903,16 @@ static void gl_glsl_set_params(void *data, unsigned width, unsigned height,
size += 8;
}
// Bind new texture in the chain.
if (fbo_info_cnt > 0)
{
glActiveTexture(GL_TEXTURE0 + texunit + fbo_info_cnt - 1);
glBindTexture(GL_TEXTURE_2D, fbo_info[fbo_info_cnt - 1].tex);
}
// Bind FBO textures.
for (i = 0; i < fbo_info_cnt; i++)
{
if (uni->pass[i].texture)
{
glActiveTexture(GL_TEXTURE0 + texunit);
glBindTexture(GL_TEXTURE_2D, fbo_info[i].tex);
glUniform1i(uni->pass[i].texture, texunit);
texunit++;
texunit++;
}
if (uni->pass[i].texture_size >= 0)
glUniform2fv(uni->pass[i].texture_size, 1, fbo_info[i].tex_size);
@ -940,23 +933,6 @@ static void gl_glsl_set_params(void *data, unsigned width, unsigned height,
}
}
}
else
{
// First pass, so unbind everything to avoid collitions.
// Unbind ORIG.
glActiveTexture(GL_TEXTURE0 + texunit);
glBindTexture(GL_TEXTURE_2D, 0);
GLuint base_tex = texunit + 1;
// Unbind any lurking FBO passes.
// Rendering to a texture that is bound to a texture unit
// sounds very shaky ... ;)
for (i = 0; i < glsl_shader->passes; i++)
{
glActiveTexture(GL_TEXTURE0 + base_tex + i);
glBindTexture(GL_TEXTURE_2D, 0);
}
}
// Set previous textures. Only bind if they're actually used.
for (i = 0; i < PREV_TEXTURES; i++)
@ -965,11 +941,10 @@ static void gl_glsl_set_params(void *data, unsigned width, unsigned height,
{
glActiveTexture(GL_TEXTURE0 + texunit);
glBindTexture(GL_TEXTURE_2D, prev_info[i].tex);
glUniform1i(uni->prev[i].texture, texunit++);
glUniform1i(uni->prev[i].texture, texunit);
texunit++;
}
texunit++;
if (uni->prev[i].texture_size >= 0)
glUniform2fv(uni->prev[i].texture_size, 1, prev_info[i].tex_size);

View File

@ -105,6 +105,11 @@ static bool shader_parse_pass(config_file_t *conf, struct gfx_shader_pass *pass,
print_buf(mipmap_buf, "mipmap_input%u", i);
config_get_bool(conf, mipmap_buf, &pass->mipmap);
char alias_buf[64];
print_buf(alias_buf, "alias%u", i);
if (!config_get_array(conf, alias_buf, pass->alias, sizeof(pass->alias)))
*pass->alias = '\0';
// Scale
struct gfx_fbo_scale *scale = &pass->fbo;
char scale_type[64] = {0};
@ -615,6 +620,9 @@ void gfx_shader_write_conf_cgp(config_file_t *conf, const struct gfx_shader *sha
print_buf(key, "mipmap_input%u", i);
config_set_bool(conf, key, pass->mipmap);
print_buf(key, "alias%u", i);
config_set_string(conf, key, pass->alias);
shader_write_fbo(conf, &pass->fbo, i);
}

View File

@ -88,6 +88,7 @@ struct gfx_shader_pass
} string;
} source;
char alias[64];
struct gfx_fbo_scale fbo;
enum gfx_filter_type filter;
enum gfx_wrap_type wrap;