diff --git a/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp b/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp index 928b4fba..e455f9db 100644 --- a/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp +++ b/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp @@ -43,13 +43,16 @@ namespace MG_GL::GL { GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target); if (buffer == 0) return; - auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject(buffer); + auto& bufferObj = *MG_State_T::bufferState->GetBufferObject(buffer); if (!bufferObj.isMapped) return; size_t start = static_cast(offset); size_t end = start + static_cast(length); - Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer]; + auto it = MG_Diligent::g_BufferMap.find(buffer); + if (it == MG_Diligent::g_BufferMap.end()) + return; + Diligent::IBuffer* pBuffer = it->second; if (pBuffer && bufferObj.data.size() >= end) { const auto& Desc = pBuffer->GetDesc(); if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) { @@ -92,9 +95,12 @@ namespace MG_GL::GL { GLuint dstBuffer = MG_State_T::bufferState->GetCurrentBinding(writeTarget); if (srcBuffer == 0 || dstBuffer == 0) return; + auto itsrc = MG_Diligent::g_BufferMap.find(srcBuffer); + auto itdst = MG_Diligent::g_BufferMap.find(dstBuffer); + if (itsrc == MG_Diligent::g_BufferMap.end() || itdst == MG_Diligent::g_BufferMap.end()) return; - Diligent::IBuffer* pSrcBuffer = MG_Diligent::g_BufferMap[srcBuffer]; - Diligent::IBuffer* pDstBuffer = MG_Diligent::g_BufferMap[dstBuffer]; + Diligent::IBuffer* pSrcBuffer = itsrc->second; + Diligent::IBuffer* pDstBuffer = itdst->second; if (pSrcBuffer && pDstBuffer) { MG_Diligent::g_pContext->CopyBuffer(pSrcBuffer, static_cast(readOffset), @@ -134,9 +140,12 @@ namespace MG_GL::GL { } GLuint buffer = MG_State_T::bufferState->currentBindings_[target]; - auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject(buffer); + auto& bufferObj = *MG_State_T::bufferState->GetBufferObject(buffer); - Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer]; + auto it = MG_Diligent::g_BufferMap.find(buffer); + if (it == MG_Diligent::g_BufferMap.end()) + return GL_FALSE; + Diligent::IBuffer* pBuffer = it->second; if (pBuffer) { const auto& Desc = pBuffer->GetDesc(); if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) { @@ -191,13 +200,17 @@ namespace MG_GL::GL { if (result == GL_NO_ERROR) { GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target); if (buffer == 0) return; - auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject(buffer); + auto& bufferObj = *MG_State_T::bufferState->GetBufferObject(buffer); if (bufferObj.isDynamic) return; // Dynamic buffer should be created by glDraw* if (size <= 0) return; // ignore 0-sized reallocation bufferObj.dirty = false; - Diligent::IBuffer*& pBuffer = MG_Diligent::g_BufferMap[buffer]; + auto it = MG_Diligent::g_BufferMap.find(buffer); + if (it == MG_Diligent::g_BufferMap.end()) + return; + + Diligent::IBuffer*& pBuffer = it->second; Diligent::BufferDesc BuffDesc; std::string name; @@ -312,10 +325,13 @@ namespace MG_GL::GL { GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target); if (buffer == 0) return; - auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject(buffer); + auto& bufferObj = *MG_State_T::bufferState->GetBufferObject(buffer); if (bufferObj.isDynamic) return; // Dynamic buffer should be created by glDraw* - Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer]; + auto it = MG_Diligent::g_BufferMap.find(buffer); + if (it == MG_Diligent::g_BufferMap.end()) + return; + Diligent::IBuffer* pBuffer = it->second; if (pBuffer) { const auto& Desc = pBuffer->GetDesc(); if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) { diff --git a/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp b/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp index 865e62cc..a3896da3 100644 --- a/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp +++ b/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp @@ -494,7 +494,9 @@ namespace MG_GL::GL { if (!attrib.enabled || attrib.buffer == 0) continue; GLuint buffer = attrib.buffer; - auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject(buffer); + auto* pBufferObj = MG_State_T::bufferState->GetBufferObject(buffer); + assert(pBufferObj != nullptr); + auto& bufferObj = *pBufferObj; Diligent::IBuffer *&pBuffer = MG_Diligent::g_BufferMap[buffer]; if (bufferObj.isDynamic && (!pBuffer || (pBuffer && pBuffer->GetDesc().Size != bufferObj.data.size()))) { @@ -529,8 +531,9 @@ namespace MG_GL::GL { const void* pOriginalIndices = nullptr; if (pVAO->elementBuffer != 0) { - auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject( - pVAO->elementBuffer); + auto* pBufferObj = MG_State_T::bufferState->GetBufferObject(pVAO->elementBuffer); + assert(pBufferObj != nullptr); + auto& bufferObj = *pBufferObj; pOriginalIndices = bufferObj.data.data() + reinterpret_cast(pIndices); } else @@ -587,7 +590,9 @@ namespace MG_GL::GL { } else if (pVAO->elementBuffer != 0) { GLuint buffer = pVAO->elementBuffer; - auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject(buffer); + auto* pBufferObj = MG_State_T::bufferState->GetBufferObject(buffer); + assert(pBufferObj != nullptr); + auto& bufferObj = *pBufferObj; Diligent::IBuffer*& pBuffer = MG_Diligent::g_BufferMap[buffer]; if (bufferObj.isDynamic || (!pBuffer || (pBuffer && pBuffer->GetDesc().Size != bufferObj.data.size()))) { @@ -620,7 +625,9 @@ namespace MG_GL::GL { // Update data for all dynamic buffers for (auto& [bufferID, pBuffer] : MG_Diligent::g_BufferMap) { - auto* pBufferObject = MG_State_T::bufferState->GetOrCreateBufferObject(bufferID); + MG_Util::Debug::LogD("g_BufferMap size: %d", MG_Diligent::g_BufferMap.size()); + + auto* pBufferObject = MG_State_T::bufferState->GetBufferObject(bufferID); if (!pBufferObject) { MG_Util::Debug::LogW("Buffer ID %u not found in bufferState. Skipping update.", bufferID); continue; diff --git a/MG/MG_GL/State/Buffer/BufferState.cpp b/MG/MG_GL/State/Buffer/BufferState.cpp index f5bde535..a18e0487 100644 --- a/MG/MG_GL/State/Buffer/BufferState.cpp +++ b/MG/MG_GL/State/Buffer/BufferState.cpp @@ -43,7 +43,14 @@ GLenum BufferState::Create(GLuint buffer) { if (ValidateAllocatedHandle(buffer)) return GL_INVALID_VALUE; - BufferObject& obj = *GetOrCreateBufferObject(buffer); + if (bufferObjects_.size() <= buffer) { + bufferObjects_.resize(buffer + 1); + } + if (bufferObjects_[buffer] == nullptr) { + bufferObjects_[buffer] = std::make_unique(); + } + + BufferObject& obj = *GetBufferObject(buffer); MG_Util::Debug::LogD("MG_State: Buffer: Create created buffer %d", buffer); obj.generated = true; obj.dirty = true; @@ -66,7 +73,7 @@ GLenum BufferState::CommitStorage(GLenum target, GLsizeiptr size, const void* da if (it == currentBindings_.end() || it->second == 0) return GL_INVALID_OPERATION; - BufferObject& obj = *GetOrCreateBufferObject(it->second); + BufferObject& obj = *GetBufferObject(it->second); MG_Util::Debug::LogD("MG_State: Buffer: CommitStorage get buffer object %u at target 0x%x",it->second,target); obj.usage = usage; obj.isDynamic = (usage == GL_DYNAMIC_DRAW || usage == GL_DYNAMIC_READ || @@ -92,7 +99,7 @@ GLenum BufferState::CommitStorageRegion(GLenum target, GLintptr offset, GLsizeip if (it == currentBindings_.end() || it->second == 0) return GL_INVALID_OPERATION; - BufferObject& obj = *GetOrCreateBufferObject(it->second); + BufferObject& obj = *GetBufferObject(it->second); MG_Util::Debug::LogD("MG_State: Buffer: BufferSubData get buffer object %u at target 0x%x", it->second, target); if (static_cast(offset + size) > obj.data.size()) return GL_INVALID_VALUE; @@ -121,7 +128,7 @@ GLenum BufferState::AcquireBufferMemoryRange(GLenum target, GLintptr offset, GLs return GL_INVALID_OPERATION; } - BufferObject& obj = *GetOrCreateBufferObject(it->second); + BufferObject& obj = *GetBufferObject(it->second); MG_Util::Debug::LogD("MG_State: Buffer: AcquireBufferMemoryRange operating on buffer %u", it->second); if (obj.isMapped) { MG_Util::Debug::LogE("MG_State: Buffer: AcquireBufferMemoryRange failed: buffer %u is already mapped", it->second); @@ -157,7 +164,7 @@ GLenum BufferState::SyncBufferMemory(GLenum target, GLintptr offset, GLsizeiptr if (it == currentBindings_.end() || it->second == 0) return GL_INVALID_OPERATION; - BufferObject& obj = *GetOrCreateBufferObject(it->second); + BufferObject& obj = *GetBufferObject(it->second); if (!obj.isMapped || !(obj.mapAccessFlags & GL_MAP_FLUSH_EXPLICIT_BIT)) return GL_INVALID_OPERATION; @@ -181,8 +188,8 @@ GLenum BufferState::CopyBufferRange(GLenum readTarget, GLenum writeTarget, GLint if (readBuffer == 0 || writeBuffer == 0 || readBuffer == writeBuffer) return GL_INVALID_OPERATION; - BufferObject& src = *GetOrCreateBufferObject(readBuffer); - BufferObject& dst = *GetOrCreateBufferObject(writeBuffer); + BufferObject& src = *GetBufferObject(readBuffer); + BufferObject& dst = *GetBufferObject(writeBuffer); if (static_cast(readOffset + size) > src.data.size() || static_cast(writeOffset + size) > dst.data.size()) @@ -202,7 +209,7 @@ GLenum BufferState::AcquireBufferMemory(GLenum target, GLenum access, void** map default: flags = access; } - return AcquireBufferMemoryRange(target, 0, GetOrCreateBufferObject(currentBindings_[target])->data.size(), flags, mappedPointer); + return AcquireBufferMemoryRange(target, 0, GetBufferObject(currentBindings_[target])->data.size(), flags, mappedPointer); } GLenum BufferState::ReleaseBufferMemory(GLenum target) { @@ -213,7 +220,7 @@ GLenum BufferState::ReleaseBufferMemory(GLenum target) { if (it == currentBindings_.end() || it->second == 0) return GL_INVALID_OPERATION; - BufferObject& obj = *GetOrCreateBufferObject(it->second); + BufferObject& obj = *GetBufferObject(it->second); if (!obj.isMapped) return GL_INVALID_OPERATION; @@ -324,12 +331,13 @@ GLuint BufferState::GetCurrentBinding(GLenum target) const { return 0; } -BufferState::BufferObject* BufferState::GetOrCreateBufferObject(GLuint buffer) { +BufferState::BufferObject* BufferState::GetBufferObject(GLuint buffer) { if (bufferObjects_.size() <= buffer) { - bufferObjects_.resize(buffer + 1); - } - if (bufferObjects_[buffer] == nullptr) { - bufferObjects_[buffer] = std::make_unique(); + return nullptr; } +// if (bufferObjects_[buffer] == nullptr) { +// raise(SIGTRAP); +//// bufferObjects_[buffer] = std::make_unique(); +// } return bufferObjects_[buffer].get(); } diff --git a/MG/MG_GL/State/Buffer/BufferState.h b/MG/MG_GL/State/Buffer/BufferState.h index 2d7b7852..60f9b1be 100644 --- a/MG/MG_GL/State/Buffer/BufferState.h +++ b/MG/MG_GL/State/Buffer/BufferState.h @@ -45,7 +45,7 @@ public: void Delete(GLuint buffer); GLuint GetCurrentBinding(GLenum target) const; - BufferObject* GetOrCreateBufferObject(GLuint buffer); + BufferObject* GetBufferObject(GLuint buffer); MG_Global::unordered_map currentBindings_; // MG_Global::unordered_map buffers_;