diff --git a/example/Vulkan/Cubemap.cpp b/example/Vulkan/Cubemap.cpp index f51eec2c..ae7d56a3 100644 --- a/example/Vulkan/Cubemap.cpp +++ b/example/Vulkan/Cubemap.cpp @@ -57,7 +57,7 @@ private: } { - texture =db->LoadTextureCube(OS_TEXT("res/cubemap/Storforsen4.TexCube"),false); + texture =db->LoadTextureCube(OS_TEXT("res/cubemap/Test.TexCube"),true); if(!texture) return(false); diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 7246a0da..b74822fa 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -156,16 +156,15 @@ public: //Image private: //texture + bool CommitTexture (Texture *,GPUBuffer *buf,const VkBufferImageCopy *,const int count,const uint32_t layer_count,VkPipelineStageFlags);//=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + bool CommitTexture2D (Texture2D *,GPUBuffer *buf,VkPipelineStageFlags stage); bool CommitTexture2DMipmaps (Texture2D *,GPUBuffer *buf,const VkExtent3D &,uint32_t); - bool CommitTexture2D (Texture2D *,GPUBuffer *buf,const VkBufferImageCopy *,const int count,VkPipelineStageFlags=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - - bool SubmitTexture (const VkCommandBuffer *cmd_bufs,const uint32_t count=1); ///<提交纹理处理到队列 - bool CommitTextureCube (TextureCube *,GPUBuffer *buf,const uint32_t mipmaps_zero_bytes,VkPipelineStageFlags stage); bool CommitTextureCubeMipmaps (TextureCube *,GPUBuffer *buf,const VkExtent3D &,uint32_t); - bool CommitTextureCube (TextureCube *,GPUBuffer *buf,const VkBufferImageCopy *,const int count,VkPipelineStageFlags=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + + bool SubmitTexture (const VkCommandBuffer *cmd_bufs,const uint32_t count=1); ///<提交纹理处理到队列 public: //Texture diff --git a/inc/hgl/graph/VKTextureCreateInfo.h b/inc/hgl/graph/VKTextureCreateInfo.h index a6ff43dc..d3d88dd6 100644 --- a/inc/hgl/graph/VKTextureCreateInfo.h +++ b/inc/hgl/graph/VKTextureCreateInfo.h @@ -292,23 +292,18 @@ struct SwapchainDepthTextureCreateInfo:public TextureCreateInfo struct TextureData { - GPUMemory * memory =nullptr; - VkImage image =VK_NULL_HANDLE; - VkImageLayout image_layout=VK_IMAGE_LAYOUT_UNDEFINED; - ImageView * image_view =nullptr; - uint32 miplevel =0; - VkImageTiling tiling =VK_IMAGE_TILING_OPTIMAL; + GPUMemory * memory; + VkImage image; + VkImageLayout image_layout; + ImageView * image_view; + uint32 miplevel; + VkImageTiling tiling; public: TextureData() { - memory =nullptr; - image =VK_NULL_HANDLE; - image_layout=VK_IMAGE_LAYOUT_UNDEFINED; - image_view =nullptr; - miplevel =0; - tiling =VK_IMAGE_TILING_OPTIMAL; + hgl_zero(*this); } TextureData(const TextureCreateInfo *tci) diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index f15d6662..598aadcd 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -114,8 +114,7 @@ SET(VK_MEMORY_SOURCE ${SG_INCLUDE_PATH}/VKMemory.h ) SET(VK_DEVICE_TEXTURE_SOURCE Vulkan/Texture/BufferImageCopy2D.h - Vulkan/Texture/GenMipmaps2D.cpp - Vulkan/Texture/GenMipmapsCube.cpp + Vulkan/Texture/GenMipmaps.cpp Vulkan/Texture/VKDeviceTexture.cpp Vulkan/Texture/VKDeviceTexture2D.cpp Vulkan/Texture/VKDeviceTextureCube.cpp) diff --git a/src/SceneGraph/Vulkan/Texture/GenMipmaps2D.cpp b/src/SceneGraph/Vulkan/Texture/GenMipmaps.cpp similarity index 87% rename from src/SceneGraph/Vulkan/Texture/GenMipmaps2D.cpp rename to src/SceneGraph/Vulkan/Texture/GenMipmaps.cpp index 9f636cb1..0b352502 100644 --- a/src/SceneGraph/Vulkan/Texture/GenMipmaps2D.cpp +++ b/src/SceneGraph/Vulkan/Texture/GenMipmaps.cpp @@ -1,16 +1,16 @@ #include VK_NAMESPACE_BEGIN -void GenerateMipmaps2D(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels) +void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels,const uint32 layer_count) { - ImageSubresourceRange subresourceRange(aspect_mask); + ImageSubresourceRange subresourceRange(aspect_mask,1,layer_count); VkImageBlit blit; blit.srcOffsets[0] = {0, 0, 0}; blit.srcSubresource.aspectMask = aspect_mask; blit.srcSubresource.baseArrayLayer = 0; - blit.srcSubresource.layerCount = 1; + blit.srcSubresource.layerCount = layer_count; blit.dstOffsets[0] = {0, 0, 0}; blit.dstSubresource=blit.srcSubresource; @@ -22,15 +22,6 @@ void GenerateMipmaps2D(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAs { subresourceRange.baseMipLevel = i - 1; - texture_cmd_buf->ImageMemoryBarrier(image, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_TRANSFER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - subresourceRange); - blit.srcOffsets[1] = {width,height,1}; blit.srcSubresource.mipLevel = i - 1; @@ -40,6 +31,15 @@ void GenerateMipmaps2D(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAs blit.dstOffsets[1] = {width,height,1}; blit.dstSubresource.mipLevel = i; + texture_cmd_buf->ImageMemoryBarrier(image, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_TRANSFER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + subresourceRange); + texture_cmd_buf->BlitImage( image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, diff --git a/src/SceneGraph/Vulkan/Texture/GenMipmapsCube.cpp b/src/SceneGraph/Vulkan/Texture/GenMipmapsCube.cpp deleted file mode 100644 index 320f7d79..00000000 --- a/src/SceneGraph/Vulkan/Texture/GenMipmapsCube.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include - -VK_NAMESPACE_BEGIN -void GenerateMipmapsCube(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels) -{ - ImageSubresourceRange subresourceRange(aspect_mask); - - VkImageBlit blit; - - blit.srcOffsets[0] = {0, 0, 0}; - blit.srcSubresource.aspectMask = aspect_mask; - blit.srcSubresource.baseArrayLayer = 0; - blit.srcSubresource.layerCount = 6; - - blit.dstOffsets[0] = {0, 0, 0}; - blit.dstSubresource=blit.srcSubresource; - - int32_t width =extent.width; - int32_t height =extent.height; - - for (uint32_t i = 1; i < mipLevels; i++) - { - subresourceRange.baseMipLevel = i - 1; - - texture_cmd_buf->ImageMemoryBarrier(image, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_TRANSFER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - subresourceRange); - - blit.srcOffsets[1] = {width,height,1}; - blit.srcSubresource.mipLevel = i - 1; - - if(width >1)width >>=1; - if(height>1)height>>=1; - - blit.dstOffsets[1] = {width,height,1}; - blit.dstSubresource.mipLevel = i; - - texture_cmd_buf->BlitImage( - image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, &blit, - VK_FILTER_LINEAR); - - texture_cmd_buf->ImageMemoryBarrier(image, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_ACCESS_TRANSFER_READ_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - subresourceRange); - } - - subresourceRange.baseMipLevel = mipLevels - 1; - - texture_cmd_buf->ImageMemoryBarrier(image, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - subresourceRange); -} -VK_NAMESPACE_END \ No newline at end of file diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp index 873e3e17..09e0c5c2 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp @@ -1,4 +1,5 @@ #include +#include VK_NAMESPACE_BEGIN bool GPUDevice::CheckFormatSupport(const VkFormat format,const uint32_t bits,ImageTiling tiling) const @@ -22,6 +23,55 @@ void GPUDevice::Clear(TextureCreateInfo *tci) delete tci; } +bool GPUDevice::CommitTexture(Texture *tex,GPUBuffer *buf,const VkBufferImageCopy *buffer_image_copy,const int count,const uint32_t layer_count,VkPipelineStageFlags destinationStage) +{ + if(!tex||!buf) + return(false); + + ImageSubresourceRange subresourceRange(tex->GetAspect(),tex->GetMipLevel(),layer_count); + + texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + VK_PIPELINE_STAGE_HOST_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + subresourceRange); + + texture_cmd_buf->CopyBufferToImage( + buf->GetBuffer(), + tex->GetImage(), + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + count, + buffer_image_copy); + + if(destinationStage==VK_PIPELINE_STAGE_TRANSFER_BIT) //接下来还有,一般是给自动生成mipmaps + { + //texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + // VK_PIPELINE_STAGE_TRANSFER_BIT, + // VK_PIPELINE_STAGE_TRANSFER_BIT, + // VK_ACCESS_TRANSFER_WRITE_BIT, + // VK_ACCESS_TRANSFER_READ_BIT, + // VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + // VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + // subresourceRange); + } + else// if(destinationStage==VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) //接下来就给fragment shader用了,证明是最后一步 + { + texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + subresourceRange); + } + + return(true); +} + bool GPUDevice::SubmitTexture(const VkCommandBuffer *cmd_bufs,const uint32_t count) { if(!cmd_bufs||count<=0) diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp index a809a6c9..b8c107f0 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp @@ -3,7 +3,7 @@ #include #include"BufferImageCopy2D.h" VK_NAMESPACE_BEGIN -void GenerateMipmaps2D(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels); +void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels,const uint32_t layer_count); Texture2D *GPUDevice::CreateTexture2D(TextureData *tex_data) { @@ -74,7 +74,7 @@ Texture2D *GPUDevice::CreateTexture2D(TextureCreateInfo *tci) if(tci->origin_mipmaps<=1) //本身不含mipmaps数据,又想要mipmaps { CommitTexture2D(tex,tci->buffer,VK_PIPELINE_STAGE_TRANSFER_BIT); - GenerateMipmaps2D(texture_cmd_buf,tex->GetImage(),tex->GetAspect(),tci->extent,tex_data->miplevel); + GenerateMipmaps(texture_cmd_buf,tex->GetImage(),tex->GetAspect(),tci->extent,tex_data->miplevel,1); } texture_cmd_buf->End(); @@ -87,62 +87,13 @@ Texture2D *GPUDevice::CreateTexture2D(TextureCreateInfo *tci) return tex; } -bool GPUDevice::CommitTexture2D(Texture2D *tex,GPUBuffer *buf,const VkBufferImageCopy *buffer_image_copy,const int count,VkPipelineStageFlags destinationStage) -{ - if(!tex||!buf) - return(false); - - ImageSubresourceRange subresourceRange(tex->GetAspect(),tex->GetMipLevel()); - - texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), - VK_PIPELINE_STAGE_HOST_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - subresourceRange); - - texture_cmd_buf->CopyBufferToImage( - buf->GetBuffer(), - tex->GetImage(), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - count, - buffer_image_copy); - - if(destinationStage==VK_PIPELINE_STAGE_TRANSFER_BIT) //接下来还有,一般是给自动生成mipmaps - { - texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - subresourceRange); - } - else// if(destinationStage==VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) //接下来就给fragment shader用了,证明是最后一步 - { - texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - subresourceRange); - } - - return(true); -} - bool GPUDevice::CommitTexture2D(Texture2D *tex,GPUBuffer *buf,VkPipelineStageFlags destinationStage) { if(!tex||!buf)return(false); BufferImageCopy buffer_image_copy(tex); - return CommitTexture2D(tex,buf,&buffer_image_copy,1,destinationStage); + return CommitTexture(tex,buf,&buffer_image_copy,1,1,destinationStage); } bool GPUDevice::CommitTexture2DMipmaps(Texture2D *tex,GPUBuffer *buf,const VkExtent3D &extent,uint32_t total_bytes) @@ -188,7 +139,7 @@ bool GPUDevice::CommitTexture2DMipmaps(Texture2D *tex,GPUBuffer *buf,const VkExt if(height>1){height>>=1;total_bytes>>=1;} } - return CommitTexture2D(tex,buf,buffer_image_copy,miplevel,VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + return CommitTexture(tex,buf,buffer_image_copy,miplevel,1,VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); } bool GPUDevice::ChangeTexture2D(Texture2D *tex,GPUBuffer *buf,const List &ir_list,VkPipelineStageFlags destinationStage) @@ -225,7 +176,7 @@ bool GPUDevice::ChangeTexture2D(Texture2D *tex,GPUBuffer *buf,const ListBegin(); - bool result=CommitTexture2D(tex,buf,buffer_image_copy,ir_count,destinationStage); + bool result=CommitTexture(tex,buf,buffer_image_copy,ir_count,1,destinationStage); texture_cmd_buf->End(); SubmitTexture(*texture_cmd_buf); return result; @@ -242,7 +193,7 @@ bool GPUDevice::ChangeTexture2D(Texture2D *tex,GPUBuffer *buf,uint32_t left,uint BufferImageCopy buffer_image_copy(tex); texture_cmd_buf->Begin(); - bool result=CommitTexture2D(tex,buf,&buffer_image_copy,1,destinationStage); + bool result=CommitTexture(tex,buf,&buffer_image_copy,1,1,destinationStage); texture_cmd_buf->End(); SubmitTexture(*texture_cmd_buf); return result; diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTextureCube.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTextureCube.cpp index 936aee97..eb6d9a7e 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTextureCube.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTextureCube.cpp @@ -3,7 +3,7 @@ #include #include"BufferImageCopy2D.h" VK_NAMESPACE_BEGIN -void GenerateMipmapsCube(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels); +void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels,const uint32_t layer_count); TextureCube *GPUDevice::CreateTextureCube(TextureData *tex_data) { @@ -70,7 +70,7 @@ TextureCube *GPUDevice::CreateTextureCube(TextureCreateInfo *tci) if(tci->origin_mipmaps<=1) //mipmaps,Ҫmipmaps { CommitTextureCube(tex,tci->buffer,tci->mipmap_zero_total_bytes,VK_PIPELINE_STAGE_TRANSFER_BIT); - GenerateMipmapsCube(texture_cmd_buf,tex->GetImage(),tex->GetAspect(),tci->extent,tex_data->miplevel); + GenerateMipmaps(texture_cmd_buf,tex->GetImage(),tex->GetAspect(),tci->extent,tex_data->miplevel,6); } texture_cmd_buf->End(); @@ -83,55 +83,6 @@ TextureCube *GPUDevice::CreateTextureCube(TextureCreateInfo *tci) return tex; } -bool GPUDevice::CommitTextureCube(TextureCube *tex,GPUBuffer *buf,const VkBufferImageCopy *buffer_image_copy,const int count,VkPipelineStageFlags destinationStage) -{ - if(!tex||!buf) - return(false); - - ImageSubresourceRange subresourceRange(tex->GetAspect(),tex->GetMipLevel(),6); - - texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), - VK_PIPELINE_STAGE_HOST_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - subresourceRange); - - texture_cmd_buf->CopyBufferToImage( - buf->GetBuffer(), - tex->GetImage(), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - count, - buffer_image_copy); - - if(destinationStage==VK_PIPELINE_STAGE_TRANSFER_BIT) //УһǸԶmipmaps - { - texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - subresourceRange); - } - else// if(destinationStage==VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) //͸fragment shaderˣ֤һ - { - texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - subresourceRange); - } - - return(true); -} - bool GPUDevice::CommitTextureCube(TextureCube *tex,GPUBuffer *buf,const uint32_t mipmaps_zero_bytes,VkPipelineStageFlags destinationStage) { if(!tex||!buf||!mipmaps_zero_bytes)return(false); @@ -161,7 +112,7 @@ bool GPUDevice::CommitTextureCube(TextureCube *tex,GPUBuffer *buf,const uint32_t offset+=mipmaps_zero_bytes; } - return CommitTextureCube(tex,buf,bic_list,6,destinationStage); + return CommitTexture(tex,buf,bic_list,6,6,destinationStage); } bool GPUDevice::CommitTextureCubeMipmaps(TextureCube *tex,GPUBuffer *buf,const VkExtent3D &extent,uint32_t total_bytes) @@ -219,7 +170,7 @@ bool GPUDevice::CommitTextureCubeMipmaps(TextureCube *tex,GPUBuffer *buf,const V } } - return CommitTextureCube(tex,buf,buffer_image_copy,miplevel*6,VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + return CommitTexture(tex,buf,buffer_image_copy,miplevel*6,6,VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); } //bool GPUDevice::ChangeTexture2D(Texture2D *tex,GPUBuffer *buf,const List &ir_list,VkPipelineStageFlags destinationStage) diff --git a/src/SceneGraph/Vulkan/Texture/VKTextureLoader.h b/src/SceneGraph/Vulkan/Texture/VKTextureLoader.h index f00b3c00..cb0c8fee 100644 --- a/src/SceneGraph/Vulkan/Texture/VKTextureLoader.h +++ b/src/SceneGraph/Vulkan/Texture/VKTextureLoader.h @@ -62,6 +62,8 @@ public: tci->SetData(buf,extent); + tci->origin_mipmaps=file_header.mipmaps; + if(auto_mipmaps&&file_header.mipmaps<=1) { if(device->CheckFormatSupport(format,VK_FORMAT_FEATURE_BLIT_DST_BIT)) @@ -72,8 +74,7 @@ public: } else { - tci->origin_mipmaps= - tci->target_mipmaps=file_header.mipmaps; + tci->target_mipmaps=file_header.mipmaps; } tci->mipmap_zero_total_bytes=mipmap_zero_total_bytes;