From d560ba46c700a56c1dda6a4f6f65d5c5d4d99fce Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Wed, 18 Mar 2026 23:53:03 -0700 Subject: [PATCH] WIP Refactoring Texture Streaming System --- kraken/KRDevice.cpp | 27 ++++------------------ kraken/KRDevice.h | 4 ++-- kraken/resources/texture/KRTexture2D.cpp | 19 ++++++++++++++- kraken/resources/texture/KRTextureCube.cpp | 21 +++++++++++++++-- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/kraken/KRDevice.cpp b/kraken/KRDevice.cpp index 230f592..d7d4ffa 100644 --- a/kraken/KRDevice.cpp +++ b/kraken/KRDevice.cpp @@ -779,16 +779,16 @@ void KRDevice::graphicsUpload(VkCommandBuffer& commandBuffer, void* data, size_t m_graphicsStagingBuffer.usage += size; } -void KRDevice::streamUpload(void* data, size_t size, Vector3i dimensions, VkImage destination) +void KRDevice::streamUpload(void* data, size_t size, VkImage destination, VkBufferImageCopy* regions, int regionCount) { checkFlushStreamBuffer(size); memcpy((uint8_t*)m_streamingStagingBuffer.data + m_streamingStagingBuffer.usage, data, size); - streamUploadImpl(size, dimensions, destination, 0, 1); + streamUploadImpl(size, destination, regions, regionCount); } -void KRDevice::streamUploadImpl(size_t size, Vector3i dimensions, VkImage destination, uint32_t baseMipLevel, uint32_t levelCount) +void KRDevice::streamUploadImpl(size_t size, VkImage destination, VkBufferImageCopy* regions, int regionCount) { // TODO - Refactor memory barriers into helper functions VkPipelineStageFlags sourceStage; @@ -822,30 +822,13 @@ void KRDevice::streamUploadImpl(size_t size, Vector3i dimensions, VkImage destin 1, &barrier ); - VkBufferImageCopy region{}; - region.bufferOffset = 0; - region.bufferRowLength = 0; - region.bufferImageHeight = 0; - - region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - region.imageSubresource.mipLevel = 0; - region.imageSubresource.baseArrayLayer = 0; - region.imageSubresource.layerCount = 1; - - region.imageOffset = { 0, 0, 0 }; - region.imageExtent = { - (unsigned int)dimensions.x, - (unsigned int)dimensions.y, - 1 - }; - vkCmdCopyBufferToImage( m_transferCommandBuffers[0], m_streamingStagingBuffer.buffer, destination, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, - ®ion + regionCount, + regions ); barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; diff --git a/kraken/KRDevice.h b/kraken/KRDevice.h index d4cd41f..8a4847b 100644 --- a/kraken/KRDevice.h +++ b/kraken/KRDevice.h @@ -74,7 +74,7 @@ public: void streamStart(); void streamUpload(mimir::Block& data, VkBuffer destination); void streamUpload(void* data, size_t size, VkBuffer destination); - void streamUpload(void* data, size_t size, hydra::Vector3i dimensions, VkImage destination); + void streamUpload(void* data, size_t size, VkImage destination, VkBufferImageCopy* regions, int regionCount); void streamEnd(); void graphicsUpload(VkCommandBuffer& commandBuffer, mimir::Block& data, VkBuffer destination); @@ -141,5 +141,5 @@ private: #endif // KRENGINE_DEBUG_GPU_LABELS ); bool initDescriptorPool(); - void streamUploadImpl(size_t size, hydra::Vector3i dimensions, VkImage destination, uint32_t baseMipLevel, uint32_t levelCount); + void streamUploadImpl(size_t size, VkImage destination, VkBufferImageCopy* regions, int regionCount); }; diff --git a/kraken/resources/texture/KRTexture2D.cpp b/kraken/resources/texture/KRTexture2D.cpp index 6da85d7..45f1f03 100755 --- a/kraken/resources/texture/KRTexture2D.cpp +++ b/kraken/resources/texture/KRTexture2D.cpp @@ -101,7 +101,24 @@ bool KRTexture2D::createGPUTexture(int lod) break; } - device.streamUpload((void*)buffer, bufferSize, dimensions, texture.image); + VkBufferImageCopy region{}; + region.bufferOffset = 0; + region.bufferRowLength = 0; + region.bufferImageHeight = 0; + + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.mipLevel = 0; + region.imageSubresource.baseArrayLayer = 0; + region.imageSubresource.layerCount = 1; + + region.imageOffset = { 0, 0, 0 }; + region.imageExtent = { + (unsigned int)dimensions.x, + (unsigned int)dimensions.y, + (unsigned int)dimensions.z + }; + + device.streamUpload((void*)buffer, bufferSize, texture.image, ®ion, 1); } delete buffer; diff --git a/kraken/resources/texture/KRTextureCube.cpp b/kraken/resources/texture/KRTextureCube.cpp index 7a5c720..c4340d3 100755 --- a/kraken/resources/texture/KRTextureCube.cpp +++ b/kraken/resources/texture/KRTextureCube.cpp @@ -121,8 +121,25 @@ bool KRTextureCube::createGPUTexture(int lod) for (int i = 0; i < 6; i++) { std::string faceName = getName() + SUFFIXES[i]; if (m_textures[i]) { - // TODO - Vulkan refactoring. We need to create a cube map texture rather than individual 2d textures. - device.streamUpload(buffers[i], bufferSizes[i], Vector3i::Create(dimensions.x, dimensions.y, 1), texture.image); + VkBufferImageCopy region{}; + region.bufferOffset = 0; + region.bufferRowLength = 0; + region.bufferImageHeight = 0; + + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.mipLevel = 0; + region.imageSubresource.baseArrayLayer = 0; + region.imageSubresource.layerCount = 1; + + region.imageOffset = { 0, 0, 0 }; + region.imageExtent = { + (unsigned int)dimensions.x, + (unsigned int)dimensions.y, + (unsigned int)1 + }; + + // TODO - Vulkan refactoring. We need to create a cube map texture rather than individual 2d textures. + device.streamUpload(buffers[i], bufferSizes[i], texture.image, ®ion, 1); } } }