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
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:
@@ -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,
|
||||||
®ion
|
regions
|
||||||
);
|
);
|
||||||
|
|
||||||
barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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, ®ion, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete buffer;
|
delete buffer;
|
||||||
|
|||||||
@@ -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]) {
|
||||||
|
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.
|
// 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);
|
device.streamUpload(buffers[i], bufferSizes[i], texture.image, ®ion, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user