WIP Refactoring Texture Streaming System
Some checks failed
CMake on multiple platforms / build (Release, cl, cl, windows-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, macos-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, ubuntu-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, gcc, g++, ubuntu-latest) (push) Has been cancelled

This commit is contained in:
2026-03-18 23:53:03 -07:00
parent 9fa0b04c8c
commit d560ba46c7
4 changed files with 44 additions and 27 deletions

View File

@@ -779,16 +779,16 @@ void KRDevice::graphicsUpload(VkCommandBuffer& commandBuffer, void* data, size_t
m_graphicsStagingBuffer.usage += size; 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); checkFlushStreamBuffer(size);
memcpy((uint8_t*)m_streamingStagingBuffer.data + m_streamingStagingBuffer.usage, data, 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 // TODO - Refactor memory barriers into helper functions
VkPipelineStageFlags sourceStage; VkPipelineStageFlags sourceStage;
@@ -822,30 +822,13 @@ void KRDevice::streamUploadImpl(size_t size, Vector3i dimensions, VkImage destin
1, &barrier 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( vkCmdCopyBufferToImage(
m_transferCommandBuffers[0], m_transferCommandBuffers[0],
m_streamingStagingBuffer.buffer, m_streamingStagingBuffer.buffer,
destination, destination,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1, regionCount,
&region regions
); );
barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;

View File

@@ -74,7 +74,7 @@ public:
void streamStart(); void streamStart();
void streamUpload(mimir::Block& data, VkBuffer destination); void streamUpload(mimir::Block& data, VkBuffer destination);
void streamUpload(void* data, size_t size, 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 streamEnd();
void graphicsUpload(VkCommandBuffer& commandBuffer, mimir::Block& data, VkBuffer destination); void graphicsUpload(VkCommandBuffer& commandBuffer, mimir::Block& data, VkBuffer destination);
@@ -141,5 +141,5 @@ private:
#endif // KRENGINE_DEBUG_GPU_LABELS #endif // KRENGINE_DEBUG_GPU_LABELS
); );
bool initDescriptorPool(); 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);
}; };

View File

@@ -101,7 +101,24 @@ bool KRTexture2D::createGPUTexture(int lod)
break; 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, &region, 1);
} }
delete buffer; delete buffer;

View File

@@ -121,8 +121,25 @@ bool KRTextureCube::createGPUTexture(int lod)
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
std::string faceName = getName() + SUFFIXES[i]; std::string faceName = getName() + SUFFIXES[i];
if (m_textures[i]) { if (m_textures[i]) {
// TODO - Vulkan refactoring. We need to create a cube map texture rather than individual 2d textures. VkBufferImageCopy region{};
device.streamUpload(buffers[i], bufferSizes[i], Vector3i::Create(dimensions.x, dimensions.y, 1), texture.image); 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, &region, 1);
} }
} }
} }