mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-06-28 09:59:41 -06:00
lower GL requirement of renderer itself to 3.1
This commit is contained in:
@ -29,10 +29,8 @@ namespace GLRenderer43
|
|||||||
{
|
{
|
||||||
|
|
||||||
// GL version requirements
|
// GL version requirements
|
||||||
// * explicit uniform location: 4.3 (or extension)
|
|
||||||
// * texelFetch: 3.0 (GLSL 1.30) (3.2/1.50 for MS)
|
// * texelFetch: 3.0 (GLSL 1.30) (3.2/1.50 for MS)
|
||||||
// * UBO: 3.1
|
// * UBO: 3.1
|
||||||
// * glMemoryBarrier: 4.2
|
|
||||||
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@ -71,6 +69,7 @@ RendererPolygon PolygonList[2048];
|
|||||||
int NumFinalPolys, NumOpaqueFinalPolys;
|
int NumFinalPolys, NumOpaqueFinalPolys;
|
||||||
|
|
||||||
GLuint ClearVertexBufferID, ClearVertexArrayID;
|
GLuint ClearVertexBufferID, ClearVertexArrayID;
|
||||||
|
GLint ClearUniformLoc[4];
|
||||||
|
|
||||||
// vertex buffer
|
// vertex buffer
|
||||||
// * XYZW: 4x16bit
|
// * XYZW: 4x16bit
|
||||||
@ -132,7 +131,28 @@ bool BuildRenderShader(u32 flags, const char* vs, const char* fs)
|
|||||||
delete[] vsbuf;
|
delete[] vsbuf;
|
||||||
delete[] fsbuf;
|
delete[] fsbuf;
|
||||||
|
|
||||||
return ret;
|
if (!ret) return false;
|
||||||
|
|
||||||
|
GLuint prog = RenderShader[flags][2];
|
||||||
|
|
||||||
|
GLint uni_id = glGetUniformBlockIndex(prog, "uConfig");
|
||||||
|
glUniformBlockBinding(prog, uni_id, 0);
|
||||||
|
|
||||||
|
glBindAttribLocation(prog, 0, "vPosition");
|
||||||
|
glBindAttribLocation(prog, 1, "vColor");
|
||||||
|
glBindAttribLocation(prog, 2, "vTexcoord");
|
||||||
|
glBindAttribLocation(prog, 3, "vPolygonAttr");
|
||||||
|
glBindFragDataLocation(prog, 0, "oColor");
|
||||||
|
glBindFragDataLocation(prog, 1, "oAttr");
|
||||||
|
|
||||||
|
glUseProgram(prog);
|
||||||
|
|
||||||
|
uni_id = glGetUniformLocation(prog, "TexMem");
|
||||||
|
glUniform1i(uni_id, 0);
|
||||||
|
uni_id = glGetUniformLocation(prog, "TexPalMem");
|
||||||
|
glUniform1i(uni_id, 1);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseRenderShader(u32 flags)
|
void UseRenderShader(u32 flags)
|
||||||
@ -187,6 +207,14 @@ bool Init()
|
|||||||
if (!OpenGL_BuildShaderProgram(kClearVS, kClearFS, ClearShaderPlain, "ClearShader"))
|
if (!OpenGL_BuildShaderProgram(kClearVS, kClearFS, ClearShaderPlain, "ClearShader"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
glBindAttribLocation(ClearShaderPlain[2], 0, "vPosition");
|
||||||
|
glBindFragDataLocation(ClearShaderPlain[2], 0, "oColor");
|
||||||
|
glBindFragDataLocation(ClearShaderPlain[2], 1, "oAttr");
|
||||||
|
ClearUniformLoc[0] = glGetUniformLocation(ClearShaderPlain[2], "uColor");
|
||||||
|
ClearUniformLoc[1] = glGetUniformLocation(ClearShaderPlain[2], "uDepth");
|
||||||
|
ClearUniformLoc[2] = glGetUniformLocation(ClearShaderPlain[2], "uOpaquePolyId");
|
||||||
|
ClearUniformLoc[3] = glGetUniformLocation(ClearShaderPlain[2], "uFogFlag");
|
||||||
|
|
||||||
memset(RenderShader, 0, sizeof(RenderShader));
|
memset(RenderShader, 0, sizeof(RenderShader));
|
||||||
|
|
||||||
if (!BuildRenderShader(0,
|
if (!BuildRenderShader(0,
|
||||||
@ -210,12 +238,6 @@ bool Init()
|
|||||||
glBufferData(GL_UNIFORM_BUFFER, sizeof(ShaderConfig), &ShaderConfig, GL_STATIC_DRAW);
|
glBufferData(GL_UNIFORM_BUFFER, sizeof(ShaderConfig), &ShaderConfig, GL_STATIC_DRAW);
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, 0, ShaderConfigUBO);
|
glBindBufferBase(GL_UNIFORM_BUFFER, 0, ShaderConfigUBO);
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
if (!RenderShader[i][2]) continue;
|
|
||||||
glUniformBlockBinding(RenderShader[i][2], 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
float clearvtx[6*2] =
|
float clearvtx[6*2] =
|
||||||
{
|
{
|
||||||
@ -843,10 +865,10 @@ void RenderFrame()
|
|||||||
if (g) g = g*2 + 1;
|
if (g) g = g*2 + 1;
|
||||||
if (b) b = b*2 + 1;*/
|
if (b) b = b*2 + 1;*/
|
||||||
|
|
||||||
glUniform4ui(0, r, g, b, a);
|
glUniform4ui(ClearUniformLoc[0], r, g, b, a);
|
||||||
glUniform1ui(1, z);
|
glUniform1ui(ClearUniformLoc[1], z);
|
||||||
glUniform1ui(2, polyid);
|
glUniform1ui(ClearUniformLoc[2], polyid);
|
||||||
glUniform1ui(3, fog);
|
glUniform1ui(ClearUniformLoc[3], fog);
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, ClearVertexBufferID);
|
glBindBuffer(GL_ARRAY_BUFFER, ClearVertexBufferID);
|
||||||
glBindVertexArray(ClearVertexArrayID);
|
glBindVertexArray(ClearVertexArrayID);
|
||||||
|
@ -19,14 +19,14 @@
|
|||||||
#ifndef GPU3D_OPENGL43_SHADERS_H
|
#ifndef GPU3D_OPENGL43_SHADERS_H
|
||||||
#define GPU3D_OPENGL43_SHADERS_H
|
#define GPU3D_OPENGL43_SHADERS_H
|
||||||
|
|
||||||
#define kShaderHeader "#version 430"
|
#define kShaderHeader "#version 140"
|
||||||
|
|
||||||
|
|
||||||
const char* kClearVS = kShaderHeader R"(
|
const char* kClearVS = kShaderHeader R"(
|
||||||
|
|
||||||
layout(location=0) in vec2 vPosition;
|
in vec2 vPosition;
|
||||||
|
|
||||||
layout(location=1) uniform uint uDepth;
|
uniform uint uDepth;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
@ -37,62 +37,62 @@ void main()
|
|||||||
|
|
||||||
const char* kClearFS = kShaderHeader R"(
|
const char* kClearFS = kShaderHeader R"(
|
||||||
|
|
||||||
layout(location=0) uniform uvec4 uColor;
|
uniform uvec4 uColor;
|
||||||
layout(location=2) uniform uint uOpaquePolyID;
|
uniform uint uOpaquePolyID;
|
||||||
layout(location=3) uniform uint uFogFlag;
|
uniform uint uFogFlag;
|
||||||
|
|
||||||
layout(location=0) out vec4 oColor;
|
out vec4 oColor;
|
||||||
layout(location=1) out uvec3 oAttr;
|
out uvec3 oAttr;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
oColor = vec4(uColor).bgra / 31.0;
|
oColor = vec4(uColor).bgra / 31.0;
|
||||||
oAttr.r = 0;
|
oAttr.r = uint(0);
|
||||||
oAttr.g = uOpaquePolyID;
|
oAttr.g = uOpaquePolyID;
|
||||||
oAttr.b = 0;
|
oAttr.b = uint(0);
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
|
||||||
const char* kRenderVSCommon = R"(
|
const char* kRenderVSCommon = R"(
|
||||||
|
|
||||||
layout(std140, binding=0) uniform uConfig
|
layout(std140) uniform uConfig
|
||||||
{
|
{
|
||||||
vec2 uScreenSize;
|
vec2 uScreenSize;
|
||||||
uint uDispCnt;
|
int uDispCnt;
|
||||||
vec4 uToonColors[32];
|
vec4 uToonColors[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
layout(location=0) in uvec4 vPosition;
|
in uvec4 vPosition;
|
||||||
layout(location=1) in uvec4 vColor;
|
in uvec4 vColor;
|
||||||
layout(location=2) in ivec2 vTexcoord;
|
in ivec2 vTexcoord;
|
||||||
layout(location=3) in uvec3 vPolygonAttr;
|
in ivec3 vPolygonAttr;
|
||||||
|
|
||||||
smooth out vec4 fColor;
|
smooth out vec4 fColor;
|
||||||
smooth out vec2 fTexcoord;
|
smooth out vec2 fTexcoord;
|
||||||
flat out uvec3 fPolygonAttr;
|
flat out ivec3 fPolygonAttr;
|
||||||
)";
|
)";
|
||||||
|
|
||||||
const char* kRenderFSCommon = R"(
|
const char* kRenderFSCommon = R"(
|
||||||
|
|
||||||
layout(binding=0) uniform usampler2D TexMem;
|
uniform usampler2D TexMem;
|
||||||
layout(binding=1) uniform sampler2D TexPalMem;
|
uniform sampler2D TexPalMem;
|
||||||
|
|
||||||
layout(std140, binding=0) uniform uConfig
|
layout(std140) uniform uConfig
|
||||||
{
|
{
|
||||||
vec2 uScreenSize;
|
vec2 uScreenSize;
|
||||||
uint uDispCnt;
|
int uDispCnt;
|
||||||
vec4 uToonColors[32];
|
vec4 uToonColors[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
smooth in vec4 fColor;
|
smooth in vec4 fColor;
|
||||||
smooth in vec2 fTexcoord;
|
smooth in vec2 fTexcoord;
|
||||||
flat in uvec3 fPolygonAttr;
|
flat in ivec3 fPolygonAttr;
|
||||||
|
|
||||||
layout(location=0) out vec4 oColor;
|
out vec4 oColor;
|
||||||
layout(location=1) out uvec3 oAttr;
|
out uvec3 oAttr;
|
||||||
|
|
||||||
int TexcoordWrap(int c, int maxc, uint mode)
|
int TexcoordWrap(int c, int maxc, int mode)
|
||||||
{
|
{
|
||||||
if ((mode & (1<<0)) != 0)
|
if ((mode & (1<<0)) != 0)
|
||||||
{
|
{
|
||||||
@ -105,90 +105,90 @@ int TexcoordWrap(int c, int maxc, uint mode)
|
|||||||
return clamp(c, 0, maxc-1);
|
return clamp(c, 0, maxc-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 TextureFetch_A3I5(ivec2 addr, ivec4 st, uint wrapmode)
|
vec4 TextureFetch_A3I5(ivec2 addr, ivec4 st, int wrapmode)
|
||||||
{
|
{
|
||||||
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
||||||
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
||||||
|
|
||||||
addr.x += ((st.y * st.z) + st.x);
|
addr.x += ((st.y * st.z) + st.x);
|
||||||
uvec4 pixel = texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0);
|
ivec4 pixel = ivec4(texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0));
|
||||||
|
|
||||||
pixel.a = (pixel.r & 0xE0);
|
pixel.a = (pixel.r & 0xE0);
|
||||||
pixel.a = (pixel.a >> 3) + (pixel.a >> 6);
|
pixel.a = (pixel.a >> 3) + (pixel.a >> 6);
|
||||||
pixel.r &= 0x1F;
|
pixel.r &= 0x1F;
|
||||||
|
|
||||||
addr.y = (addr.y << 3) + int(pixel.r);
|
addr.y = (addr.y << 3) + pixel.r;
|
||||||
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
||||||
|
|
||||||
return vec4(color.rgb, float(pixel.a)/31.0);
|
return vec4(color.rgb, float(pixel.a)/31.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 TextureFetch_I2(ivec2 addr, ivec4 st, uint wrapmode, float alpha0)
|
vec4 TextureFetch_I2(ivec2 addr, ivec4 st, int wrapmode, float alpha0)
|
||||||
{
|
{
|
||||||
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
||||||
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
||||||
|
|
||||||
addr.x += ((st.y * st.z) + st.x) >> 2;
|
addr.x += ((st.y * st.z) + st.x) >> 2;
|
||||||
uvec4 pixel = texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0);
|
ivec4 pixel = ivec4(texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0));
|
||||||
pixel.r >>= (2 * (st.x & 3));
|
pixel.r >>= (2 * (st.x & 3));
|
||||||
pixel.r &= 0x03;
|
pixel.r &= 0x03;
|
||||||
|
|
||||||
addr.y = (addr.y << 2) + int(pixel.r);
|
addr.y = (addr.y << 2) + pixel.r;
|
||||||
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
||||||
|
|
||||||
return vec4(color.rgb, max(step(1,pixel.r),alpha0));
|
return vec4(color.rgb, (pixel.r>0)?1:alpha0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 TextureFetch_I4(ivec2 addr, ivec4 st, uint wrapmode, float alpha0)
|
vec4 TextureFetch_I4(ivec2 addr, ivec4 st, int wrapmode, float alpha0)
|
||||||
{
|
{
|
||||||
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
||||||
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
||||||
|
|
||||||
addr.x += ((st.y * st.z) + st.x) >> 1;
|
addr.x += ((st.y * st.z) + st.x) >> 1;
|
||||||
uvec4 pixel = texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0);
|
ivec4 pixel = ivec4(texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0));
|
||||||
if ((st.x & 1) != 0) pixel.r >>= 4;
|
if ((st.x & 1) != 0) pixel.r >>= 4;
|
||||||
else pixel.r &= 0x0F;
|
else pixel.r &= 0x0F;
|
||||||
|
|
||||||
addr.y = (addr.y << 3) + int(pixel.r);
|
addr.y = (addr.y << 3) + pixel.r;
|
||||||
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
||||||
|
|
||||||
return vec4(color.rgb, max(step(1,pixel.r),alpha0));
|
return vec4(color.rgb, (pixel.r>0)?1:alpha0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 TextureFetch_I8(ivec2 addr, ivec4 st, uint wrapmode, float alpha0)
|
vec4 TextureFetch_I8(ivec2 addr, ivec4 st, int wrapmode, float alpha0)
|
||||||
{
|
{
|
||||||
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
||||||
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
||||||
|
|
||||||
addr.x += ((st.y * st.z) + st.x);
|
addr.x += ((st.y * st.z) + st.x);
|
||||||
uvec4 pixel = texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0);
|
ivec4 pixel = ivec4(texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0));
|
||||||
|
|
||||||
addr.y = (addr.y << 3) + int(pixel.r);
|
addr.y = (addr.y << 3) + pixel.r;
|
||||||
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
||||||
|
|
||||||
return vec4(color.rgb, max(step(1,pixel.r),alpha0));
|
return vec4(color.rgb, (pixel.r>0)?1:alpha0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 TextureFetch_Compressed(ivec2 addr, ivec4 st, uint wrapmode)
|
vec4 TextureFetch_Compressed(ivec2 addr, ivec4 st, int wrapmode)
|
||||||
{
|
{
|
||||||
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
||||||
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
||||||
|
|
||||||
addr.x += ((st.y & 0x3FC) * (st.z>>2)) + (st.x & 0x3FC) + (st.y & 0x3);
|
addr.x += ((st.y & 0x3FC) * (st.z>>2)) + (st.x & 0x3FC) + (st.y & 0x3);
|
||||||
uvec4 p = texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0);
|
ivec4 p = ivec4(texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0));
|
||||||
uint val = (p.r >> (2 * (st.x & 0x3))) & 0x3;
|
int val = (p.r >> (2 * (st.x & 0x3))) & 0x3;
|
||||||
|
|
||||||
int slot1addr = 0x20000 + ((addr.x & 0x1FFFC) >> 1);
|
int slot1addr = 0x20000 + ((addr.x & 0x1FFFC) >> 1);
|
||||||
if (addr.x >= 0x40000) slot1addr += 0x10000;
|
if (addr.x >= 0x40000) slot1addr += 0x10000;
|
||||||
|
|
||||||
uint palinfo;
|
int palinfo;
|
||||||
p = texelFetch(TexMem, ivec2(slot1addr&0x3FF, slot1addr>>10), 0);
|
p = ivec4(texelFetch(TexMem, ivec2(slot1addr&0x3FF, slot1addr>>10), 0));
|
||||||
palinfo = p.r;
|
palinfo = p.r;
|
||||||
slot1addr++;
|
slot1addr++;
|
||||||
p = texelFetch(TexMem, ivec2(slot1addr&0x3FF, slot1addr>>10), 0);
|
p = ivec4(texelFetch(TexMem, ivec2(slot1addr&0x3FF, slot1addr>>10), 0));
|
||||||
palinfo |= (p.r << 8);
|
palinfo |= (p.r << 8);
|
||||||
|
|
||||||
addr.y = (addr.y << 3) + ((int(palinfo) & 0x3FFF) << 1);
|
addr.y = (addr.y << 3) + ((palinfo & 0x3FFF) << 1);
|
||||||
palinfo >>= 14;
|
palinfo >>= 14;
|
||||||
|
|
||||||
if (val == 0)
|
if (val == 0)
|
||||||
@ -247,32 +247,32 @@ vec4 TextureFetch_Compressed(ivec2 addr, ivec4 st, uint wrapmode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 TextureFetch_A5I3(ivec2 addr, ivec4 st, uint wrapmode)
|
vec4 TextureFetch_A5I3(ivec2 addr, ivec4 st, int wrapmode)
|
||||||
{
|
{
|
||||||
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
||||||
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
||||||
|
|
||||||
addr.x += ((st.y * st.z) + st.x);
|
addr.x += ((st.y * st.z) + st.x);
|
||||||
uvec4 pixel = texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0);
|
ivec4 pixel = ivec4(texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0));
|
||||||
|
|
||||||
pixel.a = (pixel.r & 0xF8) >> 3;
|
pixel.a = (pixel.r & 0xF8) >> 3;
|
||||||
pixel.r &= 0x07;
|
pixel.r &= 0x07;
|
||||||
|
|
||||||
addr.y = (addr.y << 3) + int(pixel.r);
|
addr.y = (addr.y << 3) + pixel.r;
|
||||||
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
vec4 color = texelFetch(TexPalMem, ivec2(addr.y&0x3FF, addr.y>>10), 0);
|
||||||
|
|
||||||
return vec4(color.rgb, float(pixel.a)/31.0);
|
return vec4(color.rgb, float(pixel.a)/31.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 TextureFetch_Direct(ivec2 addr, ivec4 st, uint wrapmode)
|
vec4 TextureFetch_Direct(ivec2 addr, ivec4 st, int wrapmode)
|
||||||
{
|
{
|
||||||
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
st.x = TexcoordWrap(st.x, st.z, wrapmode>>0);
|
||||||
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
st.y = TexcoordWrap(st.y, st.w, wrapmode>>1);
|
||||||
|
|
||||||
addr.x += ((st.y * st.z) + st.x) << 1;
|
addr.x += ((st.y * st.z) + st.x) << 1;
|
||||||
uvec4 pixelL = texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0);
|
ivec4 pixelL = ivec4(texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0));
|
||||||
addr.x++;
|
addr.x++;
|
||||||
uvec4 pixelH = texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0);
|
ivec4 pixelH = ivec4(texelFetch(TexMem, ivec2(addr.x&0x3FF, addr.x>>10), 0));
|
||||||
|
|
||||||
vec4 color;
|
vec4 color;
|
||||||
color.r = float(pixelL.r & 0x1F) / 31.0;
|
color.r = float(pixelL.r & 0x1F) / 31.0;
|
||||||
@ -285,21 +285,21 @@ vec4 TextureFetch_Direct(ivec2 addr, ivec4 st, uint wrapmode)
|
|||||||
|
|
||||||
vec4 TextureLookup_Nearest(vec2 st)
|
vec4 TextureLookup_Nearest(vec2 st)
|
||||||
{
|
{
|
||||||
uint attr = fPolygonAttr.y;
|
int attr = int(fPolygonAttr.y);
|
||||||
uint paladdr = fPolygonAttr.z;
|
int paladdr = int(fPolygonAttr.z);
|
||||||
|
|
||||||
float alpha0;
|
float alpha0;
|
||||||
if ((attr & (1<<29)) != 0) alpha0 = 0.0;
|
if ((attr & (1<<29)) != 0) alpha0 = 0.0;
|
||||||
else alpha0 = 1.0;
|
else alpha0 = 1.0;
|
||||||
|
|
||||||
int tw = 8 << int((attr >> 20) & 0x7);
|
int tw = 8 << ((attr >> 20) & 0x7);
|
||||||
int th = 8 << int((attr >> 23) & 0x7);
|
int th = 8 << ((attr >> 23) & 0x7);
|
||||||
ivec4 st_full = ivec4(ivec2(st), tw, th);
|
ivec4 st_full = ivec4(ivec2(st), tw, th);
|
||||||
|
|
||||||
ivec2 vramaddr = ivec2(int(attr & 0xFFFF) << 3, int(paladdr));
|
ivec2 vramaddr = ivec2((attr & 0xFFFF) << 3, paladdr);
|
||||||
uint wrapmode = attr >> 16;
|
int wrapmode = (attr >> 16);
|
||||||
|
|
||||||
uint type = (attr >> 26) & 0x7;
|
int type = (attr >> 26) & 0x7;
|
||||||
if (type == 5) return TextureFetch_Compressed(vramaddr, st_full, wrapmode);
|
if (type == 5) return TextureFetch_Compressed(vramaddr, st_full, wrapmode);
|
||||||
else if (type == 2) return TextureFetch_I2 (vramaddr, st_full, wrapmode, alpha0);
|
else if (type == 2) return TextureFetch_I2 (vramaddr, st_full, wrapmode, alpha0);
|
||||||
else if (type == 3) return TextureFetch_I4 (vramaddr, st_full, wrapmode, alpha0);
|
else if (type == 3) return TextureFetch_I4 (vramaddr, st_full, wrapmode, alpha0);
|
||||||
@ -314,22 +314,22 @@ vec4 TextureLookup_Linear(vec2 texcoord)
|
|||||||
ivec2 intpart = ivec2(texcoord);
|
ivec2 intpart = ivec2(texcoord);
|
||||||
vec2 fracpart = fract(texcoord);
|
vec2 fracpart = fract(texcoord);
|
||||||
|
|
||||||
uint attr = fPolygonAttr.y;
|
int attr = int(fPolygonAttr.y);
|
||||||
uint paladdr = fPolygonAttr.z;
|
int paladdr = int(fPolygonAttr.z);
|
||||||
|
|
||||||
float alpha0;
|
float alpha0;
|
||||||
if ((attr & (1<<29)) != 0) alpha0 = 0.0;
|
if ((attr & (1<<29)) != 0) alpha0 = 0.0;
|
||||||
else alpha0 = 1.0;
|
else alpha0 = 1.0;
|
||||||
|
|
||||||
int tw = 8 << int((attr >> 20) & 0x7);
|
int tw = 8 << ((attr >> 20) & 0x7);
|
||||||
int th = 8 << int((attr >> 23) & 0x7);
|
int th = 8 << ((attr >> 23) & 0x7);
|
||||||
ivec4 st_full = ivec4(intpart, tw, th);
|
ivec4 st_full = ivec4(intpart, tw, th);
|
||||||
|
|
||||||
ivec2 vramaddr = ivec2(int(attr & 0xFFFF) << 3, int(paladdr));
|
ivec2 vramaddr = ivec2((attr & 0xFFFF) << 3, paladdr);
|
||||||
uint wrapmode = attr >> 16;
|
int wrapmode = (attr >> 16);
|
||||||
|
|
||||||
vec4 A, B, C, D;
|
vec4 A, B, C, D;
|
||||||
uint type = (attr >> 26) & 0x7;
|
int type = (attr >> 26) & 0x7;
|
||||||
if (type == 5)
|
if (type == 5)
|
||||||
{
|
{
|
||||||
A = TextureFetch_Compressed(vramaddr, st_full , wrapmode);
|
A = TextureFetch_Compressed(vramaddr, st_full , wrapmode);
|
||||||
@ -423,7 +423,7 @@ vec4 FinalColor()
|
|||||||
{
|
{
|
||||||
vec4 col;
|
vec4 col;
|
||||||
vec4 vcol = fColor;
|
vec4 vcol = fColor;
|
||||||
uint blendmode = (fPolygonAttr.x >> 4) & 0x3;
|
int blendmode = (fPolygonAttr.x >> 4) & 0x3;
|
||||||
|
|
||||||
if (blendmode == 2)
|
if (blendmode == 2)
|
||||||
{
|
{
|
||||||
@ -481,8 +481,8 @@ const char* kRenderVS_Z = R"(
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
uint attr = vPolygonAttr.x;
|
int attr = vPolygonAttr.x;
|
||||||
uint zshift = (attr >> 16) & 0x1F;
|
int zshift = (attr >> 16) & 0x1F;
|
||||||
|
|
||||||
vec4 fpos;
|
vec4 fpos;
|
||||||
fpos.xy = ((vec2(vPosition.xy) * 2.0) / uScreenSize) - 1.0;
|
fpos.xy = ((vec2(vPosition.xy) * 2.0) / uScreenSize) - 1.0;
|
||||||
@ -504,8 +504,8 @@ smooth out float fZ;
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
uint attr = vPolygonAttr.x;
|
int attr = vPolygonAttr.x;
|
||||||
uint zshift = (attr >> 16) & 0x1F;
|
int zshift = (attr >> 16) & 0x1F;
|
||||||
|
|
||||||
vec4 fpos;
|
vec4 fpos;
|
||||||
fpos.xy = ((vec2(vPosition.xy) * 2.0) / uScreenSize) - 1.0;
|
fpos.xy = ((vec2(vPosition.xy) * 2.0) / uScreenSize) - 1.0;
|
||||||
@ -530,7 +530,7 @@ void main()
|
|||||||
if (col.a < 30.5/31) discard;
|
if (col.a < 30.5/31) discard;
|
||||||
|
|
||||||
oColor = col;
|
oColor = col;
|
||||||
oAttr.g = (fPolygonAttr.x >> 24) & 0x3F;
|
oAttr.g = uint((fPolygonAttr.x >> 24) & 0x3F);
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
@ -544,7 +544,7 @@ void main()
|
|||||||
if (col.a < 30.5/31) discard;
|
if (col.a < 30.5/31) discard;
|
||||||
|
|
||||||
oColor = col;
|
oColor = col;
|
||||||
oAttr.g = (fPolygonAttr.x >> 24) & 0x3F;
|
oAttr.g = uint((fPolygonAttr.x >> 24) & 0x3F);
|
||||||
gl_FragDepth = fZ;
|
gl_FragDepth = fZ;
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
@ -558,7 +558,7 @@ void main()
|
|||||||
if (col.a >= 30.5/31) discard;
|
if (col.a >= 30.5/31) discard;
|
||||||
|
|
||||||
oColor = col;
|
oColor = col;
|
||||||
oAttr.g = 0xFF;
|
oAttr.g = uint(0xFF);
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
@ -573,7 +573,7 @@ void main()
|
|||||||
if (col.a >= 30.5/31) discard;
|
if (col.a >= 30.5/31) discard;
|
||||||
|
|
||||||
oColor = col;
|
oColor = col;
|
||||||
oAttr.g = 0xFF;
|
oAttr.g = uint(0xFF);
|
||||||
gl_FragDepth = fZ;
|
gl_FragDepth = fZ;
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
@ -583,8 +583,7 @@ const char* kRenderFS_ZSM = R"(
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
oColor = vec4(0,0,0,1);
|
oColor = vec4(0,0,0,1);
|
||||||
oAttr.g = 0xFF;
|
oAttr.g = uint(0xFF);
|
||||||
oAttr.b = 1;
|
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
@ -595,8 +594,7 @@ smooth in float fZ;
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
oColor = vec4(0,0,0,1);
|
oColor = vec4(0,0,0,1);
|
||||||
oAttr.g = 0xFF;
|
oAttr.g = uint(0xFF);
|
||||||
oAttr.b = 1;
|
|
||||||
gl_FragDepth = fZ;
|
gl_FragDepth = fZ;
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
Reference in New Issue
Block a user