[Feat|Fix|Improvement] (All): Continue building the basic structure.

Feat: implement MG_Impl/Buffer
Feat: implement MG_State/ErrorState and integrate it into MG_State/GLContext
Feat: add buffer deletion management
Feat: introduce `INSERTION_POINT` (https://github.com/MobileGL-Dev/MobileGLCodeManager)
Feat: add tests about MG_Impl/Buffer and buffer deletion feature
Feat: add several converters
Fix: fix some compiling errors
Fix: fix some incorrect behaviors in MG_State/Buffer
Improvement: remove some current statements at the beginning of the source file, which will be added uniformly soon
Improvement: optimize some naming
This commit is contained in:
BZLZHH
2025-07-23 23:04:36 +08:00
parent 06804d94f8
commit e79a2fa809
37 changed files with 1377 additions and 118 deletions
@@ -1,8 +1,4 @@
//
// Created by Swung 0x48 on 2025/7/20.
//
#include "Includes.h"
#include "../../../Includes.h"
namespace MobileGL {
namespace MG_Util {
@@ -1,15 +1,7 @@
//
// Created by Swung 0x48 on 2025/7/20.
//
#ifndef MOBILEGL_GLSHADERLANGCONVERTER_H
#define MOBILEGL_GLSHADERLANGCONVERTER_H
#pragma once
namespace MobileGL {
namespace MG_Util {
EShLanguage ConvertGLEnumToEShLanguage(GLenum shaderType);
}
}
#endif //MOBILEGL_GLSHADERLANGCONVERTER_H
}
@@ -0,0 +1,54 @@
#include "../../../Includes.h"
namespace MobileGL {
namespace MG_Util {
BufferTarget ConvertGLEnumToBufferTarget(GLenum bufferTarget) {
switch (bufferTarget) {
case GL_ARRAY_BUFFER: return BufferTarget::Vertex;
case GL_ELEMENT_ARRAY_BUFFER: return BufferTarget::Index;
case GL_UNIFORM_BUFFER: return BufferTarget::Uniform;
case GL_COPY_READ_BUFFER: return BufferTarget::CopyRead;
case GL_COPY_WRITE_BUFFER: return BufferTarget::CopyWrite;
case GL_PIXEL_PACK_BUFFER: return BufferTarget::PixelPack;
case GL_PIXEL_UNPACK_BUFFER: return BufferTarget::PixelUnpack;
case GL_QUERY_BUFFER: return BufferTarget::Query;
case GL_TEXTURE_BUFFER: return BufferTarget::Texture;
case GL_TRANSFORM_FEEDBACK_BUFFER: return BufferTarget::TransformFeedback;
case GL_ATOMIC_COUNTER_BUFFER: return BufferTarget::AtomicCounter;
case GL_DISPATCH_INDIRECT_BUFFER: return BufferTarget::DispatchIndirect;
case GL_DRAW_INDIRECT_BUFFER: return BufferTarget::DrawIndirect;
case GL_SHADER_STORAGE_BUFFER: return BufferTarget::ShaderStorage;
case GL_UNKNOWN_MGL:
default: return BufferTarget::Unknown;
}
}
BufferUsage ConvertGLEnumToBufferUsage(GLenum usage) {
switch (usage) {
case GL_STREAM_DRAW: return BufferUsage::StreamDraw;
case GL_STREAM_READ: return BufferUsage::StreamRead;
case GL_STREAM_COPY: return BufferUsage::StreamCopy;
case GL_STATIC_DRAW: return BufferUsage::StaticDraw;
case GL_STATIC_READ: return BufferUsage::StaticRead;
case GL_STATIC_COPY: return BufferUsage::StaticCopy;
case GL_DYNAMIC_DRAW: return BufferUsage::DynamicDraw;
case GL_DYNAMIC_READ: return BufferUsage::DynamicRead;
case GL_DYNAMIC_COPY: return BufferUsage::DynamicCopy;
default: return BufferUsage::Unknown;
}
}
BufferMappingAccessBit ConvertGLEnumToBufferMappingAccess(GLbitfield access) {
BufferMappingAccessBit result = BufferMappingAccessBit::Null;
if (access & GL_MAP_READ_BIT) result |= BufferMappingAccessBit::Read;
if (access & GL_MAP_WRITE_BIT) result |= BufferMappingAccessBit::Write;
if (access & GL_MAP_INVALIDATE_RANGE_BIT) result |= BufferMappingAccessBit::InvalidateRange;
if (access & GL_MAP_INVALIDATE_BUFFER_BIT) result |= BufferMappingAccessBit::InvalidateBuffer;
if (access & GL_MAP_FLUSH_EXPLICIT_BIT) result |= BufferMappingAccessBit::FlushExplicit;
if (access & GL_MAP_UNSYNCHRONIZED_BIT) result |= BufferMappingAccessBit::Unsynchronized;
if (access & GL_MAP_PERSISTENT_BIT) result |= BufferMappingAccessBit::Persistent;
if (access & GL_MAP_COHERENT_BIT) result |= BufferMappingAccessBit::Coherent;
return result;
}
}
}
@@ -0,0 +1,9 @@
#pragma once
namespace MobileGL {
namespace MG_Util {
BufferTarget ConvertGLEnumToBufferTarget(GLenum bufferTarget);
BufferUsage ConvertGLEnumToBufferUsage(GLenum usage);
BufferMappingAccessBit ConvertGLEnumToBufferMappingAccess(GLbitfield access);
}
}
@@ -0,0 +1,54 @@
#include "../../../Includes.h"
namespace MobileGL {
namespace MG_Util {
GLenum ConvertBufferTargetToGLEnum(BufferTarget bufferTarget) {
switch (bufferTarget) {
case BufferTarget::Vertex: return GL_ARRAY_BUFFER;
case BufferTarget::Index: return GL_ELEMENT_ARRAY_BUFFER;
case BufferTarget::Uniform: return GL_UNIFORM_BUFFER;
case BufferTarget::CopyRead: return GL_COPY_READ_BUFFER;
case BufferTarget::CopyWrite: return GL_COPY_WRITE_BUFFER;
case BufferTarget::PixelPack: return GL_PIXEL_PACK_BUFFER;
case BufferTarget::PixelUnpack: return GL_PIXEL_UNPACK_BUFFER;
case BufferTarget::Query: return GL_QUERY_BUFFER;
case BufferTarget::Texture: return GL_TEXTURE_BUFFER;
case BufferTarget::TransformFeedback: return GL_TRANSFORM_FEEDBACK_BUFFER;
case BufferTarget::AtomicCounter: return GL_ATOMIC_COUNTER_BUFFER;
case BufferTarget::DispatchIndirect: return GL_DISPATCH_INDIRECT_BUFFER;
case BufferTarget::DrawIndirect: return GL_DRAW_INDIRECT_BUFFER;
case BufferTarget::ShaderStorage: return GL_SHADER_STORAGE_BUFFER;
case BufferTarget::Unknown:
default: return GL_UNKNOWN_MGL;
}
}
GLenum ConvertBufferUsageToGLEnum(BufferUsage usage) {
switch (usage) {
case BufferUsage::StreamDraw: return GL_STREAM_DRAW;
case BufferUsage::StreamRead: return GL_STREAM_READ;
case BufferUsage::StreamCopy: return GL_STREAM_COPY;
case BufferUsage::StaticDraw: return GL_STATIC_DRAW;
case BufferUsage::StaticRead: return GL_STATIC_READ;
case BufferUsage::StaticCopy: return GL_STATIC_COPY;
case BufferUsage::DynamicDraw: return GL_DYNAMIC_DRAW;
case BufferUsage::DynamicRead: return GL_DYNAMIC_READ;
case BufferUsage::DynamicCopy: return GL_DYNAMIC_COPY;
default: return GL_UNKNOWN_MGL;
}
}
GLbitfield ConvertBufferMappingAccessToGLEnum(BufferMappingAccessBit access) {
GLbitfield result = 0;
if (Any(access & BufferMappingAccessBit::Read)) result |= GL_MAP_READ_BIT;
if (Any(access & BufferMappingAccessBit::Write)) result |= GL_MAP_WRITE_BIT;
if (Any(access & BufferMappingAccessBit::InvalidateRange)) result |= GL_MAP_INVALIDATE_RANGE_BIT;
if (Any(access & BufferMappingAccessBit::InvalidateBuffer)) result |= GL_MAP_INVALIDATE_BUFFER_BIT;
if (Any(access & BufferMappingAccessBit::FlushExplicit)) result |= GL_MAP_FLUSH_EXPLICIT_BIT;
if (Any(access & BufferMappingAccessBit::Unsynchronized)) result |= GL_MAP_UNSYNCHRONIZED_BIT;
if (Any(access & BufferMappingAccessBit::Persistent)) result |= GL_MAP_PERSISTENT_BIT;
if (Any(access & BufferMappingAccessBit::Coherent)) result |= GL_MAP_COHERENT_BIT;
return result;
}
}
}
@@ -0,0 +1,9 @@
#pragma once
namespace MobileGL {
namespace MG_Util {
GLenum ConvertBufferTargetToGLEnum(BufferTarget bufferTarget);
GLenum ConvertBufferUsageToGLEnum(BufferUsage usage);
GLbitfield ConvertBufferMappingAccessToGLEnum(BufferMappingAccessBit access);
}
}
@@ -0,0 +1,28 @@
#include "../../../Includes.h"
namespace MobileGL {
namespace MG_Util {
GLenum ConvertErrorCodeToGLEnum(ErrorCode code) {
switch (code) {
case ErrorCode::NoError:
return GL_NO_ERROR;
case ErrorCode::InvalidEnum:
return GL_INVALID_ENUM;
case ErrorCode::InvalidValue:
return GL_INVALID_VALUE;
case ErrorCode::InvalidOperation:
return GL_INVALID_OPERATION;
case ErrorCode::InvalidFramebufferOperation:
return GL_INVALID_FRAMEBUFFER_OPERATION;
case ErrorCode::OutOfMemory:
return GL_OUT_OF_MEMORY;
case ErrorCode::StackUnderflow:
return GL_STACK_UNDERFLOW;
case ErrorCode::StackOverflow:
return GL_STACK_OVERFLOW;
default:
return GL_NO_ERROR;
}
}
}
}
@@ -0,0 +1,7 @@
#pragma once
namespace MobileGL {
namespace MG_Util {
GLenum ConvertErrorCodeToGLEnum(ErrorCode code);
}
}
@@ -0,0 +1,57 @@
#include "../../../Includes.h"
namespace MobileGL {
namespace MG_Util {
String ConvertBufferTargetToString(BufferTarget bufferTarget) {
switch (bufferTarget) {
case BufferTarget::Vertex: return "Vertex";
case BufferTarget::Index: return "Index";
case BufferTarget::Uniform: return "Uniform";
case BufferTarget::CopyRead: return "CopyRead";
case BufferTarget::CopyWrite: return "CopyWrite";
case BufferTarget::PixelPack: return "PixelPack";
case BufferTarget::PixelUnpack: return "PixelUnpack";
case BufferTarget::Query: return "Query";
case BufferTarget::Texture: return "Texture";
case BufferTarget::TransformFeedback: return "TransformFeedback";
case BufferTarget::AtomicCounter: return "AtomicCounter";
case BufferTarget::DispatchIndirect: return "DispatchIndirect";
case BufferTarget::DrawIndirect: return "DrawIndirect";
case BufferTarget::ShaderStorage: return "ShaderStorage";
case BufferTarget::Unknown:
default: return "Unknown";
}
}
String ConvertBufferUsageToString(BufferUsage usage) {
switch (usage) {
case BufferUsage::StreamDraw: return "StreamDraw";
case BufferUsage::StreamRead: return "StreamRead";
case BufferUsage::StreamCopy: return "StreamCopy";
case BufferUsage::StaticDraw: return "StaticDraw";
case BufferUsage::StaticRead: return "StaticRead";
case BufferUsage::StaticCopy: return "StaticCopy";
case BufferUsage::DynamicDraw: return "DynamicDraw";
case BufferUsage::DynamicRead: return "DynamicRead";
case BufferUsage::DynamicCopy: return "DynamicCopy";
default: return "Unknown";
}
}
String ConvertBufferMappingAccessToString(BufferMappingAccessBit access) {
String result = "[";
if (Any(access & BufferMappingAccessBit::Read)) result += "Read, ";
if (Any(access & BufferMappingAccessBit::Write)) result += "Write, ";
if (Any(access & BufferMappingAccessBit::InvalidateRange)) result += "InvalidateRange, ";
if (Any(access & BufferMappingAccessBit::InvalidateBuffer)) result += "InvalidateBuffer, ";
if (Any(access & BufferMappingAccessBit::FlushExplicit)) result += "FlushExplicit, ";
if (Any(access & BufferMappingAccessBit::Unsynchronized)) result += "Unsynchronized, ";
if (Any(access & BufferMappingAccessBit::Persistent)) result += "Persistent, ";
if (Any(access & BufferMappingAccessBit::Coherent)) result += "Coherent, ";
result.pop_back();
result.pop_back();
result += "]";
return result.empty() ? "[]" : result;
}
}
}
@@ -0,0 +1,9 @@
#pragma once
namespace MobileGL {
namespace MG_Util {
String ConvertBufferTargetToString(BufferTarget bufferTarget);
String ConvertBufferUsageToString(BufferUsage usage);
String ConvertBufferMappingAccessToString(BufferMappingAccessBit access);
}
}
+5 -5
View File
@@ -7,15 +7,15 @@ namespace MobileGL {
constexpr char* GetOSName() {
#if defined(_WIN32)
return "Windows";
return (char*)"Windows";
#elif defined(__ANDROID__)
return "Android";
return (char*)"Android";
#elif defined(__APPLE__)
return "macOS";
return (char*)"macOS";
#elif defined(__linux__)
return "Linux";
return (char*)"Linux";
#else
return "UnknownOS";
return (char*)"UnknownOS";
#endif
}
+5 -5
View File
@@ -7,8 +7,8 @@ namespace MobileGL {
template <typename IndexType>
class IndexGenerator {
public:
explicit IndexGenerator(size_t initial_capacity = 1024)
: next_index_(0)
explicit IndexGenerator(size_t initial_capacity = 1024, IndexType first_index = 0)
: next_index_(first_index)
{
is_valid_.reserve(initial_capacity);
}
@@ -50,9 +50,9 @@ namespace MobileGL {
}
private:
IndexType next_index_ = 0;
std::vector<IndexType> freed_indices_;
std::vector<Uint8> is_valid_;
IndexType next_index_ = 0;
std::vector<IndexType> freed_indices_;
std::vector<Uint8> is_valid_;
};
}
@@ -1,8 +1,4 @@
//
// Created by Swung 0x48 on 2025/7/20.
//
#include "Includes.h"
#include "../../Includes.h"
namespace MobileGL {
namespace MG_Util {
@@ -1,9 +1,4 @@
//
// Created by Swung 0x48 on 2025/7/20.
//
#ifndef MOBILEGLTEST_SHADERCOMPILER_H
#define MOBILEGLTEST_SHADERCOMPILER_H
#pragma once
namespace MobileGL {
namespace MG_Util {
@@ -17,6 +12,3 @@ namespace ShaderTranspiler {
}
}
}
#endif //MOBILEGLTEST_SHADERCOMPILER_H
+1 -8
View File
@@ -1,9 +1,4 @@
//
// Created by Swung 0x48 on 2025/7/20.
//
#ifndef MG_UTIL_SHADERTRANSPILER_TYPES_H
#define MG_UTIL_SHADERTRANSPILER_TYPES_H
#pragma once
namespace MobileGL {
namespace MG_Util {
@@ -145,5 +140,3 @@ namespace MobileGL {
}
#include "ShaderCompiler.h"
#endif //MG_UTIL_SHADERTRANSPILER_TYPES_H
+11 -5
View File
@@ -1,5 +1,7 @@
#pragma once
#define GL_UNKNOWN_MGL 0
namespace MobileGL {
using String = std::string;
using StringStream = std::stringstream;
@@ -24,11 +26,11 @@ namespace MobileGL {
using SharedPtr = std::shared_ptr<T>;
template <typename T>
using UniquePtr = std::unique_ptr<T>;
template<typename T, typename... Args>
template <typename T, typename... Args>
inline SharedPtr<T> MakeShared(Args&&... args) {
return std::make_shared<T>(std::forward<Args>(args)...);
}
template<typename T, typename... Args>
template <typename T, typename... Args>
inline UniquePtr<T> MakeUnique(Args&&... args) {
return std::make_unique<T>(std::forward<Args>(args)...);
}
@@ -37,10 +39,14 @@ namespace MobileGL {
using Array = std::array<T, N>;
template <typename Key, typename Value>
using UnorderedMap = std::unordered_map<Key, Value>;
template<typename T>
template <typename T>
inline constexpr std::remove_reference_t<T>&& Move(T&& t) noexcept {
return static_cast<std::remove_reference_t<T>&&>(t);
}
template <typename T>
inline constexpr void Copy(const T* src, T* dest, SizeT count) {
std::copy(src, src + count, dest);
}
class RuntimeError : public std::runtime_error {
public:
using std::runtime_error::runtime_error;
@@ -100,7 +106,7 @@ namespace MobileGL {
}
};
template<typename ObjectType>
template <typename ObjectType>
class BindingSlot {
public:
using TargetEnum = typename ObjectType::TargetEnum;
@@ -162,4 +168,4 @@ namespace MobileGL {
};
}
#include "MG_Util/ShaderTranspiler/Types.h"
#include "../MG_Util/ShaderTranspiler/Types.h"