This commit is contained in:
red-prig 2022-10-13 20:33:48 +03:00
parent dcd6019af6
commit 9671a78e1b
5 changed files with 104 additions and 70 deletions

View File

@ -329,6 +329,7 @@
<Unit72>
<Filename Value="src\ps4_libscepad.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ps4_libScePad"/>
</Unit72>
<Unit73>
<Filename Value="src\ps4_libsceplaygo.pas"/>

View File

@ -13,6 +13,9 @@ uses
implementation
uses
ps4_libSceVideoOut;
const
SCE_PAD_ERROR_INVALID_ARG =-2137915391; // 0x80920001
SCE_PAD_ERROR_INVALID_PORT =-2137915390; // 0x80920002
@ -156,8 +159,28 @@ begin
_sig_lock;
//FillChar(data^,SizeOf(ScePadData),1);
//FillChar(data^.touchData,SizeOf(ScePadData.touchData),1);
//connect data
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.touch[0].id:=0;
@ -166,16 +189,7 @@ begin
data^.touchData.touch[0].x:=mPoint.X;
data^.touchData.touch[0].y:=mPoint.Y;
data^.connected:=True;
data^.timestamp:=Sysutils.GetTickCount64;
data^.connectedCount:=1;
data^.leftStick.x:=$80;
data^.leftStick.y:=$80;
data^.rightStick.x:=$80;
data^.rightStick.y:=$80;
//
//keymapping
if GetAsyncKeyState(VK_W) then
data^.leftStick.y:=0;
@ -254,7 +268,6 @@ begin
if GetAsyncKeyState(VK_C) then
data^.buttons:=data^.buttons or SCE_PAD_BUTTON_R3;
_sig_unlock;
Result:=0;
end;

View File

@ -243,6 +243,9 @@ type
function _qc_sceVideoOutSubmitFlip(Flip:PqcFlipInfo):Integer;
var
MainWindows:THandle;
implementation
uses
@ -266,7 +269,10 @@ type
wait:SizeUint;
u:record
Case Byte of
0:(bufferIndex:Integer;
0:(userID,
busType,
index:Integer);
1:(bufferIndex,
flipMode:Integer;
flipArg:Int64;
_type:Integer);
@ -528,6 +534,14 @@ begin
TVBlank.OnTimer:=@OnVblank;
TVBlank.Enabled:=true;
Case node^.u.busType of
SCE_VIDEO_OUT_BUS_TYPE_MAIN:
begin
MainWindows:=FForm.Handle;
end;
else
end;
//data? nop
free_node(node);
end;
@ -556,15 +570,21 @@ begin
node:=H.alloc_node;
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^.u.userID :=userID;
node^.u.busType:=busType;
node^.u.index :=index;
Push2VideoOut(node);
H.Release;
Writeln('<sceVideoOutOpen:',userID,' ',busType);
//Writeln('<sceVideoOutOpen:',userID,' ',busType);
_sig_unlock;
end;

View File

@ -22,10 +22,56 @@ type
function BindMem(P:TvPointer):TVkResult;
end;
function VkBindSparseBufferMemory(queue:TVkQueue;buffer:TVkBuffer;bindCount:TVkUInt32;pBinds:PVkSparseMemoryBind):TVkResult;
function GetRequirements(size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
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;
var
Buffer:TvBuffer;

View File

@ -108,65 +108,19 @@ end;
function _New_simple(host:TvPointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
var
t:TvHostBuffer;
Offset,Foffset:TVkDeviceSize;
delta:TVkDeviceSize;
begin
Offset :=host.FOffset;
Foffset:=_fix_buf_size(Offset,Size,usage);
delta:=_fix_buf_size(host.FOffset,Size,usage);
t:=TvHostBuffer.Create(Size,usage,@buf_ext);
t.Fhost :=host;
t.Foffset:=Foffset;
t.Foffset:=delta;
t.BindMem(host);
Result:=t;
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;
begin
if (a<b) then Result:=a else Result:=b;
@ -180,7 +134,7 @@ var
hsize:qword;
msize:qword;
Offset,Foffset:TVkDeviceSize;
Offset,delta:TVkDeviceSize;
bind:TVkSparseMemoryBind;
Binds:AVkSparseMemoryBind;
@ -190,8 +144,8 @@ var
begin
Result:=nil;
Offset :=TVkDeviceSize(Addr); //hack align at same in virtual mem
Foffset:=_fix_buf_size(Offset,Size,usage);
//hack; alignment is the same in virtual memory
delta:=_fix_buf_size(TVkDeviceSize(Addr),Size,usage);
Binds:=Default(AVkSparseMemoryBind);
host :=Default(TvPointer);
@ -223,7 +177,7 @@ begin
t:=TvHostBuffer.CreateSparce(Size,usage,@buf_ext);
t.Foffset:=Foffset;
t.Foffset:=delta;
t.FSparse:=Binds;
VkBindSparseBufferMemory(queue,t.FHandle,Length(Binds),@Binds[0]);