mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-04-16 14:42:52 +00:00
TextureConverter: Use gl_FragCoord instead of uv0
This commit is contained in:
parent
a289e0604f
commit
bcb31b09d3
@ -41,17 +41,6 @@ static SHADER s_yuyvToRgbProgram;
|
|||||||
// Not all slots are taken - but who cares.
|
// Not all slots are taken - but who cares.
|
||||||
const u32 NUM_ENCODING_PROGRAMS = 64;
|
const u32 NUM_ENCODING_PROGRAMS = 64;
|
||||||
static SHADER s_encodingPrograms[NUM_ENCODING_PROGRAMS];
|
static SHADER s_encodingPrograms[NUM_ENCODING_PROGRAMS];
|
||||||
static int s_encodingUniform_loc[NUM_ENCODING_PROGRAMS];
|
|
||||||
|
|
||||||
static const char *VProgram =
|
|
||||||
"VARYOUT vec2 uv0;\n"
|
|
||||||
"uniform vec4 copy_position;\n" // left, top, right, bottom
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n"
|
|
||||||
" gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n"
|
|
||||||
" uv0 = mix(copy_position.xy, copy_position.zw, rawpos);\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
void CreatePrograms()
|
void CreatePrograms()
|
||||||
{
|
{
|
||||||
@ -158,8 +147,14 @@ SHADER &GetOrCreateEncodingShader(u32 format)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char *VProgram =
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n"
|
||||||
|
" gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
ProgramShaderCache::CompileShader(s_encodingPrograms[format], VProgram, shader);
|
ProgramShaderCache::CompileShader(s_encodingPrograms[format], VProgram, shader);
|
||||||
s_encodingUniform_loc[format] = glGetUniformLocation(s_encodingPrograms[format].glprogid, "copy_position");
|
|
||||||
}
|
}
|
||||||
return s_encodingPrograms[format];
|
return s_encodingPrograms[format];
|
||||||
}
|
}
|
||||||
@ -200,7 +195,7 @@ void Shutdown()
|
|||||||
|
|
||||||
void EncodeToRamUsingShader(GLuint srcTexture, const TargetRectangle& sourceRc,
|
void EncodeToRamUsingShader(GLuint srcTexture, const TargetRectangle& sourceRc,
|
||||||
u8* destAddr, int dstWidth, int dstHeight, int readStride,
|
u8* destAddr, int dstWidth, int dstHeight, int readStride,
|
||||||
bool toTexture, bool linearFilter, int uniform_loc)
|
bool toTexture, bool linearFilter)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@ -230,8 +225,6 @@ void EncodeToRamUsingShader(GLuint srcTexture, const TargetRectangle& sourceRc,
|
|||||||
|
|
||||||
glViewport(0, 0, (GLsizei)dstWidth, (GLsizei)dstHeight);
|
glViewport(0, 0, (GLsizei)dstWidth, (GLsizei)dstHeight);
|
||||||
|
|
||||||
glUniform4f(uniform_loc, sourceRc.left, sourceRc.top, sourceRc.right, sourceRc.bottom);
|
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
|
||||||
GL_REPORT_ERRORD();
|
GL_REPORT_ERRORD();
|
||||||
@ -323,7 +316,7 @@ int EncodeToRamFromTexture(u32 address,GLuint source_texture, bool bFromZBuffer,
|
|||||||
TexDecoder_GetBlockWidthInTexels(format);
|
TexDecoder_GetBlockWidthInTexels(format);
|
||||||
EncodeToRamUsingShader(source_texture, scaledSource,
|
EncodeToRamUsingShader(source_texture, scaledSource,
|
||||||
dest_ptr, expandedWidth / samples, expandedHeight, readStride,
|
dest_ptr, expandedWidth / samples, expandedHeight, readStride,
|
||||||
true, bScaleByHalf > 0 && !bFromZBuffer, s_encodingUniform_loc[format]);
|
true, bScaleByHalf > 0 && !bFromZBuffer);
|
||||||
return size_in_bytes; // TODO: D3D11 is calculating this value differently!
|
return size_in_bytes; // TODO: D3D11 is calculating this value differently!
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -334,10 +327,12 @@ void EncodeToRamYUYV(GLuint srcTexture, const TargetRectangle& sourceRc, u8* des
|
|||||||
|
|
||||||
s_rgbToYuyvProgram.Bind();
|
s_rgbToYuyvProgram.Bind();
|
||||||
|
|
||||||
|
glUniform4f(s_rgbToYuyvUniform_loc, sourceRc.left, sourceRc.top, sourceRc.right, sourceRc.bottom);
|
||||||
|
|
||||||
// We enable linear filtering, because the gamecube does filtering in the vertical direction when
|
// We enable linear filtering, because the gamecube does filtering in the vertical direction when
|
||||||
// yscale is enabled.
|
// yscale is enabled.
|
||||||
// Otherwise we get jaggies when a game uses yscaling (most PAL games)
|
// Otherwise we get jaggies when a game uses yscaling (most PAL games)
|
||||||
EncodeToRamUsingShader(srcTexture, sourceRc, destAddr, dstWidth / 2, dstHeight, 0, false, true, s_rgbToYuyvUniform_loc);
|
EncodeToRamUsingShader(srcTexture, sourceRc, destAddr, dstWidth / 2, dstHeight, 0, false, true);
|
||||||
FramebufferManager::SetFramebuffer(0);
|
FramebufferManager::SetFramebuffer(0);
|
||||||
TextureCache::DisableStage(0);
|
TextureCache::DisableStage(0);
|
||||||
g_renderer->RestoreAPIState();
|
g_renderer->RestoreAPIState();
|
||||||
|
@ -75,7 +75,6 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
|
|||||||
WRITE(p, "uniform sampler2D samp0;\n");
|
WRITE(p, "uniform sampler2D samp0;\n");
|
||||||
|
|
||||||
WRITE(p, " out vec4 ocol0;\n");
|
WRITE(p, " out vec4 ocol0;\n");
|
||||||
WRITE(p, " VARYIN float2 uv0;\n");
|
|
||||||
WRITE(p, "void main()\n");
|
WRITE(p, "void main()\n");
|
||||||
}
|
}
|
||||||
else // D3D
|
else // D3D
|
||||||
@ -84,13 +83,12 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
|
|||||||
WRITE(p, "Texture2D Tex0 : register(t0);\n");
|
WRITE(p, "Texture2D Tex0 : register(t0);\n");
|
||||||
|
|
||||||
WRITE(p,"void main(\n");
|
WRITE(p,"void main(\n");
|
||||||
WRITE(p," out float4 ocol0 : SV_Target,\n");
|
WRITE(p," out float4 ocol0 : SV_Target)\n");
|
||||||
WRITE(p," in float2 uv0 : TEXCOORD0)\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE(p, "{\n"
|
WRITE(p, "{\n"
|
||||||
" float2 sampleUv;\n"
|
" float2 sampleUv;\n"
|
||||||
" float2 uv1 = floor(uv0);\n");
|
" float2 uv1 = floor(gl_FragCoord.xy);\n");
|
||||||
|
|
||||||
WRITE(p, " uv1.x = uv1.x * %d.0;\n", samples);
|
WRITE(p, " uv1.x = uv1.x * %d.0;\n", samples);
|
||||||
|
|
||||||
@ -133,7 +131,6 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType)
|
|||||||
WRITE(p, "uniform sampler2D samp0;\n");
|
WRITE(p, "uniform sampler2D samp0;\n");
|
||||||
|
|
||||||
WRITE(p, " out float4 ocol0;\n");
|
WRITE(p, " out float4 ocol0;\n");
|
||||||
WRITE(p, " VARYIN float2 uv0;\n");
|
|
||||||
WRITE(p, "void main()\n");
|
WRITE(p, "void main()\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -142,14 +139,13 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType)
|
|||||||
WRITE(p, "Texture2D Tex0 : register(t0);\n");
|
WRITE(p, "Texture2D Tex0 : register(t0);\n");
|
||||||
|
|
||||||
WRITE(p,"void main(\n");
|
WRITE(p,"void main(\n");
|
||||||
WRITE(p," out float4 ocol0 : SV_Target,\n");
|
WRITE(p," out float4 ocol0 : SV_Target)\n");
|
||||||
WRITE(p," in float2 uv0 : TEXCOORD0)\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WRITE(p, "{\n"
|
WRITE(p, "{\n"
|
||||||
" float2 sampleUv;\n"
|
" float2 sampleUv;\n"
|
||||||
" float2 uv1 = floor(uv0);\n");
|
" float2 uv1 = floor(gl_FragCoord.xy);\n");
|
||||||
|
|
||||||
WRITE(p, " float yl = floor(uv1.y / %d.0);\n", blkH);
|
WRITE(p, " float yl = floor(uv1.y / %d.0);\n", blkH);
|
||||||
WRITE(p, " float yb = yl * %d.0;\n", blkH);
|
WRITE(p, " float yb = yl * %d.0;\n", blkH);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user