glsl: Conditionally use fine/coarse derivatives based on device support
This commit is contained in:
		| @@ -395,6 +395,9 @@ void EmitContext::SetupExtensions() { | |||||||
|     if (info.uses_typeless_image_reads || info.uses_typeless_image_writes) { |     if (info.uses_typeless_image_reads || info.uses_typeless_image_writes) { | ||||||
|         header += "#extension GL_EXT_shader_image_load_formatted : enable\n"; |         header += "#extension GL_EXT_shader_image_load_formatted : enable\n"; | ||||||
|     } |     } | ||||||
|  |     if (info.uses_derivatives && profile.support_gl_derivative_control) { | ||||||
|  |         header += "#extension GL_ARB_derivative_control : enable\n"; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitContext::DefineConstantBuffers(Bindings& bindings) { | void EmitContext::DefineConstantBuffers(Bindings& bindings) { | ||||||
|   | |||||||
| @@ -180,18 +180,38 @@ void EmitFSwizzleAdd(EmitContext& ctx, IR::Inst& inst, std::string_view op_a, st | |||||||
| } | } | ||||||
|  |  | ||||||
| void EmitDPdxFine(EmitContext& ctx, IR::Inst& inst, std::string_view op_a) { | void EmitDPdxFine(EmitContext& ctx, IR::Inst& inst, std::string_view op_a) { | ||||||
|  |     if (ctx.profile.support_gl_derivative_control) { | ||||||
|         ctx.AddF32("{}=dFdxFine({});", inst, op_a); |         ctx.AddF32("{}=dFdxFine({});", inst, op_a); | ||||||
|  |     } else { | ||||||
|  |         LOG_WARNING(Shader_GLSL, "Device does not support dFdxFine, fallback to dFdx"); | ||||||
|  |         ctx.AddF32("{}=dFdx({});", inst, op_a); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitDPdyFine(EmitContext& ctx, IR::Inst& inst, std::string_view op_a) { | void EmitDPdyFine(EmitContext& ctx, IR::Inst& inst, std::string_view op_a) { | ||||||
|  |     if (ctx.profile.support_gl_derivative_control) { | ||||||
|         ctx.AddF32("{}=dFdyFine({});", inst, op_a); |         ctx.AddF32("{}=dFdyFine({});", inst, op_a); | ||||||
|  |     } else { | ||||||
|  |         LOG_WARNING(Shader_GLSL, "Device does not support dFdyFine, fallback to dFdy"); | ||||||
|  |         ctx.AddF32("{}=dFdy({});", inst, op_a); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitDPdxCoarse(EmitContext& ctx, IR::Inst& inst, std::string_view op_a) { | void EmitDPdxCoarse(EmitContext& ctx, IR::Inst& inst, std::string_view op_a) { | ||||||
|  |     if (ctx.profile.support_gl_derivative_control) { | ||||||
|         ctx.AddF32("{}=dFdxCoarse({});", inst, op_a); |         ctx.AddF32("{}=dFdxCoarse({});", inst, op_a); | ||||||
|  |     } else { | ||||||
|  |         LOG_WARNING(Shader_GLSL, "Device does not support dFdxCoarse, fallback to dFdx"); | ||||||
|  |         ctx.AddF32("{}=dFdx({});", inst, op_a); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitDPdyCoarse(EmitContext& ctx, IR::Inst& inst, std::string_view op_a) { | void EmitDPdyCoarse(EmitContext& ctx, IR::Inst& inst, std::string_view op_a) { | ||||||
|  |     if (ctx.profile.support_gl_derivative_control) { | ||||||
|         ctx.AddF32("{}=dFdyCoarse({});", inst, op_a); |         ctx.AddF32("{}=dFdyCoarse({});", inst, op_a); | ||||||
|  |     } else { | ||||||
|  |         LOG_WARNING(Shader_GLSL, "Device does not support dFdyCoarse, fallback to dFdy"); | ||||||
|  |         ctx.AddF32("{}=dFdy({});", inst, op_a); | ||||||
|  |     } | ||||||
| } | } | ||||||
| } // namespace Shader::Backend::GLSL | } // namespace Shader::Backend::GLSL | ||||||
|   | |||||||
| @@ -89,6 +89,7 @@ struct Profile { | |||||||
|     bool support_gl_warp_intrinsics{}; |     bool support_gl_warp_intrinsics{}; | ||||||
|     bool support_gl_variable_aoffi{}; |     bool support_gl_variable_aoffi{}; | ||||||
|     bool support_gl_sparse_textures{}; |     bool support_gl_sparse_textures{}; | ||||||
|  |     bool support_gl_derivative_control{}; | ||||||
|  |  | ||||||
|     bool warp_size_potentially_larger_than_guest{}; |     bool warp_size_potentially_larger_than_guest{}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -187,6 +187,7 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo | |||||||
|           .support_gl_warp_intrinsics = false, |           .support_gl_warp_intrinsics = false, | ||||||
|           .support_gl_variable_aoffi = device.HasVariableAoffi(), |           .support_gl_variable_aoffi = device.HasVariableAoffi(), | ||||||
|           .support_gl_sparse_textures = device.HasSparseTexture2(), |           .support_gl_sparse_textures = device.HasSparseTexture2(), | ||||||
|  |           .support_gl_derivative_control = device.HasDerivativeControl(), | ||||||
|  |  | ||||||
|           .warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyLargerThanGuest(), |           .warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyLargerThanGuest(), | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user