[Fix] (Diligent/Buffer): Make all types of buffer mappable.

This commit is contained in:
BZLZHH
2025-06-10 01:54:19 +08:00
parent c5ea0a7bf1
commit 964f483fd5
@@ -51,6 +51,8 @@ namespace MG_GL::GL {
Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer]; Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer];
if (pBuffer && bufferObj.data.size() >= end) { 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) {
void * data; void * data;
MG_Diligent::g_pContext->MapBuffer(pBuffer, Diligent::MAP_WRITE, MG_Diligent::g_pContext->MapBuffer(pBuffer, Diligent::MAP_WRITE,
Diligent::MAP_FLAG_DISCARD, data); Diligent::MAP_FLAG_DISCARD, data);
@@ -62,8 +64,11 @@ namespace MG_GL::GL {
MG_Diligent::g_pContext->UnmapBuffer(pBuffer, Diligent::MAP_WRITE); MG_Diligent::g_pContext->UnmapBuffer(pBuffer, Diligent::MAP_WRITE);
} }
} else {
// For USAGE_DEFAULT or USAGE_IMMUTABLE, use UpdateBuffer
MG_Diligent::g_pContext->UpdateBuffer(pBuffer, static_cast<Diligent::Uint64>(offset), static_cast<Diligent::Uint64>(length), bufferObj.data.data() + offset, Diligent::RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
}
} }
return; return;
} }
MG_State::SetError(result); MG_State::SetError(result);
@@ -133,6 +138,8 @@ namespace MG_GL::GL {
Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer]; Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer];
if (pBuffer) { if (pBuffer) {
const auto& Desc = pBuffer->GetDesc();
if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) {
void * data; void * data;
MG_Diligent::g_pContext->MapBuffer(pBuffer, Diligent::MAP_WRITE, MG_Diligent::g_pContext->MapBuffer(pBuffer, Diligent::MAP_WRITE,
Diligent::MAP_FLAG_DISCARD, data); Diligent::MAP_FLAG_DISCARD, data);
@@ -141,6 +148,10 @@ namespace MG_GL::GL {
memcpy(data, bufferObj.data.data(), bufferObj.data.size()); memcpy(data, bufferObj.data.data(), bufferObj.data.size());
MG_Diligent::g_pContext->UnmapBuffer(pBuffer, Diligent::MAP_WRITE); MG_Diligent::g_pContext->UnmapBuffer(pBuffer, Diligent::MAP_WRITE);
} }
} else {
// For USAGE_DEFAULT or USAGE_IMMUTABLE, use UpdateBuffer
MG_Diligent::g_pContext->UpdateBuffer(pBuffer, 0, bufferObj.data.size(), bufferObj.data.data(), Diligent::RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
}
} }
MG_Util::Debug::LogD("glUnmapBuffer succeeded"); MG_Util::Debug::LogD("glUnmapBuffer succeeded");
@@ -210,16 +221,7 @@ namespace MG_GL::GL {
} }
BuffDesc.Name = name.c_str(); BuffDesc.Name = name.c_str();
switch (usage) {
case GL_STATIC_DRAW:
BuffDesc.Usage = Diligent::USAGE_IMMUTABLE;
BuffDesc.CPUAccessFlags = Diligent::CPU_ACCESS_NONE;
break;
default:
BuffDesc.Usage = Diligent::USAGE_DEFAULT; BuffDesc.Usage = Diligent::USAGE_DEFAULT;
break;
}
if (pBuffer == nullptr) { if (pBuffer == nullptr) {
Diligent::BufferData BuffData; Diligent::BufferData BuffData;
@@ -306,6 +308,8 @@ namespace MG_GL::GL {
Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer]; Diligent::IBuffer* pBuffer = MG_Diligent::g_BufferMap[buffer];
if (pBuffer) { if (pBuffer) {
const auto& Desc = pBuffer->GetDesc();
if (Desc.Usage == Diligent::USAGE_STAGING || Desc.Usage == Diligent::USAGE_DYNAMIC || Desc.Usage == Diligent::USAGE_UNIFIED) {
void* pMappedData = nullptr; void* pMappedData = nullptr;
MG_Diligent::g_pContext->MapBuffer(pBuffer, Diligent::MAP_WRITE, Diligent::MAP_FLAG_DISCARD, pMappedData); MG_Diligent::g_pContext->MapBuffer(pBuffer, Diligent::MAP_WRITE, Diligent::MAP_FLAG_DISCARD, pMappedData);
if (pMappedData) if (pMappedData)
@@ -315,6 +319,12 @@ namespace MG_GL::GL {
} else { } else {
MG_Util::Debug::LogE("Failed to map buffer for BufferSubData"); MG_Util::Debug::LogE("Failed to map buffer for BufferSubData");
} }
} else {
// For USAGE_DEFAULT or USAGE_IMMUTABLE, use UpdateBuffer
MG_Diligent::g_pContext->UpdateBuffer(pBuffer, static_cast<Diligent::Uint64>(offset),
static_cast<Diligent::Uint64>(size), data,
Diligent::RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
}
} }
} }
void DeleteBuffers(GLsizei n, const GLuint *buffers) { void DeleteBuffers(GLsizei n, const GLuint *buffers) {