This commit is contained in:
Pavel 2022-10-07 17:21:05 +03:00
parent dcfd378fe3
commit 7ef60bd00b
8 changed files with 280 additions and 124 deletions

View File

@ -7,6 +7,7 @@ interface
uses
Classes,
SysUtils,
half16,
vulkan,
vImage,
bittype,
@ -836,10 +837,76 @@ const
// Hugely inefficient linear display mode -- do not use!
kTileModeDisplay_LinearGeneral = $0000001F; ///< Unsupported; do not use!
function _conv_clr_to_float(num:Byte;value,mask:qword):DWORD;
var
s:Single;
i:Integer;
begin
Result:=0;
Case num of
NUMBER_UNORM,
NUMBER_SRGB:
begin
s:=(value and mask)/mask;
Result:=PDWORD(@s)^;
end;
NUMBER_SNORM:
begin
i:=0;
Case mask of
$FF:i:=PShortInt(@value)^;
$FFFF:i:=PSmallInt(@value)^;
$FFFFFF:i:=PInteger (@value)^;
end;
s:=i/(mask div 2);
Result:=PDWORD(@s)^;
end;
NUMBER_UINT,
NUMBER_USCALED:
begin
Result:=(value and mask);
end;
NUMBER_SINT,
NUMBER_SSCALED:
begin
i:=0;
Case mask of
$FF:i:=PShortInt(@value)^;
$FFFF:i:=PSmallInt(@value)^;
$FFFFFF:i:=PInteger (@value)^;
else;
end;
Result:=PDWORD(@i)^;
end;
NUMBER_FLOAT:
begin
Case mask of
$FFFF:
begin
s:=PHalf16(@value)^;
Result:=PDWORD(@s)^;
end;
$FFFFFF:Result:=value;
else;
end;
end;
else;
end;
end;
Function TGPU_REGS.GET_RT_INFO(i:Byte):TRT_INFO; //0..7
var
COMP_MAP:TCOMP_MAP;
W:QWORD;
FORMAT:Byte;
NUMBER_TYPE:Byte;
begin
Result:=Default(TRT_INFO);
@ -859,21 +926,35 @@ begin
Assert(RENDER_TARGET[i].INFO.ENDIAN=ENDIAN_NONE);
//Assert(RENDER_TARGET[i].INFO.COMPRESSION=0); //FMASK and MSAA
Case RENDER_TARGET[i].INFO.FORMAT of
FORMAT :=RENDER_TARGET[i].INFO.FORMAT;
NUMBER_TYPE:=RENDER_TARGET[i].INFO.NUMBER_TYPE;
Case FORMAT of
COLOR_8:
Case RENDER_TARGET[i].INFO.NUMBER_TYPE of
Case NUMBER_TYPE of
NUMBER_UNORM:Result.FImageInfo.cformat:=VK_FORMAT_R8_UNORM;
NUMBER_SRGB :Result.FImageInfo.cformat:=VK_FORMAT_R8_SRGB;
else
Assert(false,'TODO');
end;
COLOR_8_8_8_8:
Case RENDER_TARGET[i].INFO.NUMBER_TYPE of
Case NUMBER_TYPE of
NUMBER_UNORM:Result.FImageInfo.cformat:=VK_FORMAT_R8G8B8A8_UNORM;
NUMBER_SRGB :Result.FImageInfo.cformat:=VK_FORMAT_R8G8B8A8_SRGB;
else
Assert(false,'TODO');
end;
COLOR_16_16:
Case NUMBER_TYPE of
NUMBER_UNORM :Result.FImageInfo.cformat:=VK_FORMAT_R16G16_UNORM;
NUMBER_SRGB :Result.FImageInfo.cformat:=VK_FORMAT_R16G16_UNORM;
NUMBER_SNORM :Result.FImageInfo.cformat:=VK_FORMAT_R16G16_SNORM;
NUMBER_USCALED:Result.FImageInfo.cformat:=VK_FORMAT_R16G16_USCALED;
NUMBER_SSCALED:Result.FImageInfo.cformat:=VK_FORMAT_R16G16_SSCALED;
NUMBER_UINT :Result.FImageInfo.cformat:=VK_FORMAT_R16G16_UINT;
NUMBER_SINT :Result.FImageInfo.cformat:=VK_FORMAT_R16G16_SINT;
NUMBER_FLOAT :Result.FImageInfo.cformat:=VK_FORMAT_R16G16_SFLOAT;
end;
else
Assert(false,'TODO');
end;
@ -920,12 +1001,10 @@ begin
// Result.IMAGE_USAGE:=Result.IMAGE_USAGE or TM_READ;
//end;
Case RENDER_TARGET[i].INFO.FORMAT of
Case FORMAT of
COLOR_8,
COLOR_8_8,
COLOR_8_8_8_8:
Case RENDER_TARGET[i].INFO.NUMBER_TYPE of
NUMBER_UNORM,
NUMBER_SRGB :
begin
COMP_MAP:=GetCompMap(RENDER_TARGET[i].INFO.COMP_SWAP,4);
@ -941,14 +1020,25 @@ begin
//Writeln((W shr (BsrDWord(COMP_MAP[2]) shl 3)) and 255);
//Writeln((W shr (BsrDWord(COMP_MAP[3]) shl 3)) and 255);
Result.CLEAR_COLOR.float32[0]:=((W shr (BsrDWord(COMP_MAP[0]) shl 3)) and 255)/255;
Result.CLEAR_COLOR.float32[1]:=((W shr (BsrDWord(COMP_MAP[1]) shl 3)) and 255)/255;
Result.CLEAR_COLOR.float32[2]:=((W shr (BsrDWord(COMP_MAP[2]) shl 3)) and 255)/255;
Result.CLEAR_COLOR.float32[3]:=((W shr (BsrDWord(COMP_MAP[3]) shl 3)) and 255)/255;
Result.CLEAR_COLOR.uint32[0]:=_conv_clr_to_float(NUMBER_TYPE,W shr (BsrDWord(COMP_MAP[0]) shl 3),$FF);
Result.CLEAR_COLOR.uint32[1]:=_conv_clr_to_float(NUMBER_TYPE,W shr (BsrDWord(COMP_MAP[1]) shl 3),$FF);
Result.CLEAR_COLOR.uint32[2]:=_conv_clr_to_float(NUMBER_TYPE,W shr (BsrDWord(COMP_MAP[2]) shl 3),$FF);
Result.CLEAR_COLOR.uint32[3]:=_conv_clr_to_float(NUMBER_TYPE,W shr (BsrDWord(COMP_MAP[3]) shl 3),$FF);
end;
else
Assert(false);
end;
COLOR_16_16,
COLOR_16_16_16_16:
begin
COMP_MAP:=GetCompMap(RENDER_TARGET[i].INFO.COMP_SWAP,4);
W:=RENDER_TARGET[i].CLEAR_WORD;
Result.CLEAR_COLOR.uint32[0]:=_conv_clr_to_float(NUMBER_TYPE,W shr (BsrDWord(COMP_MAP[0]) shl 4),$FFFF);
Result.CLEAR_COLOR.uint32[1]:=_conv_clr_to_float(NUMBER_TYPE,W shr (BsrDWord(COMP_MAP[1]) shl 4),$FFFF);
Result.CLEAR_COLOR.uint32[2]:=_conv_clr_to_float(NUMBER_TYPE,W shr (BsrDWord(COMP_MAP[2]) shl 4),$FFFF);
Result.CLEAR_COLOR.uint32[3]:=_conv_clr_to_float(NUMBER_TYPE,W shr (BsrDWord(COMP_MAP[3]) shl 4),$FFFF);
end;
else
Assert(false);
end;
@ -1342,7 +1432,7 @@ begin
BUF_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_UNORM;
BUF_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_UNORM;
BUF_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_UNORM;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_UNORM;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_UNORM;
BUF_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_UNORM;
else
Assert(false,_get_buf_dfmt_str(PV^.dfmt));
@ -1353,7 +1443,7 @@ begin
BUF_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_SNORM;
BUF_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_SNORM;
BUF_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_SNORM;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_SNORM;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_UNORM;
BUF_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_SNORM;
else
Assert(false,_get_buf_dfmt_str(PV^.dfmt));
@ -1364,7 +1454,7 @@ begin
BUF_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_USCALED;
BUF_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_USCALED;
BUF_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_USCALED;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_USCALED;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_USCALED;
BUF_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_USCALED;
else
Assert(false,_get_buf_dfmt_str(PV^.dfmt));
@ -1375,7 +1465,7 @@ begin
BUF_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_SSCALED;
BUF_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_SSCALED;
BUF_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_SSCALED;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_SSCALED;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_SSCALED;
BUF_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_SSCALED;
else
Assert(false,_get_buf_dfmt_str(PV^.dfmt));
@ -1386,7 +1476,7 @@ begin
BUF_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_UINT;
BUF_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_UINT;
BUF_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_UINT;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_UINT;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_UINT;
BUF_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_UINT;
BUF_DATA_FORMAT_32 :Result:=VK_FORMAT_R32_UINT;
BUF_DATA_FORMAT_32_32 :Result:=VK_FORMAT_R32G32_UINT;
@ -1401,7 +1491,7 @@ begin
BUF_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_SINT;
BUF_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_SINT;
BUF_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_SINT;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_SINT;
BUF_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_SINT;
BUF_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_SINT;
BUF_DATA_FORMAT_32 :Result:=VK_FORMAT_R32_SINT;
BUF_DATA_FORMAT_32_32 :Result:=VK_FORMAT_R32G32_SINT;
@ -1447,7 +1537,7 @@ begin
IMG_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_UNORM;
IMG_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_UNORM;
IMG_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_UNORM;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_UNORM;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_UNORM;
IMG_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_UNORM;
IMG_DATA_FORMAT_5_6_5 :Result:=VK_FORMAT_R5G6B5_UNORM_PACK16;
IMG_DATA_FORMAT_4_4_4_4 :Result:=VK_FORMAT_R4G4B4A4_UNORM_PACK16;
@ -1473,7 +1563,7 @@ begin
IMG_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_SNORM;
IMG_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_SNORM;
IMG_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_SNORM;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_SNORM;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_SNORM;
IMG_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_SNORM;
else
Assert(false,_get_tex_dfmt_str(PT^.dfmt));
@ -1484,7 +1574,7 @@ begin
IMG_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_USCALED;
IMG_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_USCALED;
IMG_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_USCALED;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_USCALED;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_USCALED;
IMG_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_USCALED;
else
Assert(false,_get_tex_dfmt_str(PT^.dfmt));
@ -1496,7 +1586,7 @@ begin
IMG_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_SSCALED;
IMG_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_SSCALED;
IMG_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_SSCALED;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_SSCALED;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_SSCALED;
IMG_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_SSCALED;
else
Assert(false,_get_tex_dfmt_str(PT^.dfmt));
@ -1507,7 +1597,7 @@ begin
IMG_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_UINT;
IMG_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_UINT;
IMG_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_UINT;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_UINT;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_UINT;
IMG_DATA_FORMAT_16_16_16_16 :Result:=VK_FORMAT_R16G16B16A16_UINT;
IMG_DATA_FORMAT_32 :Result:=VK_FORMAT_R32_UINT;
IMG_DATA_FORMAT_32_32 :Result:=VK_FORMAT_R32G32_UINT;
@ -1528,7 +1618,7 @@ begin
IMG_DATA_FORMAT_8 :Result:=VK_FORMAT_R8_SINT;
IMG_DATA_FORMAT_8_8 :Result:=VK_FORMAT_R8G8_SINT;
IMG_DATA_FORMAT_8_8_8_8 :Result:=VK_FORMAT_R8G8B8A8_SINT;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16_SINT;
IMG_DATA_FORMAT_16_16 :Result:=VK_FORMAT_R16G16_SINT;
IMG_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_SINT;
IMG_DATA_FORMAT_32 :Result:=VK_FORMAT_R32_SINT;
IMG_DATA_FORMAT_32_32 :Result:=VK_FORMAT_R32G32_SINT;

View File

@ -333,6 +333,7 @@
<Unit73>
<Filename Value="src\ps4_libsceplaygo.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ps4_libScePlayGo"/>
</Unit73>
<Unit74>
<Filename Value="src\ps4_libsceremoteplay.pas"/>

View File

@ -396,16 +396,9 @@ begin
//Writeln('Warn^:',Info^.lib^.strName,':',ps4libdoc.GetFunctName(Info^.Nid),':',HexStr(Info^.Nid,16));
end else
begin
//PNAME = 'module_stop',
//_MD = $11af200,
//LIB = $114e110,
//NID = 0,
//OFFSET = 311584,
//RTYPE = 7, //R_X86_64_JUMP_SLOT
//SBIND = 2, //STB_WEAK
//STYPE = 0} //STT_NOTYPE
Writeln(StdErr,'Warn^:',Info^.lib^.strName,':',ps4libdoc.GetFunctName(Info^.Nid),':',HexStr(Info^.Nid,16));
end;
end;
if (Result<>nil) then //cache
@ -608,9 +601,15 @@ begin
//ps4_app.app_path:='G:\Games\Super Exploding Zoo\CUSA00446\';
//ps4_app.app_file:='G:\Games\Super Exploding Zoo\CUSA00446\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\Super.Exploding.Zoo\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\Super.Exploding.Zoo\eboot.bin';
//ps4_app.app_path:='G:\Games\Untitled Goose Game\CUSA23079\';
//ps4_app.app_file:='G:\Games\Untitled Goose Game\CUSA23079\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\Untitled Goose Game\CUSA23079\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\Untitled Goose Game\CUSA23079\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\JETPACKJOYRIDE\CUSA03633\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\JETPACKJOYRIDE\CUSA03633\eboot.bin';
@ -647,6 +646,9 @@ begin
//ps4_app.app_path:='G:\Games\Blackhole\CUSA06921\';
//ps4_app.app_file:='G:\Games\Blackhole\CUSA06921\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\Blackhole\CUSA06921\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\Blackhole\CUSA06921\eboot.bin';
//ps4_app.app_path:='G:\Games\Spelunky\CUSA00491\';
//ps4_app.app_file:='G:\Games\Spelunky\CUSA00491\eboot.bin';
@ -665,6 +667,24 @@ begin
//ps4_app.app_path:='G:\Games\Roombo First Blood\CUSA19205\';
//ps4_app.app_file:='G:\Games\Roombo First Blood\CUSA19205\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\ps4-homebrew\PS4_Player_9.00\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\ps4-homebrew\PS4_Player_9.00\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\ps4-homebrew\Eboot_Give\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\ps4-homebrew\Eboot_Give\RayTracing3_eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\Metal_Max_Xeno\CUSA12350\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\Metal_Max_Xeno\CUSA12350\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\Roombo First Blood\CUSA19205\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\Roombo First Blood\CUSA19205\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\ps4-homebrew\pad\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\ps4-homebrew\pad\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\Gem.Smashers\CUSA07572\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\Gem.Smashers\CUSA07572\eboot.bin';
ps4_app.resolve_cb:=@ResolveImport;
ps4_app.reload_cb :=@ReloadImport;

View File

@ -27,14 +27,14 @@ type
private
//free: [Size] |[Offset]
//alloc: [Offset]
Function GetOffset:QWORD; inline;
Procedure SetOffset(q:qword); inline;
Function GetSize:QWORD; inline;
Procedure SetSize(q:qword); inline;
Function GetAddr:Pointer; inline;
Procedure SetAddr(p:Pointer); inline;
Function GetIsFree:Boolean; inline;
Procedure SetIsFree(b:Boolean); inline;
Function GetOffset:QWORD;
Procedure SetOffset(q:qword);
Function GetSize:QWORD;
Procedure SetSize(q:qword);
Function GetAddr:Pointer;
Procedure SetAddr(p:Pointer);
Function GetIsFree:Boolean;
Procedure SetIsFree(b:Boolean);
public
F:bitpacked record
Offset:bit28;
@ -68,6 +68,7 @@ type
const
Flo=0;
Fhi=$17FFFFFFF;
FMaxSize=(Fhi-Flo+1);
var
FFreeSet:TFreePoolNodeSet;
@ -150,45 +151,45 @@ end;
//
Function TDirectAdrNode.GetOffset:QWORD; inline;
Function TDirectAdrNode.GetOffset:QWORD;
begin
Result:=QWORD(F.Offset) shl 12;
end;
Procedure TDirectAdrNode.SetOffset(q:qword); inline;
Procedure TDirectAdrNode.SetOffset(q:qword);
begin
F.Offset:=DWORD(q shr 12);
Assert(GetOffset=q);
end;
Function TDirectAdrNode.GetSize:QWORD; inline;
Function TDirectAdrNode.GetSize:QWORD;
begin
Result:=QWORD(F.Size) shl 12;
end;
Procedure TDirectAdrNode.SetSize(q:qword); inline;
Procedure TDirectAdrNode.SetSize(q:qword);
begin
F.Size:=DWORD(q shr 12);
Assert(GetSize=q);
end;
Function TDirectAdrNode.GetAddr:Pointer; inline;
Function TDirectAdrNode.GetAddr:Pointer;
begin
Result:=Pointer(QWORD(F.addr) shl 12);
end;
Procedure TDirectAdrNode.SetAddr(p:Pointer); inline;
Procedure TDirectAdrNode.SetAddr(p:Pointer);
begin
F.addr:=DWORD(QWORD(p) shr 12);
Assert(GetAddr=p);
end;
Function TDirectAdrNode.GetIsFree:Boolean; inline;
Function TDirectAdrNode.GetIsFree:Boolean;
begin
Result:=Boolean(F.Free);
end;
Procedure TDirectAdrNode.SetIsFree(b:Boolean); inline;
Procedure TDirectAdrNode.SetIsFree(b:Boolean);
begin
F.Free:=Byte(b);
end;
@ -204,7 +205,7 @@ begin
key:=Default(TDirectAdrNode);
key.IsFree:=True;
key.Offset:=Flo;
key.Size :=(Fhi-Flo+1);
key.Size :=FMaxSize;
_Insert(key);
end;
@ -417,9 +418,9 @@ var
Offset:QWORD;
begin
Result:=0;
if (Size=0) or (Align=0) then Exit(EINVAL);
if (ss<Flo) or (ss>Fhi) then Exit(EINVAL);
if (se<Flo) or (se<ss) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (ss<Flo) or (ss>Fhi) then Exit(EINVAL);
if (se<Flo) or (se<ss) then Exit(EINVAL);
key:=Default(TDirectAdrNode);
@ -454,6 +455,9 @@ var
key:TDirectAdrNode;
begin
Result:=0;
if (Offset>Fhi) then Exit(EINVAL);
key:=Default(TDirectAdrNode);
key.Offset:=Offset;
@ -498,6 +502,9 @@ var
key:TDirectAdrNode;
begin
Result:=0;
if (Offset>Fhi) then Exit(EINVAL);
key:=Default(TDirectAdrNode);
key.Offset:=Offset;
@ -521,7 +528,6 @@ var
Size:QWORD;
begin
Result:=ENOMEM;
if (Align=0) then Exit(EINVAL);
if (ss<Flo) or (ss>Fhi) then Exit(EINVAL);
if (se<Flo) or (se<ss) then Exit(EINVAL);
@ -532,14 +538,20 @@ begin
While (It.Item<>nil) do
begin
key:=It.Item^;
Offset:=System.Align(Max(key.Offset,ss),Align);
if (se>=Offset) then
if key.IsFree then
begin
Size:=key.Size-(Offset-key.Offset);
AdrOut :=Offset;
SizeOut:=Size;
Exit(0);
Offset:=System.Align(Max(key.Offset,ss),Align);
if (se>=Offset) then
begin
Size:=key.Size-(Offset-key.Offset);
AdrOut :=Offset;
SizeOut:=Size;
Exit(0);
end;
end;
It.Next
end;
end;
@ -551,7 +563,7 @@ var
FEndO:QWORD;
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
FEndO:=Offset+Size;
@ -585,7 +597,7 @@ var
FEndO:QWORD;
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
FEndO:=Offset+Size;
@ -623,7 +635,7 @@ var
FEndO:QWORD;
begin
Result:=ENOENT;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
FEndO:=Offset+Size;
@ -713,7 +725,7 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
repeat
@ -822,7 +834,7 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
repeat
@ -914,7 +926,7 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
repeat

View File

@ -27,10 +27,10 @@ type
TNameAdrNode=packed object
private
Function GetOffset:Pointer; inline;
Procedure SetOffset(q:Pointer); inline;
Function GetSize:QWORD; inline;
Procedure SetSize(q:QWORD); inline;
Function GetOffset:Pointer;
Procedure SetOffset(q:Pointer);
Function GetSize:QWORD;
Procedure SetSize(q:QWORD);
public
F:bitpacked record
Offset:DWORD;
@ -54,6 +54,7 @@ type
var
Flo,Fhi:Pointer;
FMaxSize:QWORD;
FAllcSet:TAllcPoolNodeSet;
public
@ -94,23 +95,23 @@ end;
//
Function TNameAdrNode.GetOffset:Pointer; inline;
Function TNameAdrNode.GetOffset:Pointer;
begin
Result:=Pointer(QWORD(F.Offset) shl 12);
end;
Procedure TNameAdrNode.SetOffset(q:Pointer); inline;
Procedure TNameAdrNode.SetOffset(q:Pointer);
begin
F.Offset:=DWORD(QWORD(q) shr 12);
Assert(GetOffset=q);
end;
Function TNameAdrNode.GetSize:QWORD; inline;
Function TNameAdrNode.GetSize:QWORD;
begin
Result:=QWORD(F.Size) shl 12;
end;
Procedure TNameAdrNode.SetSize(q:QWORD); inline;
Procedure TNameAdrNode.SetSize(q:QWORD);
begin
F.Size:=DWORD(q shr 12);
Assert(GetSize=q);
@ -134,9 +135,11 @@ begin
Flo:=Pointer(_lo);
Fhi:=Pointer(_hi);
FMaxSize:=(_hi-_lo+1);
key:=Default(TNameAdrNode);
key.Offset:=Pointer(_lo);
key.Size :=(_hi-_lo+1);
key.Size :=FMaxSize;
_Insert(key);
end;
@ -317,7 +320,7 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
FEndO:=AlignDw(Offset,PHYSICAL_PAGE_SIZE);

View File

@ -52,14 +52,14 @@ type
PVirtualAdrBlock=^TVirtualAdrBlock;
TVirtualAdrBlock=packed object
private
Function GetOffset:Pointer; inline;
Procedure SetOffset(q:Pointer); inline;
Function GetSize:QWORD; inline;
Procedure SetSize(q:QWORD); inline;
Function GetUsed:QWORD; inline;
Procedure SetUsed(q:QWORD); inline;
Function GetRsrv:QWORD; inline;
Procedure SetRsrv(q:QWORD); inline;
Function GetOffset:Pointer;
Procedure SetOffset(q:Pointer);
Function GetSize:QWORD;
Procedure SetSize(q:QWORD);
Function GetUsed:QWORD;
Procedure SetUsed(q:QWORD);
Function GetRsrv:QWORD;
Procedure SetRsrv(q:QWORD);
public
F:bitpacked record
Offset:bit28;
@ -83,14 +83,14 @@ type
private
//free: [Size] |[Offset]
//alloc: [Offset]
Function GetOffset:Pointer; inline;
Procedure SetOffset(q:Pointer); inline;
Function GetSize:QWORD; inline;
Procedure SetSize(q:QWORD); inline;
Function GetAddr:QWORD; inline;
Procedure SetAddr(p:QWORD); inline;
Function GetIsFree:Boolean; inline;
Procedure SetIsFree(b:Boolean); inline;
Function GetOffset:Pointer;
Procedure SetOffset(q:Pointer);
Function GetSize:QWORD;
Procedure SetSize(q:QWORD);
Function GetAddr:QWORD;
Procedure SetAddr(p:QWORD);
Function GetIsFree:Boolean;
Procedure SetIsFree(b:Boolean);
public
F:bitpacked record
Offset:bit28;
@ -133,6 +133,7 @@ type
var
Flo,Fhi:Pointer;
FMaxSize:QWORD;
FFreeSet:TFreePoolNodeSet;
FAllcSet:TAllcPoolNodeSet;
@ -312,45 +313,45 @@ end;
//
Function TVirtualAdrBlock.GetOffset:Pointer; inline;
Function TVirtualAdrBlock.GetOffset:Pointer;
begin
Result:=Pointer(QWORD(F.Offset) shl 12);
end;
Procedure TVirtualAdrBlock.SetOffset(q:Pointer); inline;
Procedure TVirtualAdrBlock.SetOffset(q:Pointer);
begin
F.Offset:=DWORD(QWORD(q) shr 12);
Assert(GetOffset=q);
end;
Function TVirtualAdrBlock.GetSize:QWORD; inline;
Function TVirtualAdrBlock.GetSize:QWORD;
begin
Result:=QWORD(F.Size) shl 12;
end;
Procedure TVirtualAdrBlock.SetSize(q:QWORD); inline;
Procedure TVirtualAdrBlock.SetSize(q:QWORD);
begin
F.Size:=DWORD(q shr 12);
Assert(GetSize=q);
end;
Function TVirtualAdrBlock.GetUsed:QWORD; inline;
Function TVirtualAdrBlock.GetUsed:QWORD;
begin
Result:=QWORD(F.used) shl 12;
end;
Procedure TVirtualAdrBlock.SetUsed(q:QWORD); inline;
Procedure TVirtualAdrBlock.SetUsed(q:QWORD);
begin
F.used:=DWORD(q shr 12);
Assert(GetUsed=q);
end;
Function TVirtualAdrBlock.GetRsrv:QWORD; inline;
Function TVirtualAdrBlock.GetRsrv:QWORD;
begin
Result:=QWORD(F.rsrv) shl 12;
end;
Procedure TVirtualAdrBlock.SetRsrv(q:QWORD); inline;
Procedure TVirtualAdrBlock.SetRsrv(q:QWORD);
begin
F.rsrv:=DWORD(q shr 12);
Assert(GetRsrv=q);
@ -468,45 +469,45 @@ end;
//
Function TVirtualAdrNode.GetOffset:Pointer; inline;
Function TVirtualAdrNode.GetOffset:Pointer;
begin
Result:=Pointer(QWORD(F.Offset) shl 12);
end;
Procedure TVirtualAdrNode.SetOffset(q:Pointer); inline;
Procedure TVirtualAdrNode.SetOffset(q:Pointer);
begin
F.Offset:=DWORD(QWORD(q) shr 12);
Assert(GetOffset=q);
end;
Function TVirtualAdrNode.GetSize:QWORD; inline;
Function TVirtualAdrNode.GetSize:QWORD;
begin
Result:=QWORD(F.Size) shl 12;
end;
Procedure TVirtualAdrNode.SetSize(q:QWORD); inline;
Procedure TVirtualAdrNode.SetSize(q:QWORD);
begin
F.Size:=DWORD(q shr 12);
Assert(GetSize=q);
end;
Function TVirtualAdrNode.GetAddr:QWORD; inline;
Function TVirtualAdrNode.GetAddr:QWORD;
begin
Result:=QWORD(F.addr) shl 12;
end;
Procedure TVirtualAdrNode.SetAddr(p:QWORD); inline;
Procedure TVirtualAdrNode.SetAddr(p:QWORD);
begin
F.addr:=DWORD(QWORD(p) shr 12);
Assert(GetAddr=p);
end;
Function TVirtualAdrNode.GetIsFree:Boolean; inline;
Function TVirtualAdrNode.GetIsFree:Boolean;
begin
Result:=Boolean(F.Free);
end;
Procedure TVirtualAdrNode.SetIsFree(b:Boolean); inline;
Procedure TVirtualAdrNode.SetIsFree(b:Boolean);
begin
F.Free:=Byte(b);
end;
@ -535,10 +536,12 @@ begin
Flo:=Pointer(_lo);
Fhi:=Pointer(_hi);
FMaxSize:=(_hi-_lo+1);
key:=Default(TVirtualAdrNode);
key.IsFree:=True;
key.Offset:=Pointer(_lo);
key.Size :=(_hi-_lo+1);
key.Size :=FMaxSize;
_Insert(key);
end;
@ -546,6 +549,12 @@ end;
procedure TVirtualManager._Insert(const key:TVirtualAdrNode);
begin
Assert(key.Size<>0);
if (key.F.direct<>0) then
begin
Assert(key.addr<$17FFFFFFF);
end;
if key.IsFree then
begin
if (key.F.mapped=0) then
@ -649,7 +658,6 @@ procedure TVirtualManager._Merge(key:TVirtualAdrNode);
var
rkey:TVirtualAdrNode;
begin
//prev union
repeat
rkey:=key;
@ -864,7 +872,7 @@ var
begin
key.IsFree :=True;
key.F.prot :=0;
key.F.addr :=0;
key.F.addr :=0; //hack
key.F.reserv:=0;
key.F.direct:=0;
key.F.stack :=0;
@ -1015,7 +1023,7 @@ var
//new save
key.IsFree :=False;
key.F.addr :=0;
key.F.addr :=0; //hack
key.F.reserv:=0;
key.F.direct:=0;
key.F.stack :=0;
@ -1094,7 +1102,7 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
FEndO:=Offset+Size;
@ -1199,9 +1207,14 @@ var
Result:=False;
Assert(key.Size<>0);
if (_direct<>0) then
begin
Assert(addr<$17FFFFFFF);
end;
//new save
key.IsFree :=False;
key.F.addr :=addr;
key.addr :=addr;
key.F.reserv:=_reserv;
key.F.direct:=_direct;
key.F.stack :=0;
@ -1235,7 +1248,7 @@ var
//new save
key.IsFree :=False;
key.F.addr :=addr;
key.addr :=addr;
key.F.reserv:=_reserv;
key.F.direct:=_direct;
key.F.stack :=0;
@ -1257,7 +1270,7 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset>Fhi) then Exit(EINVAL);
Align:=Max(Align,PHYSICAL_PAGE_SIZE);
@ -1494,6 +1507,9 @@ begin
Result:=0;
if ((prot and $ffffffc8)<>0) then Exit(EINVAL);
if (Size>FMaxSize) then Exit(EINVAL);
if (Offset>Fhi) then Exit(EINVAL);
FEndO:=AlignDw(Offset,PHYSICAL_PAGE_SIZE);
Size:=Size+(Offset-FEndO);
@ -1606,6 +1622,9 @@ begin
Result:=0;
if ((prot and $ffffffc8)<>0) then Exit(EINVAL);
if (Size>FMaxSize) then Exit(EINVAL);
if (Offset>Fhi) then Exit(EINVAL);
FEndO:=AlignDw(Offset,PHYSICAL_PAGE_SIZE);
Size:=Size+(Offset-FEndO);
@ -1718,7 +1737,7 @@ var
//new save
key.IsFree :=True;
key.F.prot :=0;
key.F.addr :=0;
key.F.addr :=0; //hack
key.F.reserv:=0;
key.F.direct:=0;
key.F.stack :=0;
@ -1750,7 +1769,7 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Size=0) or (Size>FMaxSize) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
FEndO:=AlignDw(Offset,PHYSICAL_PAGE_SIZE);
@ -1804,6 +1823,11 @@ var
key:TVirtualAdrNode;
begin
Result:=0;
if (Offset>Fhi) then Exit(EINVAL);
Offset:=AlignDw(Offset,PHYSICAL_PAGE_SIZE);
key:=Default(TVirtualAdrNode);
key.Offset:=Offset;
@ -1848,6 +1872,11 @@ var
key:TVirtualAdrNode;
begin
Result:=0;
if (Offset>Fhi) then Exit(EINVAL);
Offset:=AlignDw(Offset,PHYSICAL_PAGE_SIZE);
key:=Default(TVirtualAdrNode);
key.Offset:=Offset;
@ -1870,6 +1899,11 @@ var
key:TVirtualAdrNode;
begin
Result:=False;
if (Offset>Fhi) then Exit;
Offset:=AlignDw(Offset,PHYSICAL_PAGE_SIZE);
key:=Default(TVirtualAdrNode);
key.Offset:=Offset;

View File

@ -280,7 +280,6 @@ begin
Result:=False;
pb:=nil;
addr:=AlignDw(addr,PHYSICAL_PAGE_SIZE);
rwlock_rdlock(MMLock);
@ -893,8 +892,6 @@ var
begin
Result:=0;
addr:=AlignDw(addr,PHYSICAL_PAGE_SIZE);
ROut:=Default(TVirtualAdrNode);
_sig_lock;
@ -939,8 +936,6 @@ begin
if (info=nil) then Exit;
if (infoSize<>SizeOf(SceKernelVirtualQueryInfo)) then Exit;
addr:=AlignDw(addr,PHYSICAL_PAGE_SIZE);
VOut:=Default(TVirtualAdrNode);
DOut:=Default(TDirectAdrNode);
Name:=Default(TName);

View File

@ -183,6 +183,7 @@ begin
VK_FORMAT_R8_SRGB :Result:=1;
VK_FORMAT_R5G6B5_UNORM_PACK16 :Result:=2;
VK_FORMAT_R4G4B4A4_UNORM_PACK16:Result:=2;
VK_FORMAT_R16G16_SFLOAT :Result:=4;
VK_FORMAT_R32_SFLOAT :Result:=4;
//stencil