1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Code refactor: simplify texture fetching shader parts.

This commit is contained in:
Sergey Lipskiy 2017-12-15 19:54:42 +07:00
parent dfada113d3
commit 509ee7ed10
3 changed files with 248 additions and 188 deletions

View File

@ -24,6 +24,14 @@ public:
return (m_mode & 2) != 0; return (m_mode & 2) != 0;
} }
bool useYUVCoversion() const {
return (m_mode & 3) != 3;
}
bool useTextureFiltering() const {
return (m_mode & 3) != 0;
}
private: private:
u32 m_mode; u32 m_mode;
}; };
@ -901,14 +909,23 @@ public:
class ShaderFragmentHeaderReadMSTex : public ShaderPart class ShaderFragmentHeaderReadMSTex : public ShaderPart
{ {
public: public:
ShaderFragmentHeaderReadMSTex(const opengl::GLInfo & _glinfo) ShaderFragmentHeaderReadMSTex(const opengl::GLInfo & _glinfo) : m_glinfo(_glinfo)
{ {
if (!_glinfo.isGLES2 && config.video.multisampling > 0) { }
m_part =
void write(std::stringstream & shader) const override
{
if (!m_glinfo.isGLES2 &&
config.video.multisampling > 0 &&
(g_cycleType == G_CYC_COPY || g_textureConvert.useTextureFiltering()))
{
shader <<
"lowp vec4 readTexMS(in lowp sampler2DMS mstex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha);\n"; "lowp vec4 readTexMS(in lowp sampler2DMS mstex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha);\n";
;
} }
} }
private:
const opengl::GLInfo& m_glinfo;
}; };
class ShaderFragmentHeaderDither : public ShaderPart class ShaderFragmentHeaderDither : public ShaderPart
@ -945,100 +962,131 @@ public:
class ShaderFragmentHeaderReadTex : public ShaderPart class ShaderFragmentHeaderReadTex : public ShaderPart
{ {
public: public:
ShaderFragmentHeaderReadTex (const opengl::GLInfo & _glinfo) ShaderFragmentHeaderReadTex(const opengl::GLInfo & _glinfo) : m_glinfo(_glinfo)
{ {
if (!_glinfo.isGLES2) { }
m_part =
"uniform lowp ivec2 uTextureFormat; \n" void write(std::stringstream & shader) const override
"uniform lowp ivec2 uTextureConvert; \n" {
"uniform mediump ivec4 uConvertParams; \n" std::string shaderPart;
"uniform lowp int uTextureFilterMode; \n"
"#define YUVCONVERT_TEX(name, tex, texCoord, convert, format, prev) \\\n" if (!m_glinfo.isGLES2) {
" { \\\n"
" if (convert != 0) name = prev; \\\n" if (g_textureConvert.useTextureFiltering()) {
" else name = texture(tex, texCoord); \\\n" shaderPart += "uniform lowp int uTextureFilterMode; \n";
" mediump ivec4 icolor = ivec4(name*255.0); \\\n" if (config.texture.bilinearMode == BILINEAR_3POINT) {
" if (format == 1) \\\n" // 3 point texture filtering.
" icolor.rg -= 128; \\\n" // Original author: ArthurCarvalho
" mediump ivec4 iconvert; \\\n" // GLSL implementation: twinaphex, mupen64plus-libretro project.
" iconvert.r = icolor.b + (uConvertParams[0]*icolor.g + 128)/256; \\\n" shaderPart +=
" iconvert.g = icolor.b + (uConvertParams[1]*icolor.r + uConvertParams[2]*icolor.g + 128)/256; \\\n" "#define TEX_OFFSET(off, tex, texCoord) texture(tex, texCoord - (off)/texSize) \n"
" iconvert.b = icolor.b + (uConvertParams[3]*icolor.r + 128)/256; \\\n" "#define TEX_FILTER(name, tex, texCoord) \\\n"
" iconvert.a = icolor.b; \\\n" " { \\\n"
" name = vec4(iconvert)/255.0; \\\n" " mediump vec2 texSize = vec2(textureSize(tex,0)); \\\n"
" } \n" " mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \\\n"
; " offset -= step(1.0, offset.x + offset.y); \\\n"
if (config.texture.bilinearMode == BILINEAR_3POINT) { " lowp vec4 c0 = TEX_OFFSET(offset, tex, texCoord); \\\n"
// 3 point texture filtering. " lowp vec4 c1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y), tex, texCoord); \\\n"
// Original author: ArthurCarvalho " lowp vec4 c2 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y)), tex, texCoord); \\\n"
// GLSL implementation: twinaphex, mupen64plus-libretro project. " name = c0 + abs(offset.x)*(c1-c0) + abs(offset.y)*(c2-c0); \\\n"
m_part += " } \n"
"#define TEX_OFFSET(off, tex, texCoord) texture(tex, texCoord - (off)/texSize) \n" ;
"#define TEX_FILTER(name, tex, texCoord) \\\n" } else {
" { \\\n" shaderPart +=
" mediump vec2 texSize = vec2(textureSize(tex,0)); \\\n" "#define TEX_OFFSET(off, tex, texCoord) texture(tex, texCoord - (off)/texSize) \n"
" mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \\\n" "#define TEX_FILTER(name, tex, texCoord) \\\n"
" offset -= step(1.0, offset.x + offset.y); \\\n" "{ \\\n"
" lowp vec4 c0 = TEX_OFFSET(offset, tex, texCoord); \\\n" " mediump vec2 texSize = vec2(textureSize(tex,0)); \\\n"
" lowp vec4 c1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y), tex, texCoord); \\\n" " mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \\\n"
" lowp vec4 c2 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y)), tex, texCoord); \\\n" " offset -= step(1.0, offset.x + offset.y); \\\n"
" name = c0 + abs(offset.x)*(c1-c0) + abs(offset.y)*(c2-c0); \\\n" " lowp vec4 zero = vec4(0.0); \\\n"
" } \n" " \\\n"
; " lowp vec4 p0q0 = TEX_OFFSET(offset, tex, texCoord); \\\n"
} else { " lowp vec4 p1q0 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y), tex, texCoord); \\\n"
m_part += " \\\n"
"#define TEX_OFFSET(off, tex, texCoord) texture(tex, texCoord - (off)/texSize) \n" " lowp vec4 p0q1 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y)), tex, texCoord); \\\n"
"#define TEX_FILTER(name, tex, texCoord) \\\n" " lowp vec4 p1q1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y - sign(offset.y)), tex, texCoord); \\\n"
"{ \\\n" " \\\n"
" mediump vec2 texSize = vec2(textureSize(tex,0)); \\\n" " mediump vec2 interpolationFactor = abs(offset); \\\n"
" mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \\\n" " lowp vec4 pInterp_q0 = mix( p0q0, p1q0, interpolationFactor.x ); \\\n" // Interpolates top row in X direction.
" offset -= step(1.0, offset.x + offset.y); \\\n" " lowp vec4 pInterp_q1 = mix( p0q1, p1q1, interpolationFactor.x ); \\\n" // Interpolates bottom row in X direction.
" lowp vec4 zero = vec4(0.0); \\\n" " name = mix( pInterp_q0, pInterp_q1, interpolationFactor.y ); \\\n" // Interpolate in Y direction.
" \\\n" "} \n"
" lowp vec4 p0q0 = TEX_OFFSET(offset, tex, texCoord); \\\n" ;
" lowp vec4 p1q0 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y), tex, texCoord); \\\n" }
" \\\n" shaderPart +=
" lowp vec4 p0q1 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y)), tex, texCoord); \\\n" "#define READ_TEX(name, tex, texCoord, fbMonochrome, fbFixedAlpha) \\\n"
" lowp vec4 p1q1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y - sign(offset.y)), tex, texCoord); \\\n" " { \\\n"
" \\\n" " if (fbMonochrome == 3) { \\\n"
" mediump vec2 interpolationFactor = abs(offset); \\\n" " mediump ivec2 coord = ivec2(gl_FragCoord.xy); \\\n"
" lowp vec4 pInterp_q0 = mix( p0q0, p1q0, interpolationFactor.x ); \\\n" // Interpolates top row in X direction. " name = texelFetch(tex, coord, 0); \\\n"
" lowp vec4 pInterp_q1 = mix( p0q1, p1q1, interpolationFactor.x ); \\\n" // Interpolates bottom row in X direction. " } else { \\\n"
" name = mix( pInterp_q0, pInterp_q1, interpolationFactor.y ); \\\n" // Interpolate in Y direction. " if (uTextureFilterMode == 0) name = texture(tex, texCoord); \\\n"
"} \n" " else TEX_FILTER(name, tex, texCoord); \\\n"
" } \\\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"
" else if (fbMonochrome == 3) { \\\n"
" name.rgb = vec3(dot(vec3(0.2126, 0.7152, 0.0722), name.rgb)); \\\n"
" name.a = 0.0; \\\n"
" } \\\n"
" if (fbFixedAlpha == 1) name.a = 0.825; \\\n"
" } \n"
; ;
} }
m_part +=
"#define READ_TEX(name, tex, texCoord, fbMonochrome, fbFixedAlpha) \\\n" if (g_textureConvert.useYUVCoversion()) {
" { \\\n" shaderPart +=
" if (fbMonochrome == 3) { \\\n" "uniform lowp ivec2 uTextureFormat; \n"
" mediump ivec2 coord = ivec2(gl_FragCoord.xy); \\\n" "uniform lowp int uTextureConvert; \n"
" name = texelFetch(tex, coord, 0); \\\n" "uniform mediump ivec4 uConvertParams; \n"
" } else { \\\n" "#define YUVCONVERT(name, format) \\\n"
" if (uTextureFilterMode == 0) name = texture(tex, texCoord); \\\n" " mediump ivec4 icolor = ivec4(name*255.0); \\\n"
" else TEX_FILTER(name, tex, texCoord); \\\n" " if (format == 1) \\\n"
" } \\\n" " icolor.rg -= 128; \\\n"
" if (fbMonochrome == 1) name = vec4(name.r); \\\n" " mediump ivec4 iconvert; \\\n"
" else if (fbMonochrome == 2) \\\n" " iconvert.r = icolor.b + (uConvertParams[0]*icolor.g + 128)/256; \\\n"
" name.rgb = vec3(dot(vec3(0.2126, 0.7152, 0.0722), name.rgb)); \\\n" " iconvert.g = icolor.b + (uConvertParams[1]*icolor.r + uConvertParams[2]*icolor.g + 128)/256; \\\n"
" else if (fbMonochrome == 3) { \\\n" " iconvert.b = icolor.b + (uConvertParams[3]*icolor.r + 128)/256; \\\n"
" name.rgb = vec3(dot(vec3(0.2126, 0.7152, 0.0722), name.rgb)); \\\n" " iconvert.a = icolor.b; \\\n"
" name.a = 0.0; \\\n" " name = vec4(iconvert)/255.0; \n"
" } \\\n" "#define YUVCONVERT_TEX0(name, tex, texCoord, format) \\\n"
" if (fbFixedAlpha == 1) name.a = 0.825; \\\n" " { \\\n"
" } \n" " name = texture(tex, texCoord); \\\n"
; " YUVCONVERT(name, format) \\\n"
" } \n"
"#define YUVCONVERT_TEX1(name, tex, texCoord, format, prev) \\\n"
" { \\\n"
" if (uTextureConvert != 0) name = prev; \\\n"
" else name = texture(tex, texCoord); \\\n"
" YUVCONVERT(name, format) \\\n"
" } \n"
;
}
} else { } else {
m_part = if (g_textureConvert.useTextureFiltering()) {
"uniform lowp ivec2 uTextureFormat; \n" shaderPart +=
"uniform lowp ivec2 uTextureConvert; \n" "uniform lowp int uTextureFilterMode; \n"
"uniform mediump ivec4 uConvertParams; \n" "lowp vec4 readTex(in sampler2D tex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha); \n"
"uniform lowp int uTextureFilterMode; \n" ;
"lowp vec4 readTex(in sampler2D tex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha); \n" }
"lowp vec4 YUV_Convert(in sampler2D tex, in mediump vec2 texCoord, in lowp int convert, in lowp int format, in lowp vec4 prev); \n" if (g_textureConvert.useYUVCoversion()) {
; shaderPart +=
"uniform lowp ivec2 uTextureFormat; \n"
"uniform lowp int uTextureConvert; \n"
"uniform mediump ivec4 uConvertParams; \n"
"lowp vec4 YUV_Convert(in sampler2D tex, in mediump vec2 texCoord, in lowp int convert, in lowp int format, in lowp vec4 prev); \n"
;
}
} }
shader << shaderPart;
} }
private:
const opengl::GLInfo& m_glinfo;
}; };
class ShaderFragmentHeaderReadTexCopyMode : public ShaderPart class ShaderFragmentHeaderReadTexCopyMode : public ShaderPart
@ -1185,34 +1233,33 @@ public:
std::string shaderPart; std::string shaderPart;
if (m_glinfo.isGLES2) { if (m_glinfo.isGLES2) {
shaderPart = " nCurrentTile = 0; \n"; shaderPart = " nCurrentTile = 0; \n";
if (g_textureConvert.getBilerp0()) { if (g_textureConvert.getBilerp0()) {
shaderPart += " lowp vec4 readtex0 = readTex(uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n"; shaderPart += " lowp vec4 readtex0 = readTex(uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n";
} else { } else {
shaderPart += " lowp vec4 tmpTex = vec4(0.0); \n" shaderPart += " lowp vec4 tmpTex = vec4(0.0); \n"
" lowp vec4 readtex0 = YUV_Convert(uTex0, vTexCoord0, uTextureConvert[0], uTextureFormat[0], tmpTex); \n"; " lowp vec4 readtex0 = YUV_Convert(uTex0, vTexCoord0, 0, uTextureFormat[0], tmpTex); \n";
} }
} else { } else {
if (config.video.multisampling > 0) {
shaderPart =
" lowp vec4 readtex0; \n"
" if (uMSTexEnabled[0] == 0) { \n";
if (g_textureConvert.getBilerp0()) { if (!g_textureConvert.getBilerp0()) {
shaderPart += " READ_TEX(readtex0, uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]) \n"; shaderPart = " lowp vec4 readtex0; \n"
} else { " YUVCONVERT_TEX0(readtex0, uTex0, vTexCoord0, uTextureFormat[0]) \n";
shaderPart += " YUVCONVERT_TEX(readtex0, uTex0, vTexCoord0, uTextureConvert[0], uTextureFormat[0], readtex0) \n";
}
shaderPart += " } else readtex0 = readTexMS(uMSTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n";
} else { } else {
shaderPart = " lowp vec4 readtex0; \n"; if (config.video.multisampling > 0) {
if (g_textureConvert.getBilerp0()) { shaderPart =
shaderPart += " READ_TEX(readtex0, uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]) \n"; " lowp vec4 readtex0; \n"
" if (uMSTexEnabled[0] == 0) { \n"
" READ_TEX(readtex0, uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]) \n"
" } else readtex0 = readTexMS(uMSTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]); \n";
} else { } else {
shaderPart += " YUVCONVERT_TEX(readtex0, uTex0, vTexCoord0, uTextureConvert[0], uTextureFormat[0], readtex0) \n"; shaderPart = " lowp vec4 readtex0; \n"
" READ_TEX(readtex0, uTex0, vTexCoord0, uFbMonochrome[0], uFbFixedAlpha[0]) \n";
} }
} }
} }
shader << shaderPart; shader << shaderPart;
@ -1234,35 +1281,34 @@ public:
std::string shaderPart; std::string shaderPart;
if (m_glinfo.isGLES2) { if (m_glinfo.isGLES2) {
shaderPart = " nCurrentTile = 1; \n"; shaderPart = " nCurrentTile = 1; \n";
if (g_textureConvert.getBilerp1()) { if (g_textureConvert.getBilerp1()) {
shaderPart += " lowp vec4 readtex1 = readTex(uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n"; shaderPart += " lowp vec4 readtex1 = readTex(uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n";
} else { } else {
shaderPart += " lowp vec4 readtex1 = YUV_Convert(uTex1, vTexCoord1, uTextureConvert[1], uTextureFormat[1], readtex0); \n"; shaderPart += " lowp vec4 readtex1 = YUV_Convert(uTex1, vTexCoord1, uTextureConvert, uTextureFormat[1], readtex0); \n";
} }
} else { } else {
if (config.video.multisampling > 0) {
if (!g_textureConvert.getBilerp1()) {
shaderPart = shaderPart =
" lowp vec4 readtex1; \n" " lowp vec4 readtex1; \n"
" if (uMSTexEnabled[1] == 0) { \n"; " YUVCONVERT_TEX1(readtex1, uTex1, vTexCoord1, uTextureFormat[1], readtex0) \n";
if (g_textureConvert.getBilerp1()) {
shaderPart += " READ_TEX(readtex1, uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]) \n";
} else {
shaderPart += " YUVCONVERT_TEX(readtex1, uTex1, vTexCoord1, uTextureConvert[1], uTextureFormat[1], readtex0) \n";
}
shaderPart += " } else readtex1 = readTexMS(uMSTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]);\n";
} else { } else {
shaderPart = " lowp vec4 readtex1; \n"; if (config.video.multisampling > 0) {
shaderPart =
if (g_textureConvert.getBilerp1()) { " lowp vec4 readtex1; \n"
shaderPart += " READ_TEX(readtex1, uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]) \n"; " if (uMSTexEnabled[1] == 0) { \n"
" READ_TEX(readtex1, uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]) \n"
" } else readtex1 = readTexMS(uMSTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]); \n";
} else { } else {
shaderPart += " YUVCONVERT_TEX(readtex1, uTex1, vTexCoord1, uTextureConvert[1], uTextureFormat[1], readtex0)\n"; shaderPart = " lowp vec4 readtex1; \n"
" READ_TEX(readtex1, uTex1, vTexCoord1, uFbMonochrome[1], uFbFixedAlpha[1]) \n";
} }
} }
} }
shader << shaderPart; shader << shaderPart;
@ -1621,10 +1667,17 @@ public:
class ShaderReadtex : public ShaderPart class ShaderReadtex : public ShaderPart
{ {
public: public:
ShaderReadtex(const opengl::GLInfo & _glinfo) ShaderReadtex(const opengl::GLInfo & _glinfo) : m_glinfo(_glinfo)
{ {
if (_glinfo.isGLES2) { }
m_part =
void write(std::stringstream & shader) const override
{
std::string shaderPart;
if (m_glinfo.isGLES2) {
if (g_textureConvert.useYUVCoversion())
shaderPart +=
"lowp vec4 YUV_Convert(in sampler2D tex, in mediump vec2 texCoord, in lowp int convert, in lowp int format, in lowp vec4 prev) \n" "lowp vec4 YUV_Convert(in sampler2D tex, in mediump vec2 texCoord, in lowp int convert, in lowp int format, in lowp vec4 prev) \n"
"{ \n" "{ \n"
" lowp vec4 texColor; \n" " lowp vec4 texColor; \n"
@ -1641,58 +1694,59 @@ public:
" return vec4(iconvert)/255.0; \n" " return vec4(iconvert)/255.0; \n"
" } \n" " } \n"
; ;
if (config.texture.bilinearMode == BILINEAR_3POINT) { if (g_textureConvert.useTextureFiltering()) {
m_part += if (config.texture.bilinearMode == BILINEAR_3POINT) {
"uniform mediump vec2 uTextureSize[2]; \n" shaderPart +=
// 3 point texture filtering. "uniform mediump vec2 uTextureSize[2]; \n"
// Original author: ArthurCarvalho // 3 point texture filtering.
// GLSL implementation: twinaphex, mupen64plus-libretro project. // Original author: ArthurCarvalho
"#define TEX_OFFSET(off) texture2D(tex, texCoord - (off)/texSize) \n" // GLSL implementation: twinaphex, mupen64plus-libretro project.
"lowp vec4 TextureFilter(in sampler2D tex, in mediump vec2 texCoord) \n" "#define TEX_OFFSET(off) texture2D(tex, texCoord - (off)/texSize) \n"
"{ \n" "lowp vec4 TextureFilter(in sampler2D tex, in mediump vec2 texCoord) \n"
" mediump vec2 texSize; \n" "{ \n"
" if (nCurrentTile == 0) \n" " mediump vec2 texSize; \n"
" texSize = uTextureSize[0]; \n" " if (nCurrentTile == 0) \n"
" else \n" " texSize = uTextureSize[0]; \n"
" texSize = uTextureSize[1]; \n" " else \n"
" mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \n" " texSize = uTextureSize[1]; \n"
" offset -= step(1.0, offset.x + offset.y); \n" " mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \n"
" lowp vec4 c0 = TEX_OFFSET(offset); \n" " offset -= step(1.0, offset.x + offset.y); \n"
" lowp vec4 c1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y)); \n" " lowp vec4 c0 = TEX_OFFSET(offset); \n"
" lowp vec4 c2 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y))); \n" " lowp vec4 c1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y)); \n"
" return c0 + abs(offset.x)*(c1-c0) + abs(offset.y)*(c2-c0); \n" " lowp vec4 c2 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y))); \n"
"} \n" " return c0 + abs(offset.x)*(c1-c0) + abs(offset.y)*(c2-c0); \n"
; "} \n"
} else { ;
m_part += } else {
// bilinear filtering. shaderPart +=
"uniform mediump vec2 uTextureSize[2]; \n" // bilinear filtering.
"#define TEX_OFFSET(off) texture2D(tex, texCoord - (off)/texSize) \n" "uniform mediump vec2 uTextureSize[2]; \n"
"lowp vec4 TextureFilter(in sampler2D tex, in mediump vec2 texCoord) \n" "#define TEX_OFFSET(off) texture2D(tex, texCoord - (off)/texSize) \n"
"{ \n" "lowp vec4 TextureFilter(in sampler2D tex, in mediump vec2 texCoord) \n"
" mediump vec2 texSize; \n" "{ \n"
" if (nCurrentTile == 0) \n" " mediump vec2 texSize; \n"
" texSize = uTextureSize[0]; \n" " if (nCurrentTile == 0) \n"
" else \n" " texSize = uTextureSize[0]; \n"
" texSize = uTextureSize[1]; \n" " else \n"
" mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \n" " texSize = uTextureSize[1]; \n"
" offset -= step(1.0, offset.x + offset.y); \n" " mediump vec2 offset = fract(texCoord*texSize - vec2(0.5)); \n"
" lowp vec4 zero = vec4(0.0); \n" " offset -= step(1.0, offset.x + offset.y); \n"
" \n" " lowp vec4 zero = vec4(0.0); \n"
" lowp vec4 p0q0 = TEX_OFFSET(offset); \n" " \n"
" lowp vec4 p1q0 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y)); \n" " lowp vec4 p0q0 = TEX_OFFSET(offset); \n"
" \n" " lowp vec4 p1q0 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y)); \n"
" lowp vec4 p0q1 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y))); \n" " \n"
" lowp vec4 p1q1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y - sign(offset.y)));\n" " lowp vec4 p0q1 = TEX_OFFSET(vec2(offset.x, offset.y - sign(offset.y))); \n"
" \n" " lowp vec4 p1q1 = TEX_OFFSET(vec2(offset.x - sign(offset.x), offset.y - sign(offset.y)));\n"
" mediump vec2 interpolationFactor = abs(offset); \n" " \n"
" lowp vec4 pInterp_q0 = mix( p0q0, p1q0, interpolationFactor.x ); \n" // Interpolates top row in X direction. " mediump vec2 interpolationFactor = abs(offset); \n"
" lowp vec4 pInterp_q1 = mix( p0q1, p1q1, interpolationFactor.x ); \n" // Interpolates bottom row in X direction. " lowp vec4 pInterp_q0 = mix( p0q0, p1q0, interpolationFactor.x ); \n" // Interpolates top row in X direction.
" return mix( pInterp_q0, pInterp_q1, interpolationFactor.y ); \n" // Interpolate in Y direction. " lowp vec4 pInterp_q1 = mix( p0q1, p1q1, interpolationFactor.x ); \n" // Interpolates bottom row in X direction.
"} \n" " return mix( pInterp_q0, pInterp_q1, interpolationFactor.y ); \n" // Interpolate in Y direction.
; "} \n"
} ;
m_part += }
shaderPart +=
"lowp vec4 readTex(in sampler2D tex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha) \n" "lowp vec4 readTex(in sampler2D tex, in mediump vec2 texCoord, in lowp int fbMonochrome, in lowp int fbFixedAlpha) \n"
"{ \n" "{ \n"
" lowp vec4 texColor; \n" " lowp vec4 texColor; \n"
@ -1704,10 +1758,11 @@ public:
" if (fbFixedAlpha == 1) texColor.a = 0.825; \n" " if (fbFixedAlpha == 1) texColor.a = 0.825; \n"
" return texColor; \n" " return texColor; \n"
"} \n" "} \n"
; ;
}
} else { } else {
if (config.video.multisampling > 0) { if (config.video.multisampling > 0 && g_textureConvert.useTextureFiltering()) {
m_part = shaderPart =
"uniform lowp int uMSAASamples; \n" "uniform lowp int uMSAASamples; \n"
"lowp vec4 sampleMS(in lowp sampler2DMS mstex, in mediump ivec2 ipos) \n" "lowp vec4 sampleMS(in lowp sampler2DMS mstex, in mediump ivec2 ipos) \n"
"{ \n" "{ \n"
@ -1740,7 +1795,12 @@ public:
; ;
} }
} }
shader << shaderPart;
} }
private:
const opengl::GLInfo& m_glinfo;
}; };
class ShaderReadtexCopyMode : public ShaderPart class ShaderReadtexCopyMode : public ShaderPart

View File

@ -467,7 +467,7 @@ public:
textureFilter |= 2; textureFilter |= 2;
uTextureFilterMode.set(textureFilter, _force); uTextureFilterMode.set(textureFilter, _force);
uTextureFormat.set(gSP.textureTile[0]->format, gSP.textureTile[1]->format, _force); uTextureFormat.set(gSP.textureTile[0]->format, gSP.textureTile[1]->format, _force);
uTextureConvert.set(0, gDP.otherMode.convert_one, _force); uTextureConvert.set(gDP.otherMode.convert_one, _force);
if (gDP.otherMode.bi_lerp0 == 0 || gDP.otherMode.bi_lerp1 == 0) if (gDP.otherMode.bi_lerp0 == 0 || gDP.otherMode.bi_lerp1 == 0)
uConvertParams.set(gDP.convert.k0, gDP.convert.k1, gDP.convert.k2, gDP.convert.k3, _force); uConvertParams.set(gDP.convert.k0, gDP.convert.k1, gDP.convert.k2, gDP.convert.k3, _force);
} }
@ -475,7 +475,7 @@ public:
private: private:
iUniform uTextureFilterMode; iUniform uTextureFilterMode;
iv2Uniform uTextureFormat; iv2Uniform uTextureFormat;
iv2Uniform uTextureConvert; iUniform uTextureConvert;
i4Uniform uConvertParams; i4Uniform uConvertParams;
}; };

View File

@ -20,7 +20,7 @@ namespace glsl {
bool _saveCombinerKeys(const graphics::Combiners & _combiners) const; bool _saveCombinerKeys(const graphics::Combiners & _combiners) const;
bool _loadFromCombinerKeys(graphics::Combiners & _combiners); bool _loadFromCombinerKeys(graphics::Combiners & _combiners);
const u32 m_formatVersion = 0x18U; const u32 m_formatVersion = 0x19U;
const u32 m_keysFormatVersion = 0x04; const u32 m_keysFormatVersion = 0x04;
const opengl::GLInfo & m_glinfo; const opengl::GLInfo & m_glinfo;
opengl::CachedUseProgram * m_useProgram; opengl::CachedUseProgram * m_useProgram;