From a505a89666aa5b9bcce0196d71f2698c23b70490 Mon Sep 17 00:00:00 2001 From: Pavel <68122101+red-prig@users.noreply.github.com> Date: Thu, 2 Jun 2022 14:39:14 +0300 Subject: [PATCH] fix green colors on NVIDIA 30XX --- spirv/SprvEmit.pas | 1 + spirv/emit_exp.pas | 34 +++++++++++++++++++++++++++++++--- spirv/pssl-spirv.lpr | 11 +++++++++-- vulkan/vShaderManager.pas | 1 + 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/spirv/SprvEmit.pas b/spirv/SprvEmit.pas index 5d10155..a58615e 100644 --- a/spirv/SprvEmit.pas +++ b/spirv/SprvEmit.pas @@ -86,6 +86,7 @@ type FPrintAsm:Boolean; FUseVertexInput:Boolean; FUseTexelBuffer:Boolean; + FUseOutput16:Boolean; function Alloc(Size:ptruint):Pointer; diff --git a/spirv/emit_exp.pas b/spirv/emit_exp.pas index d4c14a1..ff1e96b 100644 --- a/spirv/emit_exp.pas +++ b/spirv/emit_exp.pas @@ -6,6 +6,7 @@ interface uses sysutils, + spirv, ps4_pssl, srNodes, srLabel, @@ -34,6 +35,7 @@ Var dout:PsrVariable; dst:PsrRegNode; src:array[0..3] of PsrRegNode; + rsl:array[0..3] of PsrRegNode; rtype:TsrDataType; f,i,p:Byte; @@ -150,10 +152,36 @@ begin Assert(false); end; - dst:=emit_OpMakeVec(line,dtVec4h,4,@src); - dst^.mark_read; + if FUseOutput16 then + begin + dst:=emit_OpMakeVec(line,dtVec4h,4,@src); + dst^.mark_read; - dout:=FetchOutput(TpsslExportType(FSPI.EXP.TGT),dtVec4h); //output in FSPI.EXP.TGT + rtype:=dtVec4h; + end else + begin + rsl[0]:=NewReg(dtFloat32); + rsl[1]:=NewReg(dtFloat32); + rsl[2]:=NewReg(dtFloat32); + rsl[3]:=NewReg(dtFloat32); + + _emit_Op1(line,Op.OpFConvert,rsl[0],src[0]); + _emit_Op1(line,Op.OpFConvert,rsl[1],src[1]); + _emit_Op1(line,Op.OpFConvert,rsl[2],src[2]); + _emit_Op1(line,Op.OpFConvert,rsl[3],src[3]); + + rsl[0]^.mark_read; + rsl[1]^.mark_read; + rsl[2]^.mark_read; + rsl[3]^.mark_read; + + dst:=emit_OpMakeVec(line,dtVec4f,4,@rsl); + dst^.mark_read; + + rtype:=dtVec4f; + end; + + dout:=FetchOutput(TpsslExportType(FSPI.EXP.TGT),rtype); //output in FSPI.EXP.TGT emit_OpStore(line,dout,dst); end; diff --git a/spirv/pssl-spirv.lpr b/spirv/pssl-spirv.lpr index 5b9e68b..c1ab71d 100644 --- a/spirv/pssl-spirv.lpr +++ b/spirv/pssl-spirv.lpr @@ -25,6 +25,7 @@ var FPrintSpv:Boolean; FUseVertexInput:Boolean; FUseTexelBuffer:Boolean; + FUseOutput16:Boolean; BufferCfg:TsrBufferCfg; end; @@ -446,6 +447,7 @@ begin SprvEmit.FPrintAsm :=cfg.FPrintAsm; SprvEmit.FUseVertexInput:=cfg.FUseVertexInput; SprvEmit.FUseTexelBuffer:=cfg.FUseTexelBuffer; + SprvEmit.FUseOutput16 :=cfg.FUseOutput16; SprvEmit.FBuffers.cfg:=cfg.BufferCfg; @@ -500,11 +502,16 @@ begin '-i':cfg.FPrintInfo:=True; '-a':cfg.FPrintAsm:=True; '-p':cfg.FPrintSpv:=True; + '-eva':cfg.FUseVertexInput:=True; '-dva':cfg.FUseVertexInput:=False; + '-etb':cfg.FUseTexelBuffer:=True; '-dtb':cfg.FUseTexelBuffer:=False; + '-eoh':cfg.FUseOutput16:=True; + '-doh':cfg.FUseOutput16:=False; + '-b':n:=0; '-mubo':n:=1;//maxUniformBufferRange @@ -593,7 +600,7 @@ begin //load_dump('shader_dump\simplet-simple-fs_debug\simplet-simple-fs_debug_ps_F327ABD1.dump'); //load_dump('shader_dump\simplet-single-triangle_debug\simplet-single-triangle_debug_vs_78EF9008.dump'); - //load_dump('shader_dump\simplet-single-triangle_debug\simplet-single-triangle_debug_ps_FBCA196D.dump'); + load_dump('shader_dump\simplet-single-triangle_debug\simplet-single-triangle_debug_ps_FBCA196D.dump'); //load_dump('shader_dump\basic_quad_debug\basic_quad_debug_ps_C342C7CD.dump'); //load_dump('shader_dump\basic_quad_debug\basic_quad_debug_vs_D216FEB8.dump'); @@ -613,7 +620,7 @@ begin //load_dump('shader_dump\SonicMania\SonicMania_ps_B4281DBF.dump'); - load_dump('shader_dump\SonicMania\SonicMania_ps_11DF2A32.dump'); + //load_dump('shader_dump\SonicMania\SonicMania_ps_11DF2A32.dump'); //load_dump('shader_dump\SonicMania\SonicMania_ps_3CC22A00.dump'); //cfg end; diff --git a/vulkan/vShaderManager.pas b/vulkan/vShaderManager.pas index fbafde1..65476d2 100644 --- a/vulkan/vShaderManager.pas +++ b/vulkan/vShaderManager.pas @@ -162,6 +162,7 @@ begin SprvEmit.FPrintAsm :=False; SprvEmit.FUseVertexInput:=True; SprvEmit.FUseTexelBuffer:=False; + SprvEmit.FUseOutput16 :=storageInputOutput16; SprvEmit.FBuffers.cfg.maxUniformBufferRange :=0; // $FFFF SprvEmit.FBuffers.cfg.PushConstantsOffset :=0; // 0