diff --git a/vulkan/vImage.pas b/vulkan/vImage.pas index 605454bf..eb8511ae 100644 --- a/vulkan/vImage.pas +++ b/vulkan/vImage.pas @@ -165,8 +165,50 @@ type Function GetAspectMaskByFormat(cformat:TVkFormat):DWORD; +Function getFormatSize(cformat:TVkFormat):Byte; //in bytes +function IsTexelFormat(cformat:TVkFormat):Boolean; + implementation +Function getFormatSize(cformat:TVkFormat):Byte; //in bytes +begin + Result:=0; + Case cformat of + //pixel size + VK_FORMAT_R8G8B8A8_SRGB :Result:=4; + VK_FORMAT_R8G8B8A8_UNORM :Result:=4; + VK_FORMAT_R8G8_UNORM :Result:=2; + VK_FORMAT_R8_UNORM :Result:=1; + VK_FORMAT_R8_UINT :Result:=4; + VK_FORMAT_R5G6B5_UNORM_PACK16 :Result:=2; + + //texel size + VK_FORMAT_BC1_RGB_UNORM_BLOCK.. + VK_FORMAT_BC1_RGBA_SRGB_BLOCK, + VK_FORMAT_BC4_UNORM_BLOCK.. + VK_FORMAT_BC4_SNORM_BLOCK :Result:=8; + + VK_FORMAT_BC2_UNORM_BLOCK.. + VK_FORMAT_BC3_SRGB_BLOCK, + VK_FORMAT_BC5_UNORM_BLOCK.. + VK_FORMAT_BC7_SRGB_BLOCK :Result:=16; + + else + Assert(false,'TODO'); + end; +end; + +function IsTexelFormat(cformat:TVkFormat):Boolean; +begin + Case cformat of + VK_FORMAT_BC1_RGB_UNORM_BLOCK.. + VK_FORMAT_BC7_SRGB_BLOCK: + Result:=True; + else + Result:=False; + end; +end; + Procedure TvFramebuffer.SetRenderPass(r:TvRenderPass); begin if (r=FRenderPass) then Exit; diff --git a/vulkan/vImageManager.pas b/vulkan/vImageManager.pas index 54a31bf7..943dd481 100644 --- a/vulkan/vImageManager.pas +++ b/vulkan/vImageManager.pas @@ -8,6 +8,7 @@ uses SysUtils, RWLock, g23tree, + sys_types, Vulkan, vDevice, vMemory, @@ -251,10 +252,29 @@ begin end; function TvHostImage2.GetImageInfo:TVkImageCreateInfo; +var + bpp,size:qword; begin Result:=Parent.GetImageInfo; Result.tiling:=VK_IMAGE_TILING_LINEAR; Result.usage :=FUsage; + if (Parent.key.params.tiling_idx=8) then + begin + size:=Result.extent.width; + bpp:=getFormatSize(Result.format); + if IsTexelFormat(Result.format) then + begin + size:=(size+3) div 4; + end; + size:=size*bpp; + size:=AlignUp(size,128); + size:=size div bpp; + if IsTexelFormat(Result.format) then + begin + size:=size*4; + end; + Result.extent.width:=size; + end; end; Function TvImage2.GetSubresRange:TVkImageSubresourceRange; diff --git a/vulkan/vImageTiling.pas b/vulkan/vImageTiling.pas index f8c5cc03..cbf0770c 100644 --- a/vulkan/vImageTiling.pas +++ b/vulkan/vImageTiling.pas @@ -24,45 +24,6 @@ implementation uses vImageManager; -Function getFormatSize(cformat:TVkFormat):Byte; //in bytes -begin - Result:=0; - Case cformat of - //pixel size - VK_FORMAT_R8G8B8A8_SRGB :Result:=4; - VK_FORMAT_R8G8B8A8_UNORM :Result:=4; - VK_FORMAT_R8G8_UNORM :Result:=2; - VK_FORMAT_R8_UNORM :Result:=1; - VK_FORMAT_R8_UINT :Result:=4; - VK_FORMAT_R5G6B5_UNORM_PACK16 :Result:=2; - - //texel size - VK_FORMAT_BC1_RGB_UNORM_BLOCK.. - VK_FORMAT_BC1_RGBA_SRGB_BLOCK, - VK_FORMAT_BC4_UNORM_BLOCK.. - VK_FORMAT_BC4_SNORM_BLOCK :Result:=8; - - VK_FORMAT_BC2_UNORM_BLOCK.. - VK_FORMAT_BC3_SRGB_BLOCK, - VK_FORMAT_BC5_UNORM_BLOCK.. - VK_FORMAT_BC7_SRGB_BLOCK :Result:=16; - - else - Assert(false,'TODO'); - end; -end; - -function IsTexelFormat(cformat:TVkFormat):Boolean; -begin - Case cformat of - VK_FORMAT_BC1_RGB_UNORM_BLOCK.. - VK_FORMAT_BC7_SRGB_BLOCK: - Result:=True; - else - Result:=False; - end; -end; - { Procedure _Load_Linear(cmd:TvCustomCmdBuffer;image:TvImage2); var