|
|
|
@ -319,7 +319,7 @@ void SetupDenormControl(const Profile& profile, const IR::Program& program, Emit |
|
|
|
Id main_func) { |
|
|
|
const Info& info{program.info}; |
|
|
|
if (info.uses_fp32_denorms_flush && info.uses_fp32_denorms_preserve) { |
|
|
|
LOG_WARNING(Shader_SPIRV, "Fp32 denorm flush and preserve on the same shader"); |
|
|
|
LOG_DEBUG(Shader_SPIRV, "Fp32 denorm flush and preserve on the same shader"); |
|
|
|
} else if (info.uses_fp32_denorms_flush) { |
|
|
|
if (profile.support_fp32_denorm_flush) { |
|
|
|
ctx.AddCapability(spv::Capability::DenormFlushToZero); |
|
|
|
@ -332,15 +332,15 @@ void SetupDenormControl(const Profile& profile, const IR::Program& program, Emit |
|
|
|
ctx.AddCapability(spv::Capability::DenormPreserve); |
|
|
|
ctx.AddExecutionMode(main_func, spv::ExecutionMode::DenormPreserve, 32U); |
|
|
|
} else { |
|
|
|
LOG_WARNING(Shader_SPIRV, "Fp32 denorm preserve used in shader without host support"); |
|
|
|
LOG_DEBUG(Shader_SPIRV, "Fp32 denorm preserve used in shader without host support"); |
|
|
|
} |
|
|
|
} |
|
|
|
if (!profile.support_separate_denorm_behavior) { |
|
|
|
if (!profile.support_separate_denorm_behavior || profile.has_broken_fp16_float_controls) { |
|
|
|
// No separate denorm behavior
|
|
|
|
return; |
|
|
|
} |
|
|
|
if (info.uses_fp16_denorms_flush && info.uses_fp16_denorms_preserve) { |
|
|
|
LOG_WARNING(Shader_SPIRV, "Fp16 denorm flush and preserve on the same shader"); |
|
|
|
LOG_DEBUG(Shader_SPIRV, "Fp16 denorm flush and preserve on the same shader"); |
|
|
|
} else if (info.uses_fp16_denorms_flush) { |
|
|
|
if (profile.support_fp16_denorm_flush) { |
|
|
|
ctx.AddCapability(spv::Capability::DenormFlushToZero); |
|
|
|
@ -353,13 +353,16 @@ void SetupDenormControl(const Profile& profile, const IR::Program& program, Emit |
|
|
|
ctx.AddCapability(spv::Capability::DenormPreserve); |
|
|
|
ctx.AddExecutionMode(main_func, spv::ExecutionMode::DenormPreserve, 16U); |
|
|
|
} else { |
|
|
|
LOG_WARNING(Shader_SPIRV, "Fp16 denorm preserve used in shader without host support"); |
|
|
|
LOG_DEBUG(Shader_SPIRV, "Fp16 denorm preserve used in shader without host support"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void SetupSignedNanCapabilities(const Profile& profile, const IR::Program& program, |
|
|
|
EmitContext& ctx, Id main_func) { |
|
|
|
if (profile.has_broken_fp16_float_controls && program.info.uses_fp16) { |
|
|
|
return; |
|
|
|
} |
|
|
|
if (program.info.uses_fp16 && profile.support_fp16_signed_zero_nan_preserve) { |
|
|
|
ctx.AddCapability(spv::Capability::SignedZeroInfNanPreserve); |
|
|
|
ctx.AddExecutionMode(main_func, spv::ExecutionMode::SignedZeroInfNanPreserve, 16U); |
|
|
|
|