From ee4dc703366c9564beab824d6671c5aff4e619e6 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Thu, 1 Jan 2026 00:41:23 +0800 Subject: [PATCH] [Fix] (...): Avoid some weird crashes. --- MobileGL/Init.cpp | 12 +- MobileGL/Init.h | 14 +++ MobileGL/MG_Benchmark/Buffer/BufferBench.cpp | 38 +++--- .../MG_Benchmark/Program/ProgramBench.cpp | 46 +++---- MobileGL/MG_Impl/Init.cpp | 6 +- MobileGL/MG_Test/Buffer/BufferTest.cpp | 83 +++++++------ MobileGL/MG_Test/Program/ProgramTest.cpp | 5 +- MobileGL/MG_Test/Program/ProgramUtilTest.cpp | 4 + .../MG_Test/VertexArray/VertexArrayTest.cpp | 114 +++++++++--------- .../MG_Util/BackendLoaders/OpenGL/Loader.cpp | 5 +- 10 files changed, 173 insertions(+), 154 deletions(-) create mode 100644 MobileGL/Init.h diff --git a/MobileGL/Init.cpp b/MobileGL/Init.cpp index 06c84701..2f305172 100644 --- a/MobileGL/Init.cpp +++ b/MobileGL/Init.cpp @@ -5,10 +5,13 @@ // SPDX-License-Identifier: LGPL-2.1-only // End of Source File Header -#include "Includes.h" +#include "Init.h" +#include "Config.h" #include #include #include +#include +#include namespace MobileGL { void MG_Initialize() { @@ -16,6 +19,7 @@ namespace MobileGL { MGLOG_I("Initializing MobileGL..."); MG_State::Init(); MGLOG_D("MobileGL State initialized"); + // return; MG_Backend::Init(); MGLOG_D("MobileGL Backend initialized"); MG_Impl::Init(); @@ -28,7 +32,13 @@ namespace MobileGL { void MG_Destroy() { MGLOG_I("MobileGL closing..."); glslang::FinalizeProcess(); + delete MG_State::pGLContext; + MG_Config::RendererInfoPtr.reset(); + delete MG_Impl::GLImpl::TextureImpl::pProxyTextureManager; + delete MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo; MG_Util::Debug::Close(); + + // TODO: add and use Destroy functions for other subsystems } #if defined(__linux__) || defined(__APPLE__) diff --git a/MobileGL/Init.h b/MobileGL/Init.h new file mode 100644 index 00000000..e4e7d38c --- /dev/null +++ b/MobileGL/Init.h @@ -0,0 +1,14 @@ +// MobileGL - MobileGL/Init.cpp +// Copyright (c) 2025 MobileGL-Dev +// Licensed under the GNU Lesser General Public License v2.1: +// http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html +// SPDX-License-Identifier: LGPL-2.1-only +// End of Source File Header + +#pragma once +#include "Includes.h" + +namespace MobileGL { + void MG_Initialize(); + void MG_Destroy(); +} // namespace MobileGL \ No newline at end of file diff --git a/MobileGL/MG_Benchmark/Buffer/BufferBench.cpp b/MobileGL/MG_Benchmark/Buffer/BufferBench.cpp index 24120c7e..b261f6ac 100644 --- a/MobileGL/MG_Benchmark/Buffer/BufferBench.cpp +++ b/MobileGL/MG_Benchmark/Buffer/BufferBench.cpp @@ -9,6 +9,7 @@ #include #include +#include "Init.h" #include "MG_Impl/GLImpl/Buffer/GL_Buffer.h" #include "MG_State/GLState/Core.h" @@ -19,8 +20,6 @@ constexpr GLuint BUFFER_COUNT = 32; constexpr GLsizeiptr BUFFER_SIZE = 1024 * 1024; static void BM_GenerateAndDeleteBuffers(benchmark::State& state) { - MG_State::pGLContext = new MG_State::GLState::GLContext(); - GLuint n = static_cast(state.range(0)); int repeat = static_cast(state.range(1)); std::vector buffers(n); @@ -33,7 +32,6 @@ static void BM_GenerateAndDeleteBuffers(benchmark::State& state) { } state.SetItemsProcessed(state.iterations() * repeat * n); - delete MG_State::pGLContext; } BENCHMARK(BM_GenerateAndDeleteBuffers) @@ -45,8 +43,6 @@ BENCHMARK(BM_GenerateAndDeleteBuffers) ->UseRealTime(); static void BM_CreateBufferObjectsAndBindBuffer(benchmark::State& state) { - MG_State::pGLContext = new MG_State::GLState::GLContext(); - GLuint buffers[BUFFER_COUNT]; GenBuffers(BUFFER_COUNT, buffers); @@ -60,12 +56,11 @@ static void BM_CreateBufferObjectsAndBindBuffer(benchmark::State& state) { state.SetItemsProcessed(state.iterations() * BUFFER_COUNT); DeleteBuffers(BUFFER_COUNT, buffers); - delete MG_State::pGLContext; } BENCHMARK(BM_CreateBufferObjectsAndBindBuffer)->Unit(benchmark::kMillisecond)->UseRealTime(); static void BM_DeleteBufferObjects(benchmark::State& state) { - MG_State::pGLContext = new MG_State::GLState::GLContext(); + MG_Initialize(); std::vector buffers(BUFFER_COUNT); for (auto _ : state) { @@ -81,13 +76,10 @@ static void BM_DeleteBufferObjects(benchmark::State& state) { } state.SetItemsProcessed(state.iterations() * BUFFER_COUNT); - delete MG_State::pGLContext; } BENCHMARK(BM_DeleteBufferObjects)->Unit(benchmark::kMillisecond)->UseRealTime(); static void BM_UpdateData(benchmark::State& state) { - MG_State::pGLContext = new MG_State::GLState::GLContext(); - GLuint buffers[BUFFER_COUNT]; GenBuffers(BUFFER_COUNT, buffers); @@ -106,13 +98,10 @@ static void BM_UpdateData(benchmark::State& state) { state.SetItemsProcessed(state.iterations() * BUFFER_COUNT); DeleteBuffers(BUFFER_COUNT, buffers); - delete MG_State::pGLContext; } BENCHMARK(BM_UpdateData)->Unit(benchmark::kMillisecond)->UseRealTime(); static void BM_MapBuffer(benchmark::State& state) { - MG_State::pGLContext = new MG_State::GLState::GLContext(); - GLuint buffers[BUFFER_COUNT]; GenBuffers(BUFFER_COUNT, buffers); for (GLuint i = 0; i < BUFFER_COUNT; i++) @@ -136,13 +125,10 @@ static void BM_MapBuffer(benchmark::State& state) { state.SetItemsProcessed(state.iterations() * BUFFER_COUNT); DeleteBuffers(BUFFER_COUNT, buffers); - delete MG_State::pGLContext; } BENCHMARK(BM_MapBuffer)->Unit(benchmark::kMillisecond)->UseRealTime(); static void BM_CopyBufferSubData(benchmark::State& state) { - MG_State::pGLContext = new MG_State::GLState::GLContext(); - GLuint buffers[BUFFER_COUNT]; GenBuffers(BUFFER_COUNT, buffers); @@ -165,13 +151,10 @@ static void BM_CopyBufferSubData(benchmark::State& state) { state.SetItemsProcessed(state.iterations() * (BUFFER_COUNT / 2)); DeleteBuffers(BUFFER_COUNT, buffers); - delete MG_State::pGLContext; } BENCHMARK(BM_CopyBufferSubData)->Unit(benchmark::kMillisecond)->UseRealTime(); static void BM_UpdateDataPartially(benchmark::State& state) { - MG_State::pGLContext = new MG_State::GLState::GLContext(); - std::vector buffers(BUFFER_COUNT); std::vector data(BUFFER_SIZE / 10, 1); @@ -191,8 +174,21 @@ static void BM_UpdateDataPartially(benchmark::State& state) { state.SetItemsProcessed(state.iterations() * BUFFER_COUNT); DeleteBuffers(BUFFER_COUNT, buffers.data()); - delete MG_State::pGLContext; } BENCHMARK(BM_UpdateDataPartially)->Unit(benchmark::kMillisecond)->UseRealTime(); -BENCHMARK_MAIN(); +int main(int argc, char** argv) { + MG_Initialize(); + benchmark ::MaybeReenterWithoutASLR(argc, argv); + char arg0_default[] = "benchmark"; + char* args_default = reinterpret_cast(arg0_default); + if (!argv) { + argc = 1; + argv = &args_default; + } + ::benchmark ::Initialize(&argc, argv); + if (::benchmark ::ReportUnrecognizedArguments(argc, argv)) return 1; + ::benchmark ::RunSpecifiedBenchmarks(); + ::benchmark ::Shutdown(); + return 0; +} diff --git a/MobileGL/MG_Benchmark/Program/ProgramBench.cpp b/MobileGL/MG_Benchmark/Program/ProgramBench.cpp index cf6b5928..f2ae1555 100644 --- a/MobileGL/MG_Benchmark/Program/ProgramBench.cpp +++ b/MobileGL/MG_Benchmark/Program/ProgramBench.cpp @@ -8,6 +8,7 @@ #include #include +#include "Init.h" #include "MG_Impl/GLImpl/Program/GL_Program.h" #include "MG_State/GLState/Core.h" @@ -89,9 +90,6 @@ void main() { })"; static void BM_CompileVertexShader(benchmark::State& state) { - // Initialize GL context - MG_State::pGLContext = new MG_State::GLState::GLContext(); - SizeT vsLen = strlen(vsSrc); for (auto _ : state) { @@ -107,16 +105,10 @@ static void BM_CompileVertexShader(benchmark::State& state) { // Set the counter for Compiles/Second state.counters["VS_Compiles/Second"] = state.iterations(); state.counters["VS_Bytes/Second"] = state.iterations() * vsLen; - - // Cleanup GL context - delete MG_State::pGLContext; } BENCHMARK(BM_CompileVertexShader)->Unit(benchmark::kMillisecond); static void BM_CompileFragmentShader(benchmark::State& state) { - // Initialize GL context - MG_State::pGLContext = new MG_State::GLState::GLContext(); - SizeT fsLen = strlen(fsSrc); for (auto _ : state) { @@ -132,15 +124,10 @@ static void BM_CompileFragmentShader(benchmark::State& state) { // Set the counter for Compiles/Second state.counters["FS_Compiles/Second"] = state.iterations(); state.counters["FS_Bytes/Second"] = state.iterations() * fsLen; - - // Cleanup GL context - delete MG_State::pGLContext; } BENCHMARK(BM_CompileFragmentShader)->Unit(benchmark::kMillisecond); static void BM_CompileBothShaders(benchmark::State& state) { - // Initialize GL context - MG_State::pGLContext = new MG_State::GLState::GLContext(); SizeT vsLen = strlen(vsSrc); SizeT fsLen = strlen(fsSrc); @@ -165,16 +152,10 @@ static void BM_CompileBothShaders(benchmark::State& state) { state.counters["FS_Compiles/Second"] = state.iterations(); state.counters["VS_Bytes/Second"] = state.iterations() * vsLen; state.counters["FS_Bytes/Second"] = state.iterations() * fsLen; - - // Cleanup GL context - delete MG_State::pGLContext; } BENCHMARK(BM_CompileBothShaders)->Unit(benchmark::kMillisecond); static void BM_LinkProgram(benchmark::State& state) { - // Initialize GL context - MG_State::pGLContext = new MG_State::GLState::GLContext(); - // Create and compile vertex shader GLuint vs = CreateShader(GL_VERTEX_SHADER); ShaderSource(vs, 1, &vsSrc, NULL); @@ -199,16 +180,10 @@ static void BM_LinkProgram(benchmark::State& state) { // Set the counter for Compiles/Second state.counters["Links/Second"] = state.iterations(); - - // Cleanup GL context - delete MG_State::pGLContext; } BENCHMARK(BM_LinkProgram)->Unit(benchmark::kMillisecond); static void BM_CompileAndLink(benchmark::State& state) { - // Initialize GL context - MG_State::pGLContext = new MG_State::GLState::GLContext(); - SizeT vsLen = strlen(vsSrc); SizeT fsLen = strlen(fsSrc); @@ -240,11 +215,22 @@ static void BM_CompileAndLink(benchmark::State& state) { state.counters["VS_Bytes/Second"] = state.iterations() * vsLen; state.counters["FS_Bytes/Second"] = state.iterations() * fsLen; state.counters["Links/Second"] = state.iterations(); - - // Cleanup GL context - delete MG_State::pGLContext; } BENCHMARK(BM_CompileAndLink)->Unit(benchmark::kMillisecond); -BENCHMARK_MAIN(); \ No newline at end of file +int main(int argc, char** argv) { + MG_Initialize(); + benchmark ::MaybeReenterWithoutASLR(argc, argv); + char arg0_default[] = "benchmark"; + char* args_default = reinterpret_cast(arg0_default); + if (!argv) { + argc = 1; + argv = &args_default; + } + ::benchmark ::Initialize(&argc, argv); + if (::benchmark ::ReportUnrecognizedArguments(argc, argv)) return 1; + ::benchmark ::RunSpecifiedBenchmarks(); + ::benchmark ::Shutdown(); + return 0; +} \ No newline at end of file diff --git a/MobileGL/MG_Impl/Init.cpp b/MobileGL/MG_Impl/Init.cpp index 79ed6615..e10165f7 100644 --- a/MobileGL/MG_Impl/Init.cpp +++ b/MobileGL/MG_Impl/Init.cpp @@ -9,9 +9,9 @@ #include "GLImpl/Texture/ProxyTexture.h" #include "GLImpl/Framebuffer/GL_Framebuffer.h" -#include "MG_State/GLState/TextureState/TextureObject1D.h" -#include "MG_State/GLState/TextureState/TextureObject2D.h" -#include "MG_State/GLState/TextureState/TextureObject3D.h" +#include +#include +#include namespace MobileGL { namespace MG_Impl { diff --git a/MobileGL/MG_Test/Buffer/BufferTest.cpp b/MobileGL/MG_Test/Buffer/BufferTest.cpp index f9706736..33ca29a9 100644 --- a/MobileGL/MG_Test/Buffer/BufferTest.cpp +++ b/MobileGL/MG_Test/Buffer/BufferTest.cpp @@ -8,6 +8,7 @@ #include #include "Includes.h" +#include "Init.h" #include #include @@ -17,17 +18,19 @@ using namespace MobileGL; class BufferTest : public ::testing::Test { protected: - MG_State::GLState::GLContext glContext; + void SetUp() override { MobileGL::MG_Initialize(); } + + void TearDown() override {} }; TEST_F(BufferTest, Binding) { - auto bufferNames = glContext.GenBufferNames(3); - auto& arraySlot = glContext.GetBufferBindingSlot(BufferTarget::Vertex); - auto& indexSlot = glContext.GetBufferBindingSlot(BufferTarget::Uniform); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(3); + auto& arraySlot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex); + auto& indexSlot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Uniform); - auto obj0 = glContext.CreateBufferObject(bufferNames[0]); - auto obj1 = glContext.CreateBufferObject(bufferNames[1]); - auto obj2 = glContext.CreateBufferObject(bufferNames[2]); + auto obj0 = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); + auto obj1 = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[1]); + auto obj2 = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[2]); arraySlot.Bind(obj0); indexSlot.Bind(obj1); @@ -42,11 +45,11 @@ TEST_F(BufferTest, Binding) { } TEST_F(BufferTest, PingPong) { - auto& readSlot = glContext.GetBufferBindingSlot(BufferTarget::CopyRead); - auto& writeSlot = glContext.GetBufferBindingSlot(BufferTarget::CopyWrite); + auto& readSlot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::CopyRead); + auto& writeSlot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::CopyWrite); { - auto bufferNames = glContext.GenBufferNames(1); - auto bufObj = glContext.CreateBufferObject(bufferNames[0]); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto bufObj = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); writeSlot.Bind(bufObj); readSlot.Bind(bufObj); @@ -75,13 +78,13 @@ TEST_F(BufferTest, PingPong) { TEST_F(BufferTest, GenerateManyNames_NoPrematureCreation) { const SizeT largeCount = 100000; // generate tons of buffer names - auto names = glContext.GenBufferNames(largeCount); + auto names = MobileGL::MG_State::pGLContext->GenBufferNames(largeCount); std::vector indices = {0, 600, 5000, 32768, 99999}; // only create a few buffer objects for (SizeT idx : indices) { GLuint name = names[idx]; - auto bufObj = glContext.CreateBufferObject(name); - auto& slot = glContext.GetBufferBindingSlot(BufferTarget::Uniform); + auto bufObj = MobileGL::MG_State::pGLContext->CreateBufferObject(name); + auto& slot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Uniform); slot.Bind(bufObj); Vector data = {static_cast(idx + 1), static_cast(idx + 2)}; @@ -98,9 +101,9 @@ TEST_F(BufferTest, GenerateManyNames_NoPrematureCreation) { } TEST_F(BufferTest, AcquireMemory) { - auto& slot = glContext.GetBufferBindingSlot(BufferTarget::Uniform); - auto bufferNames = glContext.GenBufferNames(1); - auto bufObj = glContext.CreateBufferObject(bufferNames[0]); + auto& slot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Uniform); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto bufObj = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); slot.Bind(bufObj); Vector initData{10, 20, 30, 40, 50}; SizeT byteSize = initData.size() * sizeof(Int); @@ -125,9 +128,9 @@ TEST_F(BufferTest, AcquireMemory) { } TEST_F(BufferTest, AcquireMemoryRangeWithoutExplicit) { - auto& slot = glContext.GetBufferBindingSlot(BufferTarget::Uniform); - auto bufferNames = glContext.GenBufferNames(1); - auto bufObj = glContext.CreateBufferObject(bufferNames[0]); + auto& slot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Uniform); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto bufObj = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); slot.Bind(bufObj); Vector initData{10, 20, 30, 40, 50}; SizeT byteSize = initData.size() * sizeof(Int); @@ -152,9 +155,9 @@ TEST_F(BufferTest, AcquireMemoryRangeWithoutExplicit) { } TEST_F(BufferTest, AcquireMemoryRangeWithExplicit) { - auto& slot = glContext.GetBufferBindingSlot(BufferTarget::Uniform); - auto bufferNames = glContext.GenBufferNames(1); - auto bufObj = glContext.CreateBufferObject(bufferNames[0]); + auto& slot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Uniform); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto bufObj = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); slot.Bind(bufObj); Vector initData{10, 20, 30, 40, 50}; @@ -195,11 +198,11 @@ TEST_F(BufferTest, AcquireMemoryRangeWithExplicit) { } TEST_F(BufferTest, CopyBufferSubData) { - auto& srcSlot = glContext.GetBufferBindingSlot(BufferTarget::CopyRead); - auto& dstSlot = glContext.GetBufferBindingSlot(BufferTarget::CopyWrite); + auto& srcSlot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::CopyRead); + auto& dstSlot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::CopyWrite); - auto srcNames = glContext.GenBufferNames(1); - auto srcObj = glContext.CreateBufferObject(srcNames[0]); + auto srcNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto srcObj = MobileGL::MG_State::pGLContext->CreateBufferObject(srcNames[0]); srcSlot.Bind(srcObj); Vector srcData{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; @@ -208,8 +211,8 @@ TEST_F(BufferTest, CopyBufferSubData) { DataPtr srcPtr{.data = srcData.data(), .size = srcSize}; srcObj->UploadData(srcPtr, 0); - auto dstNames = glContext.GenBufferNames(1); - auto dstObj = glContext.CreateBufferObject(dstNames[0]); + auto dstNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto dstObj = MobileGL::MG_State::pGLContext->CreateBufferObject(dstNames[0]); dstSlot.Bind(dstObj); Vector dstData(15, 0); @@ -237,9 +240,9 @@ TEST_F(BufferTest, CopyBufferSubData) { } TEST_F(BufferTest, WriteWhileMapped) { - auto& slot = glContext.GetBufferBindingSlot(BufferTarget::ShaderStorage); - auto bufferNames = glContext.GenBufferNames(1); - auto bufObj = glContext.CreateBufferObject(bufferNames[0]); + auto& slot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::ShaderStorage); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto bufObj = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); slot.Bind(bufObj); Vector initData(10, 0); @@ -267,9 +270,9 @@ TEST_F(BufferTest, WriteWhileMapped) { } TEST_F(BufferTest, PartialUpdate) { - auto& slot = glContext.GetBufferBindingSlot(BufferTarget::Vertex); - auto bufferNames = glContext.GenBufferNames(1); - auto bufObj = glContext.CreateBufferObject(bufferNames[0]); + auto& slot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto bufObj = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); slot.Bind(bufObj); Vector initData{100, 200, 300, 400, 500}; @@ -295,14 +298,14 @@ TEST_F(BufferTest, PartialUpdate) { } TEST_F(BufferTest, DeleteBufferObject) { - auto bufferNames = glContext.GenBufferNames(1); - auto& slot = glContext.GetBufferBindingSlot(BufferTarget::Vertex); - auto bufObj = glContext.CreateBufferObject(bufferNames[0]); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto& slot = MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex); + auto bufObj = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); slot.Bind(bufObj); ASSERT_TRUE(slot.GetBoundObject() == bufObj); - glContext.MarkBufferObjectForDeletion(bufferNames[0]); + MobileGL::MG_State::pGLContext->MarkBufferObjectForDeletion(bufferNames[0]); ASSERT_TRUE(slot.GetBoundObject() == nullptr); - ASSERT_FALSE(glContext.GetBufferObject(bufferNames[0])); + ASSERT_FALSE(MobileGL::MG_State::pGLContext->GetBufferObject(bufferNames[0])); } using namespace MobileGL::MG_Impl::GLImpl; diff --git a/MobileGL/MG_Test/Program/ProgramTest.cpp b/MobileGL/MG_Test/Program/ProgramTest.cpp index a1f0d8c3..b52259a9 100644 --- a/MobileGL/MG_Test/Program/ProgramTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramTest.cpp @@ -7,6 +7,7 @@ #include #include "Includes.h" +#include "Init.h" #include "MG_Impl/GLImpl/Program/GL_Program.h" #include "MG_State/GLState/Core.h" #include "MG_Util/ShaderTranspiler/ShaderCompiler.h" @@ -16,9 +17,9 @@ using namespace MobileGL::MG_Impl::GLImpl; class ProgramTest : public ::testing::Test { protected: - void SetUp() override { MG_State::pGLContext = new MG_State::GLState::GLContext(); } + void SetUp() override { MobileGL::MG_Initialize(); } - void TearDown() override { delete MG_State::pGLContext; } + void TearDown() override {} }; TEST_F(ProgramTest, Sanity) { diff --git a/MobileGL/MG_Test/Program/ProgramUtilTest.cpp b/MobileGL/MG_Test/Program/ProgramUtilTest.cpp index 8f1a2e6b..a8f8ee87 100644 --- a/MobileGL/MG_Test/Program/ProgramUtilTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramUtilTest.cpp @@ -8,6 +8,7 @@ #include #include "Includes.h" +#include "Init.h" #include #include #include @@ -17,6 +18,9 @@ using namespace MobileGL; class ProgramUtilTest : public ::testing::Test { protected: + void SetUp() override { MobileGL::MG_Initialize(); } + + void TearDown() override {} }; TEST_F(ProgramUtilTest, Sanity) { diff --git a/MobileGL/MG_Test/VertexArray/VertexArrayTest.cpp b/MobileGL/MG_Test/VertexArray/VertexArrayTest.cpp index c7276733..49f1a86c 100644 --- a/MobileGL/MG_Test/VertexArray/VertexArrayTest.cpp +++ b/MobileGL/MG_Test/VertexArray/VertexArrayTest.cpp @@ -6,7 +6,10 @@ // End of Source File Header #include + #include "Includes.h" +#include "Init.h" + #include #include #include @@ -16,12 +19,10 @@ using namespace MobileGL; class VertexArrayTest : public ::testing::Test { protected: - MG_State::GLState::GLContext glContext; - SharedPtr CreateTestVBO() { - auto bufferNames = glContext.GenBufferNames(1); - auto vbo = glContext.CreateBufferObject(bufferNames[0]); - glContext.GetBufferBindingSlot(BufferTarget::Vertex).Bind(vbo); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto vbo = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); + MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex).Bind(vbo); Vector vertexData = {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f}; SizeT byteSize = vertexData.size() * sizeof(float); @@ -31,28 +32,31 @@ protected: return vbo; } + void SetUp() override { MobileGL::MG_Initialize(); } + + void TearDown() override {} }; TEST_F(VertexArrayTest, GenerateAndBindVAO) { - auto vaoNames = glContext.GenVertexArrayNames(2); - auto vao0 = glContext.CreateVertexArrayObject(vaoNames[0]); - auto vao1 = glContext.CreateVertexArrayObject(vaoNames[1]); + auto vaoNames = MobileGL::MG_State::pGLContext->GenVertexArrayNames(2); + auto vao0 = MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[0]); + auto vao1 = MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[1]); - glContext.BindVertexArray(vaoNames[0]); - ASSERT_EQ(glContext.GetBoundVertexArray(), vao0); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[0]); + ASSERT_EQ(MobileGL::MG_State::pGLContext->GetBoundVertexArray(), vao0); - glContext.BindVertexArray(vaoNames[1]); - ASSERT_EQ(glContext.GetBoundVertexArray(), vao1); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[1]); + ASSERT_EQ(MobileGL::MG_State::pGLContext->GetBoundVertexArray(), vao1); - // glContext.BindVertexArray(0); - // ASSERT_EQ(glContext.GetBoundVertexArray(), nullptr); + // MobileGL::MG_State::pGLContext->BindVertexArray(0); + // ASSERT_EQ(MobileGL::MG_State::pGLContext->GetBoundVertexArray(), nullptr); // Do not detect if it supports default VAO } TEST_F(VertexArrayTest, VertexAttributeSetup) { - auto vaoNames = glContext.GenVertexArrayNames(1); - auto vao = glContext.CreateVertexArrayObject(vaoNames[0]); - glContext.BindVertexArray(vaoNames[0]); + auto vaoNames = MobileGL::MG_State::pGLContext->GenVertexArrayNames(1); + auto vao = MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[0]); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[0]); auto vbo = CreateTestVBO(); @@ -81,13 +85,13 @@ TEST_F(VertexArrayTest, VertexAttributeSetup) { } TEST_F(VertexArrayTest, IndexBufferBinding) { - auto vaoNames = glContext.GenVertexArrayNames(1); - auto vao = glContext.CreateVertexArrayObject(vaoNames[0]); - glContext.BindVertexArray(vaoNames[0]); + auto vaoNames = MobileGL::MG_State::pGLContext->GenVertexArrayNames(1); + auto vao = MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[0]); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[0]); - auto bufferNames = glContext.GenBufferNames(1); - auto ebo = glContext.CreateBufferObject(bufferNames[0]); - glContext.GetBufferBindingSlot(BufferTarget::Index).Bind(ebo); + auto bufferNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto ebo = MobileGL::MG_State::pGLContext->CreateBufferObject(bufferNames[0]); + MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).Bind(ebo); Vector indices = {0, 1, 2}; SizeT byteSize = indices.size() * sizeof(Uint); @@ -95,57 +99,57 @@ TEST_F(VertexArrayTest, IndexBufferBinding) { DataPtr ptr{.data = indices.data(), .size = byteSize}; ebo->UploadData(ptr, 0); - glContext.GetBufferBindingSlot(BufferTarget::Index).Bind(ebo); - ASSERT_EQ(glContext.GetBufferBindingSlot(BufferTarget::Index).GetBoundObject(), ebo); + MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).Bind(ebo); + ASSERT_EQ(MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).GetBoundObject(), ebo); - auto newEboNames = glContext.GenBufferNames(1); - auto newEbo = glContext.CreateBufferObject(newEboNames[0]); - glContext.GetBufferBindingSlot(BufferTarget::Index).Bind(newEbo); - ASSERT_EQ(glContext.GetBufferBindingSlot(BufferTarget::Index).GetBoundObject(), newEbo); + auto newEboNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto newEbo = MobileGL::MG_State::pGLContext->CreateBufferObject(newEboNames[0]); + MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).Bind(newEbo); + ASSERT_EQ(MobileGL::MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).GetBoundObject(), newEbo); } TEST_F(VertexArrayTest, DeleteVAO) { - auto vaoNames = glContext.GenVertexArrayNames(1); - auto vao = glContext.CreateVertexArrayObject(vaoNames[0]); + auto vaoNames = MobileGL::MG_State::pGLContext->GenVertexArrayNames(1); + auto vao = MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[0]); - glContext.BindVertexArray(vaoNames[0]); - ASSERT_EQ(glContext.GetBoundVertexArray(), vao); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[0]); + ASSERT_EQ(MobileGL::MG_State::pGLContext->GetBoundVertexArray(), vao); - glContext.MarkVertexArrayForDeletion(vaoNames[0]); + MobileGL::MG_State::pGLContext->MarkVertexArrayForDeletion(vaoNames[0]); - ASSERT_FALSE(glContext.ValidateVertexArrayObject(vaoNames[0])); - ASSERT_EQ(glContext.GetVertexArrayObject(vaoNames[0]), nullptr); - ASSERT_EQ(glContext.GetBoundVertexArray(), nullptr); + ASSERT_FALSE(MobileGL::MG_State::pGLContext->ValidateVertexArrayObject(vaoNames[0])); + ASSERT_EQ(MobileGL::MG_State::pGLContext->GetVertexArrayObject(vaoNames[0]), nullptr); + ASSERT_EQ(MobileGL::MG_State::pGLContext->GetBoundVertexArray(), nullptr); } TEST_F(VertexArrayTest, ValidateNamesAndObjects) { const Uint count = 5; - auto vaoNames = glContext.GenVertexArrayNames(count); + auto vaoNames = MobileGL::MG_State::pGLContext->GenVertexArrayNames(count); for (Uint i = 0; i < count; i++) { - ASSERT_TRUE(glContext.ValidateVertexArrayName(vaoNames[i])); - ASSERT_FALSE(glContext.ValidateVertexArrayObject(vaoNames[i])); + ASSERT_TRUE(MobileGL::MG_State::pGLContext->ValidateVertexArrayName(vaoNames[i])); + ASSERT_FALSE(MobileGL::MG_State::pGLContext->ValidateVertexArrayObject(vaoNames[i])); } for (Uint i = 0; i < count; i += 2) { - glContext.CreateVertexArrayObject(vaoNames[i]); - ASSERT_TRUE(glContext.ValidateVertexArrayObject(vaoNames[i])); + MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[i]); + ASSERT_TRUE(MobileGL::MG_State::pGLContext->ValidateVertexArrayObject(vaoNames[i])); } for (Uint i = 1; i < count; i += 2) { - glContext.MarkVertexArrayForDeletion(vaoNames[i]); - ASSERT_FALSE(glContext.ValidateVertexArrayName(vaoNames[i])); + MobileGL::MG_State::pGLContext->MarkVertexArrayForDeletion(vaoNames[i]); + ASSERT_FALSE(MobileGL::MG_State::pGLContext->ValidateVertexArrayName(vaoNames[i])); } } TEST_F(VertexArrayTest, MultipleAttributes) { - auto vaoNames = glContext.GenVertexArrayNames(1); - auto vao = glContext.CreateVertexArrayObject(vaoNames[0]); - glContext.BindVertexArray(vaoNames[0]); + auto vaoNames = MobileGL::MG_State::pGLContext->GenVertexArrayNames(1); + auto vao = MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[0]); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[0]); auto vboPos = CreateTestVBO(); - auto vboNormalNames = glContext.GenBufferNames(1); - auto vboNormal = glContext.CreateBufferObject(vboNormalNames[0]); + auto vboNormalNames = MobileGL::MG_State::pGLContext->GenBufferNames(1); + auto vboNormal = MobileGL::MG_State::pGLContext->CreateBufferObject(vboNormalNames[0]); Vector normals(12, 0.5f); SizeT byteSize = normals.size() * sizeof(float); @@ -182,22 +186,22 @@ TEST_F(VertexArrayTest, MultipleAttributes) { } TEST_F(VertexArrayTest, BoundVAOPreservesState) { - auto vaoNames = glContext.GenVertexArrayNames(2); - auto vao1 = glContext.CreateVertexArrayObject(vaoNames[0]); - auto vao2 = glContext.CreateVertexArrayObject(vaoNames[1]); + auto vaoNames = MobileGL::MG_State::pGLContext->GenVertexArrayNames(2); + auto vao1 = MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[0]); + auto vao2 = MobileGL::MG_State::pGLContext->CreateVertexArrayObject(vaoNames[1]); auto vbo = CreateTestVBO(); - glContext.BindVertexArray(vaoNames[0]); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[0]); vao1->EnableAttribute(0); vao1->SetAttributeFormat(0, 4, DataType::Float32, false, 0, 0, false); vao1->BindAttributeBuffer(0, vbo); - glContext.BindVertexArray(vaoNames[1]); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[1]); vao2->EnableAttribute(1); vao2->SetAttributeFormat(1, 3, DataType::Float32, true, 0, 0, false); - glContext.BindVertexArray(vaoNames[0]); + MobileGL::MG_State::pGLContext->BindVertexArray(vaoNames[0]); const auto& attr = vao1->GetAttribute(0); ASSERT_TRUE(attr.Enabled); diff --git a/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp b/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp index 0f9b10be..69f9ca73 100644 --- a/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp +++ b/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp @@ -442,9 +442,10 @@ namespace MobileGL { void *libGLES = nullptr, *libEGL = nullptr; - static const char* LibPathPrefixes[] = {"", "/opt/vc/lib/", "/usr/local/lib/", "/usr/lib/", nullptr}; + static const char* LibPathPrefixes[] = { + "", "/opt/vc/lib/", "/usr/local/lib/", "/usr/lib/", "/usr/lib/x86_64-linux-gnu/", nullptr}; static const char* LibExts[] = {"so", "so.1", "so.2", "dylib", "dll", nullptr}; - static const char* GLES3Libs[] = {"libGLESv3_CM", "libGLESv3", nullptr}; + static const char* GLES3Libs[] = {"libGLESv3_CM", "libGLESv3", "libGLESv2_CM", "libGLESv2", nullptr}; static const char* EGLLibs[] = {"libEGL", nullptr}; void* OpenLib(const char** names, const char* override) {