summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authorJonathan Hamilton <jtrhamilton@gmail.com>2017-10-25 22:44:39 -0700
committerJonathan Hamilton <jtrhamilton@gmail.com>2018-01-05 09:56:46 -0800
commit29a9ed043bd0946497edf7c4d392ce46041b9817 (patch)
tree3104979b668377da1499a3b4afc7ac29c557e3ce /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
parent11976526d11f0475a3af126758260cdd69dd2a35 (diff)
Implement dual-source blending in shader
For some GLES drivers that don't support dual-source blending, but do support GL_EXT_shader_framebuffer_fetch, this might be useful.
Diffstat (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp23
1 files changed, 21 insertions, 2 deletions
diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
index a5133023af..54b5c87100 100644
--- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
+++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
@@ -885,6 +885,24 @@ void ProgramShaderCache::CreateHeader()
}
}
+ std::string framebuffer_fetch_string;
+ switch (g_ogl_config.SupportedFramebufferFetch)
+ {
+ case ES_FB_FETCH_TYPE::FB_FETCH_EXT:
+ framebuffer_fetch_string = "#extension GL_EXT_shader_framebuffer_fetch: enable\n"
+ "#define FB_FETCH_VALUE ocol0\n"
+ "#define FRAGMENT_INOUT inout";
+ break;
+ case ES_FB_FETCH_TYPE::FB_FETCH_ARM:
+ framebuffer_fetch_string = "#extension GL_ARM_shader_framebuffer_fetch: enable\n"
+ "#define FB_FETCH_VALUE gl_LastFragColorARM\n"
+ "#define FRAGMENT_INOUT out";
+ break;
+ case ES_FB_FETCH_TYPE::FB_FETCH_NONE:
+ framebuffer_fetch_string = "";
+ break;
+ }
+
s_glsl_header = StringFromFormat(
"%s\n"
"%s\n" // ubo
@@ -902,6 +920,7 @@ void ProgramShaderCache::CreateHeader()
"%s\n" // ES texture buffer
"%s\n" // ES dual source blend
"%s\n" // shader image load store
+ "%s\n" // shader framebuffer fetch
// Precision defines for GLSL ES
"%s\n"
@@ -976,8 +995,8 @@ void ProgramShaderCache::CreateHeader()
((!is_glsles && v < GLSL_430) || (is_glsles && v < GLSLES_310)) ?
"#extension GL_ARB_shader_image_load_store : enable" :
"",
- is_glsles ? "precision highp float;" : "", is_glsles ? "precision highp int;" : "",
- is_glsles ? "precision highp sampler2DArray;" : "",
+ framebuffer_fetch_string.c_str(), is_glsles ? "precision highp float;" : "",
+ is_glsles ? "precision highp int;" : "", is_glsles ? "precision highp sampler2DArray;" : "",
(is_glsles && g_ActiveConfig.backend_info.bSupportsPaletteConversion) ?
"precision highp usamplerBuffer;" :
"",