diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp index afa2f9e0..3bebbfbd 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp @@ -340,7 +340,7 @@ namespace SHADE } // Transfer to GPU - if (transformDataBuffer[frameIndex]) + if (transformDataBuffer[frameIndex] && !drawData.empty()) transformDataBuffer[frameIndex]->WriteToMemory(transformData.data(), static_cast(transformData.size() * sizeof(SHMatrix)), 0, 0); } @@ -369,7 +369,7 @@ namespace SHADE } // Transfer to GPU - if (instancedIntegerBuffer[frameIndex]) + if (instancedIntegerBuffer[frameIndex] && !drawData.empty()) instancedIntegerBuffer[frameIndex]->WriteToMemory(instancedIntegerData.data(), static_cast(instancedIntegerData.size() * sizeof(SHInstancedIntegerData)), 0, 0); } @@ -507,33 +507,36 @@ namespace SHADE isCPUBuffersDirty = false; } - // Send all buffered data to the GPU buffers - using BuffUsage = vk::BufferUsageFlagBits; - // - Draw Data - const uint32_t DRAW_DATA_BYTES = static_cast(drawData.size() * sizeof(vk::DrawIndexedIndirectCommand)); - SHVkUtil::EnsureBufferAndCopyHostVisibleData - ( - device, drawDataBuffer[frameIndex], drawData.data(), DRAW_DATA_BYTES, - BuffUsage::eIndirectBuffer, - "Batch Draw Data Buffer" - ); - // - Transform Buffer - const uint32_t TF_DATA_BYTES = static_cast(transformData.size() * sizeof(SHMatrix)); - SHVkUtil::EnsureBufferAndCopyHostVisibleData - ( - device, transformDataBuffer[frameIndex], transformData.data(), TF_DATA_BYTES, - BuffUsage::eVertexBuffer, - "Batch Transform Buffer" - ); - const uint32_t EID_DATA_BYTES = static_cast(instancedIntegerData.size() * sizeof(SHInstancedIntegerData)); - SHVkUtil::EnsureBufferAndCopyHostVisibleData - ( - device, instancedIntegerBuffer[frameIndex], instancedIntegerData.data(), EID_DATA_BYTES, - BuffUsage::eVertexBuffer, - "Batch Instance Data Buffer" - ); - // - Material Properties Buffer - rebuildMaterialBuffers(frameIndex, descPool); + // Send all buffered data to the GPU buffers if there is anything to render + if (!drawData.empty()) + { + using BuffUsage = vk::BufferUsageFlagBits; + // - Draw Data + const uint32_t DRAW_DATA_BYTES = static_cast(drawData.size() * sizeof(vk::DrawIndexedIndirectCommand)); + SHVkUtil::EnsureBufferAndCopyHostVisibleData + ( + device, drawDataBuffer[frameIndex], drawData.data(), DRAW_DATA_BYTES, + BuffUsage::eIndirectBuffer, + "Batch Draw Data Buffer" + ); + // - Transform Buffer + const uint32_t TF_DATA_BYTES = static_cast(transformData.size() * sizeof(SHMatrix)); + SHVkUtil::EnsureBufferAndCopyHostVisibleData + ( + device, transformDataBuffer[frameIndex], transformData.data(), TF_DATA_BYTES, + BuffUsage::eVertexBuffer, + "Batch Transform Buffer" + ); + const uint32_t EID_DATA_BYTES = static_cast(instancedIntegerData.size() * sizeof(SHInstancedIntegerData)); + SHVkUtil::EnsureBufferAndCopyHostVisibleData + ( + device, instancedIntegerBuffer[frameIndex], instancedIntegerData.data(), EID_DATA_BYTES, + BuffUsage::eVertexBuffer, + "Batch Instance Data Buffer" + ); + // - Material Properties Buffer + rebuildMaterialBuffers(frameIndex, descPool); + } // Mark this frame as no longer dirty isDirty[frameIndex] = false; @@ -551,7 +554,7 @@ namespace SHADE } // Nothing to draw - if (subBatches.empty()) + if (drawData.empty()) return; // Bind all required objects before drawing @@ -586,7 +589,7 @@ namespace SHADE void SHBatch::rebuildMaterialBuffers(uint32_t frameIndex, Handle descPool) { - if (matPropsData) + if (matPropsData && !drawData.empty()) { SHVkUtil::EnsureBufferAndCopyHostVisibleData (