|
|
|
@ -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);
|
|
|
|
|