diff --git a/chip/ps4_videodrv.pas b/chip/ps4_videodrv.pas index 5db1b46e..b7fa9453 100644 --- a/chip/ps4_videodrv.pas +++ b/chip/ps4_videodrv.pas @@ -2385,6 +2385,7 @@ begin if UpdateGpuRegsInfo then begin Addr:=getIndexAddress(GPU_REGS.VGT_DMA.BASE_LO,GPU_REGS.VGT_DMA.BASE_HI); + GFXRing.CmdBuffer.instanceCount:=GPU_REGS.VGT_DMA.NUM_INSTANCES; GFXRing.CmdBuffer.DrawIndex2(Addr,GPU_REGS.VGT_DMA.INDICES,GPU_REGS.GET_INDEX_TYPE); end; @@ -2408,6 +2409,7 @@ begin if UpdateGpuRegsInfo then begin + GFXRing.CmdBuffer.instanceCount:=GPU_REGS.VGT_DMA.NUM_INSTANCES; GFXRing.CmdBuffer.DrawIndexAuto(GPU_REGS.VGT_DMA.INDICES); end; @@ -2441,6 +2443,7 @@ begin if UpdateGpuRegsInfo then begin Addr:=getIndexAddress(GPU_REGS.VGT_DMA.BASE_LO,GPU_REGS.VGT_DMA.BASE_HI); + GFXRing.CmdBuffer.instanceCount:=GPU_REGS.VGT_DMA.NUM_INSTANCES; GFXRing.CmdBuffer.DrawIndexOffset2(Addr,Body^.indexOffset,GPU_REGS.VGT_DMA.INDICES,GPU_REGS.GET_INDEX_TYPE); end; @@ -2475,7 +2478,6 @@ type procedure onNumInstances(pm4Hdr:PM4_TYPE_3_HEADER;Body:PVGT_DMA_NUM_INSTANCES); begin GPU_REGS.VGT_DMA.NUM_INSTANCES:=Body^; - Assert(GPU_REGS.VGT_DMA.NUM_INSTANCES<=1,'instancing TODO:'+IntToStr(GPU_REGS.VGT_DMA.NUM_INSTANCES)); {$ifdef ww}Writeln('onNumInstances:',Body^);{$endif} end; diff --git a/vulkan/vCmdBuffer.pas b/vulkan/vCmdBuffer.pas index 84b5902a..22b28d2f 100644 --- a/vulkan/vCmdBuffer.pas +++ b/vulkan/vCmdBuffer.pas @@ -137,6 +137,7 @@ type TvCmdBuffer=class(TvCustomCmdBuffer) emulate_primtype:Integer; + instanceCount:DWORD; function BeginRenderPass(RT:TvRenderTargets):Boolean; @@ -868,6 +869,8 @@ begin if (FRenderPass=VK_NULL_HANDLE) then Exit; if (FCurrPipeline[0]=VK_NULL_HANDLE) then Exit; + if (instanceCount=0) then instanceCount:=1; + Size:=INDICES*GET_INDEX_TYPE_SIZE(INDEX_TYPE); rb:=FetchHostBuffer(Self,Addr,Size,ord(VK_BUFFER_USAGE_INDEX_BUFFER_BIT)); @@ -888,15 +891,16 @@ begin begin vkCmdDrawIndexed( cmdbuf, - INDICES, //indexCount - 1, //instanceCount - OFFSET, //firstIndex - 0, //vertexOffset - 0); //firstInstance + INDICES, //indexCount + instanceCount, //instanceCount + OFFSET, //firstIndex + 0, //vertexOffset + 0); //firstInstance end; DI_PT_QUADLIST: begin - Assert(OFFSET=0); + Assert(instanceCount<=1,'instance DI_PT_QUADLIST'); + Assert(OFFSET=0,'OFFSET DI_PT_QUADLIST'); h:=INDICES div 4; if (h>0) then h:=h-1; For i:=0 to h do @@ -930,17 +934,22 @@ begin if (FRenderPass=VK_NULL_HANDLE) then Exit; if (FCurrPipeline[0]=VK_NULL_HANDLE) then Exit; + if (instanceCount=0) then instanceCount:=1; + Case emulate_primtype of 0: begin vkCmdDraw( cmdbuf, - INDICES, - 1,0,0); + INDICES, //vertexCount + instanceCount, //instanceCount + 0, //firstVertex + 0); //firstInstance end; DI_PT_RECTLIST : begin + Assert(instanceCount<=1,'instance DI_PT_RECTLIST'); { 0 3 1 2 @@ -965,6 +974,7 @@ begin //DI_PT_LINELOOP :; DI_PT_QUADLIST : begin + Assert(instanceCount<=1,'instance DI_PT_QUADLIST'); h:=INDICES div 4; if (h>0) then h:=h-1; For i:=0 to h do @@ -972,10 +982,10 @@ begin Inc(cmd_count); vkCmdDraw( cmdbuf, - 4, - 1, - i*4, - 0); + 4, //vertexCount + 1, //instanceCount + i*4, //firstVertex + 0); //firstInstance end; end; //DI_PT_QUADSTRIP:;