diff --git a/Source/gs/GSH_OpenGL/GSH_OpenGL.cpp b/Source/gs/GSH_OpenGL/GSH_OpenGL.cpp index a53bf77e24..1df33e5ef8 100644 --- a/Source/gs/GSH_OpenGL/GSH_OpenGL.cpp +++ b/Source/gs/GSH_OpenGL/GSH_OpenGL.cpp @@ -202,10 +202,29 @@ void CGSH_OpenGL::FlipImpl() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED); + + static FramebufferPtr previousFramebuffer; + if(halfHeight) + { + if(!previousFramebuffer) + { + previousFramebuffer = FramebufferPtr(new CFramebuffer(fb.GetBufPtr(), fb.GetBufWidth(), FRAMEBUFFER_HEIGHT, fb.nPSM, m_fbScale, m_multisampleEnabled)); + } + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, previousFramebuffer->m_texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED); + } + + glUseProgram(*m_presentProgram); assert(m_presentTextureUniform != -1); glUniform1i(m_presentTextureUniform, 0); + glUniform1i(m_presentTextureUniform, 2); assert(m_presentTexCoordScaleUniform != -1); glUniform2f(m_presentTexCoordScaleUniform, u1, v1); @@ -213,11 +232,31 @@ void CGSH_OpenGL::FlipImpl() glBindBuffer(GL_ARRAY_BUFFER, m_presentVertexBuffer); glBindVertexArray(m_presentVertexArray); + glUniform1f(m_presentFieldUniform, (m_nCSR & CSR_FIELD) == CSR_FIELD ? 1 : 0); + #ifdef _DEBUG m_presentProgram->Validate(); #endif glDrawArrays(GL_TRIANGLES, 0, 3); + + if(halfHeight) + { + if(previousFramebuffer) + { + glBindFramebuffer(GL_FRAMEBUFFER, previousFramebuffer->m_framebuffer); + glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer->m_framebuffer); + + //Copy buffers + glBlitFramebuffer( + 0, 0, framebuffer->m_width * m_fbScale, framebuffer->m_height * m_fbScale, + 0, 0, previousFramebuffer->m_width * m_fbScale, previousFramebuffer->m_height * m_fbScale, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + glBindFramebuffer(GL_FRAMEBUFFER, m_presentFramebuffer); + } + } } CHECKGLERROR(); @@ -281,7 +320,9 @@ void CGSH_OpenGL::InitializeRC() m_presentVertexBuffer = GeneratePresentVertexBuffer(); m_presentVertexArray = GeneratePresentVertexArray(); m_presentTextureUniform = glGetUniformLocation(*m_presentProgram, "g_texture"); + m_presentTexture2Uniform = glGetUniformLocation(*m_presentProgram, "g_texture2"); m_presentTexCoordScaleUniform = glGetUniformLocation(*m_presentProgram, "g_texCoordScale"); + m_presentFieldUniform = glGetUniformLocation(*m_presentProgram, "g_field"); m_copyToFbProgram = GenerateCopyToFbProgram(); m_copyToFbTexture = Framework::OpenGl::CTexture::Create(); @@ -1718,10 +1759,10 @@ void CGSH_OpenGL::DoRenderPass() { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_renderState.texture0Handle); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_renderState.texture0MinFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, m_renderState.texture0MagFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, m_renderState.texture0WrapS); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, m_renderState.texture0WrapT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, m_renderState.texture0AlphaAsIndex ? GL_ALPHA : GL_RED); glActiveTexture(GL_TEXTURE1); diff --git a/Source/gs/GSH_OpenGL/GSH_OpenGL.h b/Source/gs/GSH_OpenGL/GSH_OpenGL.h index 5ead07905c..215f4528c7 100644 --- a/Source/gs/GSH_OpenGL/GSH_OpenGL.h +++ b/Source/gs/GSH_OpenGL/GSH_OpenGL.h @@ -410,7 +410,9 @@ class CGSH_OpenGL : public CGSHandler Framework::OpenGl::CBuffer m_presentVertexBuffer; Framework::OpenGl::CVertexArray m_presentVertexArray; GLint m_presentTextureUniform = -1; + GLint m_presentTexture2Uniform = -1; GLint m_presentTexCoordScaleUniform = -1; + GLint m_presentFieldUniform = -1; Framework::OpenGl::ProgramPtr m_copyToFbProgram; Framework::OpenGl::CTexture m_copyToFbTexture; diff --git a/Source/gs/GSH_OpenGL/GSH_OpenGL_Shader.cpp b/Source/gs/GSH_OpenGL/GSH_OpenGL_Shader.cpp index 54789bf012..48776fa5e6 100644 --- a/Source/gs/GSH_OpenGL/GSH_OpenGL_Shader.cpp +++ b/Source/gs/GSH_OpenGL/GSH_OpenGL_Shader.cpp @@ -467,9 +467,15 @@ Framework::OpenGl::ProgramPtr CGSH_OpenGL::GeneratePresentProgram() shaderBuilder << "in vec2 v_texCoord;" << std::endl; shaderBuilder << "out vec4 fragColor;" << std::endl; shaderBuilder << "uniform sampler2D g_texture;" << std::endl; + shaderBuilder << "uniform sampler2D g_texture2;" << std::endl; + shaderBuilder << "uniform float g_field;" << std::endl; shaderBuilder << "void main()" << std::endl; shaderBuilder << "{" << std::endl; - shaderBuilder << " fragColor = texture(g_texture, v_texCoord);" << std::endl; + shaderBuilder << " vec2 p = vec2(floor(gl_FragCoord.x), floor(gl_FragCoord.y));" << std::endl; + shaderBuilder << " if (mod(p.y, 2.0) == g_field)" << std::endl; + shaderBuilder << " fragColor = texture(g_texture, v_texCoord);" << std::endl; + shaderBuilder << " else" << std::endl; + shaderBuilder << " fragColor = texture(g_texture2, v_texCoord);" << std::endl; shaderBuilder << "}" << std::endl; pixelShader.SetSource(shaderBuilder.str().c_str());