From 7d9192051a7bade4cf420f8886a976787ea42370 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Mon, 25 Sep 2023 17:34:36 +0800 Subject: [PATCH] added codes about Texture2DArray. --- example/Vulkan/CMakeLists.txt | 2 + .../Vulkan/Texture/BufferImageCopy2D.h | 13 +++ .../Vulkan/Texture/VKDeviceTexture2DArray.cpp | 82 ++++++++++--------- 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index 14ba331c..57e24876 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -20,6 +20,8 @@ CreateProject("Basic" 04_auto_merge_material_instance fourth_triangle.cpp) CreateProject("Texture" 05_texture_format TextureFormat.cpp) CreateProject("Texture" 06_texture_quad texture_quad.cpp) CreateProject("Texture" 07_texture_rect texture_rect.cpp) +CreateProject("Texture" 08_texture_rect_array texture_rect_array.cpp) + #CreateProject("Texture" HQFilterTexture HQFilterTexture.cpp) #CreateProject(06.Geometry2D Geometry2D.cpp) diff --git a/src/SceneGraph/Vulkan/Texture/BufferImageCopy2D.h b/src/SceneGraph/Vulkan/Texture/BufferImageCopy2D.h index 5c02e077..529c0139 100644 --- a/src/SceneGraph/Vulkan/Texture/BufferImageCopy2D.h +++ b/src/SceneGraph/Vulkan/Texture/BufferImageCopy2D.h @@ -30,6 +30,19 @@ public: SetRectScope(rs); } + BufferImageCopy(const Texture2DArray *tex):BufferImageCopy() + { + imageSubresource.aspectMask=tex->GetAspect(); + SetRectScope(tex->GetWidth(),tex->GetHeight()); + } + + template + BufferImageCopy(const Texture2DArray *tex,const RectScope2 &rs):BufferImageCopy() + { + imageSubresource.aspectMask=tex->GetAspect(); + SetRectScope(rs); + } + BufferImageCopy(const TextureCube *tex):BufferImageCopy() { imageSubresource.aspectMask=tex->GetAspect(); diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2DArray.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2DArray.cpp index 40f7e52e..2e1fcff5 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2DArray.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2DArray.cpp @@ -164,7 +164,7 @@ Texture2DArray *GPUDevice::CreateTexture2DArray(const uint32_t w,const uint32_t // return CopyBufferToImageArray(tex,buf,buffer_image_copy,miplevel,VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); //} // -//bool GPUDevice::ChangeTexture2DArray(Texture2DArray *tex,DeviceBuffer *buf,const List &ir_list,VkPipelineStageFlags destinationStage) +//bool GPUDevice::ChangeTexture2DArray(Texture2DArray *tex,DeviceBuffer *buf,const List &ir_list,const uint32_t base_layer,const uint32_t layer_count,VkPipelineStageFlags destinationStage) //{ // if(!tex||!buf||ir_list.GetCount()<=0) // return(false); @@ -184,8 +184,8 @@ Texture2DArray *GPUDevice::CreateTexture2DArray(const uint32_t w,const uint32_t // tp->bufferImageHeight = 0; // tp->imageSubresource.aspectMask = tex->GetAspect(); // tp->imageSubresource.mipLevel = 0; -// tp->imageSubresource.baseArrayLayer = 0; -// tp->imageSubresource.layerCount = 1; +// tp->imageSubresource.baseArrayLayer = base_layer; +// tp->imageSubresource.layerCount = layer_count; // tp->imageOffset.x = sp.left; // tp->imageOffset.y = sp.top; // tp->imageOffset.z = 0; @@ -203,40 +203,44 @@ Texture2DArray *GPUDevice::CreateTexture2DArray(const uint32_t w,const uint32_t // SubmitTexture(*texture_cmd_buf); // return result; //} -// -//bool GPUDevice::ChangeTexture2DArray(Texture2DArray *tex,DeviceBuffer *buf,const RectScope2ui &scope,VkPipelineStageFlags destinationStage) -//{ -// if(!tex||!buf -// ||scope.GetWidth()<=0 -// ||scope.GetHeight()<=0 -// ||scope.GetRight()>tex->GetWidth() -// ||scope.GetBottom()>tex->GetHeight()) -// return(false); -// -// BufferImageCopy buffer_image_copy(tex,scope); -// -// texture_cmd_buf->Begin(); -// bool result=CopyBufferToImageArray(tex,buf,&buffer_image_copy,1,1,destinationStage); -// texture_cmd_buf->End(); -// SubmitTexture(*texture_cmd_buf); -// return result; -//} -// -//bool GPUDevice::ChangeTexture2DArray(Texture2DArray *tex,void *data,const uint32_t size,const RectScope2ui &scope,VkPipelineStageFlags destinationStage) -//{ -// if(!tex||!data -// ||size<=0 -// ||scope.GetWidth()<=0 -// ||scope.GetHeight()<=0 -// ||scope.GetRight()>tex->GetWidth() -// ||scope.GetBottom()>tex->GetHeight()) -// return(false); -// -// DeviceBuffer *buf=CreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,size,data); -// -// bool result=ChangeTexture2DArray(tex,buf,scope,destinationStage); -// -// delete buf; -// return(result); -//} + +bool GPUDevice::ChangeTexture2DArray(Texture2DArray *tex,DeviceBuffer *buf,const RectScope2ui &scope,const uint32_t base_layer,const uint32_t layer_count,VkPipelineStageFlags destinationStage) +{ + if(!tex||!buf + ||base_layer<0 + ||layer_count<=0 + ||scope.GetWidth()<=0 + ||scope.GetHeight()<=0 + ||scope.GetRight()>tex->GetWidth() + ||scope.GetBottom()>tex->GetHeight()) + return(false); + + BufferImageCopy buffer_image_copy(tex,scope); + + texture_cmd_buf->Begin(); + bool result=CopyBufferToImage(tex,buf,&buffer_image_copy,1,base_layer,layer_count,destinationStage); + texture_cmd_buf->End(); + SubmitTexture(*texture_cmd_buf); + return result; +} + +bool GPUDevice::ChangeTexture2DArray(Texture2DArray *tex,void *data,const uint32_t size,const RectScope2ui &scope,const uint32_t base_layer,const uint32_t layer_count,VkPipelineStageFlags destinationStage) +{ + if(!tex||!data + ||size<=0 + ||base_layer<0 + ||layer_count<=0 + ||scope.GetWidth()<=0 + ||scope.GetHeight()<=0 + ||scope.GetRight()>tex->GetWidth() + ||scope.GetBottom()>tex->GetHeight()) + return(false); + + DeviceBuffer *buf=CreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,size,data); + + bool result=ChangeTexture2DArray(tex,buf,scope,base_layer,layer_count,destinationStage); + + delete buf; + return(result); +} VK_NAMESPACE_END \ No newline at end of file