1
0
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:
Francisco Zurita 2016-10-10 00:33:02 -04:00 committed by Sergey Lipskiy
parent e8802cd744
commit f614c26e95
3 changed files with 48 additions and 53 deletions

View File

@ -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())

View File

@ -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);
}

View File

@ -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