MIMG?14/MIMG bugfixes/image bugfixes

This commit is contained in:
red-prig 2023-03-08 21:18:04 +03:00
parent a87a564809
commit 8c6a8b5313
5 changed files with 184 additions and 46 deletions

View File

@ -409,7 +409,10 @@ function _get_tsharp4_cformat(PT:PTSharpResource4):TVkFormat;
function _get_tsharp4_min_lod(PT:PTSharpResource4):TVkImageViewMinLodCreateInfoEXT;
function _get_tsharp4_image_info(PT:PTSharpResource4):TvImageKey;
function _get_tsharp8_image_info(PT:PTSharpResource8):TvImageKey;
function _get_tsharp4_image_view(PT:PTSharpResource4):TvImageViewKey;
function _get_tsharp8_image_view(PT:PTSharpResource8):TvImageViewKey;
function _get_ssharp_info(PS:PSSharpResource4):TVkSamplerCreateInfo;
@ -1831,12 +1834,12 @@ begin
if _img_is_msaa(PT^._type) then
begin
Result.params.samples :=PT^.last_level;
Result.params.samples :=PT^.last_level+1;
Result.params.mipLevels:=1;
end else
begin
Result.params.samples :=1;
Result.params.mipLevels:=PT^.last_level-PT^.base_level+1;
Result.params.mipLevels:=PT^.last_level+1;
end;
//Assert(Result.params.mipLevels=1,'TODO');
@ -1845,6 +1848,29 @@ begin
Result.params.arrayLayers:=1;
end;
function _get_tsharp8_image_info(PT:PTSharpResource8):TvImageKey;
begin
Result:=_get_tsharp4_image_info(PTSharpResource4(PT));
//
Case PT^._type of
SQ_RSRC_IMG_3D:
begin
Result.params.extend.depth:=PT^.depth+1;
end;
else;
end;
//
Case PT^._type of
SQ_RSRC_IMG_1D_ARRAY ,
SQ_RSRC_IMG_2D_ARRAY ,
SQ_RSRC_IMG_2D_MSAA_ARRAY:
begin
Result.params.arrayLayers:=PT^.last_array+1;
end
else;
end;
end;
function _get_dst_sel_swizzle(b:Byte):Byte;
begin
Case b of
@ -1921,9 +1947,23 @@ begin
Result.base_level:=0; /////
Result.last_level:=0; /////
end;
function _get_tsharp8_image_view(PT:PTSharpResource8):TvImageViewKey;
begin
Result:=_get_tsharp4_image_view(PTSharpResource4(PT));
//
Case PT^._type of
SQ_RSRC_IMG_1D_ARRAY ,
SQ_RSRC_IMG_2D_ARRAY ,
SQ_RSRC_IMG_2D_MSAA_ARRAY:
begin
Result.base_array:=PT^.base_array;
Result.last_array:=PT^.last_array;
end
else;
end;
end;
function _get_xy_filter(b:Byte):TVkFilter;
begin

View File

@ -300,7 +300,7 @@ type
pow2pad:bit1; //memory footprint is padded to power of 2 dimensions
mtype_L1M:bit1;
reserved:bit1;
_type:bit4; //values [8..15] are 1D, 2D, 3D, Cube, 1D array, 2D array, 2D MSAA, 2D MSAA array; 0 is V#, 1-7 reserved
_type:bit4; //values [8..15] are 1D, 2D, 3D, Cube, 1D array, 2D array, 2D MSAA, 2D MSAA array; 0 is V#, 1-7 reserved
//32
depth:bit13; //3D texture depth (0..8192)
pitch:bit14; //texture pitch in texels (0..16383); defaults to width

View File

@ -32,8 +32,8 @@ type
procedure emit_MIMG;
procedure DistribDmask(DMASK:Byte;dst:PsrRegNode;info:PsrImageInfo);
function GatherDmask(telem:TsrDataType):PsrRegNode;
Function GatherCoord_f(var offset:DWORD;dim_id:Byte):PsrRegNode;
Function GatherCoord_u(var offset:DWORD;dim_id:Byte):PsrRegNode;
Function GatherCoord_f(var offset:DWORD;info:PsrImageInfo):PsrRegNode;
Function GatherCoord_u(var offset:DWORD;info:PsrImageInfo):PsrRegNode;
Function Gather_value(var offset:DWORD;rtype:TsrDataType):PsrRegNode;
Function Gather_packed_offset(var offset:DWORD;dim:Byte):PsrRegNode;
procedure Gather_sample_param(var p:TImgSampleParam;info:PsrImageInfo);
@ -42,6 +42,7 @@ type
procedure emit_image_sample_gather(Tgrp:PsrNode;info:PsrImageInfo);
procedure emit_image_load(Tgrp:PsrNode;info:PsrImageInfo);
procedure emit_image_store(Tgrp:PsrNode;info:PsrImageInfo);
procedure emit_get_resinfo(Tgrp:PsrNode;info:PsrImageInfo);
end;
implementation
@ -372,6 +373,7 @@ begin
Dim.Dim2D:Result:=2;
Dim.Dim3D:Result:=3;
Dim.Cube :Result:=3;
else;
end;
end;
@ -488,8 +490,12 @@ end;
procedure TEmit_MIMG.DistribDmask(DMASK:Byte;dst:PsrRegNode;info:PsrImageInfo); //result
var
pSlot:PsrRegSlot;
i,d:Byte;
dtype:TsrDataType;
i,d,max:Byte;
begin
dtype:=dst^.dtype.Child;
max :=dst^.dtype.Count;
d:=0;
For i:=0 to 3 do
if DMASK.TestBit(i) then
@ -505,11 +511,17 @@ begin
MakeCopy(pSlot,dst);
end else
begin
SetConst_i(pSlot,info^.dtype,0);
SetConst_i(pSlot,dtype,0);
end;
end else
begin
OpExtract(line,pSlot^.New(line,info^.dtype),dst,i);
if (i<max) then
begin
OpExtract(line,pSlot^.New(line,dtype),dst,i);
end else
begin
SetConst_i(pSlot,dtype,0);
end;
end;
end;
@ -541,17 +553,17 @@ begin
Result:=OpMakeVec(line,telem.AsVector(m+1),@src);
end;
Function TEmit_MIMG.GatherCoord_f(var offset:DWORD;dim_id:Byte):PsrRegNode; //src
Function TEmit_MIMG.GatherCoord_f(var offset:DWORD;info:PsrImageInfo):PsrRegNode; //src
var
src:array[0..3] of PsrRegNode;
i,count:Byte;
begin
Result:=nil;
count:=GetDimCount(dim_id);
count:=GetDimCount(info^.tinfo.Dim);
if (FSPI.MIMG.DA<>0) then Inc(count); //slice
if (dim_id=Dim.Cube) then
if (info^.tinfo.Dim=Dim.Cube) then
begin
//x,y,slice,(face_id+slice*8)
@ -566,6 +578,12 @@ begin
src[0]:=fetch_vsrc8(FSPI.MIMG.VADDR+offset+0,dtFloat32); //x
src[1]:=fetch_vsrc8(FSPI.MIMG.VADDR+offset+1,dtFloat32); //y
src[2]:=fetch_vsrc8(FSPI.MIMG.VADDR+offset+2,dtFloat32); //face
if (info^.tinfo.Arrayed<>0) then //is array
begin
Inc(count);
src[3]:=NewReg_s(dtFloat32,0);
end;
end;
Result:=OpMakeCub(line,TsrDataType(dtFloat32).AsVector(count),@src);
@ -578,6 +596,15 @@ begin
src[i]:=fetch_vsrc8(FSPI.MIMG.VADDR+offset+i,dtFloat32);
end;
if (info^.tinfo.Arrayed<>0) and //is array
(FSPI.MIMG.DA=0) then //not slice
begin
i:=count;
Inc(count);
src[i]:=NewReg_s(dtFloat32,0);
end;
if (count=1) then
begin
Result:=src[0];
@ -591,17 +618,17 @@ begin
offset:=offset+count;
end;
Function TEmit_MIMG.GatherCoord_u(var offset:DWORD;dim_id:Byte):PsrRegNode; //src
Function TEmit_MIMG.GatherCoord_u(var offset:DWORD;info:PsrImageInfo):PsrRegNode; //src
var
src:array[0..3] of PsrRegNode;
i,count:Byte;
begin
Result:=nil;
count:=GetDimCount(dim_id);
count:=GetDimCount(info^.tinfo.Dim);
if (FSPI.MIMG.DA<>0) then Inc(count); //slice
if (dim_id=Dim.Cube) then
if (info^.tinfo.Dim=Dim.Cube) then
begin
//x,y,slice,(face_id+slice*8)
@ -616,6 +643,12 @@ begin
src[0]:=fetch_vsrc8(FSPI.MIMG.VADDR+offset+0,dtInt32); //x
src[1]:=fetch_vsrc8(FSPI.MIMG.VADDR+offset+1,dtInt32); //y
src[2]:=fetch_vsrc8(FSPI.MIMG.VADDR+offset+2,dtInt32); //face
if (info^.tinfo.Arrayed<>0) then //is array
begin
Inc(count);
src[3]:=NewReg_i(dtInt32,0);
end;
end;
Result:=OpMakeCub(line,TsrDataType(dtInt32).AsVector(count),@src);
@ -628,6 +661,15 @@ begin
src[i]:=fetch_vsrc8(FSPI.MIMG.VADDR+offset+i,dtInt32);
end;
if (info^.tinfo.Arrayed<>0) and //is array
(FSPI.MIMG.DA=0) then //not slice
begin
i:=count;
Inc(count);
src[i]:=NewReg_i(dtInt32,0);
end;
if (count=1) then
begin
Result:=src[0];
@ -695,7 +737,7 @@ begin
Assert(false,'TODO imGrad');
end;
p.coord:=GatherCoord_f(p.roffset,info^.tinfo.Dim);
p.coord:=GatherCoord_f(p.roffset,info);
if (imLod in p.mods) then
begin
@ -894,7 +936,7 @@ begin
Case FSPI.MIMG.OP of
IMAGE_LOAD:
begin
coord:=GatherCoord_u(roffset,info^.tinfo.Dim);
coord:=GatherCoord_u(roffset,info);
node:=OpImageFetch(line,Tgrp,dst,coord);
if (info^.tinfo.MS<>0) then //fragid T# 2D MSAA
@ -907,7 +949,7 @@ begin
end;
IMAGE_LOAD_MIP: //All except MSAA
begin
coord:=GatherCoord_u(roffset,info^.tinfo.Dim);
coord:=GatherCoord_u(roffset,info);
node:=OpImageFetch(line,Tgrp,dst,coord);
lod:=Gather_value(roffset,dtUint32);
@ -937,7 +979,7 @@ begin
Case FSPI.MIMG.OP of
IMAGE_STORE:
begin
coord:=GatherCoord_u(roffset,info^.tinfo.Dim);
coord:=GatherCoord_u(roffset,info);
node:=OpImageWrite(line,Tgrp,coord,dst);
if (info^.tinfo.MS<>0) then //fragid T# 2D MSAA
@ -950,7 +992,7 @@ begin
end;
IMAGE_STORE_MIP: //All except MSAA
begin
coord:=GatherCoord_u(roffset,info^.tinfo.Dim);
coord:=GatherCoord_u(roffset,info);
node:=OpImageWrite(line,Tgrp,coord,dst);
lod:=Gather_value(roffset,dtUint32);
@ -964,6 +1006,37 @@ begin
end;
procedure TEmit_MIMG.emit_get_resinfo(Tgrp:PsrNode;info:PsrImageInfo);
var
offset:DWORD;
dst,lod:PsrRegNode;
dvec:TsrDataType;
count:Byte;
begin
offset:=0;
lod:=Gather_value(offset,dtUint32);
count:=1;
Case info^.tinfo.Dim of
Dim.Dim2D:count:=2;
Dim.Cube :count:=2;
Dim.Dim3D:count:=3;
else;
end;
if (info^.tinfo.Arrayed<>0) then Inc(count);
dvec:=TsrDataType(dtUint32).AsVector(count);
dst:=NewReg(dvec);
_Op2(line,Op.OpImageQuerySizeLod,dst,PsrRegNode(Tgrp),lod);
DistribDmask(FSPI.MIMG.DMASK,dst,info);
AddCapability(Capability.ImageQuery);
end;
procedure TEmit_MIMG.emit_MIMG;
var
src:array[0..7] of PsrRegSlot;
@ -977,15 +1050,15 @@ begin
pLayout:=nil;
Case FSPI.MIMG.R128 of
0:
0: //256=8 *4*8
begin
if not get_srsrc(FSPI.MIMG.SRSRC,8,@src) then Assert(false);
pLayout:=GroupingSharp(src,rtTSharp4);
pLayout:=GroupingSharp(src,rtTSharp8);
end;
1:
1: //128=4 *4*8
begin
if not get_srsrc(FSPI.MIMG.SRSRC,4,@src) then Assert(false);
pLayout:=GroupingSharp(src,rtTSharp8);
pLayout:=GroupingSharp(src,rtTSharp4);
end;
end;
@ -1033,6 +1106,14 @@ begin
emit_image_store(Tgrp,@info);
end;
IMAGE_GET_RESINFO: //get info by mip
begin
info.tinfo.Sampled:=1;
Tgrp:=FetchImage(pLayout,info.dtype,info.tinfo);
emit_GET_RESINFO(Tgrp,@info);
end;
else
Assert(false,'MIMG?'+IntToStr(FSPI.MIMG.OP));
end;

View File

@ -64,12 +64,12 @@ begin
begin
extend.width :=(extend.width +3) div 4;
extend.height :=(extend.height +3) div 4;
extend.depth :=(extend.depth +3) div 4;
end;
Result:=extend.width*
extend.height*
extend.depth*
image.key.params.arrayLayers*
getFormatSize(image.key.cformat);
end;
@ -274,7 +274,7 @@ var
//tp:TilingParameters;
tiler:Tiler1d;
//mtm:Byte;
size,i,x,y,z:QWORD;
size,i,x,y,z,a:QWORD;
m_bytePerElement:Word;
m_bitsPerElement:Word;
@ -402,10 +402,7 @@ begin
//m_tilesPerRow = m_paddedWidth / kMicroTileWidth;
//m_tilesPerSlice = std::max(m_tilesPerRow * (m_paddedHeight / kMicroTileHeight), 1U);
size:=tiler.m_linearWidth*
tiler.m_linearHeight*
tiler.m_linearDepth*
m_bytePerElement;
size:=tiler.m_linearSizeBytes*image.key.params.arrayLayers;
buf:=TvTempBuffer.Create(size,ord(VK_BUFFER_USAGE_TRANSFER_SRC_BIT),nil);
buf.Fhost:=MemManager.Alloc(buf.GetRequirements,ord(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
@ -423,17 +420,18 @@ begin
m_slice_size:=(tiler.m_linearWidth*tiler.m_linearHeight);
For z:=0 to tiler.m_linearDepth-1 do
For y:=0 to tiler.m_linearHeight-1 do
For x:=0 to tiler.m_linearWidth-1 do
begin
i:=0;
tiler.getTiledElementBitOffset(i,x,y,z);
i:=i div 8;
pSrc:=@PByte(image.key.Addr)[i];
pDst:=@PByte(pData)[(z*m_slice_size+y*tiler.m_linearWidth+x)*m_bytePerElement];
Move(pSrc^,pDst^,m_bytePerElement);
end;
For a:=0 to image.key.params.arrayLayers-1 do
For z:=0 to tiler.m_linearDepth-1 do
For y:=0 to tiler.m_linearHeight-1 do
For x:=0 to tiler.m_linearWidth-1 do
begin
i:=0;
tiler.getTiledElementBitOffset(i,x,y,z);
i:=i div 8;
pSrc:=@PByte(image.key.Addr)[a*tiler.m_tiledSizeBytes+i];
pDst:=@PByte(pData)[a*tiler.m_linearSizeBytes+(z*m_slice_size+y*tiler.m_linearWidth+x)*m_bytePerElement];
Move(pSrc^,pDst^,m_bytePerElement);
end;
//Move(pData^,image.key.Addr^,size);
//FreeMem(pData);

View File

@ -169,6 +169,7 @@ type
Procedure AddBufPtr(P:Pointer;fset,size,bind,offset:DWord);
Procedure AddTSharp4(PT:PTSharpResource4;fset,bind:DWord);
Procedure AddTSharp8(PT:PTSharpResource8;fset,bind:DWord);
Procedure AddSSharp4(PS:PSSharpResource4;fset,bind:DWord);
procedure AddAttr(const b:TvCustomLayout;Fset:TVkUInt32;FData:PDWORD);
end;
@ -695,6 +696,28 @@ begin
FImages[i]:=b;
end;
Procedure TvUniformBuilder.AddTSharp8(PT:PTSharpResource8;fset,bind:DWord);
var
b:TImageBindExt;
i:Integer;
begin
Assert(PT<>nil);
if (PT=nil) then Exit;
//print_tsharp8(PT);
b:=Default(TImageBindExt);
b.fset:=fset;
b.bind:=bind;
b.FImage:=_get_tsharp8_image_info(PT);
b.FView :=_get_tsharp8_image_view(PT);
i:=Length(FImages);
SetLength(FImages,i+1);
FImages[i]:=b;
end;
procedure TvUniformBuilder.AddAttr(const b:TvCustomLayout;Fset:TVkUInt32;FData:PDWORD);
var
P:Pointer;
@ -713,11 +736,7 @@ begin
VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
Case b.addr[0].rtype of
vtTSharp4:AddTSharp4(P,fset,b.bind);
vtTSharp8:
begin
print_tsharp8(P);
Assert(false);
end;
vtTSharp8:AddTSharp8(P,fset,b.bind);
else
Assert(false);
end;