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.cpp273
1 files changed, 0 insertions, 273 deletions
diff --git a/Source/Core/VideoBackends/OGL/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/PostProcessing.cpp
deleted file mode 100644
index 57d8f7c8f8..0000000000
--- a/Source/Core/VideoBackends/OGL/PostProcessing.cpp
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright 2009 Dolphin Emulator Project
-// Licensed under GPLv2+
-// Refer to the license.txt file included.
-
-#include "VideoBackends/OGL/PostProcessing.h"
-
-#include "Common/CommonTypes.h"
-#include "Common/Logging/Log.h"
-#include "Common/StringUtil.h"
-
-#include "Core/Config/GraphicsSettings.h"
-
-#include "VideoBackends/OGL/FramebufferManager.h"
-#include "VideoBackends/OGL/OGLTexture.h"
-#include "VideoBackends/OGL/ProgramShaderCache.h"
-#include "VideoBackends/OGL/SamplerCache.h"
-
-#include "VideoCommon/VideoCommon.h"
-#include "VideoCommon/VideoConfig.h"
-
-namespace OGL
-{
-static const char s_vertex_shader[] = "out vec2 uv0;\n"
- "uniform vec4 src_rect;\n"
- "void main(void) {\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 = vec2(mix(src_rect.xy, src_rect.zw, rawpos));\n"
- "}\n";
-
-OpenGLPostProcessing::OpenGLPostProcessing() : m_initialized(false)
-{
- CreateHeader();
-}
-
-OpenGLPostProcessing::~OpenGLPostProcessing()
-{
- m_shader.Destroy();
-}
-
-void OpenGLPostProcessing::BlitFromTexture(TargetRectangle src, TargetRectangle dst,
- int src_texture, int src_width, int src_height,
- int layer)
-{
- ApplyShader();
-
- glViewport(dst.left, dst.bottom, dst.GetWidth(), dst.GetHeight());
-
- ProgramShaderCache::BindVertexFormat(nullptr);
-
- m_shader.Bind();
-
- glUniform4f(m_uniform_resolution, (float)src_width, (float)src_height, 1.0f / (float)src_width,
- 1.0f / (float)src_height);
- glUniform4f(m_uniform_src_rect, src.left / (float)src_width, src.top / (float)src_height,
- src.right / (float)src_width, src.bottom / (float)src_height);
- glUniform1ui(m_uniform_time, (GLuint)m_timer.GetTimeElapsed());
- glUniform1i(m_uniform_layer, layer);
-
- if (m_config.IsDirty())
- {
- for (auto& it : m_config.GetOptions())
- {
- if (it.second.m_dirty)
- {
- switch (it.second.m_type)
- {
- case PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_BOOL:
- glUniform1i(m_uniform_bindings[it.first], it.second.m_bool_value);
- break;
- case PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_INTEGER:
- switch (it.second.m_integer_values.size())
- {
- case 1:
- glUniform1i(m_uniform_bindings[it.first], it.second.m_integer_values[0]);
- break;
- case 2:
- glUniform2i(m_uniform_bindings[it.first], it.second.m_integer_values[0],
- it.second.m_integer_values[1]);
- break;
- case 3:
- glUniform3i(m_uniform_bindings[it.first], it.second.m_integer_values[0],
- it.second.m_integer_values[1], it.second.m_integer_values[2]);
- break;
- case 4:
- glUniform4i(m_uniform_bindings[it.first], it.second.m_integer_values[0],
- it.second.m_integer_values[1], it.second.m_integer_values[2],
- it.second.m_integer_values[3]);
- break;
- }
- break;
- case PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_FLOAT:
- switch (it.second.m_float_values.size())
- {
- case 1:
- glUniform1f(m_uniform_bindings[it.first], it.second.m_float_values[0]);
- break;
- case 2:
- glUniform2f(m_uniform_bindings[it.first], it.second.m_float_values[0],
- it.second.m_float_values[1]);
- break;
- case 3:
- glUniform3f(m_uniform_bindings[it.first], it.second.m_float_values[0],
- it.second.m_float_values[1], it.second.m_float_values[2]);
- break;
- case 4:
- glUniform4f(m_uniform_bindings[it.first], it.second.m_float_values[0],
- it.second.m_float_values[1], it.second.m_float_values[2],
- it.second.m_float_values[3]);
- break;
- }
- break;
- }
- it.second.m_dirty = false;
- }
- }
- m_config.SetDirty(false);
- }
-
- glActiveTexture(GL_TEXTURE9);
- glBindTexture(GL_TEXTURE_2D_ARRAY, src_texture);
- g_sampler_cache->BindLinearSampler(9);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-}
-
-void OpenGLPostProcessing::ApplyShader()
-{
- // shader didn't changed
- if (m_initialized && m_config.GetShader() == g_ActiveConfig.sPostProcessingShader)
- return;
-
- m_shader.Destroy();
- m_uniform_bindings.clear();
-
- // load shader code
- std::string main_code = m_config.LoadShader();
- std::string options_code = LoadShaderOptions();
- std::string code = m_glsl_header + options_code + main_code;
-
- // and compile it
- if (!ProgramShaderCache::CompileShader(m_shader, s_vertex_shader, code))
- {
- ERROR_LOG(VIDEO, "Failed to compile post-processing shader %s", m_config.GetShader().c_str());
- Config::SetCurrent(Config::GFX_ENHANCE_POST_SHADER, "");
- code = m_config.LoadShader();
- ProgramShaderCache::CompileShader(m_shader, s_vertex_shader, code);
- }
-
- // read uniform locations
- 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");
-
- for (const auto& it : m_config.GetOptions())
- {
- std::string glsl_name = "options." + it.first;
- m_uniform_bindings[it.first] = glGetUniformLocation(m_shader.glprogid, glsl_name.c_str());
- }
- m_initialized = true;
-}
-
-void OpenGLPostProcessing::CreateHeader()
-{
- m_glsl_header =
- // Required variables
- // Shouldn't be accessed directly by the PP shader
- // Texture sampler
- "SAMPLER_BINDING(8) uniform sampler2D samp8;\n"
- "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
-
- // Output variable
- "out float4 ocol0;\n"
- // Input coordinates
- "in float2 uv0;\n"
- // Resolution
- "uniform float4 resolution;\n"
- // Time
- "uniform uint time;\n"
- // Layer
- "uniform int layer;\n"
-
- // Interfacing functions
- "float4 Sample()\n"
- "{\n"
- "\treturn texture(samp9, float3(uv0, layer));\n"
- "}\n"
-
- "float4 SampleLocation(float2 location)\n"
- "{\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, float3(uv0, layer), offset)\n"
-
- "float2 GetResolution()\n"
- "{\n"
- "\treturn resolution.xy;\n"
- "}\n"
-
- "float2 GetInvResolution()\n"
- "{\n"
- "\treturn resolution.zw;\n"
- "}\n"
-
- "float2 GetCoordinates()\n"
- "{\n"
- "\treturn uv0;\n"
- "}\n"
-
- "uint GetTime()\n"
- "{\n"
- "\treturn time;\n"
- "}\n"
-
- "void SetOutput(float4 color)\n"
- "{\n"
- "\tocol0 = color;\n"
- "}\n"
-
- "#define GetOption(x) (options.x)\n"
- "#define OptionEnabled(x) (options.x != 0)\n";
-}
-
-std::string OpenGLPostProcessing::LoadShaderOptions()
-{
- m_uniform_bindings.clear();
- if (m_config.GetOptions().empty())
- return "";
-
- std::string glsl_options = "struct Options\n{\n";
-
- for (const auto& it : m_config.GetOptions())
- {
- if (it.second.m_type ==
- PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_BOOL)
- {
- glsl_options += StringFromFormat("int %s;\n", it.first.c_str());
- }
- else if (it.second.m_type ==
- PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_INTEGER)
- {
- u32 count = static_cast<u32>(it.second.m_integer_values.size());
- if (count == 1)
- glsl_options += StringFromFormat("int %s;\n", it.first.c_str());
- else
- glsl_options += StringFromFormat("int%d %s;\n", count, it.first.c_str());
- }
- else if (it.second.m_type ==
- PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_FLOAT)
- {
- u32 count = static_cast<u32>(it.second.m_float_values.size());
- if (count == 1)
- glsl_options += StringFromFormat("float %s;\n", it.first.c_str());
- else
- glsl_options += StringFromFormat("float%d %s;\n", count, it.first.c_str());
- }
-
- m_uniform_bindings[it.first] = 0;
- }
-
- glsl_options += "};\n";
- glsl_options += "uniform Options options;\n";
-
- return glsl_options;
-}
-
-} // namespace OGL