summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authoriwubcode <iwubcode@users.noreply.github.com>2023-05-28 20:59:02 -0500
committeriwubcode <iwubcode@users.noreply.github.com>2023-06-03 14:52:31 -0500
commit834f8f7b5cb9b5d9e437c7a3935bfdcc236c422a (patch)
tree429b751c40a96b44a920cc9f59afb3813320a1e0 /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
parent252d3f353aa74b06a1c67daa65eb60f786608a6a (diff)
VideoBackends: add support to allow rendering to multiple output textures
Diffstat (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp70
1 files changed, 48 insertions, 22 deletions
diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
index a149c9fad0..8c56a40e8c 100644
--- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
+++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
@@ -126,6 +126,10 @@ void SHADER::SetProgramVariables()
void SHADER::SetProgramBindings(bool is_compute)
{
+ if (g_ogl_config.bSupportsExplicitLayoutInShader)
+ {
+ return;
+ }
if (!is_compute)
{
if (g_ActiveConfig.backend_info.bSupportsDualSourceBlend)
@@ -729,6 +733,49 @@ void ProgramShaderCache::CreateHeader()
v >= GlslEs320 ||
g_ogl_config.SupportedMultisampleTexStorage != MultisampleTexStorageType::TexStorageNone;
+ std::string binding_layout;
+ if (g_ActiveConfig.backend_info.bSupportsBindingLayout)
+ {
+ if (g_ogl_config.bSupportsExplicitLayoutInShader)
+ {
+ binding_layout =
+ "#extension GL_ARB_explicit_attrib_location : enable\n"
+ "#define ATTRIBUTE_LOCATION(x) layout(location = x)\n"
+ "#define FRAGMENT_OUTPUT_LOCATION(x) layout(location = x)\n"
+ "#define FRAGMENT_OUTPUT_LOCATION_INDEXED(x, y) layout(location = x, index = y)\n"
+ "#define UBO_BINDING(packing, x) layout(packing, binding = x)\n"
+ "#define SAMPLER_BINDING(x) layout(binding = x)\n"
+ "#define TEXEL_BUFFER_BINDING(x) layout(binding = x)\n"
+ "#define SSBO_BINDING(x) layout(std430, binding = x)\n"
+ "#define IMAGE_BINDING(format, x) layout(format, binding = x)\n";
+ }
+ else
+ {
+ binding_layout = "#define ATTRIBUTE_LOCATION(x)\n"
+ "#define FRAGMENT_OUTPUT_LOCATION(x)\n"
+ "#define FRAGMENT_OUTPUT_LOCATION_INDEXED(x, y)\n"
+ "#define UBO_BINDING(packing, x) layout(packing, binding = x)\n"
+ "#define SAMPLER_BINDING(x) layout(binding = x)\n"
+ "#define TEXEL_BUFFER_BINDING(x) layout(binding = x)\n"
+ "#define SSBO_BINDING(x) layout(std430, binding = x)\n"
+ "#define IMAGE_BINDING(format, x) layout(format, binding = x)\n";
+ }
+ }
+ else
+ {
+ binding_layout = "#define ATTRIBUTE_LOCATION(x)\n"
+ "#define FRAGMENT_OUTPUT_LOCATION(x)\n"
+ "#define FRAGMENT_OUTPUT_LOCATION_INDEXED(x, y)\n"
+ "#define UBO_BINDING(packing, x) layout(packing)\n"
+ "#define SAMPLER_BINDING(x)\n"
+ "#define TEXEL_BUFFER_BINDING(x)\n"
+ "#define SSBO_BINDING(x) layout(std430)\n"
+ "#define IMAGE_BINDING(format, x) layout(format)\n";
+ }
+
+ // TODO: actually define this if using 'bSupportsExplicitLayoutInShader'
+ const std::string varying_location = "#define VARYING_LOCATION(x)\n";
+
std::string shader_shuffle_string;
if (g_ogl_config.bSupportsKHRShaderSubgroup)
{
@@ -799,28 +846,7 @@ void ProgramShaderCache::CreateHeader()
(g_ogl_config.bSupportsMSAA && v < Glsl150) ?
"#extension GL_ARB_texture_multisample : enable" :
"",
- // Attribute and fragment output bindings are still done via glBindAttribLocation and
- // glBindFragDataLocation. In the future this could be moved to the layout qualifier
- // in GLSL, but requires verification of GL_ARB_explicit_attrib_location.
- g_ActiveConfig.backend_info.bSupportsBindingLayout ?
- "#define ATTRIBUTE_LOCATION(x)\n"
- "#define FRAGMENT_OUTPUT_LOCATION(x)\n"
- "#define FRAGMENT_OUTPUT_LOCATION_INDEXED(x, y)\n"
- "#define UBO_BINDING(packing, x) layout(packing, binding = x)\n"
- "#define SAMPLER_BINDING(x) layout(binding = x)\n"
- "#define TEXEL_BUFFER_BINDING(x) layout(binding = x)\n"
- "#define SSBO_BINDING(x) layout(std430, binding = x)\n"
- "#define IMAGE_BINDING(format, x) layout(format, binding = x)\n" :
- "#define ATTRIBUTE_LOCATION(x)\n"
- "#define FRAGMENT_OUTPUT_LOCATION(x)\n"
- "#define FRAGMENT_OUTPUT_LOCATION_INDEXED(x, y)\n"
- "#define UBO_BINDING(packing, x) layout(packing)\n"
- "#define SAMPLER_BINDING(x)\n"
- "#define TEXEL_BUFFER_BINDING(x)\n"
- "#define SSBO_BINDING(x) layout(std430)\n"
- "#define IMAGE_BINDING(format, x) layout(format)\n",
- // Input/output blocks are matched by name during program linking
- "#define VARYING_LOCATION(x)\n",
+ binding_layout.c_str(), varying_location.c_str(),
!is_glsles && g_ActiveConfig.backend_info.bSupportsFragmentStoresAndAtomics ?
"#extension GL_ARB_shader_storage_buffer_object : enable" :
"",