diff --git a/chip/ps4_shader.pas b/chip/ps4_shader.pas index 9e1c5924..f40f7a62 100644 --- a/chip/ps4_shader.pas +++ b/chip/ps4_shader.pas @@ -252,7 +252,8 @@ type PTSharpResource4=^TTSharpResource4; TTSharpResource4=bitpacked record - base:bit38; + base:bit32; + unused:bit6; mtype_L2:bit2; min_lod:bit12; //fixed point 4.8 minimum LOD (0.0..15.0) dfmt:bit6; //texture data format; num components, num bits @@ -930,7 +931,7 @@ end; procedure print_tsharp4(PT:PTSharpResource4); begin if (PT=nil) then Exit; - Writeln('base=',HexStr(PT^.base shl 8,10)); + Writeln('base=',HexStr(QWORD(PT^.base) shl 8,10)); Writeln('min_lod=',_get_lod_str(PT^.min_lod)); Writeln('dfmt=',_get_tex_dfmt_str(PT^.dfmt)); diff --git a/spirv/emit_vop3.pas b/spirv/emit_vop3.pas index ac7c4985..db964829 100644 --- a/spirv/emit_vop3.pas +++ b/spirv/emit_vop3.pas @@ -38,7 +38,8 @@ type procedure emit_V2_F32(OpId:DWORD); procedure emit_V2_REV_F32(OpId:DWORD); procedure emit_V_CVT_PKRTZ_F16_F32; - procedure emit_V_MMX_F32(OpId:DWORD); + procedure emit_V_MMX(OpId:DWORD;rtype:TsrDataType); + procedure emit_V_MMX3(OpId:DWORD;rtype:TsrDataType); procedure emit_V_SH_NRM(OpId:DWORD;rtype:TsrDataType); procedure emit_V_SH_REV(OpId:DWORD;rtype:TsrDataType); procedure emit_V_MUL_LO(rtype:TsrDataType); @@ -60,8 +61,6 @@ type procedure emit_V_MAD_U32_U24; procedure emit_V_MAD_U64_U32; procedure emit_V_SAD_U32; - procedure emit_V_MAX3_F32; - procedure emit_V_MIN3_F32; procedure emit_V_MED3_F32; procedure emit_V_MED3_I32; procedure emit_V_MED3_U32; @@ -329,7 +328,7 @@ begin OpConvFloatToHalf2(dst,src[0],src[1]); end; -procedure TEmit_VOP3.emit_V_MMX_F32(OpId:DWORD); +procedure TEmit_VOP3.emit_V_MMX(OpId:DWORD;rtype:TsrDataType); Var dst:PsrRegSlot; src:array[0..1] of TsrRegNode; @@ -339,15 +338,53 @@ begin src[0]:=fetch_ssrc9(FSPI.VOP3a.SRC0,dtFloat32); src[1]:=fetch_ssrc9(FSPI.VOP3a.SRC1,dtFloat32); - emit_src_abs_bit(@src,2); - emit_src_neg_bit(@src,2); + if rtype.isFloat then + begin + emit_src_abs_bit(@src,2); + emit_src_neg_bit(@src,2); + end; - OpGlsl2(OpId,dtFloat32,dst,src[0],src[1]); + OpGlsl2(OpId,rtype,dst,src[0],src[1]); - emit_dst_omod_f(dst); - emit_dst_clamp_f(dst); + if rtype.isFloat then + begin + emit_dst_omod_f(dst); + emit_dst_clamp_f(dst); + end; end; +procedure TEmit_VOP3.emit_V_MMX3(OpId:DWORD;rtype:TsrDataType); +Var + dst:PsrRegSlot; + src:array[0..2] of TsrRegNode; + mid:TsrRegNode; +begin + dst:=get_vdst8(FSPI.VOP3a.VDST); + + src[0]:=fetch_ssrc9(FSPI.VOP3a.SRC0,dtFloat32); + src[1]:=fetch_ssrc9(FSPI.VOP3a.SRC1,dtFloat32); + src[2]:=fetch_ssrc9(FSPI.VOP3a.SRC2,dtFloat32); + + if rtype.isFloat then + begin + emit_src_abs_bit(@src,3); + emit_src_neg_bit(@src,3); + end; + + OpGlsl2(OpId,rtype,dst,src[0],src[1]); + + mid:=MakeRead(dst,rtype); + + OpGlsl2(OpId,rtype,dst,mid,src[2]); + + if rtype.isFloat then + begin + emit_dst_omod_f(dst); + emit_dst_clamp_f(dst); + end; +end; + + procedure TEmit_VOP3.emit_V_SH_NRM(OpId:DWORD;rtype:TsrDataType); Var dst:PsrRegSlot; @@ -864,46 +901,6 @@ begin OpIAdd(dst,rdif,rvac); end; -procedure TEmit_VOP3.emit_V_MAX3_F32; -Var - dst:PsrRegSlot; - src:array[0..2] of TsrRegNode; -begin - dst:=get_vdst8(FSPI.VOP3a.VDST); - - src[0]:=fetch_ssrc9(FSPI.VOP3a.SRC0,dtFloat32); - src[1]:=fetch_ssrc9(FSPI.VOP3a.SRC1,dtFloat32); - src[2]:=fetch_ssrc9(FSPI.VOP3a.SRC2,dtFloat32); - - emit_src_abs_bit(@src,3); - emit_src_neg_bit(@src,3); - - OpGlsl2(GlslOp.FMax,dtFloat32,dst,OpFMaxTo(src[0],src[1]),src[2]); - - emit_dst_omod_f(dst); - emit_dst_clamp_f(dst); -end; - -procedure TEmit_VOP3.emit_V_MIN3_F32; -Var - dst:PsrRegSlot; - src:array[0..2] of TsrRegNode; -begin - dst:=get_vdst8(FSPI.VOP3a.VDST); - - src[0]:=fetch_ssrc9(FSPI.VOP3a.SRC0,dtFloat32); - src[1]:=fetch_ssrc9(FSPI.VOP3a.SRC1,dtFloat32); - src[2]:=fetch_ssrc9(FSPI.VOP3a.SRC2,dtFloat32); - - emit_src_abs_bit(@src,3); - emit_src_neg_bit(@src,3); - - OpGlsl2(GlslOp.FMin,dtFloat32,dst,OpFMinTo(src[0],src[1]),src[2]); - - emit_dst_omod_f(dst); - emit_dst_clamp_f(dst); -end; - procedure TEmit_VOP3.emit_V_MED3_F32; Var dst:PsrRegSlot; @@ -1417,11 +1414,17 @@ begin 256+V_CVT_PKRTZ_F16_F32: emit_V_CVT_PKRTZ_F16_F32; - 256+V_MIN_LEGACY_F32:emit_V_MMX_F32(GlslOp.NMin); - 256+V_MAX_LEGACY_F32:emit_V_MMX_F32(GlslOp.NMax); + 256+V_MIN_LEGACY_F32:emit_V_MMX(GlslOp.NMin,dtFloat32); + 256+V_MAX_LEGACY_F32:emit_V_MMX(GlslOp.NMax,dtFloat32); - 256+V_MIN_F32:emit_V_MMX_F32(GlslOp.FMin); - 256+V_MAX_F32:emit_V_MMX_F32(GlslOp.FMax); + 256+V_MIN_F32:emit_V_MMX(GlslOp.FMin,dtFloat32); + 256+V_MAX_F32:emit_V_MMX(GlslOp.FMax,dtFloat32); + + 256+V_MIN_I32:emit_V_MMX(GlslOp.SMin,dtInt32); + 256+V_MAX_I32:emit_V_MMX(GlslOp.SMax,dtInt32); + + 256+V_MIN_U32:emit_V_MMX(GlslOp.UMin,dtUint32); + 256+V_MAX_U32:emit_V_MMX(GlslOp.UMax,dtUint32); 256+V_MUL_LEGACY_F32: emit_V_MUL_LEGACY_F32; @@ -1459,8 +1462,16 @@ begin V_MAD_U64_U32: emit_V_MAD_U64_U32; V_SAD_U32 : emit_V_SAD_U32; - V_MAX3_F32: emit_V_MAX3_F32; - V_MIN3_F32: emit_V_MIN3_F32; + + V_MIN3_F32: emit_V_MMX3(GlslOp.FMin,dtFloat32); + V_MAX3_F32: emit_V_MMX3(GlslOp.FMax,dtFloat32); + + V_MIN3_I32: emit_V_MMX3(GlslOp.SMin,dtInt32); + V_MAX3_I32: emit_V_MMX3(GlslOp.SMax,dtInt32); + + V_MIN3_U32: emit_V_MMX3(GlslOp.UMin,dtUint32); + V_MAX3_U32: emit_V_MMX3(GlslOp.UMax,dtUint32); + V_MED3_F32: emit_V_MED3_F32; V_MED3_I32: emit_V_MED3_I32; V_MED3_U32: emit_V_MED3_U32; diff --git a/spirv/srLayout.pas b/spirv/srLayout.pas index bc998d18..b27c6b4e 100644 --- a/spirv/srLayout.pas +++ b/spirv/srLayout.pas @@ -506,7 +506,7 @@ begin rtFunPtr2:Result:=pData; rtVSharp4:Result:={%H-}Pointer(PVSharpResource4(pData)^.base); rtTSharp4, - rtTSharp8:Result:={%H-}Pointer(PTSharpResource4(pData)^.base shl 8); + rtTSharp8:Result:={%H-}Pointer(QWORD(PTSharpResource4(pData)^.base) shl 8); rtImmData:Result:=TsrDataImm(pData).key.pData; else; end; diff --git a/vulkan/vRegs2Vulkan.pas b/vulkan/vRegs2Vulkan.pas index 30d3e90a..fd1c02da 100644 --- a/vulkan/vRegs2Vulkan.pas +++ b/vulkan/vRegs2Vulkan.pas @@ -2266,7 +2266,7 @@ begin Result:=Default(TvImageKey); if (PT=nil) then Exit; - Result.Addr:=Pointer(PT^.base shl 8); + Result.Addr:=Pointer(QWORD(PT^.base) shl 8); Result.cformat:=_get_tsharp4_cformat(PT,hint); if (Result.cformat=VK_FORMAT_UNDEFINED) then diff --git a/vulkan/vShaderExt.pas b/vulkan/vShaderExt.pas index 3afe1ae9..7ce73ea2 100644 --- a/vulkan/vShaderExt.pas +++ b/vulkan/vShaderExt.pas @@ -1021,7 +1021,7 @@ begin Case FPushConst.addr[0].rtype of vtVSharp4:Result:=Pointer(PVSharpResource4(Result)^.base); vtTSharp4, - vtTSharp8:Result:=Pointer(PTSharpResource4(Result)^.base shl 8); + vtTSharp8:Result:=Pointer(QWORD(PTSharpResource4(Result)^.base) shl 8); else; end; @@ -1232,7 +1232,7 @@ begin if (i<>0) then begin - pData:=Pointer(PTSharpResource4(pDmem)^.base shl 8); + pData:=Pointer(QWORD(PTSharpResource4(pDmem)^.base) shl 8); pDmem:=nil; if not get_dmem_ptr(pData,@pDmem,nil) then