mirror of
https://github.com/red-prig/fpPS4.git
synced 2024-11-26 16:10:25 +00:00
447 lines
12 KiB
ObjectPascal
447 lines
12 KiB
ObjectPascal
unit srVBufInfo;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
ps4_pssl,
|
|
srType,
|
|
srLayout,
|
|
spirv;
|
|
|
|
type
|
|
//Destination channel select:
|
|
//0=0, 1=1, 4=R, 5=G, 6=B, 7=A
|
|
Tdst_sel=array[0..3] of Byte;
|
|
|
|
TBuf_info=packed object
|
|
grp:PsrDataLayout;
|
|
dsel:Tdst_sel;
|
|
DFMT:Byte; //BUF_DATA_FORMAT_*
|
|
NFMT:Byte; //BUF_NUM_FORMAT_*
|
|
count:Byte; //count reg dst
|
|
function GetResultType:TsrDataType;
|
|
function GetElemType:TsrDataType;
|
|
function GetElemCount:Byte; inline;
|
|
function GetElemSize:Byte; inline;
|
|
function GetSizeFormat:Byte; inline;
|
|
function GetAlignSize:Byte; inline;
|
|
function IsComp:Boolean;
|
|
function IsExtFormat:Boolean;
|
|
function GetImageFormat:Byte;
|
|
function GetImageFormatElement:Byte;
|
|
function GetImageInfo:TsrImageInfo;
|
|
function GetImageInfoElement:TsrImageInfo;
|
|
end;
|
|
|
|
const
|
|
dst_sel_identity:Tdst_sel=(4,5,6,7);
|
|
|
|
function Buf_info(grp:PsrDataLayout;dsel:Tdst_sel;DFMT,NFMT,count:Byte):TBuf_info; inline;
|
|
function dst_sel(r,g,b,a:Byte):Tdst_sel; inline;
|
|
function get_reverse_dst_sel(dst:Tdst_sel):Tdst_sel;
|
|
function GetElemCount(DFMT:Byte):Byte; inline;
|
|
|
|
implementation
|
|
|
|
const
|
|
DFMT_ELEM_COUNT:array[0..15] of Byte=(
|
|
0, //BUF_DATA_FORMAT_INVALID
|
|
1, //BUF_DATA_FORMAT_8
|
|
1, //BUF_DATA_FORMAT_16
|
|
2, //BUF_DATA_FORMAT_8_8
|
|
1, //BUF_DATA_FORMAT_32
|
|
2, //BUF_DATA_FORMAT_16_16
|
|
3, //BUF_DATA_FORMAT_10_11_11
|
|
3, //BUF_DATA_FORMAT_11_11_10
|
|
4, //BUF_DATA_FORMAT_10_10_10_2
|
|
4, //BUF_DATA_FORMAT_2_10_10_10
|
|
4, //BUF_DATA_FORMAT_8_8_8_8
|
|
2, //BUF_DATA_FORMAT_32_32
|
|
4, //BUF_DATA_FORMAT_16_16_16_16
|
|
3, //BUF_DATA_FORMAT_32_32_32
|
|
4, //BUF_DATA_FORMAT_32_32_32_32
|
|
0); //BUF_DATA_FORMAT_RESERVED
|
|
|
|
DFMT_ELEM_SIZE:array[0..15] of Byte=(
|
|
0, //BUF_DATA_FORMAT_INVALID
|
|
1, //BUF_DATA_FORMAT_8
|
|
2, //BUF_DATA_FORMAT_16
|
|
1, //BUF_DATA_FORMAT_8_8
|
|
4, //BUF_DATA_FORMAT_32
|
|
2, //BUF_DATA_FORMAT_16_16
|
|
4, //BUF_DATA_FORMAT_10_11_11
|
|
4, //BUF_DATA_FORMAT_11_11_10
|
|
4, //BUF_DATA_FORMAT_10_10_10_2
|
|
4, //BUF_DATA_FORMAT_2_10_10_10
|
|
1, //BUF_DATA_FORMAT_8_8_8_8
|
|
4, //BUF_DATA_FORMAT_32_32
|
|
2, //BUF_DATA_FORMAT_16_16_16_16
|
|
4, //BUF_DATA_FORMAT_32_32_32
|
|
4, //BUF_DATA_FORMAT_32_32_32_32
|
|
0); //BUF_DATA_FORMAT_RESERVED
|
|
|
|
DFMT_SIZE:array[0..15] of Byte=(
|
|
0, //BUF_DATA_FORMAT_INVALID
|
|
1, //BUF_DATA_FORMAT_8 //shr 2
|
|
2, //BUF_DATA_FORMAT_16 //shr 2
|
|
2, //BUF_DATA_FORMAT_8_8 //shr 2
|
|
4, //BUF_DATA_FORMAT_32 //shr 2
|
|
4, //BUF_DATA_FORMAT_16_16 //shr 2
|
|
4, //BUF_DATA_FORMAT_10_11_11 //shr 2
|
|
4, //BUF_DATA_FORMAT_11_11_10 //shr 2
|
|
4, //BUF_DATA_FORMAT_10_10_10_2 //shr 2
|
|
4, //BUF_DATA_FORMAT_2_10_10_10 //shr 2
|
|
4, //BUF_DATA_FORMAT_8_8_8_8 //shr 2
|
|
8, //BUF_DATA_FORMAT_32_32 //shr 3
|
|
8, //BUF_DATA_FORMAT_16_16_16_16 //shr 3
|
|
12, //BUF_DATA_FORMAT_32_32_32 //div 12
|
|
16, //BUF_DATA_FORMAT_32_32_32_32 //shr 4
|
|
0); //BUF_DATA_FORMAT_RESERVED
|
|
|
|
function Buf_info(grp:PsrDataLayout;dsel:Tdst_sel;DFMT,NFMT,count:Byte):TBuf_info; inline;
|
|
begin
|
|
Result.grp :=grp;
|
|
Result.dsel :=dsel;
|
|
Result.DFMT :=DFMT;
|
|
Result.NFMT :=NFMT;
|
|
Result.count:=count;
|
|
end;
|
|
|
|
function dst_sel(r,g,b,a:Byte):Tdst_sel; inline;
|
|
begin
|
|
Result[0]:=r;
|
|
Result[1]:=g;
|
|
Result[2]:=b;
|
|
Result[3]:=a;
|
|
end;
|
|
|
|
function get_reverse_dst_sel(dst:Tdst_sel):Tdst_sel;
|
|
var
|
|
i,f,d:Byte;
|
|
begin
|
|
Result:=Default(Tdst_sel);
|
|
For i:=0 to 3 do
|
|
For f:=0 to 3 do
|
|
begin
|
|
d:=dst[f];
|
|
Case d of
|
|
4..7:
|
|
begin
|
|
d:=d-4;
|
|
if (i=d) then
|
|
begin
|
|
Result[i]:=f+4;
|
|
Break;
|
|
end;
|
|
end;
|
|
else;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TBuf_info.GetResultType:TsrDataType;
|
|
begin
|
|
Result:=dtFloat32;
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UINT:Result:=dtUint32;
|
|
BUF_NUM_FORMAT_SINT:Result:=dtInt32;
|
|
else;
|
|
end;
|
|
end;
|
|
|
|
function TBuf_info.GetElemType:TsrDataType;
|
|
begin
|
|
Result:=dtUnknow;
|
|
Case DFMT_ELEM_SIZE[DFMT] of
|
|
1:Case NFMT of
|
|
BUF_NUM_FORMAT_SNORM ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_SINT ,
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=dtInt8;
|
|
else Result:=dtUint8;
|
|
end;
|
|
2:Case NFMT of
|
|
BUF_NUM_FORMAT_SNORM ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_SINT ,
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=dtInt16;
|
|
BUF_NUM_FORMAT_FLOAT :Result:=dtHalf16;
|
|
else Result:=dtUint16;
|
|
end;
|
|
4:Case NFMT of
|
|
BUF_NUM_FORMAT_SNORM ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_SINT ,
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=dtInt32;
|
|
BUF_NUM_FORMAT_FLOAT :Result:=dtFloat32;
|
|
else Result:=dtUint32;
|
|
end;
|
|
else;
|
|
end;
|
|
end;
|
|
|
|
function GetElemCount(DFMT:Byte):Byte; inline;
|
|
begin
|
|
Result:=DFMT_ELEM_COUNT[DFMT];
|
|
end;
|
|
|
|
function TBuf_info.GetElemCount:Byte; inline;
|
|
begin
|
|
Result:=DFMT_ELEM_COUNT[DFMT];
|
|
end;
|
|
|
|
function TBuf_info.GetElemSize:Byte; inline;
|
|
begin
|
|
Result:=DFMT_ELEM_SIZE[DFMT];
|
|
end;
|
|
|
|
function TBuf_info.GetSizeFormat:Byte; inline;
|
|
begin
|
|
Result:=DFMT_SIZE[DFMT];
|
|
end;
|
|
|
|
function Min(a,b:PtrInt):PtrInt; inline;
|
|
begin
|
|
if (a<b) then Result:=a else Result:=b;
|
|
end;
|
|
|
|
function TBuf_info.GetAlignSize:Byte; inline;
|
|
begin
|
|
Result:=Min(4,GetSizeFormat);
|
|
end;
|
|
|
|
function TBuf_info.IsComp:Boolean;
|
|
begin
|
|
Case DFMT of
|
|
BUF_DATA_FORMAT_8 ,
|
|
BUF_DATA_FORMAT_16 ,
|
|
BUF_DATA_FORMAT_8_8 ,
|
|
BUF_DATA_FORMAT_16_16 ,
|
|
BUF_DATA_FORMAT_10_11_11 ,
|
|
BUF_DATA_FORMAT_11_11_10 ,
|
|
BUF_DATA_FORMAT_10_10_10_2 ,
|
|
BUF_DATA_FORMAT_2_10_10_10 ,
|
|
BUF_DATA_FORMAT_8_8_8_8 ,
|
|
BUF_DATA_FORMAT_16_16_16_16:Result:=True;
|
|
else
|
|
Result:=False;
|
|
end;
|
|
end;
|
|
|
|
function TBuf_info.IsExtFormat:Boolean;
|
|
begin
|
|
Case DFMT of
|
|
BUF_DATA_FORMAT_10_11_11 ,
|
|
BUF_DATA_FORMAT_11_11_10 ,
|
|
BUF_DATA_FORMAT_10_10_10_2 ,
|
|
BUF_DATA_FORMAT_2_10_10_10 :Result:=True;
|
|
else
|
|
Result:=False;
|
|
end;
|
|
end;
|
|
|
|
function TBuf_info.GetImageFormat:Byte;
|
|
begin
|
|
Result:=ImageFormat.Unknown;
|
|
Case DFMT of
|
|
BUF_DATA_FORMAT_8 : //R8 R8Snorm R8ui R8i
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.R8;
|
|
BUF_NUM_FORMAT_SNORM :Result:=ImageFormat.R8Snorm;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.R8ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.R8i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.R8i;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_16 : //R16 R16Snorm R16ui R16i R16f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.R16;
|
|
BUF_NUM_FORMAT_SNORM :Result:=ImageFormat.R16Snorm;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.R16ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.R16i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.R16i;
|
|
BUF_NUM_FORMAT_USCALED ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.R16f;
|
|
end;
|
|
BUF_DATA_FORMAT_8_8 : //Rg8 Rg8Snorm Rg8ui Rg8i
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.Rg8;
|
|
BUF_NUM_FORMAT_SNORM :Result:=ImageFormat.Rg8Snorm;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.Rg8ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.Rg8i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.Rg8i;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_32 : //R32ui R32i R32f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.R32ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.R32i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.R32i;
|
|
BUF_NUM_FORMAT_USCALED ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.R32f;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_16_16 : //Rg16 Rg16Snorm Rg16ui Rg16i Rg16f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.Rg16;
|
|
BUF_NUM_FORMAT_SNORM :Result:=ImageFormat.Rg16Snorm;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.Rg16ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.Rg16i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.Rg16i;
|
|
BUF_NUM_FORMAT_USCALED ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.Rg16f;
|
|
end;
|
|
BUF_DATA_FORMAT_10_11_11 ,
|
|
BUF_DATA_FORMAT_11_11_10 : //R11fG11fB10f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.R11fG11fB10f;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_10_10_10_2 ,
|
|
BUF_DATA_FORMAT_2_10_10_10 : //Rgb10A2 Rgb10a2ui
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.Rgb10A2;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.Rgb10a2ui;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_8_8_8_8 : //Rgba8 Rgba8Snorm Rgba8ui Rgba8i
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.Rgba8;
|
|
BUF_NUM_FORMAT_SNORM :Result:=ImageFormat.Rgba8Snorm;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.Rgba8ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.Rgba8i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.Rgba8i;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_32_32 : //Rg32ui Rg32i Rg32f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.Rg32ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.Rg32i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.Rg32i;
|
|
BUF_NUM_FORMAT_USCALED ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.Rg32f;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_16_16_16_16: //Rgba16 Rgba16Snorm Rgba16ui Rgba16i Rgba16f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.Rgba16;
|
|
BUF_NUM_FORMAT_SNORM :Result:=ImageFormat.Rgba16Snorm;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.Rgba16ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.Rgba16i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.Rgba16i;
|
|
BUF_NUM_FORMAT_USCALED ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.Rgba16f;
|
|
end;
|
|
BUF_DATA_FORMAT_32_32_32 ,
|
|
BUF_DATA_FORMAT_32_32_32_32: //Rgba32ui Rgba32i Rgba32f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.Rgba32ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.Rgba32i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.Rgba32i;
|
|
BUF_NUM_FORMAT_USCALED ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.Rgba32f;
|
|
else;
|
|
end;
|
|
else;
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
function TBuf_info.GetImageFormatElement:Byte;
|
|
begin
|
|
Result:=ImageFormat.Unknown;
|
|
Case DFMT of
|
|
BUF_DATA_FORMAT_8 ,
|
|
BUF_DATA_FORMAT_8_8 ,
|
|
BUF_DATA_FORMAT_8_8_8_8 : //R8 R8Snorm R8ui R8i
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.R8;
|
|
BUF_NUM_FORMAT_SNORM :Result:=ImageFormat.R8Snorm;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.R8ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.R8i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.R8i;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_16 ,
|
|
BUF_DATA_FORMAT_16_16 ,
|
|
BUF_DATA_FORMAT_16_16_16_16: //R16 R16Snorm R16ui R16i R16f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.R16;
|
|
BUF_NUM_FORMAT_SNORM :Result:=ImageFormat.R16Snorm;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.R16ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.R16i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.R16i;
|
|
BUF_NUM_FORMAT_USCALED ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.R16f;
|
|
end;
|
|
BUF_DATA_FORMAT_32 , //R32ui R32i R32f
|
|
BUF_DATA_FORMAT_32_32 ,
|
|
BUF_DATA_FORMAT_32_32_32 ,
|
|
BUF_DATA_FORMAT_32_32_32_32:
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.R32ui;
|
|
BUF_NUM_FORMAT_SINT :Result:=ImageFormat.R32i;
|
|
BUF_NUM_FORMAT_SNORM_NZ:Result:=ImageFormat.R32i;
|
|
BUF_NUM_FORMAT_USCALED ,
|
|
BUF_NUM_FORMAT_SSCALED ,
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.R32f;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_10_11_11 ,
|
|
BUF_DATA_FORMAT_11_11_10 : //R11fG11fB10f
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_FLOAT :Result:=ImageFormat.R11fG11fB10f;
|
|
else;
|
|
end;
|
|
BUF_DATA_FORMAT_10_10_10_2 ,
|
|
BUF_DATA_FORMAT_2_10_10_10 : //Rgb10A2 Rgb10a2ui
|
|
Case NFMT of
|
|
BUF_NUM_FORMAT_UNORM :Result:=ImageFormat.Rgb10A2;
|
|
BUF_NUM_FORMAT_UINT :Result:=ImageFormat.Rgb10a2ui;
|
|
else;
|
|
end;
|
|
else;
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
function TBuf_info.GetImageInfo:TsrImageInfo;
|
|
begin
|
|
Result:=Default(TsrImageInfo);
|
|
Result.dtype:=GetResultType;
|
|
|
|
Result.tinfo.Dim :=Dim.Buffer;
|
|
Result.tinfo.Depth :=2;
|
|
Result.tinfo.Arrayed:=0;
|
|
Result.tinfo.MS :=0;
|
|
Result.tinfo.Sampled:=2;
|
|
Result.tinfo.Format :=GetImageFormat;
|
|
end;
|
|
|
|
function TBuf_info.GetImageInfoElement:TsrImageInfo;
|
|
begin
|
|
Result:=Default(TsrImageInfo);
|
|
Result.dtype:=GetResultType;
|
|
|
|
Result.tinfo.Dim :=Dim.Buffer;
|
|
Result.tinfo.Depth :=2;
|
|
Result.tinfo.Arrayed:=0;
|
|
Result.tinfo.MS :=0;
|
|
Result.tinfo.Sampled:=2;
|
|
Result.tinfo.Format :=GetImageFormatElement;
|
|
end;
|
|
|
|
end.
|
|
|