video_core: Fix fragment shader interlock usage on OpenGL. (#7144)
This commit is contained in:
parent
13d02c14e0
commit
d4f31bc617
8 changed files with 69 additions and 14 deletions
|
@ -181,6 +181,9 @@ void Driver::CheckExtensionSupport() {
|
|||
ext_texture_compression_s3tc = GLAD_GL_EXT_texture_compression_s3tc;
|
||||
ext_shader_framebuffer_fetch = GLAD_GL_EXT_shader_framebuffer_fetch;
|
||||
arm_shader_framebuffer_fetch = GLAD_GL_ARM_shader_framebuffer_fetch;
|
||||
arb_fragment_shader_interlock = GLAD_GL_ARB_fragment_shader_interlock;
|
||||
nv_fragment_shader_interlock = GLAD_GL_NV_fragment_shader_interlock;
|
||||
intel_fragment_shader_ordering = GLAD_GL_INTEL_fragment_shader_ordering;
|
||||
blend_minmax_factor = GLAD_GL_AMD_blend_minmax_factor || GLAD_GL_NV_blend_minmax_factor;
|
||||
is_suitable = GLAD_GL_VERSION_4_3 || GLAD_GL_ES_VERSION_3_1;
|
||||
}
|
||||
|
|
|
@ -118,6 +118,18 @@ public:
|
|||
return arm_shader_framebuffer_fetch;
|
||||
}
|
||||
|
||||
bool HasArbFragmentShaderInterlock() const {
|
||||
return arb_fragment_shader_interlock;
|
||||
}
|
||||
|
||||
bool HasNvFragmentShaderInterlock() const {
|
||||
return nv_fragment_shader_interlock;
|
||||
}
|
||||
|
||||
bool HasIntelFragmentShaderOrdering() const {
|
||||
return intel_fragment_shader_ordering;
|
||||
}
|
||||
|
||||
/// Returns true if the implementation supports (NV/AMD)_blend_minmax_factor
|
||||
bool HasBlendMinMaxFactor() const {
|
||||
return blend_minmax_factor;
|
||||
|
@ -146,6 +158,9 @@ private:
|
|||
bool arb_texture_compression_bptc{};
|
||||
bool arm_shader_framebuffer_fetch{};
|
||||
bool ext_shader_framebuffer_fetch{};
|
||||
bool arb_fragment_shader_interlock{};
|
||||
bool nv_fragment_shader_interlock{};
|
||||
bool intel_fragment_shader_ordering{};
|
||||
bool blend_minmax_factor{};
|
||||
|
||||
std::string_view gl_version{};
|
||||
|
|
|
@ -269,15 +269,16 @@ public:
|
|||
.has_clip_planes = driver.HasClipCullDistance(),
|
||||
.has_geometry_shader = true,
|
||||
.has_custom_border_color = true,
|
||||
.has_fragment_shader_interlock = false,
|
||||
.has_fragment_shader_interlock = driver.HasArbFragmentShaderInterlock(),
|
||||
// TODO: This extension requires GLSL 450 / OpenGL 4.5 context.
|
||||
.has_fragment_shader_barycentric = false,
|
||||
.has_blend_minmax_factor = driver.HasBlendMinMaxFactor(),
|
||||
.has_minus_one_to_one_range = true,
|
||||
.has_logic_op = !driver.IsOpenGLES(),
|
||||
.has_gl_ext_framebuffer_fetch = driver.HasExtFramebufferFetch(),
|
||||
.has_gl_arm_framebuffer_fetch = driver.HasArmShaderFramebufferFetch(),
|
||||
.has_gl_nv_fragment_shader_interlock = driver.GetVendor() == Vendor::Nvidia,
|
||||
.has_gl_intel_fragment_shader_interlock = driver.GetVendor() == Vendor::Intel,
|
||||
.has_gl_nv_fragment_shader_interlock = driver.HasNvFragmentShaderInterlock(),
|
||||
.has_gl_intel_fragment_shader_ordering = driver.HasIntelFragmentShaderOrdering(),
|
||||
// TODO: This extension requires GLSL 450 / OpenGL 4.5 context.
|
||||
.has_gl_nv_fragment_shader_barycentric = false,
|
||||
.is_vulkan = false,
|
||||
|
|
|
@ -1234,10 +1234,11 @@ void FragmentModule::DefineExtensions() {
|
|||
out += "#extension GL_NV_fragment_shader_interlock : enable\n";
|
||||
out += "#define beginInvocationInterlock beginInvocationInterlockNV\n";
|
||||
out += "#define endInvocationInterlock endInvocationInterlockNV\n";
|
||||
} else if (profile.has_gl_intel_fragment_shader_interlock) {
|
||||
} else if (profile.has_gl_intel_fragment_shader_ordering) {
|
||||
// NOTE: Intel does not have an end function for this.
|
||||
out += "#extension GL_INTEL_fragment_shader_ordering : enable\n";
|
||||
out += "#define beginInvocationInterlock beginFragmentShaderOrderingINTEL\n";
|
||||
out += "#define endInvocationInterlock\n";
|
||||
out += "#define endInvocationInterlock()\n";
|
||||
} else {
|
||||
use_fragment_shader_interlock = false;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ struct Profile {
|
|||
bool has_gl_ext_framebuffer_fetch{};
|
||||
bool has_gl_arm_framebuffer_fetch{};
|
||||
bool has_gl_nv_fragment_shader_interlock{};
|
||||
bool has_gl_intel_fragment_shader_interlock{};
|
||||
bool has_gl_intel_fragment_shader_ordering{};
|
||||
bool has_gl_nv_fragment_shader_barycentric{};
|
||||
bool is_vulkan{};
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue