mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-13 06:38:31 +09:00
[Fix] (MG_State/Buffer): 1. Don't check on GetBufferObject(), do it on creation 2. Don't modify g_BufferMap on querying
This commit is contained in:
@@ -43,13 +43,16 @@ namespace MG_GL::GL {
|
|||||||
GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target);
|
GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target);
|
||||||
if (buffer == 0) return;
|
if (buffer == 0) return;
|
||||||
|
|
||||||
auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject(buffer);
|
auto& bufferObj = *MG_State_T::bufferState->GetBufferObject(buffer);
|
||||||
if (!bufferObj.isMapped) return;
|
if (!bufferObj.isMapped) return;
|
||||||
|
|
||||||
size_t start = static_cast<size_t>(offset);
|
size_t start = static_cast<size_t>(offset);
|
||||||
size_t end = start + static_cast<size_t>(length);
|
size_t end = start + static_cast<size_t>(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) {
|
if (pBuffer && bufferObj.data.size() >= end) {
|
||||||
const auto& Desc = pBuffer->GetDesc();
|
const auto& Desc = pBuffer->GetDesc();
|
||||||
if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) {
|
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);
|
GLuint dstBuffer = MG_State_T::bufferState->GetCurrentBinding(writeTarget);
|
||||||
|
|
||||||
if (srcBuffer == 0 || dstBuffer == 0) return;
|
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* pSrcBuffer = itsrc->second;
|
||||||
Diligent::IBuffer* pDstBuffer = MG_Diligent::g_BufferMap[dstBuffer];
|
Diligent::IBuffer* pDstBuffer = itdst->second;
|
||||||
|
|
||||||
if (pSrcBuffer && pDstBuffer) {
|
if (pSrcBuffer && pDstBuffer) {
|
||||||
MG_Diligent::g_pContext->CopyBuffer(pSrcBuffer, static_cast<Diligent::Uint64>(readOffset),
|
MG_Diligent::g_pContext->CopyBuffer(pSrcBuffer, static_cast<Diligent::Uint64>(readOffset),
|
||||||
@@ -134,9 +140,12 @@ namespace MG_GL::GL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GLuint buffer = MG_State_T::bufferState->currentBindings_[target];
|
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) {
|
if (pBuffer) {
|
||||||
const auto& Desc = pBuffer->GetDesc();
|
const auto& Desc = pBuffer->GetDesc();
|
||||||
if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) {
|
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) {
|
if (result == GL_NO_ERROR) {
|
||||||
GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target);
|
GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target);
|
||||||
if (buffer == 0) return;
|
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 (bufferObj.isDynamic) return; // Dynamic buffer should be created by glDraw*
|
||||||
if (size <= 0) return; // ignore 0-sized reallocation
|
if (size <= 0) return; // ignore 0-sized reallocation
|
||||||
|
|
||||||
bufferObj.dirty = false;
|
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;
|
Diligent::BufferDesc BuffDesc;
|
||||||
std::string name;
|
std::string name;
|
||||||
@@ -312,10 +325,13 @@ namespace MG_GL::GL {
|
|||||||
GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target);
|
GLuint buffer = MG_State_T::bufferState->GetCurrentBinding(target);
|
||||||
if (buffer == 0) return;
|
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 (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) {
|
if (pBuffer) {
|
||||||
const auto& Desc = pBuffer->GetDesc();
|
const auto& Desc = pBuffer->GetDesc();
|
||||||
if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) {
|
if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) {
|
||||||
|
|||||||
@@ -494,7 +494,9 @@ namespace MG_GL::GL {
|
|||||||
if (!attrib.enabled || attrib.buffer == 0) continue;
|
if (!attrib.enabled || attrib.buffer == 0) continue;
|
||||||
|
|
||||||
GLuint buffer = attrib.buffer;
|
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];
|
Diligent::IBuffer *&pBuffer = MG_Diligent::g_BufferMap[buffer];
|
||||||
if (bufferObj.isDynamic && (!pBuffer || (pBuffer && pBuffer->GetDesc().Size != bufferObj.data.size()))) {
|
if (bufferObj.isDynamic && (!pBuffer || (pBuffer && pBuffer->GetDesc().Size != bufferObj.data.size()))) {
|
||||||
@@ -529,8 +531,9 @@ namespace MG_GL::GL {
|
|||||||
const void* pOriginalIndices = nullptr;
|
const void* pOriginalIndices = nullptr;
|
||||||
if (pVAO->elementBuffer != 0)
|
if (pVAO->elementBuffer != 0)
|
||||||
{
|
{
|
||||||
auto& bufferObj = *MG_State_T::bufferState->GetOrCreateBufferObject(
|
auto* pBufferObj = MG_State_T::bufferState->GetBufferObject(pVAO->elementBuffer);
|
||||||
pVAO->elementBuffer);
|
assert(pBufferObj != nullptr);
|
||||||
|
auto& bufferObj = *pBufferObj;
|
||||||
pOriginalIndices = bufferObj.data.data() + reinterpret_cast<uintptr_t>(pIndices);
|
pOriginalIndices = bufferObj.data.data() + reinterpret_cast<uintptr_t>(pIndices);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -587,7 +590,9 @@ namespace MG_GL::GL {
|
|||||||
}
|
}
|
||||||
else if (pVAO->elementBuffer != 0) {
|
else if (pVAO->elementBuffer != 0) {
|
||||||
GLuint buffer = pVAO->elementBuffer;
|
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];
|
Diligent::IBuffer*& pBuffer = MG_Diligent::g_BufferMap[buffer];
|
||||||
if (bufferObj.isDynamic || (!pBuffer || (pBuffer && pBuffer->GetDesc().Size != bufferObj.data.size()))) {
|
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
|
// Update data for all dynamic buffers
|
||||||
for (auto& [bufferID, pBuffer] : MG_Diligent::g_BufferMap) {
|
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) {
|
if (!pBufferObject) {
|
||||||
MG_Util::Debug::LogW("Buffer ID %u not found in bufferState. Skipping update.", bufferID);
|
MG_Util::Debug::LogW("Buffer ID %u not found in bufferState. Skipping update.", bufferID);
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -43,7 +43,14 @@ GLenum BufferState::Create(GLuint buffer) {
|
|||||||
if (ValidateAllocatedHandle(buffer))
|
if (ValidateAllocatedHandle(buffer))
|
||||||
return GL_INVALID_VALUE;
|
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>();
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferObject& obj = *GetBufferObject(buffer);
|
||||||
MG_Util::Debug::LogD("MG_State: Buffer: Create created buffer %d", buffer);
|
MG_Util::Debug::LogD("MG_State: Buffer: Create created buffer %d", buffer);
|
||||||
obj.generated = true;
|
obj.generated = true;
|
||||||
obj.dirty = 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)
|
if (it == currentBindings_.end() || it->second == 0)
|
||||||
return GL_INVALID_OPERATION;
|
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);
|
MG_Util::Debug::LogD("MG_State: Buffer: CommitStorage get buffer object %u at target 0x%x",it->second,target);
|
||||||
obj.usage = usage;
|
obj.usage = usage;
|
||||||
obj.isDynamic = (usage == GL_DYNAMIC_DRAW || usage == GL_DYNAMIC_READ ||
|
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)
|
if (it == currentBindings_.end() || it->second == 0)
|
||||||
return GL_INVALID_OPERATION;
|
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);
|
MG_Util::Debug::LogD("MG_State: Buffer: BufferSubData get buffer object %u at target 0x%x", it->second, target);
|
||||||
|
|
||||||
if (static_cast<size_t>(offset + size) > obj.data.size()) return GL_INVALID_VALUE;
|
if (static_cast<size_t>(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;
|
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);
|
MG_Util::Debug::LogD("MG_State: Buffer: AcquireBufferMemoryRange operating on buffer %u", it->second);
|
||||||
if (obj.isMapped) {
|
if (obj.isMapped) {
|
||||||
MG_Util::Debug::LogE("MG_State: Buffer: AcquireBufferMemoryRange failed: buffer %u is already mapped", it->second);
|
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)
|
if (it == currentBindings_.end() || it->second == 0)
|
||||||
return GL_INVALID_OPERATION;
|
return GL_INVALID_OPERATION;
|
||||||
|
|
||||||
BufferObject& obj = *GetOrCreateBufferObject(it->second);
|
BufferObject& obj = *GetBufferObject(it->second);
|
||||||
if (!obj.isMapped || !(obj.mapAccessFlags & GL_MAP_FLUSH_EXPLICIT_BIT))
|
if (!obj.isMapped || !(obj.mapAccessFlags & GL_MAP_FLUSH_EXPLICIT_BIT))
|
||||||
return GL_INVALID_OPERATION;
|
return GL_INVALID_OPERATION;
|
||||||
|
|
||||||
@@ -181,8 +188,8 @@ GLenum BufferState::CopyBufferRange(GLenum readTarget, GLenum writeTarget, GLint
|
|||||||
if (readBuffer == 0 || writeBuffer == 0 || readBuffer == writeBuffer)
|
if (readBuffer == 0 || writeBuffer == 0 || readBuffer == writeBuffer)
|
||||||
return GL_INVALID_OPERATION;
|
return GL_INVALID_OPERATION;
|
||||||
|
|
||||||
BufferObject& src = *GetOrCreateBufferObject(readBuffer);
|
BufferObject& src = *GetBufferObject(readBuffer);
|
||||||
BufferObject& dst = *GetOrCreateBufferObject(writeBuffer);
|
BufferObject& dst = *GetBufferObject(writeBuffer);
|
||||||
|
|
||||||
if (static_cast<size_t>(readOffset + size) > src.data.size() ||
|
if (static_cast<size_t>(readOffset + size) > src.data.size() ||
|
||||||
static_cast<size_t>(writeOffset + size) > dst.data.size())
|
static_cast<size_t>(writeOffset + size) > dst.data.size())
|
||||||
@@ -202,7 +209,7 @@ GLenum BufferState::AcquireBufferMemory(GLenum target, GLenum access, void** map
|
|||||||
default:
|
default:
|
||||||
flags = access;
|
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) {
|
GLenum BufferState::ReleaseBufferMemory(GLenum target) {
|
||||||
@@ -213,7 +220,7 @@ GLenum BufferState::ReleaseBufferMemory(GLenum target) {
|
|||||||
if (it == currentBindings_.end() || it->second == 0)
|
if (it == currentBindings_.end() || it->second == 0)
|
||||||
return GL_INVALID_OPERATION;
|
return GL_INVALID_OPERATION;
|
||||||
|
|
||||||
BufferObject& obj = *GetOrCreateBufferObject(it->second);
|
BufferObject& obj = *GetBufferObject(it->second);
|
||||||
if (!obj.isMapped)
|
if (!obj.isMapped)
|
||||||
return GL_INVALID_OPERATION;
|
return GL_INVALID_OPERATION;
|
||||||
|
|
||||||
@@ -324,12 +331,13 @@ GLuint BufferState::GetCurrentBinding(GLenum target) const {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferState::BufferObject* BufferState::GetOrCreateBufferObject(GLuint buffer) {
|
BufferState::BufferObject* BufferState::GetBufferObject(GLuint buffer) {
|
||||||
if (bufferObjects_.size() <= buffer) {
|
if (bufferObjects_.size() <= buffer) {
|
||||||
bufferObjects_.resize(buffer + 1);
|
return nullptr;
|
||||||
}
|
|
||||||
if (bufferObjects_[buffer] == nullptr) {
|
|
||||||
bufferObjects_[buffer] = std::make_unique<BufferObject>();
|
|
||||||
}
|
}
|
||||||
|
// if (bufferObjects_[buffer] == nullptr) {
|
||||||
|
// raise(SIGTRAP);
|
||||||
|
//// bufferObjects_[buffer] = std::make_unique<BufferObject>();
|
||||||
|
// }
|
||||||
return bufferObjects_[buffer].get();
|
return bufferObjects_[buffer].get();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public:
|
|||||||
void Delete(GLuint buffer);
|
void Delete(GLuint buffer);
|
||||||
GLuint GetCurrentBinding(GLenum target) const;
|
GLuint GetCurrentBinding(GLenum target) const;
|
||||||
|
|
||||||
BufferObject* GetOrCreateBufferObject(GLuint buffer);
|
BufferObject* GetBufferObject(GLuint buffer);
|
||||||
|
|
||||||
MG_Global::unordered_map<GLenum, GLuint> currentBindings_;
|
MG_Global::unordered_map<GLenum, GLuint> currentBindings_;
|
||||||
// MG_Global::unordered_map<GLuint, BufferObject> buffers_;
|
// MG_Global::unordered_map<GLuint, BufferObject> buffers_;
|
||||||
|
|||||||
Reference in New Issue
Block a user