mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 22:00:05 +00:00 
			
		
		
		
	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