diff --git a/chip/pm4_stream.pas b/chip/pm4_stream.pas index dae73e7e..06fe9d85 100644 --- a/chip/pm4_stream.pas +++ b/chip/pm4_stream.pas @@ -1204,7 +1204,7 @@ begin node^.scope :=Default(t_pm4_resource_curr_scope); // - RT:=GPU_REGS.GET_RT_INFO(0); + RT:=GPU_REGS.GET_RT_INFO(0,True); //-TM_READ +TM_CLEAR RT.IMAGE_USAGE:=RT.IMAGE_USAGE and (not TM_READ) or TM_CLEAR; @@ -1253,8 +1253,8 @@ begin node^.scope :=Default(t_pm4_resource_curr_scope); // - RT[0]:=GPU_REGS.GET_RT_INFO(0); - RT[1]:=GPU_REGS.GET_RT_INFO(1); + RT[0]:=GPU_REGS.GET_RT_INFO(0,True); + RT[1]:=GPU_REGS.GET_RT_INFO(1,True); RT[0].IMAGE_USAGE:=TM_READ; RT[1].IMAGE_USAGE:=TM_WRITE; diff --git a/vulkan/vImage.pas b/vulkan/vImage.pas index 05fb3f3c..61f505bb 100644 --- a/vulkan/vImage.pas +++ b/vulkan/vImage.pas @@ -1189,6 +1189,19 @@ begin end; end; +Function GetNormalizedTiling(tiling:TvTiling):TvTiling; inline; +begin + // + case tiling.idx of + 9,13,27:begin Result.idx:=5; Result.alt:=tiling.alt; end; + 14,28:begin Result.idx:=10; Result.alt:=tiling.alt; end; + 16,29:begin Result.idx:=11; Result.alt:=tiling.alt; end; + 17,30:begin Result.idx:=12; Result.alt:=tiling.alt; end; + else + Result:=tiling; + end; +end; + Function GetNormalizedParams(const key:TvImageKey):TvImageKeyParams; begin Result:=key.params; @@ -1199,6 +1212,8 @@ begin Result.height:=(Result.height+3) shr 2; end; + Result.tiling :=GetNormalizedTiling(Result.tiling); + Result.pitch :=0; Result.pad_width :=0; Result.pad_height:=0; diff --git a/vulkan/vImageTiling.pas b/vulkan/vImageTiling.pas index 309bae1d..73b421a9 100644 --- a/vulkan/vImageTiling.pas +++ b/vulkan/vImageTiling.pas @@ -1038,6 +1038,11 @@ begin if (IMAGE_USAGE and TM_READ)=0 then Exit; + if image.key.params.samples>1 then + begin + Exit; + end; + if image.IsDepthAndStencil then begin pm4_load_from(cmd,image.DepthOnly ,IMAGE_USAGE); @@ -1086,6 +1091,11 @@ var begin if (cmd=nil) or (image=nil) then Exit; + if image.key.params.samples>1 then + begin + Exit; + end; + if image.IsDepthAndStencil then begin pm4_write_back(cmd,image.DepthOnly ); diff --git a/vulkan/vRegs2Vulkan.pas b/vulkan/vRegs2Vulkan.pas index 27d3a771..a22b4806 100644 --- a/vulkan/vRegs2Vulkan.pas +++ b/vulkan/vRegs2Vulkan.pas @@ -114,7 +114,7 @@ type Function GET_SCREEN_SIZE:TVkExtent2D; Function GET_RT_BLEND(i:Byte):TVkPipelineColorBlendAttachmentState; //0..7 Function GET_BLEND_INFO:TBLEND_INFO; - Function GET_RT_INFO(i:Byte):TRT_INFO; //0..7 + Function GET_RT_INFO(i:Byte;ignore_mask:Boolean=False):TRT_INFO; //0..7 Function DB_ENABLE:Boolean; Function GET_DB_INFO:TDB_INFO; @@ -267,50 +267,185 @@ begin } end; -Function _fix_scissor_range(i:Word):Word; +Function _fix_scissor_range(i:Word):Word; inline; begin Result:=i; if SmallInt(Result)<0 then Result:=0; if SmallInt(Result)>16384 then Result:=16384; end; -Function TGPU_REGS.GET_SCISSOR(i:Byte):TVkRect2D; //0..15 +function Min(a,b:Integer):Integer; inline; begin + if (a0) and - ((DWORD(CX_REG^.PA_SC_VPORT_SCISSOR[i].TL)<>0) or - (DWORD(CX_REG^.PA_SC_VPORT_SCISSOR[i].BR)<>0)) then - begin - Result.offset.x :=_fix_scissor_range(CX_REG^.PA_SC_VPORT_SCISSOR[i].TL.TL_X); - Result.offset.y :=_fix_scissor_range(CX_REG^.PA_SC_VPORT_SCISSOR[i].TL.TL_Y); - Result.extent.width :=_fix_scissor_range(CX_REG^.PA_SC_VPORT_SCISSOR[i].BR.BR_X); - Result.extent.height:=_fix_scissor_range(CX_REG^.PA_SC_VPORT_SCISSOR[i].BR.BR_Y); - end else - begin - Result.offset.x :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_TL.TL_X); - Result.offset.y :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_TL.TL_Y); - Result.extent.width :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_X); - Result.extent.height:=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_Y); +function Max(a,b:Integer):Integer; inline; +begin + if (a>b) then Result:=a else Result:=b; +end; + +Function TGPU_REGS.GET_SCISSOR(i:Byte):TVkRect2D; //0..15 +var + u:record + Case Byte of + 0:( + V_TL:TPA_SC_VPORT_SCISSOR_0_TL; + V_BR:TPA_SC_VPORT_SCISSOR_0_BR; + ); + 1:( + S_TL:TPA_SC_SCREEN_SCISSOR_TL; + S_BR:TPA_SC_SCREEN_SCISSOR_BR; + ); + 2:( + W_TL:TPA_SC_WINDOW_SCISSOR_TL; + W_BR:TPA_SC_WINDOW_SCISSOR_BR; + ); + 3:( + OFS:TPA_SC_WINDOW_OFFSET; + ); end; - Result.extent.width :=Result.extent.width -Result.offset.x; - Result.extent.height:=Result.extent.height-Result.offset.y; + ofs:TVkOffset2D; + + sum:TVkRect2D; + tmp:TVkRect2D; +begin + + if (CX_REG^.PA_SC_CLIPRECT_RULE.CLIP_RULE<>$FFFF) then + begin + Assert(false,'VK_EXT_discard_rectangles'); + end; + + //Screen Scissor rectangle + u.S_TL:=CX_REG^.PA_SC_SCREEN_SCISSOR_TL; + u.S_BR:=CX_REG^.PA_SC_SCREEN_SCISSOR_BR; + // + sum.offset.x :=Min(SmallInt(u.S_TL.TL_X),16383); + sum.offset.y :=Min(SmallInt(u.S_TL.TL_Y),16383); + sum.extent.width :=Min(SmallInt(u.S_BR.BR_X),16384); + sum.extent.height:=Min(SmallInt(u.S_BR.BR_Y),16384); + // + + //Offset from screen coords to window coords + u.ofs:=CX_REG^.PA_SC_WINDOW_OFFSET; + // + ofs.x:=SmallInt(u.ofs.WINDOW_X_OFFSET); + ofs.y:=SmallInt(u.ofs.WINDOW_Y_OFFSET); + // + + if (CX_REG^.PA_SU_SC_MODE_CNTL.VTX_WINDOW_OFFSET_ENABLE<>0) then + if (DWORD(u.ofs)<>0) then + begin + Assert(false,'VTX_WINDOW_OFFSET_ENABLE'); + end; + + //Generic Scissor rectangle specification + u.V_TL:=CX_REG^.PA_SC_GENERIC_SCISSOR.TL; + u.V_BR:=CX_REG^.PA_SC_GENERIC_SCISSOR.BR; + // + tmp.offset.x :=Min(Word(u.V_TL.TL_X),16383); + tmp.offset.y :=Min(Word(u.V_TL.TL_Y),16383); + tmp.extent.width :=Min(Word(u.V_BR.BR_X),16384); + tmp.extent.height:=Min(Word(u.V_BR.BR_Y),16384); + // + if (u.V_TL.WINDOW_OFFSET_DISABLE=0) then + begin + Inc(tmp.offset.x ,ofs.x); + Inc(tmp.offset.y ,ofs.y); + Inc(tmp.extent.width ,ofs.x); + Inc(tmp.extent.height,ofs.y); + end; + // + + //apply + sum.offset.x :=Max(sum.offset.x ,tmp.offset.x ); + sum.offset.y :=Max(sum.offset.y ,tmp.offset.y ); + sum.extent.width :=Min(sum.extent.width ,tmp.extent.width ); + sum.extent.height:=Min(sum.extent.height,tmp.extent.height); + //apply + + //Window Scissor rectangle specification + u.W_TL:=CX_REG^.PA_SC_WINDOW_SCISSOR_TL; + u.W_BR:=CX_REG^.PA_SC_WINDOW_SCISSOR_BR; + // + tmp.offset.x :=Min(Word(u.W_TL.TL_X),16383); + tmp.offset.y :=Min(Word(u.W_TL.TL_Y),16383); + tmp.extent.width :=Min(Word(u.W_BR.BR_X),16384); + tmp.extent.height:=Min(Word(u.W_BR.BR_Y),16384); + // + if (u.W_TL.WINDOW_OFFSET_DISABLE=0) then + begin + Inc(tmp.offset.x ,ofs.x); + Inc(tmp.offset.y ,ofs.y); + Inc(tmp.extent.width ,ofs.x); + Inc(tmp.extent.height,ofs.y); + end; + // + + //apply + sum.offset.x :=Max(sum.offset.x ,tmp.offset.x ); + sum.offset.y :=Max(sum.offset.y ,tmp.offset.y ); + sum.extent.width :=Min(sum.extent.width ,tmp.extent.width ); + sum.extent.height:=Min(sum.extent.height,tmp.extent.height); + //apply + + if (CX_REG^.PA_SC_MODE_CNTL_0.VPORT_SCISSOR_ENABLE<>0) then + begin + u.V_TL:=CX_REG^.PA_SC_VPORT_SCISSOR[i].TL; + u.V_BR:=CX_REG^.PA_SC_VPORT_SCISSOR[i].BR; + // + tmp.offset.x :=Min(Word(u.V_TL.TL_X),16383); + tmp.offset.y :=Min(Word(u.V_TL.TL_Y),16383); + tmp.extent.width :=Min(Word(u.V_BR.BR_X),16384); + tmp.extent.height:=Min(Word(u.V_BR.BR_Y),16384); + // + if (u.V_TL.WINDOW_OFFSET_DISABLE=0) then + begin + Inc(tmp.offset.x ,ofs.x); + Inc(tmp.offset.y ,ofs.y); + Inc(tmp.extent.width ,ofs.x); + Inc(tmp.extent.height,ofs.y); + end; + // + + //apply + sum.offset.x :=Max(sum.offset.x ,tmp.offset.x ); + sum.offset.y :=Max(sum.offset.y ,tmp.offset.y ); + sum.extent.width :=Min(sum.extent.width ,tmp.extent.width ); + sum.extent.height:=Min(sum.extent.height,tmp.extent.height); + //apply + end; + + Result.offset.x :=sum.offset.x; + Result.offset.y :=sum.offset.y; + Result.extent.width :=sum.extent.width -sum.offset.x; + Result.extent.height:=sum.extent.height-sum.offset.y; end; Function TGPU_REGS.GET_SCREEN:TVkRect2D; +var + S_TL:TPA_SC_SCREEN_SCISSOR_TL; + S_BR:TPA_SC_SCREEN_SCISSOR_BR; begin - Result.offset.x :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_TL.TL_X); - Result.offset.y :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_TL.TL_Y); - Result.extent.width :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_X); - Result.extent.height:=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_Y); + S_TL:=CX_REG^.PA_SC_SCREEN_SCISSOR_TL; + S_BR:=CX_REG^.PA_SC_SCREEN_SCISSOR_BR; + // + Result.offset.x :=Min(SmallInt(S_TL.TL_X),16383); + Result.offset.y :=Min(SmallInt(S_TL.TL_Y),16383); + Result.extent.width :=Min(SmallInt(S_BR.BR_X),16384); + Result.extent.height:=Min(SmallInt(S_BR.BR_Y),16384); Result.extent.width :=Result.extent.width -Result.offset.x; Result.extent.height:=Result.extent.height-Result.offset.y; end; Function TGPU_REGS.GET_SCREEN_SIZE:TVkExtent2D; +var + S_BR:TPA_SC_SCREEN_SCISSOR_BR; begin - Result.width :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_X); - Result.height:=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_Y); + S_BR:=CX_REG^.PA_SC_SCREEN_SCISSOR_BR; + // + Result.width :=Min(SmallInt(S_BR.BR_X),16384); + Result.height:=Min(SmallInt(S_BR.BR_Y),16384); end; Function GetBlendFactor(i:Byte):TVkBlendFactor; @@ -861,8 +996,9 @@ begin end; -Function TGPU_REGS.GET_RT_INFO(i:Byte):TRT_INFO; //0..7 +Function TGPU_REGS.GET_RT_INFO(i:Byte;ignore_mask:Boolean=False):TRT_INFO; //0..7 var + scr:TVkExtent2D; RENDER_TARGET:TRENDER_TARGET; COMP_MAP:TCOMP_MAP; W:QWORD; @@ -872,7 +1008,7 @@ var begin Result:=Default(TRT_INFO); - if not RT_ENABLE(i) then + if (not ignore_mask) and (not RT_ENABLE(i)) then begin Result.attachment:=VK_ATTACHMENT_UNUSED; @@ -902,8 +1038,10 @@ begin Result.FImageInfo.Addr:=Pointer(QWORD(Result.FImageInfo.Addr) or Byte(RENDER_TARGET.VIEW.SLICE_START)); end; - Result.FImageInfo.params.width :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_X); - Result.FImageInfo.params.height:=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_Y); + scr:=GET_SCREEN_SIZE; + + Result.FImageInfo.params.width :=scr.width; + Result.FImageInfo.params.height:=scr.height; Result.FImageInfo.params.depth :=1; tmp:=(RENDER_TARGET.PITCH.TILE_MAX+1); @@ -1178,6 +1316,7 @@ const Function TGPU_REGS.GET_DB_INFO:TDB_INFO; var + scr:TVkExtent2D; RENDER_CONTROL :TDB_RENDER_CONTROL; DEPTH_CONTROL :TDB_DEPTH_CONTROL; STENCIL_CONTROL :TDB_STENCIL_CONTROL; @@ -1375,8 +1514,10 @@ begin Result.FImageInfo.Addr :=Result.Z_READ_ADDR; Result.FImageInfo.Addr2 :=Result.STENCIL_READ_ADDR; - Result.FImageInfo.params.width :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_X); - Result.FImageInfo.params.height:=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_Y); + scr:=GET_SCREEN_SIZE; + + Result.FImageInfo.params.width :=scr.width; + Result.FImageInfo.params.height:=scr.height; Result.FImageInfo.params.depth :=1; Result.FImageInfo.params.tiling.idx:=DB_Z_INFO.TILE_MODE_INDEX;