From 0c2449dc5eaad5cde9bc3efc0177388d09dd4ca8 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sun, 15 Jun 2025 10:32:38 +0800 Subject: [PATCH] [Fix] (Diligent/Buffer): Recreate buffer object when the size changes. --- .../Implementations/GL/Buffer/GL_Buffer.cpp | 6 +++++- .../Implementations/GL/Drawing/GL_Drawing.cpp | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp b/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp index cceb1f35..4171aa6e 100644 --- a/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp +++ b/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp @@ -223,7 +223,11 @@ namespace MG_GL::GL { BuffDesc.Name = name.c_str(); BuffDesc.Usage = Diligent::USAGE_DEFAULT; - if (pBuffer == nullptr) { + if (!pBuffer || (pBuffer && pBuffer->GetDesc().Size != bufferObj.data.size())) { + if (pBuffer) { + pBuffer->Release(); + pBuffer = nullptr; + } Diligent::BufferData BuffData; // Initial data must not be null for immutable buffers BuffData.pData = BuffDesc.Usage != Diligent::USAGE_IMMUTABLE ? nullptr : bufferObj.data.data(); diff --git a/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp b/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp index 23593eae..bb76a122 100644 --- a/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp +++ b/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp @@ -465,7 +465,12 @@ namespace MG_GL::GL { auto& bufferObj = MG_State_T::bufferState->buffers_[buffer]; Diligent::IBuffer *&pBuffer = MG_Diligent::g_BufferMap[buffer]; - if (bufferObj.isDynamic && !pBuffer) { + if (bufferObj.isDynamic && (!pBuffer || (pBuffer && pBuffer->GetDesc().Size != bufferObj.data.size()))) { + if (pBuffer) { + pBuffer->Release(); + pBuffer = nullptr; + } + Diligent::BufferDesc BuffDesc; std::string bufferName = "Dynamic VBO " + std::to_string(buffer); BuffDesc.Name = bufferName.c_str(); @@ -488,7 +493,12 @@ namespace MG_GL::GL { auto& bufferObj = MG_State_T::bufferState->buffers_[buffer]; Diligent::IBuffer*& pBuffer = MG_Diligent::g_BufferMap[buffer]; - if (bufferObj.isDynamic && !pBuffer) { + if (bufferObj.isDynamic && (!pBuffer || (pBuffer && pBuffer->GetDesc().Size != bufferObj.data.size()))) { + if (pBuffer) { + pBuffer->Release(); + pBuffer = nullptr; + } + Diligent::BufferDesc BuffDesc; std::string bufferName = "Dynamic IBO " + std::to_string(buffer); BuffDesc.Name = bufferName.c_str(); @@ -497,10 +507,6 @@ namespace MG_GL::GL { BuffDesc.BindFlags = Diligent::BIND_INDEX_BUFFER; BuffDesc.CPUAccessFlags = Diligent::CPU_ACCESS_WRITE; - if (pBuffer) { - pBuffer->Release(); - } - MG_Diligent::g_pDevice->CreateBuffer(BuffDesc, nullptr, &pBuffer); if (!pBuffer) {