summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/PostProcessing.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/OGL/PostProcessing.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/PostProcessing.cpp42
1 files changed, 28 insertions, 14 deletions
diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp
index 434a1d94a3..80bdf8eef4 100644
--- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp
+++ b/Source/Core/VideoBackends/OGL/PostProcessing.cpp
@@ -37,6 +37,8 @@ static char s_vertex_shader[] =
"}\n";
OpenGLPostProcessing::OpenGLPostProcessing()
+ : m_initialized(false)
+ , m_anaglyph(false)
{
CreateHeader();
@@ -46,8 +48,6 @@ OpenGLPostProcessing::OpenGLPostProcessing()
glGenBuffers(1, &m_attribute_vbo);
glGenVertexArrays(1, &m_attribute_vao);
}
-
- m_initialized = false;
}
OpenGLPostProcessing::~OpenGLPostProcessing()
@@ -62,7 +62,7 @@ OpenGLPostProcessing::~OpenGLPostProcessing()
}
void OpenGLPostProcessing::BlitFromTexture(TargetRectangle src, TargetRectangle dst,
- int src_texture, int src_width, int src_height)
+ int src_texture, int src_width, int src_height, int layer)
{
ApplyShader();
@@ -79,6 +79,7 @@ void OpenGLPostProcessing::BlitFromTexture(TargetRectangle src, TargetRectangle
glUniform4f(m_uniform_src_rect, src.left / (float) src_width, src.bottom / (float) src_height,
src.GetWidth() / (float) src_width, src.GetHeight() / (float) src_height);
glUniform1ui(m_uniform_time, (GLuint)m_timer.GetTimeElapsed());
+ glUniform1i(m_uniform_layer, layer);
if (m_config.IsDirty())
{
@@ -151,25 +152,29 @@ void OpenGLPostProcessing::BlitFromTexture(TargetRectangle src, TargetRectangle
}
glActiveTexture(GL_TEXTURE0+9);
- glBindTexture(GL_TEXTURE_2D, src_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glBindTexture(GL_TEXTURE_2D_ARRAY, src_texture);
+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
void OpenGLPostProcessing::ApplyShader()
{
// shader didn't changed
- if (m_initialized && m_config.GetShader() == g_ActiveConfig.sPostProcessingShader)
+ if (m_initialized && m_config.GetShader() == g_ActiveConfig.sPostProcessingShader &&
+ ((g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH) == m_anaglyph))
return;
m_shader.Destroy();
m_uniform_bindings.clear();
- // load shader from disk
- std::string default_shader = "void main() { SetOutput(Sample()); }";
+ // load shader code
std::string code = "";
- if (g_ActiveConfig.sPostProcessingShader != "")
+ std::string default_shader = "void main() { SetOutput(Sample()); }\n";
+
+ if (g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH)
+ code = "void main() { SetOutput(float4(pow(0.7 * SampleLayer(0).g + 0.3 * SampleLayer(0).b, 1.5), SampleLayer(1).gba)); }\n";
+ else if (g_ActiveConfig.sPostProcessingShader != "")
code = m_config.LoadShader();
if (code == "")
@@ -195,6 +200,7 @@ void OpenGLPostProcessing::ApplyShader()
m_uniform_resolution = glGetUniformLocation(m_shader.glprogid, "resolution");
m_uniform_time = glGetUniformLocation(m_shader.glprogid, "time");
m_uniform_src_rect = glGetUniformLocation(m_shader.glprogid, "src_rect");
+ m_uniform_layer = glGetUniformLocation(m_shader.glprogid, "layer");
if (m_attribute_workaround)
{
@@ -218,6 +224,7 @@ void OpenGLPostProcessing::ApplyShader()
std::string glsl_name = "option_" + it.first;
m_uniform_bindings[it.first] = glGetUniformLocation(m_shader.glprogid, glsl_name.c_str());
}
+ m_anaglyph = g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH;
m_initialized = true;
}
@@ -228,7 +235,7 @@ void OpenGLPostProcessing::CreateHeader()
// Shouldn't be accessed directly by the PP shader
// Texture sampler
"SAMPLER_BINDING(8) uniform sampler2D samp8;\n"
- "SAMPLER_BINDING(9) uniform sampler2D samp9;\n"
+ "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
// Output variable
"out float4 ocol0;\n"
@@ -238,19 +245,26 @@ void OpenGLPostProcessing::CreateHeader()
"uniform float4 resolution;\n"
// Time
"uniform uint time;\n"
+ // Layer
+ "uniform int layer;\n"
// Interfacing functions
"float4 Sample()\n"
"{\n"
- "\treturn texture(samp9, uv0);\n"
+ "\treturn texture(samp9, float3(uv0, layer));\n"
"}\n"
"float4 SampleLocation(float2 location)\n"
"{\n"
- "\treturn texture(samp9, location);\n"
+ "\treturn texture(samp9, float3(location, layer));\n"
+ "}\n"
+
+ "float4 SampleLayer(int layer)\n"
+ "{\n"
+ "\treturn texture(samp9, float3(uv0, layer));\n"
"}\n"
- "#define SampleOffset(offset) textureOffset(samp9, uv0, offset)\n"
+ "#define SampleOffset(offset) textureOffset(samp9, float3(uv0, layer), offset)\n"
"float4 SampleFontLocation(float2 location)\n"
"{\n"