mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 13:48:30 +09:00
[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:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user