mirror of
https://github.com/libretro/RetroArch
synced 2025-04-16 08:43:10 +00:00
Add GL_SHADER_STOCK_BLEND.
Replace stock shader with a special shader which does not apply color. This is a necessary on Android.
This commit is contained in:
parent
4f7d3b5ea0
commit
6dd7ea935e
@ -243,7 +243,7 @@ static void setup_font(void *data, const char *msg, GLfloat scale, GLfloat pos_x
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (gl->shader)
|
if (gl->shader)
|
||||||
gl->shader->use(0);
|
gl->shader->use(GL_SHADER_STOCK_BLEND);
|
||||||
|
|
||||||
gl_set_viewport(gl, gl->win_width, gl->win_height, false, false);
|
gl_set_viewport(gl, gl->win_width, gl->win_height, false, false);
|
||||||
|
|
||||||
|
4
gfx/gl.c
4
gfx/gl.c
@ -1261,7 +1261,7 @@ static inline void gl_draw_texture(void *data)
|
|||||||
glBindTexture(GL_TEXTURE_2D, gl->rgui_texture);
|
glBindTexture(GL_TEXTURE_2D, gl->rgui_texture);
|
||||||
|
|
||||||
if (gl->shader)
|
if (gl->shader)
|
||||||
gl->shader->use(0);
|
gl->shader->use(GL_SHADER_STOCK_BLEND);
|
||||||
gl_shader_set_coords(gl, &gl->coords, &gl->mvp_no_rot);
|
gl_shader_set_coords(gl, &gl->coords, &gl->mvp_no_rot);
|
||||||
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
@ -2205,7 +2205,7 @@ static void gl_render_overlay(void *data)
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (gl->shader)
|
if (gl->shader)
|
||||||
gl->shader->use(0);
|
gl->shader->use(GL_SHADER_STOCK_BLEND);
|
||||||
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
gl->coords.vertex = gl->overlay_vertex_coord;
|
gl->coords.vertex = gl->overlay_vertex_coord;
|
||||||
|
@ -122,12 +122,12 @@ struct cg_program
|
|||||||
CGparameter frame_dir_v;
|
CGparameter frame_dir_v;
|
||||||
CGparameter mvp;
|
CGparameter mvp;
|
||||||
|
|
||||||
struct cg_fbo_params fbo[RARCH_CG_MAX_SHADERS];
|
struct cg_fbo_params fbo[GFX_MAX_SHADERS];
|
||||||
struct cg_fbo_params orig;
|
struct cg_fbo_params orig;
|
||||||
struct cg_fbo_params prev[PREV_TEXTURES];
|
struct cg_fbo_params prev[PREV_TEXTURES];
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct cg_program prg[RARCH_CG_MAX_SHADERS];
|
static struct cg_program prg[GFX_MAX_SHADERS];
|
||||||
static const char **cg_arguments;
|
static const char **cg_arguments;
|
||||||
static bool cg_active;
|
static bool cg_active;
|
||||||
static CGprofile cgVProf, cgFProf;
|
static CGprofile cgVProf, cgFProf;
|
||||||
@ -138,7 +138,7 @@ static struct gfx_shader *cg_shader;
|
|||||||
static state_tracker_t *state_tracker;
|
static state_tracker_t *state_tracker;
|
||||||
static GLuint lut_textures[MAX_TEXTURES];
|
static GLuint lut_textures[MAX_TEXTURES];
|
||||||
|
|
||||||
static CGparameter cg_attribs[PREV_TEXTURES + 1 + 4 + RARCH_CG_MAX_SHADERS];
|
static CGparameter cg_attribs[PREV_TEXTURES + 1 + 4 + GFX_MAX_SHADERS];
|
||||||
static unsigned cg_attrib_index;
|
static unsigned cg_attrib_index;
|
||||||
|
|
||||||
static void gl_cg_reset_attrib(void)
|
static void gl_cg_reset_attrib(void)
|
||||||
@ -195,7 +195,7 @@ static void gl_cg_set_params(unsigned width, unsigned height,
|
|||||||
const struct gl_tex_info *fbo_info,
|
const struct gl_tex_info *fbo_info,
|
||||||
unsigned fbo_info_cnt)
|
unsigned fbo_info_cnt)
|
||||||
{
|
{
|
||||||
if (!cg_active || (active_index == 0))
|
if (!cg_active || (active_index == 0) || (active_index == GL_SHADER_STOCK_BLEND))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Set frame.
|
// Set frame.
|
||||||
@ -332,7 +332,7 @@ static void gl_cg_deinit_progs(void)
|
|||||||
cgGLUnbindProgram(cgVProf);
|
cgGLUnbindProgram(cgVProf);
|
||||||
|
|
||||||
// Programs may alias [0].
|
// Programs may alias [0].
|
||||||
for (unsigned i = 1; i < RARCH_CG_MAX_SHADERS; i++)
|
for (unsigned i = 1; i < GFX_MAX_SHADERS; i++)
|
||||||
{
|
{
|
||||||
if (prg[i].fprg && prg[i].fprg != prg[0].fprg)
|
if (prg[i].fprg && prg[i].fprg != prg[0].fprg)
|
||||||
cgDestroyProgram(prg[i].fprg);
|
cgDestroyProgram(prg[i].fprg);
|
||||||
@ -629,10 +629,10 @@ static bool load_preset(const char *path)
|
|||||||
config_file_free(conf);
|
config_file_free(conf);
|
||||||
gfx_shader_resolve_relative(cg_shader, path);
|
gfx_shader_resolve_relative(cg_shader, path);
|
||||||
|
|
||||||
if (cg_shader->passes > RARCH_CG_MAX_SHADERS - 3)
|
if (cg_shader->passes > GFX_MAX_SHADERS - 3)
|
||||||
{
|
{
|
||||||
RARCH_WARN("Too many shaders ... Capping shader amount to %d.\n", RARCH_CG_MAX_SHADERS - 3);
|
RARCH_WARN("Too many shaders ... Capping shader amount to %d.\n", GFX_MAX_SHADERS - 3);
|
||||||
cg_shader->passes = RARCH_CG_MAX_SHADERS - 3;
|
cg_shader->passes = GFX_MAX_SHADERS - 3;
|
||||||
}
|
}
|
||||||
for (unsigned i = 0; i < cg_shader->passes; i++)
|
for (unsigned i = 0; i < cg_shader->passes; i++)
|
||||||
{
|
{
|
||||||
@ -818,6 +818,9 @@ static bool gl_cg_init(const char *path)
|
|||||||
// pass-through.
|
// pass-through.
|
||||||
prg[cg_shader->passes + 1] = prg[0];
|
prg[cg_shader->passes + 1] = prg[0];
|
||||||
|
|
||||||
|
// No need to apply Android hack in Cg.
|
||||||
|
prg[GL_SHADER_STOCK_BLEND] = prg[0];
|
||||||
|
|
||||||
cgGLBindProgram(prg[1].fprg);
|
cgGLBindProgram(prg[1].fprg);
|
||||||
cgGLBindProgram(prg[1].vprg);
|
cgGLBindProgram(prg[1].vprg);
|
||||||
|
|
||||||
|
@ -20,9 +20,7 @@
|
|||||||
#include "shader_common.h"
|
#include "shader_common.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define RARCH_CG_MAX_SHADERS 16
|
|
||||||
void gl_cg_set_compiler_args(const char **argv);
|
void gl_cg_set_compiler_args(const char **argv);
|
||||||
|
|
||||||
void gl_cg_invalidate_context(void); // Call when resetting GL context on PS3.
|
void gl_cg_invalidate_context(void); // Call when resetting GL context on PS3.
|
||||||
extern const gl_shader_backend_t gl_cg_backend;
|
extern const gl_shader_backend_t gl_cg_backend;
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
#include "shader_parse.h"
|
#include "shader_parse.h"
|
||||||
#include "math/matrix.h"
|
#include "math/matrix.h"
|
||||||
|
|
||||||
|
#define GL_SHADER_STOCK_BLEND (GFX_MAX_SHADERS - 1)
|
||||||
|
|
||||||
struct gl_shader_backend
|
struct gl_shader_backend
|
||||||
{
|
{
|
||||||
bool (*init)(const char *path);
|
bool (*init)(const char *path);
|
||||||
|
@ -130,7 +130,7 @@ static GLuint gl_teximage[GFX_MAX_TEXTURES];
|
|||||||
|
|
||||||
static state_tracker_t *gl_state_tracker;
|
static state_tracker_t *gl_state_tracker;
|
||||||
|
|
||||||
static GLint gl_attribs[PREV_TEXTURES + 1 + 4 + RARCH_GLSL_MAX_SHADERS];
|
static GLint gl_attribs[PREV_TEXTURES + 1 + 4 + GFX_MAX_SHADERS];
|
||||||
static unsigned gl_attrib_index;
|
static unsigned gl_attrib_index;
|
||||||
|
|
||||||
static gfx_ctx_proc_t (*glsl_get_proc_address)(const char*);
|
static gfx_ctx_proc_t (*glsl_get_proc_address)(const char*);
|
||||||
@ -162,17 +162,40 @@ struct shader_uniforms
|
|||||||
int lut_texture[GFX_MAX_TEXTURES];
|
int lut_texture[GFX_MAX_TEXTURES];
|
||||||
|
|
||||||
struct shader_uniforms_frame orig;
|
struct shader_uniforms_frame orig;
|
||||||
struct shader_uniforms_frame pass[RARCH_GLSL_MAX_SHADERS];
|
struct shader_uniforms_frame pass[GFX_MAX_SHADERS];
|
||||||
struct shader_uniforms_frame prev[PREV_TEXTURES];
|
struct shader_uniforms_frame prev[PREV_TEXTURES];
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct shader_uniforms gl_uniforms[RARCH_GLSL_MAX_SHADERS];
|
static struct shader_uniforms gl_uniforms[GFX_MAX_SHADERS];
|
||||||
|
|
||||||
static const char *glsl_prefixes[] = {
|
static const char *glsl_prefixes[] = {
|
||||||
"",
|
"",
|
||||||
"ruby",
|
"ruby",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Need to duplicate these to work around broken stuff on Android.
|
||||||
|
// Must enforce alpha = 1.0 or 32-bit games can potentially go black.
|
||||||
|
static const char *stock_vertex_modern =
|
||||||
|
"attribute vec2 TexCoord;\n"
|
||||||
|
"attribute vec2 VertexCoord;\n"
|
||||||
|
"attribute vec4 Color;\n"
|
||||||
|
"uniform mat4 MVPMatrix;\n"
|
||||||
|
"varying vec2 tex_coord;\n"
|
||||||
|
"void main() {\n"
|
||||||
|
" gl_Position = MVPMatrix * vec4(VertexCoord, 0.0, 1.0);\n"
|
||||||
|
" tex_coord = TexCoord;\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
static const char *stock_fragment_modern =
|
||||||
|
"#ifdef GL_ES\n"
|
||||||
|
"precision mediump float;\n"
|
||||||
|
"#endif\n"
|
||||||
|
"uniform sampler2D Texture;\n"
|
||||||
|
"varying vec2 tex_coord;\n"
|
||||||
|
"void main() {\n"
|
||||||
|
" gl_FragColor = vec4(texture2D(Texture, tex_coord).rgb, 1.0);\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
static const char *stock_vertex_legacy =
|
static const char *stock_vertex_legacy =
|
||||||
"varying vec4 color;\n"
|
"varying vec4 color;\n"
|
||||||
"void main() {\n"
|
"void main() {\n"
|
||||||
@ -188,7 +211,7 @@ static const char *stock_fragment_legacy =
|
|||||||
" gl_FragColor = color * texture2D(Texture, gl_TexCoord[0].xy);\n"
|
" gl_FragColor = color * texture2D(Texture, gl_TexCoord[0].xy);\n"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
static const char *stock_vertex_modern =
|
static const char *stock_vertex_modern_blend =
|
||||||
"attribute vec2 TexCoord;\n"
|
"attribute vec2 TexCoord;\n"
|
||||||
"attribute vec2 VertexCoord;\n"
|
"attribute vec2 VertexCoord;\n"
|
||||||
"attribute vec4 Color;\n"
|
"attribute vec4 Color;\n"
|
||||||
@ -201,7 +224,7 @@ static const char *stock_vertex_modern =
|
|||||||
" color = Color;\n"
|
" color = Color;\n"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
static const char *stock_fragment_modern =
|
static const char *stock_fragment_modern_blend =
|
||||||
"#ifdef GL_ES\n"
|
"#ifdef GL_ES\n"
|
||||||
"precision mediump float;\n"
|
"precision mediump float;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
@ -718,6 +741,19 @@ static bool gl_glsl_init(const char *path)
|
|||||||
gl_program[glsl_shader->passes + 1] = gl_program[0];
|
gl_program[glsl_shader->passes + 1] = gl_program[0];
|
||||||
gl_uniforms[glsl_shader->passes + 1] = gl_uniforms[0];
|
gl_uniforms[glsl_shader->passes + 1] = gl_uniforms[0];
|
||||||
|
|
||||||
|
if (glsl_shader->modern)
|
||||||
|
{
|
||||||
|
gl_program[GL_SHADER_STOCK_BLEND] = compile_program(stock_vertex_modern_blend,
|
||||||
|
stock_fragment_modern_blend, GL_SHADER_STOCK_BLEND);
|
||||||
|
|
||||||
|
find_uniforms(gl_program[GL_SHADER_STOCK_BLEND], &gl_uniforms[GL_SHADER_STOCK_BLEND]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gl_program[GL_SHADER_STOCK_BLEND] = gl_program[0];
|
||||||
|
gl_uniforms[GL_SHADER_STOCK_BLEND] = gl_uniforms[0];
|
||||||
|
}
|
||||||
|
|
||||||
gl_glsl_reset_attrib();
|
gl_glsl_reset_attrib();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -728,7 +764,7 @@ static void gl_glsl_deinit(void)
|
|||||||
if (glsl_enable)
|
if (glsl_enable)
|
||||||
{
|
{
|
||||||
pglUseProgram(0);
|
pglUseProgram(0);
|
||||||
for (unsigned i = 0; i <= glsl_shader->passes; i++)
|
for (unsigned i = 0; i < GFX_MAX_SHADERS; i++)
|
||||||
{
|
{
|
||||||
if (gl_program[i] == 0 || (i && gl_program[i] == gl_program[0]))
|
if (gl_program[i] == 0 || (i && gl_program[i] == gl_program[0]))
|
||||||
continue;
|
continue;
|
||||||
|
@ -20,11 +20,7 @@
|
|||||||
#include "../boolean.h"
|
#include "../boolean.h"
|
||||||
#include "shader_common.h"
|
#include "shader_common.h"
|
||||||
|
|
||||||
#define RARCH_GLSL_MAX_SHADERS 16
|
|
||||||
#define RARCH_GLSL_MENU_SHADER_INDEX (RARCH_GLSL_MAX_SHADERS - 1)
|
|
||||||
|
|
||||||
void gl_glsl_set_get_proc_address(gfx_ctx_proc_t (*proc)(const char*));
|
void gl_glsl_set_get_proc_address(gfx_ctx_proc_t (*proc)(const char*));
|
||||||
|
|
||||||
extern const gl_shader_backend_t gl_glsl_backend;
|
extern const gl_shader_backend_t gl_glsl_backend;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user