From 286d3d13f0728be90eefaeeff3e530aa10a707a0 Mon Sep 17 00:00:00 2001 From: Pavel <68122101+red-prig@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:11:12 +0300 Subject: [PATCH] + --- vulkan/vImage.pas | 43 ++++++++++++++++++++++++++++++++++++---- vulkan/vImageManager.pas | 13 +++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/vulkan/vImage.pas b/vulkan/vImage.pas index c892fc4b..545025af 100644 --- a/vulkan/vImage.pas +++ b/vulkan/vImage.pas @@ -153,6 +153,8 @@ type base_array:Word; //first array index (0..16383) last_array:Word; //texture height (0..16383) minLod :TVkFloat; + function arrayLayers:Word; + function baseArrayLayer:Word; function layerCount:Word; end; @@ -302,6 +304,39 @@ begin end; end; +// + +function TvImageViewKey.arrayLayers:Word; +begin + Result:=last_array-base_array+1; +end; + +function TvImageViewKey.baseArrayLayer:Word; +begin + case TVkImageViewType(vtype) of + VK_IMAGE_VIEW_TYPE_3D: + begin + Result:=0; //3D texture array does not exist? + end; + VK_IMAGE_VIEW_TYPE_CUBE, + VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: + begin + if (arrayLayers mod 6)<>0 then + begin + //broken CUBE? + Result:=0; + end else + begin + Result:=base_array; + end; + end; + else + begin + Result:=base_array; + end; + end; +end; + function TvImageViewKey.layerCount:Word; begin case TVkImageViewType(vtype) of @@ -309,14 +344,14 @@ begin begin Result:=1; //3D texture array does not exist? end; - VK_IMAGE_VIEW_TYPE_CUBE: + VK_IMAGE_VIEW_TYPE_CUBE, + VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: begin - Result:=last_array-base_array+1; - Result:=((Result+5) div 6)*6; //align up + Result:=((arrayLayers+5) div 6)*6; //align up end; else begin - Result:=last_array-base_array+1; + Result:=arrayLayers; end; end; end; diff --git a/vulkan/vImageManager.pas b/vulkan/vImageManager.pas index d3f1856d..10cfd1e1 100644 --- a/vulkan/vImageManager.pas +++ b/vulkan/vImageManager.pas @@ -426,7 +426,7 @@ begin Result.aspectMask :=GetAspectMaskByFormat(cformat); Result.baseMipLevel :=key.base_level; Result.levelCount :=key.last_level-key.base_level+1; - Result.baseArrayLayer:=key.base_array; + Result.baseArrayLayer:=key.baseArrayLayer; Result.layerCount :=key.layerCount; end; @@ -437,7 +437,7 @@ begin Result:=Default(TVkImageSubresourceLayers); Result.aspectMask :=GetAspectMaskByFormat(cformat); Result.mipLevel :=key.base_level; - Result.baseArrayLayer:=key.base_array; + Result.baseArrayLayer:=key.baseArrayLayer; Result.layerCount :=key.layerCount; end; @@ -546,9 +546,16 @@ begin cinfo.subresourceRange.aspectMask :=GetAspectMaskByFormat(F.cformat); cinfo.subresourceRange.baseMipLevel :=F.base_level; cinfo.subresourceRange.levelCount :=F.last_level-F.base_level+1; - cinfo.subresourceRange.baseArrayLayer:=F.base_array; + cinfo.subresourceRange.baseArrayLayer:=F.baseArrayLayer; cinfo.subresourceRange.layerCount :=F.layerCount; + if (cinfo.subresourceRange.baseArrayLayer + + cinfo.subresourceRange.layerCount) > self.key.params.layerCount + then + begin + Assert(false); + end; + case cinfo.viewType of VK_IMAGE_VIEW_TYPE_CUBE: begin