mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Fixes GLES 3.1 in Adreno devices
See https://github.com/gonetz/GLideN64/issues/895
This commit is contained in:
parent
e8802cd744
commit
f614c26e95
|
@ -384,7 +384,7 @@ Storage format:
|
|||
uint32 - number of shaders
|
||||
shaders in binary form
|
||||
*/
|
||||
static const u32 ShaderStorageFormatVersion = 0x09U;
|
||||
static const u32 ShaderStorageFormatVersion = 0x0AU;
|
||||
void CombinerInfo::_saveShadersStorage() const
|
||||
{
|
||||
if (m_shadersLoaded >= m_combiners.size())
|
||||
|
|
|
@ -28,7 +28,6 @@ static GLuint g_calc_noise_shader_object;
|
|||
static GLuint g_write_depth_shader_object;
|
||||
static GLuint g_calc_depth_shader_object;
|
||||
static GLuint g_render_depth_shader_object;
|
||||
static GLuint g_readtex_shader_object;
|
||||
static GLuint g_readtex_ms_shader_object;
|
||||
static GLuint g_dither_shader_object;
|
||||
static GLuint g_monochrome_image_program = 0;
|
||||
|
@ -219,7 +218,6 @@ void InitShaderCombiner()
|
|||
g_calc_mipmap_shader_object = _createShader(GL_FRAGMENT_SHADER, fragment_shader_mipmap);
|
||||
g_calc_noise_shader_object = _createShader(GL_FRAGMENT_SHADER, fragment_shader_noise);
|
||||
g_write_depth_shader_object = _createShader(GL_FRAGMENT_SHADER, fragment_shader_depth);
|
||||
g_readtex_shader_object = _createShader(GL_FRAGMENT_SHADER, config.texture.bilinearMode == BILINEAR_3POINT ? fragment_shader_readtex_3point : fragment_shader_readtex);
|
||||
g_readtex_ms_shader_object = _createShader(GL_FRAGMENT_SHADER, fragment_shader_readtex_ms);
|
||||
g_dither_shader_object = _createShader(GL_FRAGMENT_SHADER, fragment_shader_dither);
|
||||
#endif // GLESX
|
||||
|
@ -256,8 +254,6 @@ void DestroyShaderCombiner() {
|
|||
g_calc_light_shader_object = 0;
|
||||
glDeleteShader(g_calc_mipmap_shader_object);
|
||||
g_calc_mipmap_shader_object = 0;
|
||||
glDeleteShader(g_readtex_shader_object);
|
||||
g_readtex_shader_object = 0;
|
||||
glDeleteShader(g_readtex_ms_shader_object);
|
||||
g_readtex_ms_shader_object = 0;
|
||||
glDeleteShader(g_calc_noise_shader_object);
|
||||
|
@ -320,7 +316,8 @@ ShaderCombiner::ShaderCombiner(Combiner & _color, Combiner & _alpha, const gDPCo
|
|||
if (bUseLod)
|
||||
strFragmentShader.append(fragment_shader_header_mipmap);
|
||||
else {
|
||||
strFragmentShader.append(fragment_shader_header_readTex);
|
||||
strFragmentShader.append(config.texture.bilinearMode == BILINEAR_3POINT ? fragment_shader_readtex_3point : fragment_shader_readtex);
|
||||
|
||||
#ifdef GL_MULTISAMPLING_SUPPORT
|
||||
if (config.video.multisampling > 0)
|
||||
strFragmentShader.append(fragment_shader_header_readTexMS);
|
||||
|
@ -361,24 +358,32 @@ ShaderCombiner::ShaderCombiner(Combiner & _color, Combiner & _alpha, const gDPCo
|
|||
if (usesTile(0)) {
|
||||
if (config.video.multisampling > 0) {
|
||||
strFragmentShader.append(" lowp vec4 readtex0; \n");
|
||||
strFragmentShader.append(" if (uMSTexEnabled[0] == 0) readtex0 = readTex(uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n");
|
||||
strFragmentShader.append(" if (uMSTexEnabled[0] == 0) READ_TEX(readtex0, uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]) \n");
|
||||
strFragmentShader.append(" else readtex0 = readTexMS(uMSTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n");
|
||||
} else
|
||||
strFragmentShader.append(" lowp vec4 readtex0 = readTex(uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n");
|
||||
} else {
|
||||
strFragmentShader.append(" lowp vec4 readtex0; \n");
|
||||
strFragmentShader.append(" READ_TEX(readtex0, uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n");
|
||||
}
|
||||
}
|
||||
if (usesTile(1)) {
|
||||
if (config.video.multisampling > 0) {
|
||||
strFragmentShader.append(" lowp vec4 readtex1; \n");
|
||||
strFragmentShader.append(" if (uMSTexEnabled[1] == 0) readtex1 = readTex(uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n");
|
||||
strFragmentShader.append(" if (uMSTexEnabled[1] == 0) READ_TEX(readtex1, uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]) \n");
|
||||
strFragmentShader.append(" else readtex1 = readTexMS(uMSTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n");
|
||||
} else
|
||||
strFragmentShader.append(" lowp vec4 readtex1 = readTex(uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n");
|
||||
} else {
|
||||
strFragmentShader.append(" lowp vec4 readtex1; \n");
|
||||
strFragmentShader.append(" READ_TEX(readtex1, uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n");
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (usesTile(0))
|
||||
strFragmentShader.append(" lowp vec4 readtex0 = readTex(uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n");
|
||||
if (usesTile(1))
|
||||
strFragmentShader.append(" lowp vec4 readtex1 = readTex(uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n");
|
||||
if (usesTile(0)) {
|
||||
strFragmentShader.append(" lowp vec4 readtex0; \n");
|
||||
strFragmentShader.append(" READ_TEX(readtex0, uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n");
|
||||
}
|
||||
if (usesTile(1)) {
|
||||
strFragmentShader.append(" lowp vec4 readtex1; \n");
|
||||
strFragmentShader.append(" READ_TEX(readtex1, uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n");
|
||||
}
|
||||
#endif // GL_MULTISAMPLING_SUPPORT
|
||||
}
|
||||
|
||||
|
@ -425,7 +430,6 @@ ShaderCombiner::ShaderCombiner(Combiner & _color, Combiner & _alpha, const gDPCo
|
|||
if (config.generalEmulation.enableLOD != 0)
|
||||
strFragmentShader.append(fragment_shader_mipmap);
|
||||
} else if (usesTexture()) {
|
||||
strFragmentShader.append(config.texture.bilinearMode == BILINEAR_3POINT ? fragment_shader_readtex_3point : fragment_shader_readtex);
|
||||
#ifdef GL_MULTISAMPLING_SUPPORT
|
||||
if (config.video.multisampling > 0)
|
||||
strFragmentShader.append(fragment_shader_readtex_ms);
|
||||
|
@ -467,7 +471,6 @@ ShaderCombiner::ShaderCombiner(Combiner & _color, Combiner & _alpha, const gDPCo
|
|||
if (config.generalEmulation.enableLOD != 0)
|
||||
glAttachShader(m_program, g_calc_mipmap_shader_object);
|
||||
} else if (usesTexture()) {
|
||||
glAttachShader(m_program, g_readtex_shader_object);
|
||||
if (config.video.multisampling > 0)
|
||||
glAttachShader(m_program, g_readtex_ms_shader_object);
|
||||
}
|
||||
|
|
|
@ -270,8 +270,6 @@ static const char* fragment_shader_header_calc_light =
|
|||
"void calc_light(in lowp float fLights, in lowp vec3 input_color, out lowp vec3 output_color);\n";
|
||||
static const char* fragment_shader_header_mipmap =
|
||||
"mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1);\n";
|
||||
static const char* fragment_shader_header_readTex =
|
||||
"lowp vec4 readTex(in sampler2D tex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha);\n";
|
||||
#ifdef GL_MULTISAMPLING_SUPPORT
|
||||
static const char* fragment_shader_header_readTexMS =
|
||||
"lowp vec4 readTexMS(in lowp sampler2DMS mstex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha);\n";
|
||||
|
@ -461,46 +459,40 @@ static const char* fragment_shader_fake_mipmap =
|
|||
;
|
||||
|
||||
static const char* fragment_shader_readtex =
|
||||
AUXILIARY_SHADER_VERSION
|
||||
"lowp vec4 readTex(in sampler2D tex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha) \n"
|
||||
"{ \n"
|
||||
" lowp vec4 texColor = texture(tex, texCoord); \n"
|
||||
" if (fbMonochrome == 1) texColor = vec4(texColor.r); \n"
|
||||
" else if (fbMonochrome == 2) \n"
|
||||
" texColor.rgb = vec3(dot(vec3(0.2126, 0.7152, 0.0722), texColor.rgb)); \n"
|
||||
" if (fbFixedAlpha == 1) texColor.a = 0.825; \n"
|
||||
" return texColor; \n"
|
||||
"} \n"
|
||||
"#define READ_TEX(name, tex, texCoord, fbMonochrome, fbFixedAlpha) \\\n"
|
||||
" { \\\n"
|
||||
" name = texture(tex, texCoord); \\\n"
|
||||
" if (fbMonochrome == 1) name = vec4(name.r); \\\n"
|
||||
" else if (fbMonochrome == 2) \\\n"
|
||||
" name.rgb = vec3(dot(vec3(0.2126, 0.7152, 0.0722), name.rgb)); \\\n"
|
||||
" if (fbFixedAlpha == 1) name.a = 0.825; \\\n"
|
||||
" } \n"
|
||||
;
|
||||
|
||||
static const char* fragment_shader_readtex_3point =
|
||||
AUXILIARY_SHADER_VERSION
|
||||
"uniform lowp int uTextureFilterMode; \n"
|
||||
// 3 point texture filtering.
|
||||
// Original author: ArthurCarvalho
|
||||
// GLSL implementation: twinaphex, mupen64plus-libretro project.
|
||||
"#define TEX_OFFSET(off) texture(tex, texCoord - (off)/texSize) \n"
|
||||
"lowp vec4 filter3point(in sampler2D tex, in mediump vec2 texCoord) \n"
|
||||
"{ \n"
|
||||
" mediump vec2 texSize = vec2(textureSize(tex,0)); \n"
|
||||
" mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \n"
|
||||
" offset -= step(1.0, offset.x + offset.y); \n"
|
||||
" lowp vec4 c0 = TEX_OFFSET(offset); \n"
|
||||
" lowp vec4 c1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y)); \n"
|
||||
" lowp vec4 c2 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y))); \n"
|
||||
" return c0 + abs(offset.x)*(c1-c0) + abs(offset.y)*(c2-c0); \n"
|
||||
"} \n"
|
||||
"lowp vec4 readTex(in sampler2D tex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha) \n"
|
||||
"{ \n"
|
||||
" lowp vec4 texStandard = texture(tex, texCoord); \n"
|
||||
" lowp vec4 tex3Point = filter3point(tex, texCoord); \n"
|
||||
" lowp vec4 texColor = uTextureFilterMode == 0 ? texStandard : tex3Point; \n"
|
||||
" if (fbMonochrome == 1) texColor = vec4(texColor.r); \n"
|
||||
" else if (fbMonochrome == 2) \n"
|
||||
" texColor.rgb = vec3(dot(vec3(0.2126, 0.7152, 0.0722), texColor.rgb)); \n"
|
||||
" if (fbFixedAlpha == 1) texColor.a = 0.825; \n"
|
||||
" return texColor; \n"
|
||||
"} \n"
|
||||
"#define TEX_OFFSET(tex, texCoord, off) texture(tex, texCoord - (off)/texSize) \n"
|
||||
"#define FILTER_3POINT(tex, texCoord) \\\n"
|
||||
" mediump vec2 texSize = vec2(textureSize(tex,0)); \\\n"
|
||||
" mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \\\n"
|
||||
" offset -= step(1.0, offset.x + offset.y); \\\n"
|
||||
" lowp vec4 c0 = TEX_OFFSET(tex, texCoord, offset); \\\n"
|
||||
" lowp vec4 c1 = TEX_OFFSET(tex, texCoord, vec2(offset.x - sign(offset.x), offset.y)); \\\n"
|
||||
" lowp vec4 c2 = TEX_OFFSET(tex, texCoord, vec2(offset.x, offset.y - sign(offset.y))); \\\n"
|
||||
" lowp vec4 tex3Point = c0 + abs(offset.x)*(c1-c0) + abs(offset.y)*(c2-c0); \n"
|
||||
"#define READ_TEX(name, tex, texCoord, fbMonochrome, fbFixedAlpha) \\\n"
|
||||
" { \\\n"
|
||||
" lowp vec4 texStandard = texture(tex, texCoord); \\\n"
|
||||
" FILTER_3POINT(tex, texCoord); \\\n"
|
||||
" name = uTextureFilterMode == 0 ? texStandard : tex3Point; \\\n"
|
||||
" if (fbMonochrome == 1) name = vec4(name.r); \\\n"
|
||||
" else if (fbMonochrome == 2) \\\n"
|
||||
" name.rgb = vec3(dot(vec3(0.2126, 0.7152, 0.0722), name.rgb)); \\\n"
|
||||
" if (fbFixedAlpha == 1) name.a = 0.825; \\\n"
|
||||
" } \n"
|
||||
;
|
||||
|
||||
#ifdef GL_MULTISAMPLING_SUPPORT
|
||||
|
|
Loading…
Reference in New Issue
Block a user