glsl: Conditionally use fine/coarse derivatives based on device support
This commit is contained in:
parent
6eea88d614
commit
3b339fbbf6
|
@ -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) {
|
||||||
ctx.AddF32("{}=dFdxFine({});", inst, op_a);
|
if (ctx.profile.support_gl_derivative_control) {
|
||||||
|
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) {
|
||||||
ctx.AddF32("{}=dFdyFine({});", inst, op_a);
|
if (ctx.profile.support_gl_derivative_control) {
|
||||||
|
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) {
|
||||||
ctx.AddF32("{}=dFdxCoarse({});", inst, op_a);
|
if (ctx.profile.support_gl_derivative_control) {
|
||||||
|
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) {
|
||||||
ctx.AddF32("{}=dFdyCoarse({});", inst, op_a);
|
if (ctx.profile.support_gl_derivative_control) {
|
||||||
|
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