[Fix] (Diligent/Buffer): Update all dynamic buffers in glDraw*.

This commit is contained in:
BZLZHH
2025-06-08 23:00:13 +08:00
parent ee72f7d07f
commit 1022a4dfc3
@@ -451,10 +451,8 @@ namespace MG_GL::GL {
GLuint buffer = attrib.buffer; GLuint buffer = attrib.buffer;
auto& bufferObj = MG_State_T::bufferState->buffers_[buffer]; auto& bufferObj = MG_State_T::bufferState->buffers_[buffer];
if (bufferObj.isDynamic || MG_Diligent::g_BufferMap.find(buffer) == MG_Diligent::g_BufferMap.end()) {
Diligent::IBuffer *&pBuffer = MG_Diligent::g_BufferMap[buffer]; Diligent::IBuffer *&pBuffer = MG_Diligent::g_BufferMap[buffer];
if (bufferObj.isDynamic && !pBuffer) {
if (!pBuffer) {
Diligent::BufferDesc BuffDesc; Diligent::BufferDesc BuffDesc;
std::string bufferName = "Dynamic VBO " + std::to_string(buffer); std::string bufferName = "Dynamic VBO " + std::to_string(buffer);
BuffDesc.Name = bufferName.c_str(); BuffDesc.Name = bufferName.c_str();
@@ -463,28 +461,11 @@ namespace MG_GL::GL {
BuffDesc.BindFlags = Diligent::BIND_VERTEX_BUFFER; BuffDesc.BindFlags = Diligent::BIND_VERTEX_BUFFER;
BuffDesc.CPUAccessFlags = Diligent::CPU_ACCESS_WRITE; BuffDesc.CPUAccessFlags = Diligent::CPU_ACCESS_WRITE;
if (pBuffer) {
pBuffer->Release();
}
MG_Diligent::g_pDevice->CreateBuffer(BuffDesc, nullptr, &pBuffer); MG_Diligent::g_pDevice->CreateBuffer(BuffDesc, nullptr, &pBuffer);
}
if (pBuffer && !bufferObj.data.empty()) { if (!pBuffer) {
void* pMappedData = nullptr; MG_Util::Debug::LogE("Failed to create dynamic vertex buffer %u", buffer);
MG_Diligent::g_pContext->MapBuffer( continue;
pBuffer,
Diligent::MAP_WRITE,
Diligent::MAP_FLAG_DISCARD,
pMappedData
);
if (pMappedData) {
memcpy(pMappedData, bufferObj.data.data(), bufferObj.data.size());
MG_Diligent::g_pContext->UnmapBuffer(pBuffer, Diligent::MAP_WRITE);
bufferObj.dirty = false;
createdBuffers[buffer] = pBuffer;
}
} }
} }
} }
@@ -493,16 +474,13 @@ namespace MG_GL::GL {
GLuint buffer = pVAO->elementBuffer; GLuint buffer = pVAO->elementBuffer;
auto& bufferObj = MG_State_T::bufferState->buffers_[buffer]; auto& bufferObj = MG_State_T::bufferState->buffers_[buffer];
if (bufferObj.isDynamic || MG_Diligent::g_BufferMap.find(buffer) == MG_Diligent::g_BufferMap.end()) {
Diligent::IBuffer*& pBuffer = MG_Diligent::g_BufferMap[buffer]; Diligent::IBuffer*& pBuffer = MG_Diligent::g_BufferMap[buffer];
if (bufferObj.isDynamic && !pBuffer) {
if (!pBuffer) {
Diligent::BufferDesc BuffDesc; Diligent::BufferDesc BuffDesc;
std::string bufferName = "Dynamic IBO " + std::to_string(buffer); std::string bufferName = "Dynamic IBO " + std::to_string(buffer);
BuffDesc.Name = bufferName.c_str(); BuffDesc.Name = bufferName.c_str();
BuffDesc.Size = bufferObj.data.size(); BuffDesc.Size = bufferObj.data.size();
BuffDesc.Usage = bufferObj.isDynamic ? Diligent::USAGE_DYNAMIC BuffDesc.Usage = Diligent::USAGE_DYNAMIC;
: Diligent::USAGE_DEFAULT;
BuffDesc.BindFlags = Diligent::BIND_INDEX_BUFFER; BuffDesc.BindFlags = Diligent::BIND_INDEX_BUFFER;
BuffDesc.CPUAccessFlags = Diligent::CPU_ACCESS_WRITE; BuffDesc.CPUAccessFlags = Diligent::CPU_ACCESS_WRITE;
@@ -511,26 +489,35 @@ namespace MG_GL::GL {
} }
MG_Diligent::g_pDevice->CreateBuffer(BuffDesc, nullptr, &pBuffer); MG_Diligent::g_pDevice->CreateBuffer(BuffDesc, nullptr, &pBuffer);
if (!pBuffer) {
MG_Util::Debug::LogE("Failed to create dynamic index buffer %u", buffer);
}
}
} }
if (pBuffer && !bufferObj.data.empty()) { // Update data for all dynamic buffers
for (auto& [bufferID, pBuffer] : MG_Diligent::g_BufferMap) {
auto& bufferObj = MG_State_T::bufferState->buffers_[bufferID];
if (pBuffer && bufferObj.isDynamic && !bufferObj.data.empty()) {
void* pMappedData = nullptr; void* pMappedData = nullptr;
MG_Util::Debug::LogD("Mapping dynamic buffer %u for data update.", bufferID);
MG_Diligent::g_pContext->MapBuffer( MG_Diligent::g_pContext->MapBuffer(
pBuffer, pBuffer,
Diligent::MAP_WRITE, Diligent::MAP_WRITE,
bufferObj.isDynamic ? Diligent::MAP_FLAG_DISCARD : Diligent::MAP_FLAG_NONE, Diligent::MAP_FLAG_DISCARD,
pMappedData pMappedData);
);
if (pMappedData) { if (pMappedData) {
memcpy(pMappedData, bufferObj.data.data(), bufferObj.data.size()); memcpy(pMappedData, bufferObj.data.data(), bufferObj.data.size());
MG_Diligent::g_pContext->UnmapBuffer(pBuffer, Diligent::MAP_WRITE); MG_Diligent::g_pContext->UnmapBuffer(pBuffer, Diligent::MAP_WRITE);
bufferObj.dirty = false; bufferObj.dirty = false;
createdBuffers[buffer] = pBuffer; MG_Util::Debug::LogD("Successfully updated data for dynamic buffer %u.", bufferID);
createdBuffers[bufferID] = pBuffer;
} else {
MG_Util::Debug::LogE("Failed to map dynamic buffer %u for data update.", bufferID);
} }
} }
}
} }
std::vector<Diligent::IBuffer*> vertexBuffers; std::vector<Diligent::IBuffer*> vertexBuffers;