From fc9018f97c685eb0d3a30396507b32e3f3f8db99 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Fri, 25 Jul 2025 14:02:36 +0800 Subject: [PATCH] [Misc] (MG_State/Buffer): Separate BufferState.cpp into 2 files. --- CMakeLists.txt | 3 +- .../GLState/BufferState/BufferObject.cpp | 158 ++++++++++++++++++ .../GLState/BufferState/BufferState.cpp | 153 ----------------- MobileGL/MG_Test/Buffer/CMakeLists.txt | 1 + 4 files changed, 161 insertions(+), 154 deletions(-) create mode 100644 MobileGL/MG_State/GLState/BufferState/BufferObject.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index abe986af..f89503e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,7 +46,8 @@ add_library(${CMAKE_PROJECT_NAME} SHARED MobileGL/MG_State/GLState/Core.cpp MobileGL/MG_State/GLState/ErrorState/Error.cpp MobileGL/MG_State/GLState/BufferState/BufferState.cpp - ) + MobileGL/MG_State/GLState/BufferState/BufferObject.cpp +) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/library/arm64-v8a/libglslang.a diff --git a/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp b/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp new file mode 100644 index 00000000..990bf56d --- /dev/null +++ b/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp @@ -0,0 +1,158 @@ +#include "../../../Includes.h" + +namespace MobileGL { + namespace MG_State { + namespace GLState { + BufferObject::BufferObject() + : m_id(0), m_size(0), m_usage(BufferUsage::StaticDraw), + m_isMapped(false), m_mappingAccess(BufferMappingAccessBit::Null), + m_dirtyRange({ 0, 0 }), m_mappedRange({ 0, 0 }) { + } + + void BufferObject::Resize(SizeT size) { + m_size = size; + m_data.reserve(std::bit_ceil(size)); // power-of-2 reserve + m_data.resize(size); + m_dirtyRange = { 0, 0 }; + } + + void BufferObject::UploadData(DataPtr data, SizeT atOffset) { + assert(atOffset + data.size <= m_size); + assert(!m_isMapped); + memcpy(m_data.data() + atOffset, data.data, data.size); + m_dirtyRange.UnionUpdate(atOffset, atOffset + data.size); + } + + void BufferObject::SetUsage(BufferUsage usage) { + m_usage = usage; + } + + void BufferObject::ReleaseMemory() { + if (!m_isMapped) return; + + if (Any(m_mappingAccess & BufferMappingAccessBit::Write)) { // if we wrote to the buffer + if (!Any(m_mappingAccess & BufferMappingAccessBit::FlushExplicit)) { // if we didn't flush explicitly + memcpy(m_data.data() + m_mappedRange.start, + m_stagingData.data(), + m_mappedRange.end - m_mappedRange.start); + m_dirtyRange.UnionUpdate(m_mappedRange.start, m_mappedRange.end); + } + + m_stagingData.clear(); + } + + m_isMapped = false; + m_mappingAccess = BufferMappingAccessBit::Null; + m_mappedRange = { 0, 0 }; + m_ownsStagingData = false; + } + + void BufferObject::FlushMemoryRange(SizeT offset, SizeT length) { + assert(m_isMapped); + assert(Any(m_mappingAccess & BufferMappingAccessBit::FlushExplicit)); + assert(Any(m_mappingAccess & BufferMappingAccessBit::Write)); + + SizeT start = m_mappedRange.start + offset; + SizeT end = start + length; + assert(end <= m_mappedRange.end); + + memcpy(m_data.data() + start, m_stagingData.data() + offset, length); + m_dirtyRange.UnionUpdate(start, end); + } + + void BufferObject::UploadSubData(DataPtr data, SizeT atOffset) { + assert(!m_isMapped); + assert(atOffset + data.size <= m_size); + + memcpy(m_data.data() + atOffset, data.data, data.size); + m_dirtyRange.UnionUpdate(atOffset, atOffset + data.size); + } + + void BufferObject::CopyDataFrom(const SharedPtr& src, SizeT srcOffset, SizeT dstOffset, SizeT size) { + assert(!m_isMapped); + assert(!src->IsMapped()); + assert(srcOffset + size <= src->GetSize()); + assert(dstOffset + size <= m_size); + + const Uint8* srcData = src->m_data.data() + srcOffset; + memcpy(m_data.data() + dstOffset, srcData, size); + m_dirtyRange.UnionUpdate(dstOffset, dstOffset + size); + } + + void* BufferObject::AcquireMemory(Bool markMapped, Bool read, Bool write) { + if (markMapped) { + m_isMapped = true; + m_mappingAccess = + (read ? BufferMappingAccessBit::Read : BufferMappingAccessBit::Null) | + (write ? BufferMappingAccessBit::Write : BufferMappingAccessBit::Null); + m_mappedRange = { 0, m_size }; + + if (Any(m_mappingAccess & BufferMappingAccessBit::Write)) { + m_stagingData.resize(m_size); + m_ownsStagingData = true; + + if (!Any(m_mappingAccess & (BufferMappingAccessBit::InvalidateRange | + BufferMappingAccessBit::InvalidateBuffer))) { + memcpy(m_stagingData.data(), m_data.data(), m_size); + } + + return m_stagingData.data(); + } + } + + return m_data.data(); + } + + void* BufferObject::AcquireMemoryRange(Range1D range, BufferMappingAccessBit access) { + assert(range.end <= m_size && range.start <= range.end); + m_isMapped = true; + m_mappingAccess = access; + m_mappedRange = range; + + if (Any(access & BufferMappingAccessBit::Write)) { + m_stagingData.resize(range.end - range.start); + m_ownsStagingData = true; + + if (!Any(access & (BufferMappingAccessBit::InvalidateRange | + BufferMappingAccessBit::InvalidateBuffer))) { + memcpy(m_stagingData.data(), m_data.data() + range.start, m_stagingData.size()); + } + + return m_stagingData.data(); + } + else { + m_ownsStagingData = false; + return m_data.data() + range.start; + } + } + + void BufferObject::ClearDirty() { + m_dirtyRange = { 0, 0 }; + } + + SizeT BufferObject::GetSize() const { + return m_size; + } + + BufferUsage BufferObject::GetUsage() const { + return m_usage; + } + + Range1D BufferObject::GetDirtyRange() const { + return m_dirtyRange; + } + + Bool BufferObject::IsMapped() const { + return m_isMapped; + } + + Range1D BufferObject::GetMappedRange() const { + return m_isMapped ? m_mappedRange : Range1D{ 0, 0 }; + } + + BufferMappingAccessBit BufferObject::GetMappingAccess() const { + return m_isMapped ? m_mappingAccess : BufferMappingAccessBit::Null; + } + } + } +} \ No newline at end of file diff --git a/MobileGL/MG_State/GLState/BufferState/BufferState.cpp b/MobileGL/MG_State/GLState/BufferState/BufferState.cpp index 56548ddc..6a2a30f1 100644 --- a/MobileGL/MG_State/GLState/BufferState/BufferState.cpp +++ b/MobileGL/MG_State/GLState/BufferState/BufferState.cpp @@ -3,159 +3,6 @@ namespace MobileGL { namespace MG_State { namespace GLState { - // BufferObject - BufferObject::BufferObject() - : m_id(0), m_size(0), m_usage(BufferUsage::StaticDraw), - m_isMapped(false), m_mappingAccess(BufferMappingAccessBit::Null), - m_dirtyRange({ 0, 0 }), m_mappedRange({ 0, 0 }) { - } - - void BufferObject::Resize(SizeT size) { - m_size = size; - m_data.reserve(std::bit_ceil(size)); // power-of-2 reserve - m_data.resize(size); - m_dirtyRange = { 0, 0 }; - } - - void BufferObject::UploadData(DataPtr data, SizeT atOffset) { - assert(atOffset + data.size <= m_size); - assert(!m_isMapped); - memcpy(m_data.data() + atOffset, data.data, data.size); - m_dirtyRange.UnionUpdate(atOffset, atOffset + data.size); - } - - void BufferObject::SetUsage(BufferUsage usage) { - m_usage = usage; - } - - void BufferObject::ReleaseMemory() { - if (!m_isMapped) return; - - if (Any(m_mappingAccess & BufferMappingAccessBit::Write)) { // if we wrote to the buffer - if (!Any(m_mappingAccess & BufferMappingAccessBit::FlushExplicit)) { // if we didn't flush explicitly - memcpy(m_data.data() + m_mappedRange.start, - m_stagingData.data(), - m_mappedRange.end - m_mappedRange.start); - m_dirtyRange.UnionUpdate(m_mappedRange.start, m_mappedRange.end); - } - - m_stagingData.clear(); - } - - m_isMapped = false; - m_mappingAccess = BufferMappingAccessBit::Null; - m_mappedRange = { 0, 0 }; - m_ownsStagingData = false; - } - - void BufferObject::FlushMemoryRange(SizeT offset, SizeT length) { - assert(m_isMapped); - assert(Any(m_mappingAccess & BufferMappingAccessBit::FlushExplicit)); - assert(Any(m_mappingAccess & BufferMappingAccessBit::Write)); - - SizeT start = m_mappedRange.start + offset; - SizeT end = start + length; - assert(end <= m_mappedRange.end); - - memcpy(m_data.data() + start, m_stagingData.data() + offset, length); - m_dirtyRange.UnionUpdate(start, end); - } - - void BufferObject::UploadSubData(DataPtr data, SizeT atOffset) { - assert(!m_isMapped); - assert(atOffset + data.size <= m_size); - - memcpy(m_data.data() + atOffset, data.data, data.size); - m_dirtyRange.UnionUpdate(atOffset, atOffset + data.size); - } - - void BufferObject::CopyDataFrom(const SharedPtr& src, SizeT srcOffset, SizeT dstOffset, SizeT size) { - assert(!m_isMapped); - assert(!src->IsMapped()); - assert(srcOffset + size <= src->GetSize()); - assert(dstOffset + size <= m_size); - - const Uint8* srcData = src->m_data.data() + srcOffset; - memcpy(m_data.data() + dstOffset, srcData, size); - m_dirtyRange.UnionUpdate(dstOffset, dstOffset + size); - } - - void* BufferObject::AcquireMemory(Bool markMapped, Bool read, Bool write) { - if (markMapped) { - m_isMapped = true; - m_mappingAccess = - (read ? BufferMappingAccessBit::Read : BufferMappingAccessBit::Null) | - (write ? BufferMappingAccessBit::Write : BufferMappingAccessBit::Null); - m_mappedRange = { 0, m_size }; - - if (Any(m_mappingAccess & BufferMappingAccessBit::Write)) { - m_stagingData.resize(m_size); - m_ownsStagingData = true; - - if (!Any(m_mappingAccess & (BufferMappingAccessBit::InvalidateRange | - BufferMappingAccessBit::InvalidateBuffer))) { - memcpy(m_stagingData.data(), m_data.data(), m_size); - } - - return m_stagingData.data(); - } - } - - return m_data.data(); - } - - void* BufferObject::AcquireMemoryRange(Range1D range, BufferMappingAccessBit access) { - assert(range.end <= m_size && range.start <= range.end); - m_isMapped = true; - m_mappingAccess = access; - m_mappedRange = range; - - if (Any(access & BufferMappingAccessBit::Write)) { - m_stagingData.resize(range.end - range.start); - m_ownsStagingData = true; - - if (!Any(access & (BufferMappingAccessBit::InvalidateRange | - BufferMappingAccessBit::InvalidateBuffer))) { - memcpy(m_stagingData.data(), m_data.data() + range.start, m_stagingData.size()); - } - - return m_stagingData.data(); - } - else { - m_ownsStagingData = false; - return m_data.data() + range.start; - } - } - - void BufferObject::ClearDirty() { - m_dirtyRange = { 0, 0 }; - } - - SizeT BufferObject::GetSize() const { - return m_size; - } - - BufferUsage BufferObject::GetUsage() const { - return m_usage; - } - - Range1D BufferObject::GetDirtyRange() const { - return m_dirtyRange; - } - - Bool BufferObject::IsMapped() const { - return m_isMapped; - } - - Range1D BufferObject::GetMappedRange() const { - return m_isMapped ? m_mappedRange : Range1D{ 0, 0 }; - } - - BufferMappingAccessBit BufferObject::GetMappingAccess() const { - return m_isMapped ? m_mappingAccess : BufferMappingAccessBit::Null; - } - - // BufferState BufferState::BufferState() : m_indexGenerator(1024, 1) { for (SizeT i = 0; i < (SizeT)BufferTarget::BufferTargetCount; ++i) { diff --git a/MobileGL/MG_Test/Buffer/CMakeLists.txt b/MobileGL/MG_Test/Buffer/CMakeLists.txt index b948b68a..0a824088 100644 --- a/MobileGL/MG_Test/Buffer/CMakeLists.txt +++ b/MobileGL/MG_Test/Buffer/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable( ${MGL_ROOT}/MobileGL/MG_State/GLState/Core.cpp ${MGL_ROOT}/MobileGL/MG_State/GLState/BufferState/BufferState.cpp + ${MGL_ROOT}/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp ${MGL_ROOT}/MobileGL/MG_State/GLState/ErrorState/Error.cpp ${MGL_ROOT}/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp ${MGL_ROOT}/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp