diff --git a/kraken/KRDevice.cpp b/kraken/KRDevice.cpp index 8546c02..8061a98 100644 --- a/kraken/KRDevice.cpp +++ b/kraken/KRDevice.cpp @@ -711,10 +711,10 @@ void KRDevice::streamUpload(KRDataBlock& data, VkBuffer destination) data.unlock(); } -void KRDevice::graphicsUpload(KRDataBlock& data, VkBuffer destination) +void KRDevice::graphicsUpload(VkCommandBuffer& commandBuffer, KRDataBlock& data, VkBuffer destination) { data.lock(); - graphicsUpload(data.getStart(), data.getSize(), destination); + graphicsUpload(commandBuffer, data.getStart(), data.getSize(), destination); data.unlock(); } @@ -746,7 +746,7 @@ void KRDevice::streamUpload(void* data, size_t size, VkBuffer destination) m_streamingStagingBuffer.usage += size; } -void KRDevice::graphicsUpload(void* data, size_t size, VkBuffer destination) +void KRDevice::graphicsUpload(VkCommandBuffer& commandBuffer, void* data, size_t size, VkBuffer destination) { memcpy((uint8_t*)m_graphicsStagingBuffer.data + m_graphicsStagingBuffer.usage, data, size); @@ -755,7 +755,7 @@ void KRDevice::graphicsUpload(void* data, size_t size, VkBuffer destination) copyRegion.srcOffset = m_graphicsStagingBuffer.usage; copyRegion.dstOffset = 0; // Optional copyRegion.size = size; - vkCmdCopyBuffer(m_graphicsCommandBuffers[0], m_graphicsStagingBuffer.buffer, destination, 1, ©Region); + vkCmdCopyBuffer(commandBuffer, m_graphicsStagingBuffer.buffer, destination, 1, ©Region); // TODO - Assert on any needed alignment? m_graphicsStagingBuffer.usage += size; diff --git a/kraken/KRDevice.h b/kraken/KRDevice.h index eedc09b..8a18dc4 100644 --- a/kraken/KRDevice.h +++ b/kraken/KRDevice.h @@ -80,8 +80,8 @@ public: void streamUpload(void* data, size_t size, Vector2i dimensions, VkImage destination); void streamEnd(); - void graphicsUpload(KRDataBlock& data, VkBuffer destination); - void graphicsUpload(void* data, size_t size, VkBuffer destination); + void graphicsUpload(VkCommandBuffer& commandBuffer, KRDataBlock& data, VkBuffer destination); + void graphicsUpload(VkCommandBuffer& commandBuffer, void* data, size_t size, VkBuffer destination); VkPhysicalDevice m_device; VkDevice m_logicalDevice; diff --git a/kraken/KRMeshManager.cpp b/kraken/KRMeshManager.cpp index c9680c6..961fb07 100755 --- a/kraken/KRMeshManager.cpp +++ b/kraken/KRMeshManager.cpp @@ -330,7 +330,8 @@ void KRMeshManager::bindVBO(VkCommandBuffer& commandBuffer, KRDataBlock &data, K , debug_label #endif ); - vbo_data->load(); + vbo_data->load(commandBuffer); + vbo_data->_swapHandles(); bindVBO(commandBuffer, vbo_data, lodCoverage); } @@ -529,6 +530,13 @@ KRMeshManager::KRVBOData::~KRVBOData() } void KRMeshManager::KRVBOData::load() +{ + // TODO - This is a bit messy. Clean up after Vulkan refactor. + VkCommandBuffer noCommandBuffer = VK_NULL_HANDLE; + load(noCommandBuffer); +} + +void KRMeshManager::KRVBOData::load(VkCommandBuffer& commandBuffer) { // TODO - We should load on each GPU only if there is a surface using the mesh if(isVBOLoaded()) { @@ -578,7 +586,7 @@ void KRMeshManager::KRVBOData::load() #endif // KRENGINE_DEBUG_GPU_LABELS ); if (m_type == vbo_type::TEMPORARY) { - device.graphicsUpload(*m_data, allocation.vertex_buffer); + device.graphicsUpload(commandBuffer, *m_data, allocation.vertex_buffer); } else { device.streamUpload(*m_data, allocation.vertex_buffer); } @@ -599,7 +607,7 @@ void KRMeshManager::KRVBOData::load() #endif ); if (m_type == vbo_type::TEMPORARY) { - device.graphicsUpload(*m_index_data, allocation.index_buffer); + device.graphicsUpload(commandBuffer, *m_index_data, allocation.index_buffer); } else { device.streamUpload(*m_index_data, allocation.index_buffer); } diff --git a/kraken/KRMeshManager.h b/kraken/KRMeshManager.h index 1067e8f..b574cb2 100755 --- a/kraken/KRMeshManager.h +++ b/kraken/KRMeshManager.h @@ -94,6 +94,7 @@ public: bool isVBOLoaded() { return m_is_vbo_loaded; } bool isVBOReady() { return m_is_vbo_ready; } void load(); + void load(VkCommandBuffer& commandBuffer); void unload(); void bind(VkCommandBuffer& commandBuffer);