mirror of
https://github.com/red-prig/fpPS4.git
synced 2024-10-07 03:33:20 +00:00
+
This commit is contained in:
parent
dcd6019af6
commit
9671a78e1b
@ -329,6 +329,7 @@
|
|||||||
<Unit72>
|
<Unit72>
|
||||||
<Filename Value="src\ps4_libscepad.pas"/>
|
<Filename Value="src\ps4_libscepad.pas"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
|
<UnitName Value="ps4_libScePad"/>
|
||||||
</Unit72>
|
</Unit72>
|
||||||
<Unit73>
|
<Unit73>
|
||||||
<Filename Value="src\ps4_libsceplaygo.pas"/>
|
<Filename Value="src\ps4_libsceplaygo.pas"/>
|
||||||
|
@ -13,6 +13,9 @@ uses
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
ps4_libSceVideoOut;
|
||||||
|
|
||||||
const
|
const
|
||||||
SCE_PAD_ERROR_INVALID_ARG =-2137915391; // 0x80920001
|
SCE_PAD_ERROR_INVALID_ARG =-2137915391; // 0x80920001
|
||||||
SCE_PAD_ERROR_INVALID_PORT =-2137915390; // 0x80920002
|
SCE_PAD_ERROR_INVALID_PORT =-2137915390; // 0x80920002
|
||||||
@ -156,8 +159,28 @@ begin
|
|||||||
|
|
||||||
_sig_lock;
|
_sig_lock;
|
||||||
|
|
||||||
//FillChar(data^,SizeOf(ScePadData),1);
|
//connect data
|
||||||
//FillChar(data^.touchData,SizeOf(ScePadData.touchData),1);
|
|
||||||
|
data^.timestamp:=Sysutils.GetTickCount64;
|
||||||
|
|
||||||
|
data^.connected:=True;
|
||||||
|
data^.connectedCount:=1;
|
||||||
|
|
||||||
|
data^.leftStick.x :=$80;
|
||||||
|
data^.leftStick.y :=$80;
|
||||||
|
data^.rightStick.x:=$80;
|
||||||
|
data^.rightStick.y:=$80;
|
||||||
|
|
||||||
|
//only in active windows
|
||||||
|
|
||||||
|
if (MainWindows<>GetForegroundWindow) then
|
||||||
|
begin
|
||||||
|
_sig_unlock;
|
||||||
|
Result:=0;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
//mouse as touch pad
|
||||||
|
|
||||||
data^.touchData.touchNum:=1;
|
data^.touchData.touchNum:=1;
|
||||||
data^.touchData.touch[0].id:=0;
|
data^.touchData.touch[0].id:=0;
|
||||||
@ -166,16 +189,7 @@ begin
|
|||||||
data^.touchData.touch[0].x:=mPoint.X;
|
data^.touchData.touch[0].x:=mPoint.X;
|
||||||
data^.touchData.touch[0].y:=mPoint.Y;
|
data^.touchData.touch[0].y:=mPoint.Y;
|
||||||
|
|
||||||
data^.connected:=True;
|
//keymapping
|
||||||
data^.timestamp:=Sysutils.GetTickCount64;
|
|
||||||
data^.connectedCount:=1;
|
|
||||||
|
|
||||||
data^.leftStick.x:=$80;
|
|
||||||
data^.leftStick.y:=$80;
|
|
||||||
data^.rightStick.x:=$80;
|
|
||||||
data^.rightStick.y:=$80;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
if GetAsyncKeyState(VK_W) then
|
if GetAsyncKeyState(VK_W) then
|
||||||
data^.leftStick.y:=0;
|
data^.leftStick.y:=0;
|
||||||
@ -254,7 +268,6 @@ begin
|
|||||||
if GetAsyncKeyState(VK_C) then
|
if GetAsyncKeyState(VK_C) then
|
||||||
data^.buttons:=data^.buttons or SCE_PAD_BUTTON_R3;
|
data^.buttons:=data^.buttons or SCE_PAD_BUTTON_R3;
|
||||||
|
|
||||||
|
|
||||||
_sig_unlock;
|
_sig_unlock;
|
||||||
Result:=0;
|
Result:=0;
|
||||||
end;
|
end;
|
||||||
|
@ -243,6 +243,9 @@ type
|
|||||||
|
|
||||||
function _qc_sceVideoOutSubmitFlip(Flip:PqcFlipInfo):Integer;
|
function _qc_sceVideoOutSubmitFlip(Flip:PqcFlipInfo):Integer;
|
||||||
|
|
||||||
|
var
|
||||||
|
MainWindows:THandle;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -266,7 +269,10 @@ type
|
|||||||
wait:SizeUint;
|
wait:SizeUint;
|
||||||
u:record
|
u:record
|
||||||
Case Byte of
|
Case Byte of
|
||||||
0:(bufferIndex:Integer;
|
0:(userID,
|
||||||
|
busType,
|
||||||
|
index:Integer);
|
||||||
|
1:(bufferIndex,
|
||||||
flipMode:Integer;
|
flipMode:Integer;
|
||||||
flipArg:Int64;
|
flipArg:Int64;
|
||||||
_type:Integer);
|
_type:Integer);
|
||||||
@ -528,6 +534,14 @@ begin
|
|||||||
TVBlank.OnTimer:=@OnVblank;
|
TVBlank.OnTimer:=@OnVblank;
|
||||||
TVBlank.Enabled:=true;
|
TVBlank.Enabled:=true;
|
||||||
|
|
||||||
|
Case node^.u.busType of
|
||||||
|
SCE_VIDEO_OUT_BUS_TYPE_MAIN:
|
||||||
|
begin
|
||||||
|
MainWindows:=FForm.Handle;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
end;
|
||||||
|
|
||||||
//data? nop
|
//data? nop
|
||||||
free_node(node);
|
free_node(node);
|
||||||
end;
|
end;
|
||||||
@ -556,15 +570,21 @@ begin
|
|||||||
node:=H.alloc_node;
|
node:=H.alloc_node;
|
||||||
|
|
||||||
Result:=-1;
|
Result:=-1;
|
||||||
FVideoOutMap.New(H,Result);
|
if not FVideoOutMap.New(H,Result) then Exit(SCE_VIDEO_OUT_ERROR_INVALID_VALUE);
|
||||||
|
|
||||||
|
//Writeln('>sceVideoOutOpen:',HexStr(Pointer(H)));
|
||||||
|
|
||||||
Writeln('>sceVideoOutOpen:',HexStr(Pointer(H)));
|
|
||||||
node^.Parent:=@H.sceVideoOutOpen;
|
node^.Parent:=@H.sceVideoOutOpen;
|
||||||
|
|
||||||
|
node^.u.userID :=userID;
|
||||||
|
node^.u.busType:=busType;
|
||||||
|
node^.u.index :=index;
|
||||||
|
|
||||||
Push2VideoOut(node);
|
Push2VideoOut(node);
|
||||||
|
|
||||||
H.Release;
|
H.Release;
|
||||||
|
|
||||||
Writeln('<sceVideoOutOpen:',userID,' ',busType);
|
//Writeln('<sceVideoOutOpen:',userID,' ',busType);
|
||||||
|
|
||||||
_sig_unlock;
|
_sig_unlock;
|
||||||
end;
|
end;
|
||||||
|
@ -22,10 +22,56 @@ type
|
|||||||
function BindMem(P:TvPointer):TVkResult;
|
function BindMem(P:TvPointer):TVkResult;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function VkBindSparseBufferMemory(queue:TVkQueue;buffer:TVkBuffer;bindCount:TVkUInt32;pBinds:PVkSparseMemoryBind):TVkResult;
|
||||||
function GetRequirements(size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
|
function GetRequirements(size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
function VkBindSparseBufferMemory(queue:TVkQueue;buffer:TVkBuffer;bindCount:TVkUInt32;pBinds:PVkSparseMemoryBind):TVkResult;
|
||||||
|
var
|
||||||
|
finfo:TVkFenceCreateInfo;
|
||||||
|
fence:TVkFence;
|
||||||
|
|
||||||
|
bind:TVkSparseBufferMemoryBindInfo;
|
||||||
|
info:TVkBindSparseInfo;
|
||||||
|
begin
|
||||||
|
finfo:=Default(TVkFenceCreateInfo);
|
||||||
|
finfo.sType:=VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||||
|
Result:=vkCreateFence(Device.FHandle,@finfo,nil,@fence);
|
||||||
|
if (Result<>VK_SUCCESS) then
|
||||||
|
begin
|
||||||
|
Writeln(StdErr,'vkCreateFence:',Result);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
bind:=Default(TVkSparseBufferMemoryBindInfo);
|
||||||
|
bind.buffer :=buffer;
|
||||||
|
bind.bindCount:=bindCount;
|
||||||
|
bind.pBinds :=pBinds;
|
||||||
|
|
||||||
|
info:=Default(TVkBindSparseInfo);
|
||||||
|
info.sType :=VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
|
||||||
|
info.bufferBindCount:=1;
|
||||||
|
info.pBufferBinds :=@bind;
|
||||||
|
|
||||||
|
Result:=vkQueueBindSparse(queue,1,@info,fence);
|
||||||
|
|
||||||
|
if (Result<>VK_SUCCESS) then
|
||||||
|
begin
|
||||||
|
Writeln(StdErr,'vkQueueBindSparse:',Result);
|
||||||
|
vkDestroyFence(Device.FHandle,fence,nil);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result:=vkWaitForFences(Device.FHandle,1,@fence,VK_TRUE,TVkUInt64(-1));
|
||||||
|
if (Result<>VK_SUCCESS) then
|
||||||
|
begin
|
||||||
|
Writeln(StdErr,'vkWaitForFences:',Result);
|
||||||
|
end;
|
||||||
|
|
||||||
|
vkDestroyFence(Device.FHandle,fence,nil);
|
||||||
|
end;
|
||||||
|
|
||||||
function GetRequirements(size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
|
function GetRequirements(size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
|
||||||
var
|
var
|
||||||
Buffer:TvBuffer;
|
Buffer:TvBuffer;
|
||||||
|
@ -108,65 +108,19 @@ end;
|
|||||||
function _New_simple(host:TvPointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
|
function _New_simple(host:TvPointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
|
||||||
var
|
var
|
||||||
t:TvHostBuffer;
|
t:TvHostBuffer;
|
||||||
Offset,Foffset:TVkDeviceSize;
|
delta:TVkDeviceSize;
|
||||||
begin
|
begin
|
||||||
Offset :=host.FOffset;
|
delta:=_fix_buf_size(host.FOffset,Size,usage);
|
||||||
Foffset:=_fix_buf_size(Offset,Size,usage);
|
|
||||||
|
|
||||||
t:=TvHostBuffer.Create(Size,usage,@buf_ext);
|
t:=TvHostBuffer.Create(Size,usage,@buf_ext);
|
||||||
|
|
||||||
t.Fhost :=host;
|
t.Fhost :=host;
|
||||||
t.Foffset:=Foffset;
|
t.Foffset:=delta;
|
||||||
t.BindMem(host);
|
t.BindMem(host);
|
||||||
|
|
||||||
Result:=t;
|
Result:=t;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function VkBindSparseBufferMemory(queue:TVkQueue;buffer:TVkBuffer;bindCount:TVkUInt32;pBinds:PVkSparseMemoryBind):TVkResult;
|
|
||||||
var
|
|
||||||
finfo:TVkFenceCreateInfo;
|
|
||||||
fence:TVkFence;
|
|
||||||
|
|
||||||
bind:TVkSparseBufferMemoryBindInfo;
|
|
||||||
info:TVkBindSparseInfo;
|
|
||||||
begin
|
|
||||||
finfo:=Default(TVkFenceCreateInfo);
|
|
||||||
finfo.sType:=VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
|
||||||
Result:=vkCreateFence(Device.FHandle,@finfo,nil,@fence);
|
|
||||||
if (Result<>VK_SUCCESS) then
|
|
||||||
begin
|
|
||||||
Writeln(StdErr,'vkCreateFence:',Result);
|
|
||||||
Exit;
|
|
||||||
end;
|
|
||||||
|
|
||||||
bind:=Default(TVkSparseBufferMemoryBindInfo);
|
|
||||||
bind.buffer :=buffer;
|
|
||||||
bind.bindCount:=bindCount;
|
|
||||||
bind.pBinds :=pBinds;
|
|
||||||
|
|
||||||
info:=Default(TVkBindSparseInfo);
|
|
||||||
info.sType :=VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
|
|
||||||
info.bufferBindCount:=1;
|
|
||||||
info.pBufferBinds :=@bind;
|
|
||||||
|
|
||||||
Result:=vkQueueBindSparse(queue,1,@info,fence);
|
|
||||||
|
|
||||||
if (Result<>VK_SUCCESS) then
|
|
||||||
begin
|
|
||||||
Writeln(StdErr,'vkQueueBindSparse:',Result);
|
|
||||||
vkDestroyFence(Device.FHandle,fence,nil);
|
|
||||||
Exit;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Result:=vkWaitForFences(Device.FHandle,1,@fence,VK_TRUE,TVkUInt64(-1));
|
|
||||||
if (Result<>VK_SUCCESS) then
|
|
||||||
begin
|
|
||||||
Writeln(StdErr,'vkWaitForFences:',Result);
|
|
||||||
end;
|
|
||||||
|
|
||||||
vkDestroyFence(Device.FHandle,fence,nil);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function Min(a,b:QWORD):QWORD; inline;
|
function Min(a,b:QWORD):QWORD; inline;
|
||||||
begin
|
begin
|
||||||
if (a<b) then Result:=a else Result:=b;
|
if (a<b) then Result:=a else Result:=b;
|
||||||
@ -180,7 +134,7 @@ var
|
|||||||
hsize:qword;
|
hsize:qword;
|
||||||
msize:qword;
|
msize:qword;
|
||||||
|
|
||||||
Offset,Foffset:TVkDeviceSize;
|
Offset,delta:TVkDeviceSize;
|
||||||
|
|
||||||
bind:TVkSparseMemoryBind;
|
bind:TVkSparseMemoryBind;
|
||||||
Binds:AVkSparseMemoryBind;
|
Binds:AVkSparseMemoryBind;
|
||||||
@ -190,8 +144,8 @@ var
|
|||||||
begin
|
begin
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
|
|
||||||
Offset :=TVkDeviceSize(Addr); //hack align at same in virtual mem
|
//hack; alignment is the same in virtual memory
|
||||||
Foffset:=_fix_buf_size(Offset,Size,usage);
|
delta:=_fix_buf_size(TVkDeviceSize(Addr),Size,usage);
|
||||||
|
|
||||||
Binds:=Default(AVkSparseMemoryBind);
|
Binds:=Default(AVkSparseMemoryBind);
|
||||||
host :=Default(TvPointer);
|
host :=Default(TvPointer);
|
||||||
@ -223,7 +177,7 @@ begin
|
|||||||
|
|
||||||
t:=TvHostBuffer.CreateSparce(Size,usage,@buf_ext);
|
t:=TvHostBuffer.CreateSparce(Size,usage,@buf_ext);
|
||||||
|
|
||||||
t.Foffset:=Foffset;
|
t.Foffset:=delta;
|
||||||
t.FSparse:=Binds;
|
t.FSparse:=Binds;
|
||||||
|
|
||||||
VkBindSparseBufferMemory(queue,t.FHandle,Length(Binds),@Binds[0]);
|
VkBindSparseBufferMemory(queue,t.FHandle,Length(Binds),@Binds[0]);
|
||||||
|
Loading…
Reference in New Issue
Block a user