This commit is contained in:
red-prig 2021-12-17 16:35:29 +03:00
parent 65e688addb
commit 8518ab70e8
3 changed files with 154 additions and 76 deletions

View File

@ -651,7 +651,7 @@ begin
Result.padded.Height:=(RENDER_TARGET[i].SLICE.TILE_MAX+1)*8 div (RENDER_TARGET[i].PITCH.TILE_MAX+1);
Assert(RENDER_TARGET[i].INFO.ENDIAN=ENDIAN_NONE);
Assert(RENDER_TARGET[i].INFO.COMPRESSION=0);
//Assert(RENDER_TARGET[i].INFO.COMPRESSION=0); //FMASK and MSAA
Case RENDER_TARGET[i].INFO.FORMAT of
COLOR_8_8_8_8:

View File

@ -160,7 +160,8 @@ end;
procedure onEventWrite(pm4Hdr:PM4_TYPE_3_HEADER;Body:PTPM4CMDEVENTWRITE);
begin
Case Body^.eventType of
THREAD_TRACE_MARKER:;
THREAD_TRACE_MARKER,
FLUSH_AND_INV_CB_PIXEL_DATA,
FLUSH_AND_INV_CB_META:
begin
Case Body^.EVENTINDEX of
@ -177,7 +178,7 @@ begin
end;
end;
else
Assert(False);
Assert(False,IntToStr(Body^.eventType));
end;
end;

View File

@ -660,47 +660,113 @@ begin
end;
const
kEmbeddedVsShaderFullScreen = 0;
kNumEmbeddedVsShaders = 1;
kEmbeddedVsShaderFullScreen = 0;
kNumEmbeddedVsShaders = 1;
kEmbeddedPsShaderDummy = 0;
kEmbeddedPsShaderDummyG32R32 = 1;
kNumEmbeddedPsShaders = 2;
// if (shaderId != 0) {
// thunk_FUN_000001de(0,"sce::Gnm::setEmbeddedVsShader() error: Unknown shaderId %u passed.\n");
// return -0x7111ff01;
// }
// sceGnmSetVsShader(cmdBuffer,numDwords,EmbVsRegsPtr,shaderModifier);
const
EmbPs0Shader:array[0..15] of DWORD=(
$beeb03ff,
3,
$7e000280,
$5e000100,
$bf800000,
$f8001c0f,
0,
0,
$bf810000,
$5362724f,
$7726468,
$2043,
0,
$b0a45b2b,
$1d39766d,
$72044b7b
);
//EmbVsRegs
//[0] FE000F1h, 0h, C0000h, 4h
//[4] 0h, 4h, 0h
EmbPs1Shader:array[0..15] of DWORD=(
$beeb03ff,
3,
$7e040280,
$f8001803,
$2020202,
$bf810000,
$302,
0,
$d81c987,
$5362724f,
$7726468,
$1841,
$4080002,
$98b9cb94,
0,
$6f130734
);
//_fe000f100_EmbVsShader0 = 0xbeeb03ff;
//uRam0000000fe000f104 = 7;
//uRam0000000fe000f108 = 0x36020081;
//uRam0000000fe000f10c = 0x34020281;
//uRam0000000fe000f110 = 0x360000c2;
//uRam0000000fe000f114 = 0x4a0202c1;
//uRam0000000fe000f118 = 0x4a0000c1;
//uRam0000000fe000f11c = 0x7e020b01;
//_fe000f120_EmbVsShader1 = 0x7e000b00;
//uRam0000000fe000f124 = 0x7e040280;
//uRam0000000fe000f128 = 0x7e0602f2;
//uRam0000000fe000f12c = 0xf80008cf;
//uRam0000000fe000f130 = 0x3020001;
//uRam0000000fe000f134 = 0xf800020f;
//uRam0000000fe000f138 = 0x3030303;
//_fe000f13c_EmbVsShader2 = 0xbf810000;
//uRam0000000fe000f140 = 0x5362724f;
//uRam0000000fe000f144 = 0x7726468;
//uRam0000000fe000f148 = 0x4047;
//uRam0000000fe000f14c = 0;
//uRam0000000fe000f150 = 0x47f8c29f;
//uRam0000000fe000f154 = 0x9b2da5cf;
//uRam0000000fe000f158 = 0xff7c5b7d;
EmbVsShader:array[0..23] of DWORD=(
$beeb03ff,
7,
$36020081,
$34020281,
$360000c2,
$4a0202c1,
$4a0000c1,
$7e020b01,
$7e000b00,
$7e040280,
$7e0602f2,
$f80008cf,
$3020001,
$f800020f,
$3030303,
0,
$bf810000,
$5362724f,
$7726468,
$4047,
0,
$47f8c29f,
$9b2da5cf,
$ff7c5b7d
);
type
PEmbShaders=^TEmbShaders;
TEmbShaders=packed record
EmbPsShader0:array[0..63] of DWORD;
EmbPsShader1:array[0..63] of DWORD;
EmbVsShader :array[0..63] of DWORD;
align :array[0..63] of DWORD;
end;
var
EmbShaders:TEmbShaders;
EmbPsShader0Ptr:Pointer;
EmbPsShader1Ptr:Pointer;
EmbVsShaderPtr :Pointer;
procedure GnmInitEmbedded;
var
s:PEmbShaders;
begin
s:=Align(@EmbShaders,kAlignmentOfShaderInBytes);
Move(EmbPs0Shader,s^.EmbPsShader0,SizeOf(EmbPs0Shader));
Move(EmbPs1Shader,s^.EmbPsShader1,SizeOf(EmbPs1Shader));
Move(EmbVsShader ,s^.EmbVsShader ,SizeOf(EmbVsShader));
EmbPsShader0Ptr:=@s^.EmbPsShader0;
EmbPsShader1Ptr:=@s^.EmbPsShader1;
EmbVsShaderPtr :=@s^.EmbVsShader ;
end;
const
EmbVsRegs:VsStageRegisters=(
m_spiShaderPgmLoVs :$FE000F1;
m_spiShaderPgmLoVs :0;
m_spiShaderPgmHiVs :0;
m_spiShaderPgmRsrc1Vs:$C0000;
m_spiShaderPgmRsrc2Vs:4;
@ -709,59 +775,68 @@ const
m_paClVsOutCntl :0
);
EmbVsShader:array[0..22] of DWORD=(
$beeb03ff,
7,
$36020081,
$34020281,
$360000c2,
$4a0202c1,
$4a0000c1,
$7e020b01,
$7e000b00,
$7e040280,
$7e0602f2,
$f80008cf,
$3020001,
$f800020f,
$3030303,
$bf810000,
$5362724f,
$7726468,
$4047,
0,
$47f8c29f,
$9b2da5cf,
$ff7c5b7d
EmbPsRegs0:PsStageRegisters=(
m_spiShaderPgmLoPs :0;
m_spiShaderPgmHiPs :0;
m_spiShaderPgmRsrc1Ps:$C0000;
m_spiShaderPgmRsrc2Ps:4;
m_spiShaderZFormat :0;
m_spiShaderColFormat :4;
m_spiPsInputEna :2;
m_spiPsInputAddr :2;
m_spiPsInControl :0;
m_spiBarycCntl :0;
m_dbShaderControl :$10;
m_cbShaderMask :$F;
);
var
EmbVsShaderPtr:Pointer;
EmbPsRegs1:PsStageRegisters=(
m_spiShaderPgmLoPs :0;
m_spiShaderPgmHiPs :0;
m_spiShaderPgmRsrc1Ps:$200000;
m_spiShaderPgmRsrc2Ps:0;
m_spiShaderZFormat :0;
m_spiShaderColFormat :2;
m_spiPsInputEna :2;
m_spiPsInputAddr :2;
m_spiPsInControl :0;
m_spiBarycCntl :0;
m_dbShaderControl :$10;
m_cbShaderMask :3;
);
function ps4_sceGnmSetEmbeddedVsShader(cmdBuffer:PDWORD;numDwords:QWORD;shaderId,shaderModifier:DWORD):Integer; SysV_ABI_CDecl;
var
VsRegs:VsStageRegisters;
//F:THandle;
begin
Assert(shaderId=0,'error: Unknown shaderId passed.');
VsRegs:=EmbVsRegs;
if (EmbVsShaderPtr=nil) then
begin
EmbVsShaderPtr:=AllocMem(kAlignmentOfShaderInBytes*2-1);
Move(EmbVsShader,Align(EmbVsShaderPtr,kAlignmentOfShaderInBytes)^,SizeOf(EmbVsShader));
end;
patchShaderGpuAddress(Align(EmbVsShaderPtr,kAlignmentOfShaderInBytes),VsRegs.m_spiShaderPgmHiVs,VsRegs.m_spiShaderPgmLoVs);
patchShaderGpuAddress(EmbVsShaderPtr,VsRegs.m_spiShaderPgmHiVs,VsRegs.m_spiShaderPgmLoVs);
Result:=ps4_sceGnmSetVsShader(cmdBuffer,numDwords,@VsRegs,shaderModifier);
end;
//F:=FileCreate('EmbVsShader.bin');
//FileWrite(F,EmbVsShader,SizeOf(EmbVsShader));
//FileClose(F);
function ps4_sceGnmSetEmbeddedPsShader(cmdBuffer:PDWORD;numDwords:QWORD;shaderId:DWORD):Integer; SysV_ABI_CDecl;
var
PsRegs:PsStageRegisters;
begin
Case shaderId of
0:begin
PsRegs:=EmbPsRegs0;
patchShaderGpuAddress(EmbPsShader0Ptr,PsRegs.m_spiShaderPgmHiPs,PsRegs.m_spiShaderPgmLoPs);
end;
1:begin
PsRegs:=EmbPsRegs1;
patchShaderGpuAddress(EmbPsShader1Ptr,PsRegs.m_spiShaderPgmHiPs,PsRegs.m_spiShaderPgmLoPs);
end;
else
Assert(false,'error: Unknown shaderId passed.');
end;
Result:=ps4_sceGnmSetPsShader350(cmdBuffer,numDwords,@PsRegs);
end;
function ps4_sceGnmUpdateVsShader(cmdBuffer:PDWORD;numDwords:QWORD;vsRegs:PVsStageRegisters;shaderModifier:DWORD):Integer; SysV_ABI_CDecl;
@ -1124,6 +1199,7 @@ begin
lib^.set_proc($E6E14A7248896113,@ps4_sceGnmSetPsShader350);
lib^.set_proc($F8016F3845EB2899,@ps4_sceGnmSetEmbeddedVsShader);
lib^.set_proc($5FD3A6C3D770BF93,@ps4_sceGnmSetEmbeddedPsShader);
lib^.set_proc($577D55D3552249C6,@ps4_sceGnmUpdateVsShader);
lib^.set_proc($E0C811C3F6D53505,@ps4_sceGnmUpdatePsShader);
@ -1152,6 +1228,7 @@ begin
end;
initialization
GnmInitEmbedded;
EopEvents.Init;
ps4_app.RegistredPreLoad('libSceGnmDriver.prx',@Load_libSceGnmDriver);
ps4_app.RegistredPreLoad('libSceGnmDriver_padebug.prx',@Load_libSceGnmDriver);