Răsfoiți Sursa

spirv/convert: Catch more broken signed operations on Nvidia OpenGL

BitCast U32 to S32 before converting to float on drivers with broken
signed operations.
ReinUsesLisp 5 ani în urmă
părinte
comite
8554a644df
1 a modificat fișierele cu 6 adăugiri și 0 ștergeri
  1. 6 0
      src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp

+ 6 - 0
src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp

@@ -205,6 +205,9 @@ Id EmitConvertF32S16(EmitContext& ctx, Id value) {
 }
 }
 
 
 Id EmitConvertF32S32(EmitContext& ctx, Id value) {
 Id EmitConvertF32S32(EmitContext& ctx, Id value) {
+    if (ctx.profile.has_broken_signed_operations) {
+        value = ctx.OpBitcast(ctx.S32[1], value);
+    }
     return ctx.OpConvertSToF(ctx.F32[1], value);
     return ctx.OpConvertSToF(ctx.F32[1], value);
 }
 }
 
 
@@ -237,6 +240,9 @@ Id EmitConvertF64S16(EmitContext& ctx, Id value) {
 }
 }
 
 
 Id EmitConvertF64S32(EmitContext& ctx, Id value) {
 Id EmitConvertF64S32(EmitContext& ctx, Id value) {
+    if (ctx.profile.has_broken_signed_operations) {
+        value = ctx.OpBitcast(ctx.S32[1], value);
+    }
     return ctx.OpConvertSToF(ctx.F64[1], value);
     return ctx.OpConvertSToF(ctx.F64[1], value);
 }
 }