From 7a7f6a0533b449c349346e8f6d3bfdcc52fc3e0c Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Fri, 22 Aug 2025 17:29:25 +0800 Subject: [PATCH] [Feat] (MG_Util/Metrics): GetGLTypeSize --- MobileGL/MG_Test/Buffer/CMakeLists.txt | 1 + MobileGL/MG_Test/Program/CMakeLists.txt | 1 + MobileGL/MG_Test/VertexArray/CMakeLists.txt | 1 + MobileGL/MG_Util/Metrics/BufferMetrics.cpp | 117 ++++++++++++++++++++ MobileGL/MG_Util/Metrics/BufferMetrics.h | 16 +++ 5 files changed, 136 insertions(+) create mode 100644 MobileGL/MG_Util/Metrics/BufferMetrics.cpp create mode 100644 MobileGL/MG_Util/Metrics/BufferMetrics.h diff --git a/MobileGL/MG_Test/Buffer/CMakeLists.txt b/MobileGL/MG_Test/Buffer/CMakeLists.txt index 9cf1dfda..16c18571 100644 --- a/MobileGL/MG_Test/Buffer/CMakeLists.txt +++ b/MobileGL/MG_Test/Buffer/CMakeLists.txt @@ -32,6 +32,7 @@ add_executable( ${MGL_ROOT}/MobileGL/MG_Util/Converters/MGToGL/DataTypeConverter.cpp ${MGL_ROOT}/MobileGL/MG_Util/Converters/GLToMG/BufferEnumConverter.cpp ${MGL_ROOT}/MobileGL/MG_Util/Converters/GLToMG/DataTypeConverter.cpp + ${MGL_ROOT}/MobileGL/MG_Util/Metrics/BufferMetrics.cpp ${MGL_ROOT}/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp ${MGL_ROOT}/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp ${MGL_ROOT}/MobileGL/MG_Backend/Init.cpp diff --git a/MobileGL/MG_Test/Program/CMakeLists.txt b/MobileGL/MG_Test/Program/CMakeLists.txt index 3d828123..9b2aa5d2 100644 --- a/MobileGL/MG_Test/Program/CMakeLists.txt +++ b/MobileGL/MG_Test/Program/CMakeLists.txt @@ -63,6 +63,7 @@ add_executable( ${MGL_ROOT}/MobileGL/MG_Util/Converters/MGToGL/DataTypeConverter.cpp ${MGL_ROOT}/MobileGL/MG_Util/Converters/GLToMG/BufferEnumConverter.cpp ${MGL_ROOT}/MobileGL/MG_Util/Converters/GLToMG/DataTypeConverter.cpp + ${MGL_ROOT}/MobileGL/MG_Util/Metrics/BufferMetrics.cpp ${MGL_ROOT}/MobileGL/MG_Backend/Init.cpp ${MGL_ROOT}/MobileGL/MG_Util/Debug/Log.cpp ) diff --git a/MobileGL/MG_Test/VertexArray/CMakeLists.txt b/MobileGL/MG_Test/VertexArray/CMakeLists.txt index 2dcac661..dcbdd056 100644 --- a/MobileGL/MG_Test/VertexArray/CMakeLists.txt +++ b/MobileGL/MG_Test/VertexArray/CMakeLists.txt @@ -32,6 +32,7 @@ add_executable( ${MGL_ROOT}/MobileGL/MG_Util/Converters/MGToGL/DataTypeConverter.cpp ${MGL_ROOT}/MobileGL/MG_Util/Converters/GLToMG/BufferEnumConverter.cpp ${MGL_ROOT}/MobileGL/MG_Util/Converters/GLToMG/DataTypeConverter.cpp + ${MGL_ROOT}/MobileGL/MG_Util/Metrics/BufferMetrics.cpp ${MGL_ROOT}/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp ${MGL_ROOT}/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp ${MGL_ROOT}/MobileGL/MG_Backend/Init.cpp diff --git a/MobileGL/MG_Util/Metrics/BufferMetrics.cpp b/MobileGL/MG_Util/Metrics/BufferMetrics.cpp new file mode 100644 index 00000000..5b275112 --- /dev/null +++ b/MobileGL/MG_Util/Metrics/BufferMetrics.cpp @@ -0,0 +1,117 @@ +// +// Created by Swung0x48 on 2025/8/22. +// + +#include "BufferMetrics.h" + +namespace MobileGL { +namespace MG_Util { + SizeT GetGLTypeSize(GLenum type) { + switch (type) { + // Scalars + case GL_BYTE: + case GL_UNSIGNED_BYTE: + case GL_UNSIGNED_BYTE_3_3_2: + return 1; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_HALF_FLOAT: + case GL_UNSIGNED_SHORT_5_6_5: + case GL_UNSIGNED_SHORT_4_4_4_4: + case GL_UNSIGNED_SHORT_5_5_5_1: + return 2; + case GL_INT: + case GL_UNSIGNED_INT: + case GL_FLOAT: + case GL_FIXED: + case GL_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_10F_11F_11F_REV: + case GL_UNSIGNED_INT_5_9_9_9_REV: + return 4; + case GL_DOUBLE: + #ifdef GL_ARB_gpu_shader_int64 + case GL_UNSIGNED_INT64_ARB: + case GL_INT64_ARB: + #endif + return 8; + + // ---- Vector Types ---- + // 2-component vec + case GL_FLOAT_VEC2: + case GL_INT_VEC2: + case GL_UNSIGNED_INT_VEC2: + case GL_BOOL_VEC2: + return 2 * sizeof(GLfloat); // GL_BOOL_VEC2 is also 2 * 4 bytes + case GL_DOUBLE_VEC2: + return 2 * sizeof(GLdouble); + + // 3-component vec + case GL_FLOAT_VEC3: + case GL_INT_VEC3: + case GL_UNSIGNED_INT_VEC3: + case GL_BOOL_VEC3: + return 3 * sizeof(GLfloat); + case GL_DOUBLE_VEC3: + return 3 * sizeof(GLdouble); + + // 4-component vec + case GL_FLOAT_VEC4: + case GL_INT_VEC4: + case GL_UNSIGNED_INT_VEC4: + case GL_BOOL_VEC4: + return 4 * sizeof(GLfloat); + case GL_DOUBLE_VEC4: + return 4 * sizeof(GLdouble); + + // ---- Matrix Types ---- + // Double non-square + case GL_FLOAT_MAT2: + return 2 * 2 * sizeof(GLfloat); + case GL_FLOAT_MAT3: + return 3 * 3 * sizeof(GLfloat); + case GL_FLOAT_MAT4: + return 4 * 4 * sizeof(GLfloat); + + // Float non-square + case GL_FLOAT_MAT2x3: + return 2 * 3 * sizeof(GLfloat); + case GL_FLOAT_MAT2x4: + return 2 * 4 * sizeof(GLfloat); + case GL_FLOAT_MAT3x2: + return 3 * 2 * sizeof(GLfloat); + case GL_FLOAT_MAT3x4: + return 3 * 4 * sizeof(GLfloat); + case GL_FLOAT_MAT4x2: + return 4 * 2 * sizeof(GLfloat); + case GL_FLOAT_MAT4x3: + return 4 * 3 * sizeof(GLfloat); + + // Double mat + case GL_DOUBLE_MAT2: + return 2 * 2 * sizeof(GLdouble); + case GL_DOUBLE_MAT3: + return 3 * 3 * sizeof(GLdouble); + case GL_DOUBLE_MAT4: + return 4 * 4 * sizeof(GLdouble); + + // Double non-square + case GL_DOUBLE_MAT2x3: + return 2 * 3 * sizeof(GLdouble); + case GL_DOUBLE_MAT2x4: + return 2 * 4 * sizeof(GLdouble); + case GL_DOUBLE_MAT3x2: + return 3 * 2 * sizeof(GLdouble); + case GL_DOUBLE_MAT3x4: + return 3 * 4 * sizeof(GLdouble); + case GL_DOUBLE_MAT4x2: + return 4 * 2 * sizeof(GLdouble); + case GL_DOUBLE_MAT4x3: + return 4 * 3 * sizeof(GLdouble); + + default: + return -1; + } + } +} +} diff --git a/MobileGL/MG_Util/Metrics/BufferMetrics.h b/MobileGL/MG_Util/Metrics/BufferMetrics.h new file mode 100644 index 00000000..8b218978 --- /dev/null +++ b/MobileGL/MG_Util/Metrics/BufferMetrics.h @@ -0,0 +1,16 @@ +// +// Created by Swung0x48 on 2025/8/22. +// + +#ifndef BUFFERMETRICS_H +#define BUFFERMETRICS_H + +#include + +namespace MobileGL { +namespace MG_Util { + SizeT GetGLTypeSize(GLenum type); +} +} + +#endif //BUFFERMETRICS_H