diff --git a/.clang-tidy b/.clang-tidy index 76055bbf..5fbfdfdc 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -14,7 +14,6 @@ bugprone-forwarding-reference-overload, bugprone-inaccurate-erase, bugprone-incorrect-roundings, bugprone-integer-division, -bugprone-lambda-function-name, bugprone-macro-parentheses, bugprone-macro-repeated-side-effects, bugprone-misplaced-operator-in-strlen-in-alloc, diff --git a/MobileGL/Init.cpp b/MobileGL/Init.cpp index 74d458ae..75a086ea 100644 --- a/MobileGL/Init.cpp +++ b/MobileGL/Init.cpp @@ -34,10 +34,10 @@ namespace MobileGL { void Destroy() { MGLOG_I("MobileGL closing..."); glslang::FinalizeProcess(); - delete MG_State::pGLContext; - delete MG_State::pEGLContext; - delete MG_Impl::GLImpl::TextureImpl::pProxyTextureManager; - delete MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo; + MG_State::pGLContext.reset(); + MG_State::pEGLContext.reset(); + MG_Impl::GLImpl::TextureImpl::pProxyTextureManager.reset(); + MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo.reset(); MG_Util::Debug::Close(); // TODO: add and use Destroy functions for other subsystems diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index 5a0dd3c3..696b0c83 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -8,6 +8,7 @@ #include "DirectGLES.h" #include "EGL/egl.h" +#include "MG_Util/Types.h" #include "Utils.h" #include "Managers.h" #include @@ -45,7 +46,7 @@ namespace MobileGL::MG_Backend::DirectGLES { namespace DebugImpl { #if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG - void ErrorLopper::Loop(std::function func) { + void ErrorLopper::Loop(const std::function& func) { GLenum err = g_GLESFuncs.glGetError(); while (err != GL_NO_ERROR) { func(err); @@ -68,14 +69,14 @@ namespace MobileGL::MG_Backend::DirectGLES { Clear(); } #else - void ErrorLopper::Loop(std::function func) {} + void ErrorLopper::Loop(const std::function& func) {} void ErrorLopper::Clear() {} - ErrorLopper::ErrorLopper() {} - ErrorLopper::~ErrorLopper() {} + ErrorLopper::ErrorLopper() = default; + ErrorLopper::~ErrorLopper() = default; #endif #if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG - OpenGLScopeMarker::OpenGLScopeMarker(String scopeName) { + OpenGLScopeMarker::OpenGLScopeMarker(const String& scopeName) { g_GLESFuncs.glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, scopeName.c_str()); } @@ -83,7 +84,7 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glPopDebugGroup(); } #else - OpenGLScopeMarker::OpenGLScopeMarker(String scopeName) {} + OpenGLScopeMarker::OpenGLScopeMarker(const String& scopeName) {} OpenGLScopeMarker::~OpenGLScopeMarker() {} #endif @@ -92,18 +93,16 @@ namespace MobileGL::MG_Backend::DirectGLES { // TODO: deletion for deleted objects namespace BufferImpl { - void CreateAndSyncBufferObject(SharedPtr& bufferObject) { + void CreateAndSyncBufferObject(const SharedPtr& bufferObject) { if (!(bufferObject->GetChangeBits() & BufferChangeBits::DirtyBit)) return; - const auto& backendBufferIt = g_backendBufferObjects.find(bufferObject); - SharedPtr backendBufferObject; - if (backendBufferIt == g_backendBufferObjects.end()) { - backendBufferObject = MakeShared(); - g_backendBufferObjects[bufferObject] = backendBufferObject; - } else { - backendBufferObject = backendBufferIt->second; + const auto& backendBufferIt = g_backendBufferObjects.find(bufferObject.get()); + Bool exist = (backendBufferIt != g_backendBufferObjects.end()); + auto& backendObj = exist ? backendBufferIt->second : g_backendBufferObjects[bufferObject.get()]; + if (!exist) { + backendObj = MakeShared(); } - backendBufferObject->SyncToBackend(bufferObject); + backendObj->SyncToBackend(bufferObject); } void SyncNeccessaryBuffers(Bool includeIBO = false, Bool includeIndirectBuffer = false) { @@ -114,9 +113,6 @@ namespace MobileGL::MG_Backend::DirectGLES { // 1.VBO 2.IBO (if needed) 3.UBO 4.IndirectBuffer (if needed) 5.SSBO (TODO) // PBO is not needed since it should be handled in frontend - // static Vector> buffersToSync; - // buffersToSync.clear(); - const auto& currentVAOObject = MG_State::pGLContext->GetBoundVertexArray(); if (!currentVAOObject) { MGLOG_E("No VAO is currently bound, cannot sync necessary buffers."); @@ -126,7 +122,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // VBO for (const auto& attrib : currentVAOObject->GetAllAttributes()) { if (!attrib.Enabled) continue; - auto bufferObject = attrib.Buffer; + auto& bufferObject = attrib.Buffer; if (bufferObject) { CreateAndSyncBufferObject(bufferObject); } @@ -134,7 +130,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // IBO if (includeIBO) { - auto possibleIBO = currentVAOObject->GetIndexBufferBindingSlot().GetBoundObject(); + auto& possibleIBO = currentVAOObject->GetIndexBufferBindingSlot().GetBoundObject(); if (possibleIBO) { CreateAndSyncBufferObject(possibleIBO); } @@ -142,7 +138,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // Indirect Buffer Object if (includeIndirectBuffer) { - auto possibleIndirectBuffer = + auto& possibleIndirectBuffer = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::DrawIndirect).GetBoundObject(); if (possibleIndirectBuffer) { CreateAndSyncBufferObject(possibleIndirectBuffer); @@ -153,7 +149,7 @@ namespace MobileGL::MG_Backend::DirectGLES { auto uboBindingPointCnt = MG_State::pGLContext->GetBufferBindingPointCount(BufferTarget::Uniform); for (SizeT i = 0; i < uboBindingPointCnt; ++i) { auto& point = MG_State::pGLContext->GetBufferBindingPoint(BufferTarget::Uniform, i); - auto obj = point.GetBoundObject(); + auto& obj = point.GetBoundObject(); if (obj) { CreateAndSyncBufferObject(obj); } @@ -166,42 +162,39 @@ namespace MobileGL::MG_Backend::DirectGLES { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif - auto currentVAOObject = MG_State::pGLContext->GetBoundVertexArray(); + auto& currentVAOObject = MG_State::pGLContext->GetBoundVertexArray(); if (!currentVAOObject) { MGLOG_E("No VAO is currently bound, cannot sync current VAO."); return; } - const auto& backendVAOIt = g_backendVertexArrayObjects.find(currentVAOObject); - SharedPtr backendVAOObject; - if (backendVAOIt == g_backendVertexArrayObjects.end()) { - backendVAOObject = MakeShared(); - g_backendVertexArrayObjects[currentVAOObject] = backendVAOObject; - } else { - backendVAOObject = backendVAOIt->second; + const auto& backendVAOIt = g_backendVertexArrayObjects.find(currentVAOObject.get()); + Bool exist = (backendVAOIt != g_backendVertexArrayObjects.end()); + auto& backendObj = exist ? backendVAOIt->second : g_backendVertexArrayObjects[currentVAOObject.get()]; + if (!exist) { + backendObj = MakeShared(); } - backendVAOObject->SyncToBackend(currentVAOObject); + backendObj->SyncToBackend(currentVAOObject); } } // namespace VertexArrayImpl namespace TextureImpl { - SharedPtr SyncTextureObjectToBackend( - SharedPtr& textureObject) { + SharedPtr& SyncTextureObjectToBackend( + const SharedPtr& textureObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif - const auto& backendTextureIt = g_backendTextureObjects.find(textureObject); - SharedPtr backendTextureObject; - if (backendTextureIt == g_backendTextureObjects.end()) { - backendTextureObject = MakeShared(); - g_backendTextureObjects[textureObject] = backendTextureObject; - } else { - backendTextureObject = backendTextureIt->second; + const auto& backendTextureIt = g_backendTextureObjects.find(textureObject.get()); + Bool exist = (backendTextureIt != g_backendTextureObjects.end()); + auto& backendObj = exist ? backendTextureIt->second : g_backendTextureObjects[textureObject.get()]; + if (!exist) { + backendObj = MakeShared(); } - backendTextureObject->SyncTextureParamsToBackend(textureObject); - backendTextureObject->SyncBuiltinSamplerToBackend(textureObject); - backendTextureObject->SyncMipmapsToBackend(textureObject); - return backendTextureObject; + backendObj->SyncTextureParamsToBackend(textureObject); + backendObj->SyncBuiltinSamplerToBackend(textureObject); + backendObj->SyncMipmapsToBackend(textureObject); + + return backendObj; } void SyncNeccessaryTextures() { @@ -216,7 +209,7 @@ namespace MobileGL::MG_Backend::DirectGLES { for (int index = 0; index < MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS; ++index) { auto& unit = MG_State::pGLContext->GetTextureUnitObject(index); for (const auto& bindingSlot : unit.GetAllBindingSlots()) { - auto textureObject = bindingSlot.GetBoundObject(); + auto& textureObject = bindingSlot.GetBoundObject(); if (textureObject) { SyncTextureObjectToBackend(textureObject); } @@ -228,7 +221,7 @@ namespace MobileGL::MG_Backend::DirectGLES { if (currentFBO) { for (const auto& attachment : currentFBO->GetAllAttachmentObjects()) { if (!attachment.IsTexture()) continue; - auto textureObject = attachment.GetTexture(); + auto& textureObject = attachment.GetTexture(); if (textureObject) { SyncTextureObjectToBackend(textureObject); } @@ -246,12 +239,12 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_State::GLState::FramebufferObject* lastUpdatedFBO = nullptr; - for (auto target : fboTargets) { - auto slot = MG_State::pGLContext->GetFramebufferBindingSlot(target); + for (auto& target : fboTargets) { + auto& slot = MG_State::pGLContext->GetFramebufferBindingSlot(target); auto version = slot.GetVersion(); if (version == g_fboBindVersions[SizeT(target)]) continue; - auto currentFBO = slot.GetBoundObject(); + auto& currentFBO = slot.GetBoundObject(); if (!currentFBO) { MGLOG_E("No FBO is currently bound, cannot sync current FBO."); @@ -263,21 +256,19 @@ namespace MobileGL::MG_Backend::DirectGLES { continue; } - const auto& backendFBOIt = g_backendFramebufferObjects.find(currentFBO); - SharedPtr backendFBOObject; - if (backendFBOIt == g_backendFramebufferObjects.end()) { - backendFBOObject = MakeShared(); - g_backendFramebufferObjects[currentFBO] = backendFBOObject; - } else { - backendFBOObject = backendFBOIt->second; - } - if (currentFBO.get() == lastUpdatedFBO) { MGLOG_D("Draw FBO and read FBO are the same, skipping sync."); - } else { - backendFBOObject->SyncToBackend(currentFBO, target); + continue; } + const auto& backendFBOIt = g_backendFramebufferObjects.find(currentFBO.get()); + Bool exist = (backendFBOIt != g_backendFramebufferObjects.end()); + auto& backendObj = exist ? backendFBOIt->second : g_backendFramebufferObjects[currentFBO.get()]; + if (!exist) { + backendObj = MakeShared(); + } + backendObj->SyncToBackend(currentFBO, target); + lastUpdatedFBO = currentFBO.get(); } } @@ -466,21 +457,20 @@ namespace MobileGL::MG_Backend::DirectGLES { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif - auto currentProgram = MG_State::pGLContext->GetCurrentProgram(); + auto& currentProgram = MG_State::pGLContext->GetCurrentProgram(); if (!currentProgram || !currentProgram->GetLinkStatus()) { g_GLESFuncs.glUseProgram(0); return; } - const auto& backendProgramIt = g_backendProgramObjects.find(currentProgram); - SharedPtr backendProgram; - if (backendProgramIt == g_backendProgramObjects.end()) { - backendProgram = MakeShared(); - g_backendProgramObjects[currentProgram] = backendProgram; - backendProgram->SyncToBackend(currentProgram); + const auto& backendProgramIt = g_backendProgramObjects.find(currentProgram.get()); + Bool exist = (backendProgramIt != g_backendProgramObjects.end()); + auto& backendObj = exist ? backendProgramIt->second : g_backendProgramObjects[currentProgram.get()]; + if (!exist) { + backendObj = MakeShared(); + backendObj->SyncToBackend(currentProgram); } else { - backendProgram = backendProgramIt->second; - if (!backendProgram->GetBackendProgramId()) { - backendProgram->SyncToBackend(currentProgram); + if (!backendObj->GetBackendProgramId()) { + backendObj->SyncToBackend(currentProgram); } } } @@ -495,7 +485,7 @@ namespace MobileGL::MG_Backend::DirectGLES { const auto& currentFBO = slot.GetBoundObject(); if (currentFBO && currentFBO != MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo->defaultFBO) { - const auto& backendFBOIt = FramebufferImpl::g_backendFramebufferObjects.find(currentFBO); + const auto& backendFBOIt = FramebufferImpl::g_backendFramebufferObjects.find(currentFBO.get()); if (backendFBOIt != FramebufferImpl::g_backendFramebufferObjects.end()) { backendFBOIt->second->Bind(target); } else { @@ -528,7 +518,7 @@ namespace MobileGL::MG_Backend::DirectGLES { #endif const auto& currentVAO = MG_State::pGLContext->GetBoundVertexArray(); if (currentVAO) { - const auto& backendVAOIt = VertexArrayImpl::g_backendVertexArrayObjects.find(currentVAO); + const auto& backendVAOIt = VertexArrayImpl::g_backendVertexArrayObjects.find(currentVAO.get()); if (backendVAOIt != VertexArrayImpl::g_backendVertexArrayObjects.end()) { backendVAOIt->second->Bind(); } @@ -556,7 +546,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_Util::ConvertTextureTargetToString(target).c_str()); continue; } - const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject); + const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get()); if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) continue; GLenum targetGL = MG_Util::ConvertTextureTargetToGLEnum(target); @@ -566,7 +556,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // Bind sampler object if necessary const auto& samplerObject = textureUnit.GetSamplerObject(); if (samplerObject) { - const auto& backendSamplerIt = SamplerImpl::g_backendSamplerObjects.find(samplerObject); + const auto& backendSamplerIt = SamplerImpl::g_backendSamplerObjects.find(samplerObject.get()); if (backendSamplerIt != SamplerImpl::g_backendSamplerObjects.end()) { backendSamplerIt->second->Bind(unit); } @@ -581,7 +571,7 @@ namespace MobileGL::MG_Backend::DirectGLES { #ifdef TRACY_ENABLE ZoneScopedNC("BindCurrentProgram", TRACY_ZONECOLOR_BACKEND); #endif - const auto& backendProgramIt = PrgramImpl::g_backendProgramObjects.find(currentProgram); + const auto& backendProgramIt = PrgramImpl::g_backendProgramObjects.find(currentProgram.get()); if (backendProgramIt != PrgramImpl::g_backendProgramObjects.end()) { backendProgramIt->second->Use(); auto backendProgramId = backendProgramIt->second->GetBackendProgramId(); @@ -623,11 +613,11 @@ namespace MobileGL::MG_Backend::DirectGLES { // Connect buffer to backend binding point auto& point = MG_State::pGLContext->GetBufferBindingPoint(BufferTarget::Uniform, binding); - auto bufferObj = point.GetBoundObject(); + auto& bufferObj = point.GetBoundObject(); auto range = point.GetRange(); if (bufferObj) { - const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(bufferObj); + const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(bufferObj.get()); if (backendBufferIt != BufferImpl::g_backendBufferObjects.end()) { const auto& backendBufferObject = backendBufferIt->second; backendBufferObject->Bind(GL_UNIFORM_BUFFER); @@ -635,9 +625,9 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glBindBufferBase(GL_UNIFORM_BUFFER, lastUBOBinding, backendBufferObject->GetBackendBufferId()); } else { - g_GLESFuncs.glBindBufferRange(GL_UNIFORM_BUFFER, lastUBOBinding, - backendBufferObject->GetBackendBufferId(), - range.start, range.end - range.start); + g_GLESFuncs.glBindBufferRange( + GL_UNIFORM_BUFFER, lastUBOBinding, backendBufferObject->GetBackendBufferId(), + (GLintptr)range.start, (GLintptr)(range.end - range.start)); } } else { MGLOG_E("No backend buffer found for UBO binding, cannot bind UBO."); @@ -660,18 +650,18 @@ namespace MobileGL::MG_Backend::DirectGLES { backendProgramIt->second->GetBackendProgramId(), name.c_str()); g_GLESFuncs.glUniform1i(locAtBackend, unit); - auto samplerObject = MG_State::pGLContext->GetTextureUnitObject(unit).GetSamplerObject(); + auto& samplerObject = MG_State::pGLContext->GetTextureUnitObject(unit).GetSamplerObject(); if (samplerObject) { - const auto& backendSamplerIt = SamplerImpl::g_backendSamplerObjects.find(samplerObject); - SharedPtr backendSamplerObject; - if (backendSamplerIt == SamplerImpl::g_backendSamplerObjects.end()) { - backendSamplerObject = MakeShared(); - SamplerImpl::g_backendSamplerObjects[samplerObject] = backendSamplerObject; - } else { - backendSamplerObject = backendSamplerIt->second; + const auto& backendSamplerIt = + SamplerImpl::g_backendSamplerObjects.find(samplerObject.get()); + Bool exist = (backendSamplerIt != SamplerImpl::g_backendSamplerObjects.end()); + auto& backendObj = exist ? backendSamplerIt->second + : SamplerImpl::g_backendSamplerObjects[samplerObject.get()]; + if (!exist) { + backendObj = MakeShared(); } - backendSamplerObject->SyncToBackend(samplerObject); + backendObj->SyncToBackend(samplerObject); } else { SamplerImpl::UnbindSampler(unit); } @@ -845,30 +835,29 @@ namespace MobileGL::MG_Backend::DirectGLES { #if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG && MOBILEGL_ENABLE_SCOPE_MARKER DebugImpl::OpenGLScopeMarker marker(__func__); #endif - DebugImpl::ErrorLopper errorLopper; TextureImpl::SyncNeccessaryTextures(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); FramebufferImpl::SyncCurrentFBO(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); RenderStateImpl::SyncRenderState(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); BindCurrentFBO(FramebufferTarget::Draw); BindCurrentFBO(FramebufferTarget::Read); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); MGLOG_D("ES %s(%d, %d, %d, %d, %d, %d, %d, %d, 0x%x, %s)", __func__, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, MG_Util::ConvertGLEnumToString(filter).c_str()); g_GLESFuncs.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); } @@ -895,15 +884,14 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_Util::ConvertTextureTargetToString(textureTarget).c_str()); } - const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject); - SharedPtr backendTextureObject; - if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) { - backendTextureObject = MakeShared(); - TextureImpl::g_backendTextureObjects[textureObject] = backendTextureObject; - } else { - backendTextureObject = backendTextureIt->second; + const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get()); + Bool exist = (backendTextureIt != TextureImpl::g_backendTextureObjects.end()); + auto& backendObj = + exist ? backendTextureIt->second : TextureImpl::g_backendTextureObjects[textureObject.get()]; + if (!exist) { + backendObj = MakeShared(); } - backendTextureObject->Bind(target, unit); + backendObj->Bind(target, unit); } return true; } @@ -953,15 +941,15 @@ namespace MobileGL::MG_Backend::DirectGLES { DebugImpl::ErrorLopper errorLopper; MGLOG_D("%s: Backend", __func__); TextureImpl::SyncNeccessaryTextures(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); FramebufferImpl::SyncCurrentFBO(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); RenderStateImpl::SyncRenderState(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); if (!UpdateTextureBindingAtTarget(target)) return; @@ -969,10 +957,10 @@ namespace MobileGL::MG_Backend::DirectGLES { // Bind necessary FBO and texture BindCurrentFBO(FramebufferTarget::Read); Uint activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit(); - const auto& textureObject = MG_State::pGLContext->GetTextureUnitObject(activeTextureUnit) + const auto& textureObject = MG_State::pGLContext->GetTextureUnitObject((Int)activeTextureUnit) .GetBindingSlot(MG_Util::ConvertGLEnumToTextureTarget(target)) .GetBoundObject(); - const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject); + const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get()); if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) { MGLOG_E("CopyTexSubImage2D: No backend texture found for texture %u.", textureObject ? textureObject->GetExternalIndex() : 0); @@ -998,19 +986,19 @@ namespace MobileGL::MG_Backend::DirectGLES { if (!isDepthFormat) { g_GLESFuncs.glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); } else { MGLOG_D("%s: Backend depth", __func__); g_GLESFuncs.glTexImage2D(target, level, (GLint)internalformat, width, height, border, format, type, nullptr); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); - GLint currentTex = backendTextureIt->second->GetBackendTextureId(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + auto currentTex = (GLint)backendTextureIt->second->GetBackendTextureId(); + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); @@ -1026,7 +1014,7 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glBlitFramebuffer(x, y, x + width, y + height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT | (isStencilFormat ? GL_STENCIL_BUFFER_BIT : 0), GL_NEAREST); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); } @@ -1041,15 +1029,15 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("%s: Backend", __func__); TextureImpl::SyncNeccessaryTextures(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); FramebufferImpl::SyncCurrentFBO(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); RenderStateImpl::SyncRenderState(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); @@ -1057,11 +1045,11 @@ namespace MobileGL::MG_Backend::DirectGLES { // Bind necessary FBO and texture BindCurrentFBO(FramebufferTarget::Read); - Uint activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit(); + auto activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit(); const auto& textureObject = MG_State::pGLContext->GetTextureUnitObject(activeTextureUnit) .GetBindingSlot(MG_Util::ConvertGLEnumToTextureTarget(target)) .GetBoundObject(); - const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject); + const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get()); if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) { MGLOG_E("CopyTexSubImage2D: No backend texture found for texture %u.", textureObject ? textureObject->GetExternalIndex() : 0); @@ -1069,12 +1057,12 @@ namespace MobileGL::MG_Backend::DirectGLES { } backendTextureIt->second->Bind(target, activeTextureUnit); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); GLenum internalFormat; g_GLESFuncs.glGetTexLevelParameteriv(target, level, GL_TEXTURE_INTERNAL_FORMAT, (GLint*)&internalFormat); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); auto mgInternalFormat = MG_Util::ConvertGLEnumToTextureInternalFormat(internalFormat); @@ -1084,19 +1072,19 @@ namespace MobileGL::MG_Backend::DirectGLES { if (!isDepthFormat) { g_GLESFuncs.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); } else { MGLOG_D("%s: Backend depth", __func__); - GLint currentTex = backendTextureIt->second->GetBackendTextureId(); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + auto currentTex = backendTextureIt->second->GetBackendTextureId(); + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); GLenum attachment = isStencilFormat ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT; TempFBOBinder tempFBOBinder(false); g_GLESFuncs.glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, target, currentTex, level); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); if (g_GLESFuncs.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -1107,7 +1095,7 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glBlitFramebuffer( x, y, x + width, y + height, xoffset, yoffset, xoffset + width, yoffset + height, GL_DEPTH_BUFFER_BIT | (isStencilFormat ? GL_STENCIL_BUFFER_BIT : 0), GL_NEAREST); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); } @@ -1120,8 +1108,8 @@ namespace MobileGL::MG_Backend::DirectGLES { auto unitIndex = MG_State::pGLContext->GetActiveTextureUnit(); auto& unit = MG_State::pGLContext->GetTextureUnitObject(unitIndex); auto& slot = unit.GetBindingSlot(MG_Util::ConvertGLEnumToTextureTarget(target)); - auto texture = slot.GetBoundObject(); - auto backendTexture = TextureImpl::SyncTextureObjectToBackend(texture); + auto& texture = slot.GetBoundObject(); + auto& backendTexture = TextureImpl::SyncTextureObjectToBackend(texture); backendTexture->Bind(target, unitIndex); g_GLESFuncs.glGenerateMipmap(target); @@ -1184,7 +1172,7 @@ namespace MobileGL::MG_Backend::DirectGLES { PixelStoreParameters m_prevParams; - PixelStoreParameters QueryCurrentGLPixelStoreParams(Bool isUnpack) { + static PixelStoreParameters QueryCurrentGLPixelStoreParams(Bool isUnpack) { PixelStoreParameters p; if (!isUnpack) { g_GLESFuncs.glGetIntegerv(GL_PACK_ALIGNMENT, (GLint*)&p.Alignment); @@ -1214,7 +1202,7 @@ namespace MobileGL::MG_Backend::DirectGLES { return p; } - void Sync(Bool isUnpack, const PixelStoreParameters& params) { + static void Sync(Bool isUnpack, const PixelStoreParameters& params) { if (!isUnpack) { g_GLESFuncs.glPixelStorei(GL_PACK_ALIGNMENT, params.Alignment); g_GLESFuncs.glPixelStorei(GL_PACK_ROW_LENGTH, params.RowLength); @@ -1271,7 +1259,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } // Handle PBO - auto pixelPackBufferObject = + auto& pixelPackBufferObject = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::PixelPack).GetBoundObject(); Bool usePBO; GLuint prevPixelPackBuffer = 0; @@ -1279,7 +1267,7 @@ namespace MobileGL::MG_Backend::DirectGLES { BufferImpl::CreateAndSyncBufferObject(pixelPackBufferObject); MGLOG_D("ReadPixels: Using PBO %u", pixelPackBufferObject->GetExternalIndex()); usePBO = true; - const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(pixelPackBufferObject); + const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(pixelPackBufferObject.get()); if (backendBufferIt == BufferImpl::g_backendBufferObjects.end()) { MGLOG_E("ReadPixels: No backend buffer found for PBO %u.", @@ -1299,8 +1287,8 @@ namespace MobileGL::MG_Backend::DirectGLES { if (usePBO) { // pull back to client memory if PBO is used MGLOG_D("ReadPixels: PBO used, mapping buffer to client memory"); - GLvoid* pboMappedPtr = g_GLESFuncs.glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, - pixelPackBufferObject->GetSize(), GL_MAP_READ_BIT); + GLvoid* pboMappedPtr = g_GLESFuncs.glMapBufferRange( + GL_PIXEL_PACK_BUFFER, 0, (GLsizeiptr)pixelPackBufferObject->GetSize(), GL_MAP_READ_BIT); if (pboMappedPtr) { MGLOG_D("ReadPixels: Copying data from PBO to client memory"); SizeT size = pixelPackBufferObject->GetSize(); @@ -1345,7 +1333,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("GetTexImage: SyncCurrentFBO()"); FramebufferImpl::SyncCurrentFBO(); - Uint activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit(); + auto activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit(); MGLOG_D("GetTexImage: active texture unit = %u", activeTextureUnit); const auto& textureObject = MG_State::pGLContext->GetTextureUnitObject(activeTextureUnit) @@ -1355,7 +1343,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("GetTexImage: bound texture object = %p (name=%u)", textureObject.get(), textureObject ? textureObject->GetExternalIndex() : 0); - const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject); + const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get()); if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) { MGLOG_E("GetTexImage: No backend texture found for texture %u.", @@ -1383,14 +1371,14 @@ namespace MobileGL::MG_Backend::DirectGLES { return; } - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); MGLOG_D("GetTexImage: Applying TempPixelStoreParameterSync (PACK)"); TempPixelStoreParameterSync tempPackParamsSync(false); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); @@ -1402,9 +1390,9 @@ namespace MobileGL::MG_Backend::DirectGLES { return; } - auto* textureMipmapObject = static_cast(textureObject.get()); + auto* textureMipmapObject = dynamic_cast(textureObject.get()); - auto levelRange = textureMipmapObject->GetLevelRange(); + auto& levelRange = textureMipmapObject->GetLevelRange(); MGLOG_D("GetTexImage: mipmap level range = [%d, %d)", levelRange.x(), levelRange.y()); if (level < levelRange.x() || level >= levelRange.y()) { @@ -1421,7 +1409,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("GetTexImage: mip level %d size = %dx%d", level, size.x(), size.y()); // Handle PBO - auto pixelPackBufferObject = + auto& pixelPackBufferObject = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::PixelPack).GetBoundObject(); Bool usePBO; GLuint prevPixelPackBuffer = 0; @@ -1429,7 +1417,7 @@ namespace MobileGL::MG_Backend::DirectGLES { BufferImpl::CreateAndSyncBufferObject(pixelPackBufferObject); MGLOG_D("GetTexImage: Using PBO %u", pixelPackBufferObject->GetExternalIndex()); usePBO = true; - const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(pixelPackBufferObject); + const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(pixelPackBufferObject.get()); if (backendBufferIt == BufferImpl::g_backendBufferObjects.end()) { MGLOG_E("GetTexImage: No backend buffer found for PBO %u.", pixelPackBufferObject ? pixelPackBufferObject->GetExternalIndex() : 0); @@ -1443,7 +1431,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("GetTexImage: Not using PBO"); } - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); MGLOG_D("GetTexImage: glReadPixels(0, 0, %d, %d, %s, %s, %p)", size.x(), size.y(), @@ -1451,14 +1439,14 @@ namespace MobileGL::MG_Backend::DirectGLES { pixels); g_GLESFuncs.glReadPixels(0, 0, size.x(), size.y(), esFormat, esType, pixels); - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); if (usePBO) { // pull back to client memory if PBO is used MGLOG_D("ReadPixels: PBO used, mapping buffer to client memory"); - GLvoid* pboMappedPtr = g_GLESFuncs.glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, - pixelPackBufferObject->GetSize(), GL_MAP_READ_BIT); + GLvoid* pboMappedPtr = g_GLESFuncs.glMapBufferRange( + GL_PIXEL_PACK_BUFFER, 0, (GLsizeiptr)pixelPackBufferObject->GetSize(), GL_MAP_READ_BIT); if (pboMappedPtr) { MGLOG_D("ReadPixels: Copying data from PBO to client memory"); SizeT size = pixelPackBufferObject->GetSize(); @@ -1479,7 +1467,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } } - errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__](auto err) { MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); MGLOG_D("GetTexImage: finished"); diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index 4ad1521a..8eb363c0 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -7,10 +7,6 @@ // End of Source File Header #include "Managers.h" -#include "MG_State/GLState/TextureState/TextureEnum.h" -#include "MG_State/GLState/TextureState/TextureObject.h" -#include "MG_State/GLState/TextureState/TextureState.h" -#include "MG_Util/Converters/GLToMG/TextureEnumConverter.h" #include "Utils.h" #include "DirectGLES.h" @@ -18,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -44,7 +41,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } } - void BackendBufferObject::SyncToBackend(SharedPtr& stateBufferObject) { + void BackendBufferObject::SyncToBackend(const SharedPtr& stateBufferObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -105,7 +102,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } void BackendBufferObject::SyncToBackend_glBufferData( - SharedPtr& stateBufferObject) { + const SharedPtr& stateBufferObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -117,11 +114,11 @@ namespace MobileGL::MG_Backend::DirectGLES { GLenum usage = MG_Util::ConvertBufferUsageToGLEnum(stateBufferObject->GetUsage()); Bind(); - g_GLESFuncs.glBufferData(TempBufferTarget, size, data, usage); + g_GLESFuncs.glBufferData(TempBufferTarget, (GLsizeiptr)size, data, usage); } void BackendBufferObject::SyncToBackend_glBufferSubData( - SharedPtr& stateBufferObject) { + const SharedPtr& stateBufferObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -130,7 +127,7 @@ namespace MobileGL::MG_Backend::DirectGLES { const void* data = stateBufferObject->GetDataReadOnly()->data(); // dirty range: [range.start, range.end) - auto ranges = stateBufferObject->GetDirtyRanges(); + auto& ranges = stateBufferObject->GetDirtyRanges(); if (ranges.empty()) { MGLOG_D("No dirty range to sync for buffer with ID: %u", m_backendBufferId); return; @@ -138,20 +135,21 @@ namespace MobileGL::MG_Backend::DirectGLES { for (const auto& range : ranges) { Bind(); - g_GLESFuncs.glBufferSubData(TempBufferTarget, range.start, range.end - range.start, + g_GLESFuncs.glBufferSubData(TempBufferTarget, (GLintptr)range.start, + (GLintptr)(range.end - range.start), reinterpret_cast(data) + range.start); } } void BackendBufferObject::SyncToBackend_glMapBufferRange( - SharedPtr& stateBufferObject, Bool invalidate, Bool unsynchronized) { + const SharedPtr& stateBufferObject, Bool invalidate, Bool unsynchronized) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif MGLOG_D("Syncing buffer map (glMapBuffer) for object with ID : %u", m_backendBufferId); MGLOG_D("Mapping buffer with ID: %u", m_backendBufferId); - auto ranges = stateBufferObject->GetDirtyRanges(); + auto& ranges = stateBufferObject->GetDirtyRanges(); if (ranges.empty()) { MGLOG_D("No dirty range to sync for buffer with ID: %u", m_backendBufferId); return; @@ -159,18 +157,18 @@ namespace MobileGL::MG_Backend::DirectGLES { SizeT minStart = ranges.GetOverallMinStart(); SizeT maxEnd = ranges.GetOverallMaxEnd(); Bind(); - void* mappedData = g_GLESFuncs.glMapBufferRange(TempBufferTarget, minStart, maxEnd - minStart, - (invalidate ? GL_MAP_INVALIDATE_RANGE_BIT : 0) | - (unsynchronized ? GL_MAP_UNSYNCHRONIZED_BIT : 0) | - GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); + void* mappedData = g_GLESFuncs.glMapBufferRange( + TempBufferTarget, (GLintptr)minStart, (GLintptr)(maxEnd - minStart), + (invalidate ? GL_MAP_INVALIDATE_RANGE_BIT : 0) | (unsynchronized ? GL_MAP_UNSYNCHRONIZED_BIT : 0) | + GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); const void* data = stateBufferObject->GetDataReadOnly()->data(); if (mappedData) { MGLOG_D("Mapped buffer data successfully for object with ID: %u", m_backendBufferId); Memcpy(mappedData, reinterpret_cast(data) + minStart, maxEnd - minStart); // Explicitly flush the dirty ranges for (const auto& range : ranges) { - g_GLESFuncs.glFlushMappedBufferRange(TempBufferTarget, range.start - minStart, - range.end - range.start); + g_GLESFuncs.glFlushMappedBufferRange(TempBufferTarget, (GLintptr)(range.start - minStart), + (GLintptr)(range.end - range.start)); } g_GLESFuncs.glUnmapBuffer(TempBufferTarget); } else { @@ -191,7 +189,7 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glBindBuffer(target, m_backendBufferId); } - UnorderedMap, SharedPtr> g_backendBufferObjects; + UnorderedMap> g_backendBufferObjects; BackendBufferObject* g_boundVertexBufferObject = nullptr; } // namespace BufferImpl @@ -209,22 +207,21 @@ namespace MobileGL::MG_Backend::DirectGLES { } } - void BackendVertexArrayObject::Bind() { + void BackendVertexArrayObject::Bind() const { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif g_GLESFuncs.glBindVertexArray(m_backendVAOId); } - void BackendVertexArrayObject::BindAttributeBuffer(Uint index, - const MG_State::GLState::VertexAttribute& attrib) { + inline void BindAttributeBuffer(const MG_State::GLState::VertexAttribute& attrib) { const auto& bufferObject = attrib.Buffer; if (!bufferObject) { MGLOG_W("Attribute has no bound buffer, skipping."); return; } - const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(bufferObject); + const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(bufferObject.get()); if (backendBufferIt == BufferImpl::g_backendBufferObjects.end()) { MGLOG_E("No backend buffer found for attribute's buffer, cannot bind attribute."); return; @@ -234,7 +231,8 @@ namespace MobileGL::MG_Backend::DirectGLES { backendBufferObject->Bind(GL_ARRAY_BUFFER); } - void BackendVertexArrayObject::SyncToBackend(SharedPtr& stateVAOObject) { + void BackendVertexArrayObject::SyncToBackend( + const SharedPtr& stateVAOObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -268,7 +266,7 @@ namespace MobileGL::MG_Backend::DirectGLES { m_syncedAttributeVersions[attribIndex].BufferVersion; if (!needsSyncFormat && !needsSyncBuffer) continue; - BindAttributeBuffer(attribIndex, attrib); + BindAttributeBuffer(attrib); if (!attrib.IsInteger) { g_GLESFuncs.glVertexAttribPointer( @@ -289,7 +287,7 @@ namespace MobileGL::MG_Backend::DirectGLES { if (currentIndexBufferVersion != m_syncedIndexBufferVersion) { const auto& indexBufferBinding = stateVAOObject->GetIndexBufferBindingSlot().GetBoundObject(); if (indexBufferBinding) { - const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(indexBufferBinding); + const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(indexBufferBinding.get()); if (backendBufferIt != BufferImpl::g_backendBufferObjects.end()) { const auto& backendBufferObject = backendBufferIt->second; backendBufferObject->Bind(GL_ELEMENT_ARRAY_BUFFER); @@ -303,7 +301,7 @@ namespace MobileGL::MG_Backend::DirectGLES { m_syncedAttributeVersions = allAttributeVersions; } - UnorderedMap, SharedPtr> + UnorderedMap> g_backendVertexArrayObjects; } // namespace VertexArrayImpl @@ -336,7 +334,7 @@ namespace MobileGL::MG_Backend::DirectGLES { g_boundTexturesCache[unit][targetN] = this; } - Uint BackendTextureObject::GetBackendTextureId() { + Uint BackendTextureObject::GetBackendTextureId() const { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -344,7 +342,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } void BackendTextureObject::SyncMipmapsToBackend( - SharedPtr& stateTextureObject) { + const SharedPtr& stateTextureObject) { if (!stateTextureObject) { MGLOG_E("State texture object is null, cannot sync to backend."); return; @@ -353,7 +351,6 @@ namespace MobileGL::MG_Backend::DirectGLES { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif - DebugImpl::ErrorLopper errorLopper; MGLOG_D("Syncing texture mipmaps with backend ID %u to backend for state ID %u", m_backendTextureId, stateTextureObject->GetExternalIndex()); @@ -381,7 +378,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } Bind(target); - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); const auto baseSize = stateTextureObject->GetBaseSize(); @@ -394,7 +391,7 @@ namespace MobileGL::MG_Backend::DirectGLES { switch (stateTextureObject->GetStorageType()) { case TextureStorageType::Mipmap: { auto* textureMipmapObject = - static_cast(stateTextureObject.get()); + dynamic_cast(stateTextureObject.get()); const auto mipmapCount = textureMipmapObject->GetMipmapLevelCount(); currentTextureInfo.mipmapLevels = mipmapCount; @@ -414,7 +411,7 @@ namespace MobileGL::MG_Backend::DirectGLES { &glFormat, &glType); const auto& uploadTargets = textureMipmapObject->GetUploadTargets(); - for (auto uploadTarget : uploadTargets) { + for (auto& uploadTarget : uploadTargets) { for (SizeT level = 0; level < mipmapCount; ++level) { auto levelTexelSize = textureMipmapObject->GetMipmapTexelSize(uploadTarget, level); auto levelByteSize = textureMipmapObject->GetMipmapByteSize(uploadTarget, level); @@ -429,22 +426,22 @@ namespace MobileGL::MG_Backend::DirectGLES { levelTexelSize.x(), levelTexelSize.y(), levelTexelSize.z(), levelByteSize, pData, levelDirty ? "true" : "false"); - errorLopper.Clear(); + DebugImpl::ErrorLopper::Clear(); g_GLESFuncs.glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); auto textureTarget = stateTextureObject->GetTarget(); // TODO: handle more texture types switch (textureTarget) { case TextureTarget::Texture2D: case TextureTarget::TextureCubeMap: { - g_GLESFuncs.glTexImage2D(glUploadTarget, static_cast(level), glInternalFormat, - static_cast(levelTexelSize.x()), - static_cast(levelTexelSize.y()), 0, glFormat, glType, - pData); + g_GLESFuncs.glTexImage2D( + glUploadTarget, static_cast(level), (GLint)glInternalFormat, + static_cast(levelTexelSize.x()), static_cast(levelTexelSize.y()), + 0, glFormat, glType, pData); break; } case TextureTarget::Texture3D: { g_GLESFuncs.glTexImage3D( - glUploadTarget, static_cast(level), glInternalFormat, + glUploadTarget, static_cast(level), (GLint)glInternalFormat, static_cast(levelTexelSize.x()), static_cast(levelTexelSize.y()), static_cast(levelTexelSize.z()), 0, glFormat, glType, pData); break; @@ -454,8 +451,9 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_Util::ConvertTextureTargetToString(textureTarget).c_str()); } } - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__, glUploadTarget, - glInternalFormat, glFormat, glType, pData](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__, + glUploadTarget, glInternalFormat, glFormat, glType, + pData](GLenum err) { MGLOG_D("%s(%s:%d) ES error: %s. glTexImage*: target=%s, internalformat=%s, format=%s, " "type=%s, pixels=%p", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str(), @@ -478,7 +476,7 @@ namespace MobileGL::MG_Backend::DirectGLES { TextureImpl::GenerateTextureFormatInfo(textureMipmapObject->GetFormat(), &glInternalFormat, &glFormat, &glType); const auto& uploadTargets = textureMipmapObject->GetUploadTargets(); - for (auto uploadTarget : uploadTargets) { + for (auto& uploadTarget : uploadTargets) { for (SizeT level = 0; level < mipmapCount; ++level) { if (!textureMipmapObject->IsStorageDirty(uploadTarget, level)) { continue; @@ -499,10 +497,11 @@ namespace MobileGL::MG_Backend::DirectGLES { auto glUploadTarget = MG_Util::ConvertTextureUploadTargetToGLEnum(uploadTarget); g_GLESFuncs.glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { - MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, - MG_Util::ConvertGLEnumToString(err).c_str()); - }); + DebugImpl::ErrorLopper::Loop( + [file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, + MG_Util::ConvertGLEnumToString(err).c_str()); + }); auto texelSize = textureMipmapObject->GetMipmapTexelSize(uploadTarget, level); g_GLESFuncs.glTexSubImage2D(glUploadTarget, static_cast(level), 0, 0, static_cast(texelSize.x()), @@ -516,9 +515,9 @@ namespace MobileGL::MG_Backend::DirectGLES { } case TextureStorageType::Buffer: { auto* textureBufferObject = - static_cast(stateTextureObject.get()); + dynamic_cast(stateTextureObject.get()); auto& slot = textureBufferObject->GetBufferBindingSlot(); - auto buffer = slot.GetBoundObject(); + auto& buffer = slot.GetBoundObject(); auto bufferIndex = buffer->GetExternalIndex(); currentTextureInfo.bufferExternalIndex = bufferIndex; @@ -530,10 +529,10 @@ namespace MobileGL::MG_Backend::DirectGLES { // Need to sync texture buffer if not synced yet auto& backendBuffers = BufferImpl::g_backendBufferObjects; SharedPtr backendBufferObject; - const auto& backendBufferIt = backendBuffers.find(buffer); + const auto& backendBufferIt = backendBuffers.find(buffer.get()); if (backendBufferIt == backendBuffers.end()) { backendBufferObject = MakeShared(); - backendBuffers[buffer] = backendBufferObject; + backendBuffers[buffer.get()] = backendBufferObject; } else { backendBufferObject = backendBufferIt->second; } @@ -553,7 +552,7 @@ namespace MobileGL::MG_Backend::DirectGLES { THROW_UNIMPL_EXCEPTION; } - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); @@ -561,11 +560,11 @@ namespace MobileGL::MG_Backend::DirectGLES { } void BackendTextureObject::SyncBuiltinSamplerToBackend( - SharedPtr& stateTextureObject) { + const SharedPtr& stateTextureObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif - DebugImpl::ErrorLopper errorLopper; + if (!stateTextureObject) { MGLOG_E("State texture object is null, cannot sync to backend."); return; @@ -594,7 +593,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } Bind(target); - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); @@ -607,28 +606,29 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glTexParameteri(target, glName, \ MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)); \ m_cacheSamplerParameters.internalName = samplerParams.internalName; \ - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__, \ - t = MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)](GLenum err) { \ - MGLOG_D("%s(%s:%d) ES error %s, GL_TEXTURE_MIN_FILTER = %s", func, file, line, \ - MG_Util::ConvertGLEnumToString(err).c_str(), MG_Util::ConvertGLEnumToString(t).c_str()); \ - }); \ + DebugImpl::ErrorLopper::Loop( \ + [file = __FILE__, line = __LINE__, func = __func__, \ + t = MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)](GLenum err) { \ + MGLOG_D("%s(%s:%d) ES error %s, GL_TEXTURE_MIN_FILTER = %s", func, file, line, \ + MG_Util::ConvertGLEnumToString(err).c_str(), MG_Util::ConvertGLEnumToString(t).c_str()); \ + }); \ } if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter || m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) { - g_GLESFuncs.glTexParameteri( - target, GL_TEXTURE_MIN_FILTER, - MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter, samplerParams.mipmapMode)); + g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER, + (GLint)MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter, + samplerParams.mipmapMode)); m_cacheSamplerParameters.minFilter = samplerParams.minFilter; m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode; } if (m_cacheSamplerParameters.magFilter != samplerParams.magFilter) { g_GLESFuncs.glTexParameteri( target, GL_TEXTURE_MAG_FILTER, - MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.magFilter, SamplerMipmapMode::None)); + (GLint)MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.magFilter, SamplerMipmapMode::None)); m_cacheSamplerParameters.magFilter = samplerParams.magFilter; } - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); @@ -645,18 +645,18 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glTexParameterf(target, GL_TEXTURE_MAX_LOD, samplerParams.maxLod); m_cacheSamplerParameters.maxLod = samplerParams.maxLod; } - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); #undef SYNC_TEX_SAMPLER_PARAM_IF_CHANGED } void BackendTextureObject::SyncTextureParamsToBackend( - SharedPtr& stateTextureObject) { + const SharedPtr& stateTextureObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif - DebugImpl::ErrorLopper errorLopper; + if (!stateTextureObject) { MGLOG_E("State texture object is null, cannot sync to backend."); return; @@ -683,7 +683,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } Bind(target); - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); @@ -696,14 +696,14 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, static_cast(levelRange.x())); m_cacheLodRange.x() = levelRange.x(); } - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); if (m_cacheLodRange.y() != levelRange.y()) { g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, static_cast(levelRange.y())); m_cacheLodRange.y() = levelRange.y(); } - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); @@ -720,7 +720,7 @@ namespace MobileGL::MG_Backend::DirectGLES { SYNC_TEX_SWIZZLE_PARAM_IF_CHANGED(a(), GL_TEXTURE_SWIZZLE_A); #undef SYNC_TEX_SWIZZLE_PARAM_IF_CHANGED m_cacheSwizzleParams = swizzleParams; - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); } @@ -730,7 +730,7 @@ namespace MobileGL::MG_Backend::DirectGLES { GLfloat borderColorArray[4] = {borderColor.x(), borderColor.y(), borderColor.z(), borderColor.w()}; g_GLESFuncs.glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, borderColorArray); m_cacheBorderColor = borderColor; - errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); }); } @@ -760,8 +760,7 @@ namespace MobileGL::MG_Backend::DirectGLES { Array, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS> g_boundTexturesCache; - UnorderedMap, SharedPtr> - g_backendTextureObjects; + UnorderedMap> g_backendTextureObjects; } // namespace TextureImpl namespace FramebufferImpl { @@ -778,7 +777,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } } - void BackendFramebufferObject::Bind(FramebufferTarget target) { + void BackendFramebufferObject::Bind(FramebufferTarget target) const { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -788,12 +787,12 @@ namespace MobileGL::MG_Backend::DirectGLES { g_GLESFuncs.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_backendFBOId); } - Bool BackendFramebufferObject::SyncAttachmentObject( - GLenum glFBOTarget, const MG_State::GLState::FramebufferAttachmentObject& attachmentObject, - GLenum glBackendAttachment) { + static Bool SyncAttachmentObject(GLenum glFBOTarget, + const MG_State::GLState::FramebufferAttachmentObject& attachmentObject, + GLenum glBackendAttachment) { if (attachmentObject.IsTexture()) { const auto& textureObject = attachmentObject.GetTexture(); - const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject); + const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get()); if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) { MGLOG_E("%s: No backend texture found for FBO attachment, cannot bind texture.", __func__); return false; @@ -807,11 +806,12 @@ namespace MobileGL::MG_Backend::DirectGLES { } else if (attachmentObject.IsRenderbuffer()) { const auto& renderbufferObject = attachmentObject.GetRenderbuffer(); const auto& backendRenderbufferIt = - RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject); + RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject.get()); SharedPtr backendRenderbufferObject; if (backendRenderbufferIt == RenderbufferImpl::g_backendRenderbufferObjects.end()) { backendRenderbufferObject = MakeShared(); - RenderbufferImpl::g_backendRenderbufferObjects[renderbufferObject] = backendRenderbufferObject; + RenderbufferImpl::g_backendRenderbufferObjects[renderbufferObject.get()] = + backendRenderbufferObject; } else { backendRenderbufferObject = backendRenderbufferIt->second; } @@ -824,8 +824,8 @@ namespace MobileGL::MG_Backend::DirectGLES { return true; } - void BackendFramebufferObject::SyncToBackend(SharedPtr& stateFBOObject, - FramebufferTarget asTarget) { + void BackendFramebufferObject::SyncToBackend( + const SharedPtr& stateFBOObject, FramebufferTarget asTarget) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -853,7 +853,7 @@ namespace MobileGL::MG_Backend::DirectGLES { std::fill(m_backendDrawBuffers, m_backendDrawBuffers + FramebufferObject::MAX_DRAW_BUFFERS, GL_NONE); int nEffectiveBuffers = 0; for (GLint i = 0; i < FramebufferObject::MAX_DRAW_BUFFERS; ++i) { - auto frontendBuf = stateDrawBuffers[i]; + auto& frontendBuf = stateDrawBuffers[i]; if (frontendBuf == FramebufferAttachmentType::None) { m_backendDrawBuffers[i] = GL_NONE; continue; @@ -892,7 +892,7 @@ namespace MobileGL::MG_Backend::DirectGLES { const auto& attachmentVersions = stateFBOObject->GetAllFramebufferAttachmentVersions(); for (SizeT i = 0; i < attachments.size(); ++i) { const auto& attachmentObject = attachments[i]; - FramebufferAttachmentType frontendType = static_cast(i); + auto frontendType = static_cast(i); GLenum glBackendAttachment = GL_NONE; if (frontendType >= FramebufferAttachmentType::Color0 && frontendType <= FramebufferAttachmentType::Color31) @@ -928,7 +928,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // Verify that the backend object's name and parameters match the frontend attachment state if (attachmentObject.IsTexture()) { const auto& textureObject = attachmentObject.GetTexture(); - auto backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject); + auto backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get()); MOBILEGL_ASSERT(backendTextureIt != TextureImpl::g_backendTextureObjects.end(), "No backend texture found while framebuffer reports texture attachment."); GLuint backendTexId = backendTextureIt->second->GetBackendTextureId(); @@ -944,7 +944,8 @@ namespace MobileGL::MG_Backend::DirectGLES { "Attachment texture level mismatch between GLES and state object."); } else if (attachmentObject.IsRenderbuffer()) { const auto& renderbufferObject = attachmentObject.GetRenderbuffer(); - auto backendRboIt = RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject); + auto backendRboIt = + RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject.get()); MOBILEGL_ASSERT( backendRboIt != RenderbufferImpl::g_backendRenderbufferObjects.end(), "No backend renderbuffer found while framebuffer reports renderbuffer attachment."); @@ -975,14 +976,13 @@ namespace MobileGL::MG_Backend::DirectGLES { return glBackendReadBuffer; } - UnorderedMap, SharedPtr> + UnorderedMap> g_backendFramebufferObjects; Array g_fboBindVersions = {0}; } // namespace FramebufferImpl namespace PrgramImpl { - UnorderedMap, SharedPtr> - g_backendProgramObjects; + UnorderedMap> g_backendProgramObjects; BackendProgramObjectImpl::BackendProgramObjectImpl() { #ifdef TRACY_ENABLE @@ -1008,7 +1008,8 @@ namespace MobileGL::MG_Backend::DirectGLES { } } - void BackendProgramObjectImpl::SyncToBackend(SharedPtr& stateProgramObject) { + void BackendProgramObjectImpl::SyncToBackend( + const SharedPtr& stateProgramObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -1161,7 +1162,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("Program sync completed. backend ID %u", m_backendProgramId); } - void BackendProgramObjectImpl::Use() { + void BackendProgramObjectImpl::Use() const { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -1184,7 +1185,8 @@ namespace MobileGL::MG_Backend::DirectGLES { } } - void BackendSamplerObject::SyncToBackend(SharedPtr& stateSamplerObject) { + void BackendSamplerObject::SyncToBackend( + const SharedPtr& stateSamplerObject) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -1210,22 +1212,22 @@ namespace MobileGL::MG_Backend::DirectGLES { #define SYNC_SAMPLER_PARAM_IF_CHANGED(internalName, glName, type) \ if (m_cacheSamplerParameters.internalName != samplerParams.internalName) { \ g_GLESFuncs.glSamplerParameteri(m_backendSamplerId, glName, \ - MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)); \ + (GLint)MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)); \ m_cacheSamplerParameters.internalName = samplerParams.internalName; \ } if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter || m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) { - g_GLESFuncs.glSamplerParameteri( - m_backendSamplerId, GL_TEXTURE_MIN_FILTER, - MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter, samplerParams.mipmapMode)); + g_GLESFuncs.glSamplerParameteri(m_backendSamplerId, GL_TEXTURE_MIN_FILTER, + (GLint)MG_Util::ConvertSamplerFilterModeToGLEnum( + samplerParams.minFilter, samplerParams.mipmapMode)); m_cacheSamplerParameters.minFilter = samplerParams.minFilter; m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode; } if (m_cacheSamplerParameters.magFilter != samplerParams.magFilter) { g_GLESFuncs.glSamplerParameteri( m_backendSamplerId, GL_TEXTURE_MAG_FILTER, - MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.magFilter, SamplerMipmapMode::None)); + (GLint)MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.magFilter, SamplerMipmapMode::None)); m_cacheSamplerParameters.magFilter = samplerParams.magFilter; } @@ -1256,7 +1258,7 @@ namespace MobileGL::MG_Backend::DirectGLES { g_boundSamplersCache[unit] = this; } - Uint BackendSamplerObject::GetBackendSamplerId() { + Uint BackendSamplerObject::GetBackendSamplerId() const { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -1271,8 +1273,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } Array g_boundSamplersCache; - UnorderedMap, SharedPtr> - g_backendSamplerObjects; + UnorderedMap> g_backendSamplerObjects; } // namespace SamplerImpl namespace RenderbufferImpl { @@ -1287,7 +1288,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } } - void BackendRenderbufferObject::Bind() { + void BackendRenderbufferObject::Bind() const { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif @@ -1334,9 +1335,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("RBO %u sync completed. backend ID %u", stateRBOObject->GetExternalIndex(), m_backendRBOId); } - UnorderedMap, SharedPtr> + UnorderedMap> g_backendRenderbufferObjects; } // namespace RenderbufferImpl - - namespace Utils {} // namespace Utils } // namespace MobileGL::MG_Backend::DirectGLES diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.h b/MobileGL/MG_Backend/DirectGLES/Managers.h index b08aee3a..e82e50fb 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.h +++ b/MobileGL/MG_Backend/DirectGLES/Managers.h @@ -20,14 +20,14 @@ namespace MobileGL::MG_Backend::DirectGLES { class BackendBufferObject { public: BackendBufferObject(); - void SyncToBackend(SharedPtr& stateBufferObject); - Uint GetBackendBufferId() { return m_backendBufferId; } + void SyncToBackend(const SharedPtr& stateBufferObject); + Uint GetBackendBufferId() const { return m_backendBufferId; } void Bind(GLenum target = TempBufferTarget); private: - void SyncToBackend_glBufferData(SharedPtr& stateBufferObject); - void SyncToBackend_glBufferSubData(SharedPtr& stateBufferObject); - void SyncToBackend_glMapBufferRange(SharedPtr& stateBufferObject, + void SyncToBackend_glBufferData(const SharedPtr& stateBufferObject); + void SyncToBackend_glBufferSubData(const SharedPtr& stateBufferObject); + void SyncToBackend_glMapBufferRange(const SharedPtr& stateBufferObject, Bool invalidate = true, Bool unsynchronized = true); Uint m_backendBufferId = 0; @@ -36,21 +36,18 @@ namespace MobileGL::MG_Backend::DirectGLES { }; extern BackendBufferObject* g_boundVertexBufferObject; - extern UnorderedMap, SharedPtr> - g_backendBufferObjects; + extern UnorderedMap> g_backendBufferObjects; } // namespace BufferImpl namespace VertexArrayImpl { class BackendVertexArrayObject { public: BackendVertexArrayObject(); - void SyncToBackend(SharedPtr& stateVAOObject); - Uint GetBackendVertexArrayId() { return m_backendVAOId; } - void Bind(); + void SyncToBackend(const SharedPtr& stateVAOObject); + Uint GetBackendVertexArrayId() const { return m_backendVAOId; } + void Bind() const; private: - void BindAttributeBuffer(Uint index, const MG_State::GLState::VertexAttribute& attrib); - Uint m_backendVAOId = 0; Bool m_isInitialized = false; Uint16 m_syncedIndexBufferVersion = 0; @@ -58,7 +55,7 @@ namespace MobileGL::MG_Backend::DirectGLES { m_syncedAttributeVersions; }; - extern UnorderedMap, SharedPtr> + extern UnorderedMap> g_backendVertexArrayObjects; } // namespace VertexArrayImpl @@ -92,11 +89,11 @@ namespace MobileGL::MG_Backend::DirectGLES { class BackendTextureObject { public: BackendTextureObject(); - void SyncMipmapsToBackend(SharedPtr& stateTextureObject); - void SyncBuiltinSamplerToBackend(SharedPtr& stateTextureObject); - void SyncTextureParamsToBackend(SharedPtr& stateTextureObject); + void SyncMipmapsToBackend(const SharedPtr& stateTextureObject); + void SyncBuiltinSamplerToBackend(const SharedPtr& stateTextureObject); + void SyncTextureParamsToBackend(const SharedPtr& stateTextureObject); void Bind(GLenum target, Uint unit = TempTextureUnit); - Uint GetBackendTextureId(); + Uint GetBackendTextureId() const; private: Uint m_backendTextureId = 0; @@ -113,7 +110,7 @@ namespace MobileGL::MG_Backend::DirectGLES { void ActivateTextureUnit(Uint unit); void UnbindTexture(Uint unit, GLenum target); - extern UnorderedMap, SharedPtr> + extern UnorderedMap> g_backendTextureObjects; extern Array, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS> @@ -125,13 +122,10 @@ namespace MobileGL::MG_Backend::DirectGLES { class BackendFramebufferObject { public: BackendFramebufferObject(); - void SyncToBackend(SharedPtr& stateFBOObject, + void SyncToBackend(const SharedPtr& stateFBOObject, FramebufferTarget asTarget); - Uint GetBackendFramebufferId() { return m_backendFBOId; } - void Bind(FramebufferTarget target); - bool SyncAttachmentObject(GLenum glFBOTarget, - const MG_State::GLState::FramebufferAttachmentObject& attachmentObject, - GLenum glBackendAttachment); + Uint GetBackendFramebufferId() const { return m_backendFBOId; } + void Bind(FramebufferTarget target) const; // FramebufferAttachmentType GetCompactedAttachmentTypeAtDrawBufferIndex(Int index); GLenum GetBackendAttachmentType(FramebufferAttachmentType frontendAtt) const; @@ -159,7 +153,7 @@ namespace MobileGL::MG_Backend::DirectGLES { FramebufferObject::FramebufferAttachmentVersionArray m_syncedFrontendAttachmentVersions = {0}; }; - extern UnorderedMap, SharedPtr> + extern UnorderedMap> g_backendFramebufferObjects; extern Array g_fboBindVersions; } // namespace FramebufferImpl @@ -169,8 +163,8 @@ namespace MobileGL::MG_Backend::DirectGLES { public: BackendProgramObjectImpl(); ~BackendProgramObjectImpl(); - void SyncToBackend(SharedPtr& stateProgramObject); - void Use(); + void SyncToBackend(const SharedPtr& stateProgramObject); + void Use() const; Uint GetBackendProgramId() const { return m_backendProgramId; } Uint GetBackendGlobalUBOId() const { return m_backendGlobalUBOId; } @@ -180,7 +174,7 @@ namespace MobileGL::MG_Backend::DirectGLES { Bool m_isInitialized = false; }; - extern UnorderedMap, SharedPtr> + extern UnorderedMap> g_backendProgramObjects; } // namespace PrgramImpl @@ -188,9 +182,9 @@ namespace MobileGL::MG_Backend::DirectGLES { class BackendSamplerObject { public: BackendSamplerObject(); - void SyncToBackend(SharedPtr& stateSamplerObject); + void SyncToBackend(const SharedPtr& stateSamplerObject); void Bind(Uint unit); - Uint GetBackendSamplerId(); + Uint GetBackendSamplerId() const; private: Uint m_backendSamplerId = 0; @@ -203,8 +197,7 @@ namespace MobileGL::MG_Backend::DirectGLES { extern Array g_boundSamplersCache; - extern UnorderedMap, SharedPtr> - g_backendSamplerObjects; + extern UnorderedMap> g_backendSamplerObjects; } // namespace SamplerImpl namespace RenderbufferImpl { @@ -212,8 +205,8 @@ namespace MobileGL::MG_Backend::DirectGLES { public: BackendRenderbufferObject(); void SyncToBackend(const SharedPtr& stateRBOObject); - Uint GetBackendRenderbufferId() { return m_backendRBOId; } - void Bind(); + Uint GetBackendRenderbufferId() const { return m_backendRBOId; } + void Bind() const; private: Uint m_backendRBOId = 0; @@ -223,7 +216,7 @@ namespace MobileGL::MG_Backend::DirectGLES { Int m_cacheHeight = 0; }; - extern UnorderedMap, SharedPtr> + extern UnorderedMap> g_backendRenderbufferObjects; } // namespace RenderbufferImpl } // namespace MobileGL::MG_Backend::DirectGLES diff --git a/MobileGL/MG_Backend/DirectGLES/Utils.cpp b/MobileGL/MG_Backend/DirectGLES/Utils.cpp index 0ec96fea..2ae7f27d 100644 --- a/MobileGL/MG_Backend/DirectGLES/Utils.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Utils.cpp @@ -19,10 +19,6 @@ #include namespace MobileGL::MG_Backend::DirectGLES { - namespace BufferImpl {} // namespace BufferImpl - - namespace VertexArrayImpl {} // namespace VertexArrayImpl - namespace TextureImpl { void GenerateTextureFormatInfo(TextureInternalFormat internalFormat, GLenum* outInternalFormat, GLenum* outFormat, GLenum* outType) { @@ -36,9 +32,6 @@ namespace MobileGL::MG_Backend::DirectGLES { outInternalFormat, outFormat, outType); } } // namespace TextureImpl - - namespace FramebufferImpl {} // namespace FramebufferImpl - namespace PrgramImpl { String ProcessOutColorLocations(const String& glslCode) { #ifdef TRACY_ENABLE @@ -166,7 +159,6 @@ namespace MobileGL::MG_Backend::DirectGLES { return GL_UNIFORM_BUFFER_BINDING; case GL_FRAMEBUFFER: - return GL_FRAMEBUFFER_BINDING; case GL_DRAW_FRAMEBUFFER: return GL_DRAW_FRAMEBUFFER_BINDING; case GL_READ_FRAMEBUFFER: @@ -176,7 +168,6 @@ namespace MobileGL::MG_Backend::DirectGLES { return GL_RENDERBUFFER_BINDING; case GL_VERTEX_ARRAY: - return GL_VERTEX_ARRAY_BINDING; case GL_VERTEX_ARRAY_BINDING: return GL_VERTEX_ARRAY_BINDING; diff --git a/MobileGL/MG_Backend/DirectGLES/Utils.h b/MobileGL/MG_Backend/DirectGLES/Utils.h index 21777e33..9d0dfbca 100644 --- a/MobileGL/MG_Backend/DirectGLES/Utils.h +++ b/MobileGL/MG_Backend/DirectGLES/Utils.h @@ -14,15 +14,15 @@ namespace MobileGL::MG_Backend::DirectGLES { namespace DebugImpl { class ErrorLopper { public: - void Loop(std::function); - void Clear(); + static void Loop(const std::function&); + static void Clear(); ErrorLopper(); ~ErrorLopper(); }; class OpenGLScopeMarker { public: - explicit OpenGLScopeMarker(String scopeName); + explicit OpenGLScopeMarker(const String& scopeName); ~OpenGLScopeMarker(); }; } // namespace DebugImpl diff --git a/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp b/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp index 27c03edc..93b04d3a 100644 --- a/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp @@ -297,7 +297,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { const auto& drawFboSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw); const auto drawFbo = drawFboSlot.GetBoundObject(); - const auto defaultFboInfo = MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo; + const auto& defaultFboInfo = MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo; const auto defaultFbo = defaultFboInfo ? defaultFboInfo->defaultFBO : nullptr; const Bool isDefaultFboTarget = (drawFbo == defaultFbo) || (drawFbo == nullptr && defaultFbo != nullptr); Uint drawFboExternalIndex = 0; @@ -429,7 +429,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { const auto& drawFboSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw); const auto readFbo = readFboSlot.GetBoundObject(); const auto drawFbo = drawFboSlot.GetBoundObject(); - const auto defaultFboInfo = MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo; + const auto& defaultFboInfo = MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo; const auto defaultFbo = defaultFboInfo ? defaultFboInfo->defaultFBO : nullptr; const Bool readIsDefault = (readFbo == defaultFbo) || (readFbo == nullptr && defaultFbo != nullptr); diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 4580b684..a0432ead 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -90,7 +90,8 @@ namespace MobileGL::MG_Backend::DirectVulkan { const VkPipelineVertexInputStateCreateInfo& vertexInputState) { MOBILEGL_ASSERT(m_pipelineFactory != nullptr, "PipelineFactory is not initialized"); MOBILEGL_ASSERT(m_programFactory != nullptr, "ProgramFactory is not initialized"); - ProgramFactory::CompileOptionFlags transformFlags = GetShaderTransformFlags(m_swapchainObject.GetPreTransform()); + ProgramFactory::CompileOptionFlags transformFlags = + GetShaderTransformFlags(m_swapchainObject.GetPreTransform()); auto& stages = m_programFactory->GetOrCreatePipelineShaderStages(program, transformFlags); if (stages.empty()) { MGLOG_D("GetOrCreatePipeline skipped: program has no shader stages"); @@ -178,7 +179,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { payload.dstAlphaBlendFactor = toVkBlendFactor(dstAlpha); payload.colorWriteMask = 0; - const BoolVec4 colorMask = MG_State::pGLContext->GetColorMask(); + auto colorMask = MG_State::pGLContext->GetColorMask(); if (colorMask.x()) payload.colorWriteMask |= VK_COLOR_COMPONENT_R_BIT; if (colorMask.y()) payload.colorWriteMask |= VK_COLOR_COMPONENT_G_BIT; if (colorMask.z()) payload.colorWriteMask |= VK_COLOR_COMPONENT_B_BIT; @@ -442,7 +443,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { MG_State::pGLContext ? MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw).GetBoundObject() : nullptr; - const auto defaultFboInfo = MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo; + const auto& defaultFboInfo = MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo; const auto defaultFbo = defaultFboInfo ? defaultFboInfo->defaultFBO : nullptr; const Bool drawTargetsDefault = (drawFbo == defaultFbo) || (drawFbo == nullptr && defaultFbo != nullptr); const Uint drawFboExternalIndex = @@ -2143,7 +2144,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { } Bool VulkanRenderer::GetMoreCapablePhysicalDevice(VkPhysicalDevice newVkDevice, VkSurfaceKHR surface, - const PhysicalDevice& otherDevice, + const PhysicalDevice& compareWithDevice, PhysicalDevice& outBetterDevice) { const auto deviceTypeToStr = [](VkPhysicalDeviceType type) { switch (type) { @@ -2175,7 +2176,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // Check device extensions (including swapchain extension) Bool deviceExtSupported = IsNecessaryDeviceExtensionSupported(newVkDevice); if (!deviceExtSupported) { - outBetterDevice = otherDevice; + outBetterDevice = compareWithDevice; MGLOG_I(" Ignored physical device. (Reason: Some of the required device extension not supported on this " "device)"); return false; @@ -2184,7 +2185,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // Check swapchain capabilities auto swapchainCapabilities = SwapchainObject::GetSwapchainCapabilities(newVkDevice, surface); if (!swapchainCapabilities.IsComplete()) { - outBetterDevice = otherDevice; + outBetterDevice = compareWithDevice; MGLOG_I(" Ignored physical device. (Reason: Swapchain capabilities not met)"); return false; } @@ -2193,7 +2194,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { Vector queueFamilies = GetQueueFamilyFromPhysicalDevice(newVkDevice); newDevice.queueFamilies.graphicsFamily = GetQueueFamilyIndex(queueFamilies, VK_QUEUE_GRAPHICS_BIT); if (newDevice.queueFamilies.graphicsFamily == -1) { - outBetterDevice = otherDevice; + outBetterDevice = compareWithDevice; MGLOG_I(" Ignored physical device. (Reason: No graphics queue family)"); return false; } @@ -2201,14 +2202,14 @@ namespace MobileGL::MG_Backend::DirectVulkan { newDevice.queueFamilies.presentFamily = GetPresentQueueFamilyIndex(newDevice, surface, queueFamilies, newDevice.queueFamilies.graphicsFamily); if (newDevice.queueFamilies.presentFamily == -1) { - outBetterDevice = otherDevice; + outBetterDevice = compareWithDevice; MGLOG_I(" Ignored physical device. (Reason: No present queue family)"); return false; } // Pick discrete GPU if (newDevice.properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU && - otherDevice.properties.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) { + compareWithDevice.properties.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) { outBetterDevice = newDevice; MGLOG_I(" Picked physical device. (Reason: Discrete GPU)"); return true; @@ -2216,7 +2217,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // Pick integrated GPU if no discrete GPU if (newDevice.properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU && - otherDevice.properties.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) { + compareWithDevice.properties.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) { outBetterDevice = newDevice; MGLOG_I(" Picked physical device. (Reason: Integrated GPU and no discrete one found yet)"); return true; @@ -2224,7 +2225,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // Ignore other GPU when discrete GPU found if (newDevice.properties.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU && - otherDevice.properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) { + compareWithDevice.properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) { outBetterDevice = newDevice; MGLOG_I(" Ignored physical device. (Reason: Already picked discrete GPU)"); return false; @@ -2487,7 +2488,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkRenderPass VulkanRenderer::GetDefaultLoadRenderPass() const { MOBILEGL_ASSERT(m_renderPassManager != nullptr, "GetDefaultLoadRenderPass: render pass manager is null"); - const VkRenderPass renderPass = m_renderPassManager->GetLoadRenderPass(); + VkRenderPass renderPass = m_renderPassManager->GetLoadRenderPass(); MOBILEGL_ASSERT(renderPass != VK_NULL_HANDLE, "GetDefaultLoadRenderPass: default load render pass is unavailable"); return renderPass; @@ -2579,7 +2580,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkQueueFlagBits flag) { for (Uint32 i = 0; i < queueFamilies.size(); i++) { if (queueFamilies[i].queueFlags & flag) { - return i; + return (Int)i; } } return -1; @@ -2598,7 +2599,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { for (Uint32 i = 0; i < queueFamilies.size(); i++) { VkBool32 supportsPresent = false; vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice.handle, i, surface, &supportsPresent); - if (supportsPresent) return i; + if (supportsPresent) return (Int)i; } return -1; } @@ -2631,12 +2632,8 @@ namespace MobileGL::MG_Backend::DirectVulkan { Bool VulkanRenderer::IsExtensionAlreadyEnabled(const Vector& enabledExtensions, const char* extensionName) { - for (const char* enabledExtensionName : enabledExtensions) { - if (strcmp(enabledExtensionName, extensionName) == 0) { - return true; - } - } - return false; + return std::any_of(enabledExtensions.begin(), enabledExtensions.end(), + [&extensionName](const String& name) { return name == extensionName; }); } Bool VulkanRenderer::EnableOptionalDeviceExtension(const Vector& availableExtensions, diff --git a/MobileGL/MG_Impl/EGLImpl/EGLImpl.cpp b/MobileGL/MG_Impl/EGLImpl/EGLImpl.cpp index d54dad22..20aa6d1c 100644 --- a/MobileGL/MG_Impl/EGLImpl/EGLImpl.cpp +++ b/MobileGL/MG_Impl/EGLImpl/EGLImpl.cpp @@ -20,7 +20,7 @@ namespace MobileGL::MG_Impl::EGLImpl { if (!MG_State::pEGLContext) { MGLOG_E("pEGLContext is null. MG_State may not be initialized."); } - return MG_State::pEGLContext; + return MG_State::pEGLContext.get(); } MG_Backend::BackendObject* GetBackendObject(EGLStateContext* state) { diff --git a/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp b/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp index a6c92001..23c4c0a3 100644 --- a/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp +++ b/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp @@ -8,600 +8,595 @@ #include "GL_Buffer.h" #include "Validators.h" -#include "MG_Util/Converters/GLToStr/GLEnumConverter.h" #include #include +#include #include #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - void GetBufferParameteriv_State(GLenum target, GLenum pname, GLint* params) { - if (!params) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", - "GetBufferParameteriv_State", - "Params pointer cannot be null.")); - return; - } +namespace MobileGL::MG_Impl::GLImpl { + void GetBufferParameteriv_State(GLenum target, GLenum pname, GLint* params) { + if (!params) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "GetBufferParameteriv_State", + "Params pointer cannot be null.")); + return; + } - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; - auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); + auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); - auto bufferObject = bindingSlot.GetBoundObject(); - if (!bufferObject) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "GetBufferParameteriv_State", - "Buffer target is bound to no buffer object.")); - return; - } + auto& bufferObject = bindingSlot.GetBoundObject(); + if (!bufferObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "GetBufferParameteriv_State", + "Buffer target is bound to no buffer object.")); + return; + } - switch (pname) { - case GL_BUFFER_SIZE: - *params = static_cast(bufferObject->GetSize()); - break; - case GL_BUFFER_USAGE: - *params = MG_Util::ConvertBufferUsageToGLEnum(bufferObject->GetUsage()); - break; - case GL_BUFFER_ACCESS: - if (bufferObject->IsMapped()) { - auto access = bufferObject->GetMappingAccess(); - if (access & BufferMappingAccessBit::Read && access & BufferMappingAccessBit::Write) { - *params = GL_READ_WRITE; - } else if (access & BufferMappingAccessBit::Read) { - *params = GL_READ_ONLY; - } else if (access & BufferMappingAccessBit::Write) { - *params = GL_WRITE_ONLY; - } else { - *params = 0; - } + switch (pname) { + case GL_BUFFER_SIZE: + *params = static_cast(bufferObject->GetSize()); + break; + case GL_BUFFER_USAGE: + *params = (GLint)MG_Util::ConvertBufferUsageToGLEnum(bufferObject->GetUsage()); + break; + case GL_BUFFER_ACCESS: + if (bufferObject->IsMapped()) { + auto access = bufferObject->GetMappingAccess(); + if (access & BufferMappingAccessBit::Read && access & BufferMappingAccessBit::Write) { + *params = GL_READ_WRITE; + } else if (access & BufferMappingAccessBit::Read) { + *params = GL_READ_ONLY; + } else if (access & BufferMappingAccessBit::Write) { + *params = GL_WRITE_ONLY; } else { *params = 0; } - break; - case GL_BUFFER_MAPPED: - *params = bufferObject->IsMapped() ? GL_TRUE : GL_FALSE; - break; + } else { + *params = 0; + } + break; + case GL_BUFFER_MAPPED: + *params = bufferObject->IsMapped() ? GL_TRUE : GL_FALSE; + break; + default: + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeUnique("MG_Impl/GLImpl", "GetBufferParameteriv_State", + std::format("Invalid pname enum: 0x{:X}", pname))); + break; + } + } + + void DeleteBuffers_State(GLsizei n, const GLuint* buffers) { + if (n < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "DeleteBuffers_State", "n must be non-negative.")); + return; + } + + if (!buffers) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "DeleteBuffers_State", + "Buffer names array cannot be null.")); + return; + } + + for (SizeT i = 0; i < static_cast(n); ++i) { + Uint bufferName = buffers[i]; + if (bufferName == 0) continue; + if (!BufferImpl::ValidateBufferName(bufferName, true)) continue; + MG_State::pGLContext->MarkBufferObjectForDeletion(bufferName); + } + } + + void FlushMappedBufferRange_State(GLenum target, GLintptr offset, GLsizeiptr length) { + if (length < 0 || offset < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "FlushMappedBufferRange_State", + "Offset and length must be non-negative.")); + return; + } + + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; + + auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); + + auto& bufferObject = bindingSlot.GetBoundObject(); + if (!bufferObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "FlushMappedBufferRange_State", + "Buffer target is bound to no buffer object.")); + return; + } + + if (!bufferObject->IsMapped()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "FlushMappedBufferRange_State", + "Cannot flush a buffer object that is not mapped.")); + return; + } + + if (offset + length > bufferObject->GetSize()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "FlushMappedBufferRange_State", + "Offset and length exceed buffer size.")); + return; + } + + auto mappingAccess = bufferObject->GetMappingAccess(); + if (!(mappingAccess & BufferMappingAccessBit::FlushExplicit)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique( + "MG_Impl/GLImpl", "FlushMappedBufferRange_State", + "Cannot flush a buffer object that is not mapped with GL_MAP_FLUSH_EXPLICIT_BIT.")); + return; + } + + bufferObject->FlushMemoryRange(static_cast(offset), static_cast(length)); + } + + GLboolean UnmapBuffer_State(GLenum target) { + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return GL_FALSE; + + auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); + + auto& bufferObject = bindingSlot.GetBoundObject(); + if (!bufferObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "UnmapBuffer_State", + "Buffer target is bound to no buffer object.")); + return GL_FALSE; + } + + if (!bufferObject->IsMapped()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "UnmapBuffer_State", + "Cannot unmap a buffer object that is not mapped.")); + return GL_FALSE; + } + + bufferObject->ReleaseMemory(); + return GL_TRUE; + } + + void* MapBufferRange_State(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { + if (length < 0 || offset < 0) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", + "Offset and length must be non-negative.")); + return nullptr; + } + + if (length == 0) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", + "Length must be greater than zero.")); + return nullptr; + } + + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return nullptr; + + auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); + auto& bufferObject = bindingSlot.GetBoundObject(); + if (!bufferObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", + "Buffer target is bound to no buffer object.")); + return nullptr; + } + + if (offset + length > bufferObject->GetSize()) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", + "Offset and length exceed buffer size.")); + return nullptr; + } + + auto accessBits = MG_Util::ConvertGLEnumToBufferMappingAccess(access); + if (!BufferImpl::ValidateBufferMappingAccess(accessBits)) return nullptr; + + if (!(accessBits & (BufferMappingAccessBit::Read | BufferMappingAccessBit::Write))) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", + "At least one of GL_MAP_READ_BIT or GL_MAP_WRITE_BIT must be set.")); + return nullptr; + } + + if (accessBits & BufferMappingAccessBit::Read) { + const auto invalidFlags = BufferMappingAccessBit::InvalidateRange | + BufferMappingAccessBit::InvalidateBuffer | BufferMappingAccessBit::Unsynchronized; + + if (accessBits & invalidFlags) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique( + "MG_Impl/GLImpl", "MapBufferRange_State", + "GL_MAP_READ_BIT cannot be combined with invalidation or unsynchronized flags.")); + return nullptr; } } - void DeleteBuffers_State(GLsizei n, const GLuint* buffers) { - if (n < 0) { + if (accessBits & BufferMappingAccessBit::FlushExplicit) { + if (!(accessBits & BufferMappingAccessBit::Write)) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "DeleteBuffers_State", "n must be non-negative.")); - return; - } - - if (!buffers) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "DeleteBuffers_State", - "Buffer names array cannot be null.")); - return; - } - - for (SizeT i = 0; i < static_cast(n); ++i) { - Uint bufferName = buffers[i]; - if (bufferName == 0) continue; - if (!BufferImpl::ValidateBufferName(bufferName, true)) continue; - MG_State::pGLContext->MarkBufferObjectForDeletion(bufferName); + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", + "GL_MAP_FLUSH_EXPLICIT_BIT requires GL_MAP_WRITE_BIT.")); + return nullptr; } } - void FlushMappedBufferRange_State(GLenum target, GLintptr offset, GLsizeiptr length) { - if (length < 0 || offset < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "FlushMappedBufferRange_State", - "Offset and length must be non-negative.")); - return; - } - - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; - - auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); - - auto bufferObject = bindingSlot.GetBoundObject(); - if (!bufferObject) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "FlushMappedBufferRange_State", - "Buffer target is bound to no buffer object.")); - return; - } - - if (!bufferObject->IsMapped()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "FlushMappedBufferRange_State", - "Cannot flush a buffer object that is not mapped.")); - return; - } - - if (offset + length > bufferObject->GetSize()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "FlushMappedBufferRange_State", - "Offset and length exceed buffer size.")); - return; - } - - auto mappingAccess = bufferObject->GetMappingAccess(); - if (!(mappingAccess & BufferMappingAccessBit::FlushExplicit)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared( - "MG_Impl/GLImpl", "FlushMappedBufferRange_State", - "Cannot flush a buffer object that is not mapped with GL_MAP_FLUSH_EXPLICIT_BIT.")); - return; - } - - bufferObject->FlushMemoryRange(static_cast(offset), static_cast(length)); + const auto storageFlags = BufferMappingAccessBit::Persistent | BufferMappingAccessBit::Coherent; + auto requiredFlags = accessBits & storageFlags; + if (requiredFlags) { + // TODO: check if the buffer data is created by BufferStorage and its flags after its + // implementation + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", + "Access flags require matching storage flags in buffer.")); + return nullptr; } - GLboolean UnmapBuffer_State(GLenum target) { - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return GL_FALSE; + if (bufferObject->IsMapped()) { + const auto invalidateFlags = + BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer; - auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); - - auto bufferObject = bindingSlot.GetBoundObject(); - if (!bufferObject) { + if (!(accessBits & invalidateFlags)) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "UnmapBuffer_State", - "Buffer target is bound to no buffer object.")); - return GL_FALSE; - } - - if (!bufferObject->IsMapped()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "UnmapBuffer_State", - "Cannot unmap a buffer object that is not mapped.")); - return GL_FALSE; - } - - bufferObject->ReleaseMemory(); - return GL_TRUE; - } - - void* MapBufferRange_State(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { - if (length < 0 || offset < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "Offset and length must be non-negative.")); - return nullptr; - } - - if (length == 0) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "Length must be greater than zero.")); - return nullptr; - } - - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return nullptr; - - auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); - auto bufferObject = bindingSlot.GetBoundObject(); - if (!bufferObject) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "Buffer target is bound to no buffer object.")); - return nullptr; - } - - if (offset + length > bufferObject->GetSize()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "Offset and length exceed buffer size.")); - return nullptr; - } - - auto accessBits = MG_Util::ConvertGLEnumToBufferMappingAccess(access); - if (!BufferImpl::ValidateBufferMappingAccess(accessBits)) return nullptr; - - if (!(accessBits & (BufferMappingAccessBit::Read | BufferMappingAccessBit::Write))) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "At least one of GL_MAP_READ_BIT or GL_MAP_WRITE_BIT must be set.")); - return nullptr; - } - - if (accessBits & BufferMappingAccessBit::Read) { - const auto invalidFlags = BufferMappingAccessBit::InvalidateRange | - BufferMappingAccessBit::InvalidateBuffer | - BufferMappingAccessBit::Unsynchronized; - - if (accessBits & invalidFlags) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared( - "MG_Impl/GLImpl", "MapBufferRange_State", - "GL_MAP_READ_BIT cannot be combined with invalidation or unsynchronized flags.")); - return nullptr; - } - } - - if (accessBits & BufferMappingAccessBit::FlushExplicit) { - if (!(accessBits & BufferMappingAccessBit::Write)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "GL_MAP_FLUSH_EXPLICIT_BIT requires GL_MAP_WRITE_BIT.")); - return nullptr; - } - } - - const auto storageFlags = BufferMappingAccessBit::Persistent | BufferMappingAccessBit::Coherent; - auto requiredFlags = accessBits & storageFlags; - if (requiredFlags) { - // TODO: check if the buffer data is created by BufferStorage and its flags after its - // implementation - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "Access flags require matching storage flags in buffer.")); - return nullptr; - } - - if (bufferObject->IsMapped()) { - const auto invalidateFlags = - BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer; - - if (!(accessBits & invalidateFlags)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "Cannot map a buffer object that is already mapped.")); - return nullptr; - } - } - - void* result = bufferObject->AcquireMemoryRange( - {static_cast(offset), static_cast(offset + length)}, accessBits); - if (!result) { - MG_State::pGLContext->RecordError( - ErrorCode::OutOfMemory, - MakeShared("MG_Impl/GLImpl", "MapBufferRange_State", - "Failed to map buffer due to insufficient memory.")); - return nullptr; - } - return result; - } - - void* MapBuffer_State(GLenum target, GLenum access) { - Bool readable = access == GL_READ_ONLY || access == GL_READ_WRITE; - Bool writable = access == GL_WRITE_ONLY || access == GL_READ_WRITE; - if (access != GL_READ_ONLY && access != GL_WRITE_ONLY && access != GL_READ_WRITE) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared( - "MG_Impl/GLImpl", "MapBuffer_State", - "Access must be one of GL_READ_ONLY, GL_WRITE_ONLY, or GL_READ_WRITE.")); - return nullptr; - } - - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return nullptr; - auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); - - auto bufferObject = bindingSlot.GetBoundObject(); - if (!bufferObject) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "MapBuffer_State", - "Buffer target is bound to no buffer object.")); - return nullptr; - } - - if (bufferObject->IsMapped()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "MapBuffer_State", + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", "Cannot map a buffer object that is already mapped.")); return nullptr; } - - void* result = bufferObject->AcquireMemory(true, readable, writable); - if (!result) { - MG_State::pGLContext->RecordError( - ErrorCode::OutOfMemory, - MakeShared("MG_Impl/GLImpl", "MapBuffer_State", - "Failed to map buffer due to insufficient memory.")); - return nullptr; - } - return result; } - void CopyBufferSubData_State(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, - GLsizeiptr size) { - if (size < 0 || readOffset < 0 || writeOffset < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "CopyBufferSubData_State", - "Offset and size must be non-negative.")); - return; - } + void* result = bufferObject->AcquireMemoryRange( + {static_cast(offset), static_cast(offset + length)}, accessBits); + if (!result) { + MG_State::pGLContext->RecordError( + ErrorCode::OutOfMemory, + MakeUnique("MG_Impl/GLImpl", "MapBufferRange_State", + "Failed to map buffer due to insufficient memory.")); + return nullptr; + } + return result; + } - BufferTarget readBufferTarget = MG_Util::ConvertGLEnumToBufferTarget(readTarget); - BufferTarget writeBufferTarget = MG_Util::ConvertGLEnumToBufferTarget(writeTarget); - if (!BufferImpl::ValidateBufferTarget(readBufferTarget) || - !BufferImpl::ValidateBufferTarget(writeBufferTarget)) - return; + void* MapBuffer_State(GLenum target, GLenum access) { + Bool readable = access == GL_READ_ONLY || access == GL_READ_WRITE; + Bool writable = access == GL_WRITE_ONLY || access == GL_READ_WRITE; + if (access != GL_READ_ONLY && access != GL_WRITE_ONLY && access != GL_READ_WRITE) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "MapBuffer_State", + "Access must be one of GL_READ_ONLY, GL_WRITE_ONLY, or GL_READ_WRITE.")); + return nullptr; + } - auto& readBindingSlot = MG_State::pGLContext->GetBufferBindingSlot(readBufferTarget); - auto& writeBindingSlot = MG_State::pGLContext->GetBufferBindingSlot(writeBufferTarget); - auto readBufferObject = readBindingSlot.GetBoundObject(); - auto writeBufferObject = writeBindingSlot.GetBoundObject(); + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return nullptr; + auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); - if (!readBufferObject || !writeBufferObject) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "CopyBufferSubData_State", - "One of the buffer targets is bound to no buffer object.")); - return; - } + auto& bufferObject = bindingSlot.GetBoundObject(); + if (!bufferObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "MapBuffer_State", + "Buffer target is bound to no buffer object.")); + return nullptr; + } - if (readOffset + size > readBufferObject->GetSize() || writeOffset + size > writeBufferObject->GetSize()) { + if (bufferObject->IsMapped()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "MapBuffer_State", + "Cannot map a buffer object that is already mapped.")); + return nullptr; + } + + void* result = bufferObject->AcquireMemory(true, readable, writable); + if (!result) { + MG_State::pGLContext->RecordError( + ErrorCode::OutOfMemory, + MakeUnique("MG_Impl/GLImpl", "MapBuffer_State", + "Failed to map buffer due to insufficient memory.")); + return nullptr; + } + return result; + } + + void CopyBufferSubData_State(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, + GLsizeiptr size) { + if (size < 0 || readOffset < 0 || writeOffset < 0) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "CopyBufferSubData_State", + "Offset and size must be non-negative.")); + return; + } + + BufferTarget readBufferTarget = MG_Util::ConvertGLEnumToBufferTarget(readTarget); + BufferTarget writeBufferTarget = MG_Util::ConvertGLEnumToBufferTarget(writeTarget); + if (!BufferImpl::ValidateBufferTarget(readBufferTarget) || !BufferImpl::ValidateBufferTarget(writeBufferTarget)) + return; + + auto& readBindingSlot = MG_State::pGLContext->GetBufferBindingSlot(readBufferTarget); + auto& writeBindingSlot = MG_State::pGLContext->GetBufferBindingSlot(writeBufferTarget); + auto& readBufferObject = readBindingSlot.GetBoundObject(); + auto& writeBufferObject = writeBindingSlot.GetBoundObject(); + + if (!readBufferObject || !writeBufferObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "CopyBufferSubData_State", + "One of the buffer targets is bound to no buffer object.")); + return; + } + + if (readOffset + size > readBufferObject->GetSize() || writeOffset + size > writeBufferObject->GetSize()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "CopyBufferSubData_State", + "Offset and size must be within the bounds of the buffer objects.")); + return; + } + + if (readBufferObject == writeBufferObject) { + if ((readOffset <= writeOffset && readOffset + size > writeOffset) || + (writeOffset <= readOffset && writeOffset + size > readOffset)) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "CopyBufferSubData_State", - "Offset and size must be within the bounds of the buffer objects.")); + MakeUnique("MG_Impl/GLImpl", "CopyBufferSubData_State", + "Source and destination buffers overlap in the specified ranges.")); return; } - - if (readBufferObject == writeBufferObject) { - if ((readOffset <= writeOffset && readOffset + size > writeOffset) || - (writeOffset <= readOffset && writeOffset + size > readOffset)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", "CopyBufferSubData_State", - "Source and destination buffers overlap in the specified ranges.")); - return; - } - } - - auto isIllegallyMapped = [](const SharedPtr& buffer) { - return buffer->IsMapped() && !(buffer->GetMappingAccess() & BufferMappingAccessBit::Persistent); - }; - if (isIllegallyMapped(readBufferObject) || isIllegallyMapped(writeBufferObject)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "CopyBufferSubData_State", - "Cannot copy data from/to a mapped buffer object unless it was mapped " - "with GL_MAP_PERSISTENT_BIT.")); - return; - } - - writeBufferObject->CopyDataFrom(readBufferObject, readOffset, writeOffset, size); } - void BufferSubData_State(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { - MGLOG_D("%s: target = %s, offset = %d, size = %d, data = %p", __func__, - MG_Util::ConvertGLEnumToString(target).c_str(), offset, size, data); - if (!data) { - MG_State::pGLContext->RecordError( - ErrorCode::NoError, // somehow OpenGL does not generate an error for this - MakeShared("MG_Impl/GLImpl", "BufferSubData_State", - "Data pointer cannot be null.")); - return; - } + auto isIllegallyMapped = [](const SharedPtr& buffer) { + return buffer->IsMapped() && !(buffer->GetMappingAccess() & BufferMappingAccessBit::Persistent); + }; + if (isIllegallyMapped(readBufferObject) || isIllegallyMapped(writeBufferObject)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "CopyBufferSubData_State", + "Cannot copy data from/to a mapped buffer object unless it was mapped " + "with GL_MAP_PERSISTENT_BIT.")); + return; + } - if (size < 0 || offset < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "BufferSubData_State", - "Offset and size must be non-negative.")); - return; - } + writeBufferObject->CopyDataFrom(readBufferObject, readOffset, writeOffset, size); + } - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; - auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); + void BufferSubData_State(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { + MGLOG_D("%s: target = %s, offset = %d, size = %d, data = %p", __func__, + MG_Util::ConvertGLEnumToString(target).c_str(), offset, size, data); + if (!data) { + MG_State::pGLContext->RecordError( + ErrorCode::NoError, // somehow OpenGL does not generate an error for this + MakeUnique("MG_Impl/GLImpl", "BufferSubData_State", "Data pointer cannot be null.")); + return; + } - auto bufferObject = bindingSlot.GetBoundObject(); - if (!bufferObject) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "BufferSubData_State", - "Buffer target is bound to no buffer object.")); - return; - } + if (size < 0 || offset < 0) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "BufferSubData_State", + "Offset and size must be non-negative.")); + return; + } - SizeT bufferSize = bufferObject->GetSize(); + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; + auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); + + auto& bufferObject = bindingSlot.GetBoundObject(); + if (!bufferObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "BufferSubData_State", + "Buffer target is bound to no buffer object.")); + return; + } + + SizeT bufferSize = bufferObject->GetSize(); + Range1D mappedRange = bufferObject->GetMappedRange(); + if ((offset < mappedRange.end) && (offset + size > mappedRange.start)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", "BufferSubData_State", + "Offset and size must not overlap with the mapped range of the buffer object.")); + return; + } + + auto mappingAccess = bufferObject->GetMappingAccess(); + if (bufferObject->IsMapped() && !(mappingAccess & BufferMappingAccessBit::Persistent)) { Range1D mappedRange = bufferObject->GetMappedRange(); - if ((offset < mappedRange.end) && (offset + size > mappedRange.start)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", "BufferSubData_State", - "Offset and size must not overlap with the mapped range of the buffer object.")); - return; - } - - auto mappingAccess = bufferObject->GetMappingAccess(); - if (bufferObject->IsMapped() && !(mappingAccess & BufferMappingAccessBit::Persistent)) { - Range1D mappedRange = bufferObject->GetMappedRange(); - if (offset + size >= mappedRange.start) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "BufferSubData_State", - "Cannot modify a mapped buffer object unless it was " - "mapped with GL_MAP_PERSISTENT_BIT.")); - return; - } - } - - bufferObject->UploadSubData({(void*)data, (SizeT)size}, offset); - } - - void BufferData_State(GLenum target, GLsizeiptr size, const void* data, GLenum usage) { - MGLOG_D("%s: %s, size = %d, data = %p, usage = %s", __func__, - MG_Util::ConvertGLEnumToString(target).c_str(), size, data, - MG_Util::ConvertGLEnumToString(usage).c_str()); - if (size < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "BufferData_State", "Size must be non-negative.")); - return; - } - - BufferUsage bufferUsage = MG_Util::ConvertGLEnumToBufferUsage(usage); - if (!BufferImpl::ValidateBufferUsage(bufferUsage)) return; - - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; - auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); - - auto bufferObject = bindingSlot.GetBoundObject(); - if (!bufferObject) { + if (offset + size >= mappedRange.start) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "BufferData_State", - "Buffer target is bound to no buffer object.")); + MakeUnique("MG_Impl/GLImpl", "BufferSubData_State", + "Cannot modify a mapped buffer object unless it was " + "mapped with GL_MAP_PERSISTENT_BIT.")); return; } - - bufferObject->SetUsage(bufferUsage); - bufferObject->Resize(size); - if (data) { - bufferObject->UploadData({(void*)data, (SizeT)size}, 0); - } } - void BindBuffer_State(GLenum target, GLuint buffer) { - if (!BufferImpl::ValidateBufferName(buffer, true)) return; - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; + bufferObject->UploadSubData({(void*)data, (SizeT)size}, offset); + } - auto bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - if (!bufferObject) { - MG_State::pGLContext->CreateBufferObject(buffer); - bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - } - - auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); - bindingSlot.Bind(bufferObject); - MGLOG_D("%s: bind buffer object %d -> %s", __func__, bufferObject->GetExternalIndex(), - MG_Util::ConvertGLEnumToString(target).c_str()); + void BufferData_State(GLenum target, GLsizeiptr size, const void* data, GLenum usage) { + MGLOG_D("%s: %s, size = %d, data = %p, usage = %s", __func__, MG_Util::ConvertGLEnumToString(target).c_str(), + size, data, MG_Util::ConvertGLEnumToString(usage).c_str()); + if (size < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "BufferData_State", "Size must be non-negative.")); + return; } - void GenBuffers_State(GLsizei n, GLuint* buffers) { - if (n < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GenBuffers_State", "n must be non-negative")); - return; - } - auto bufferNames = MG_State::pGLContext->GenBufferNames(n); - Copy(bufferNames.data(), buffers, bufferNames.size()); + BufferUsage bufferUsage = MG_Util::ConvertGLEnumToBufferUsage(usage); + if (!BufferImpl::ValidateBufferUsage(bufferUsage)) return; + + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; + auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); + + auto& bufferObject = bindingSlot.GetBoundObject(); + if (!bufferObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "BufferData_State", + "Buffer target is bound to no buffer object.")); + return; } - GLboolean IsBuffer_State(GLuint buffer) { - if (!BufferImpl::ValidateBufferName(buffer)) return GL_FALSE; - return MG_State::pGLContext->ValidateBufferObject(buffer) ? GL_TRUE : GL_FALSE; + bufferObject->SetUsage(bufferUsage); + bufferObject->Resize(size); + if (data) { + bufferObject->UploadData({(void*)data, (SizeT)size}, 0); } + } - void BindBufferBase_State(GLenum target, GLuint pointIndex, GLuint buffer) { - MGLOG_D("%s: target = %s, pointIndex = %u, buffer = %u", __func__, - MG_Util::ConvertGLEnumToString(target).c_str(), pointIndex, buffer); - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferBindingPointTarget(bufferTarget)) return; + void BindBuffer_State(GLenum target, GLuint buffer) { + if (!BufferImpl::ValidateBufferName(buffer, true)) return; + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return; - auto bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - if (!bufferObject) { - MG_State::pGLContext->CreateBufferObject(buffer); - bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - } - - auto& point = MG_State::pGLContext->GetBufferBindingPoint(bufferTarget, pointIndex); - point.Bind(bufferObject); - point.SetRange(Range1D(0, bufferObject->GetSize())); - MGLOG_D("%s: set range (0, %d)", __func__, bufferObject->GetSize()); + Bool doesBufferObjectCreated = MG_State::pGLContext->ValidateBufferObject(buffer); + if (!doesBufferObjectCreated) { + MG_State::pGLContext->CreateBufferObject(buffer); } + auto& bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - void BindBufferRange_State(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { - MGLOG_D("%s: target = %s, index = %u, buffer = %u, offset = %d, size = %d", __func__, - MG_Util::ConvertGLEnumToString(target).c_str(), index, buffer, offset, size); - BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); - if (!BufferImpl::ValidateBufferBindingPointTarget(bufferTarget)) return; + auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget); + bindingSlot.Bind(bufferObject); + MGLOG_D("%s: bind buffer object %d -> %s", __func__, bufferObject->GetExternalIndex(), + MG_Util::ConvertGLEnumToString(target).c_str()); + } - auto bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - if (!bufferObject) { - MG_State::pGLContext->CreateBufferObject(buffer); - bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - } - - auto& point = MG_State::pGLContext->GetBufferBindingPoint(bufferTarget, index); - point.Bind(bufferObject); - point.SetRange(Range1D(offset, offset + size)); + void GenBuffers_State(GLsizei n, GLuint* buffers) { + if (n < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "GenBuffers_State", "n must be non-negative")); + return; } + static thread_local Vector bufferNames; + MG_State::pGLContext->GenBufferNames(n, bufferNames); + Memcpy(buffers, bufferNames.data(), n * sizeof(GLuint)); + } - /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ - void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params) { - GetBufferParameteriv_State(target, pname, params); - } + GLboolean IsBuffer_State(GLuint buffer) { + if (!BufferImpl::ValidateBufferName(buffer)) return GL_FALSE; + return MG_State::pGLContext->ValidateBufferObject(buffer) ? GL_TRUE : GL_FALSE; + } - GLboolean IsBuffer(GLuint buffer) { - return IsBuffer_State(buffer); - } + void BindBufferBase_State(GLenum target, GLuint pointIndex, GLuint buffer) { + MGLOG_D("%s: target = %s, pointIndex = %u, buffer = %u", __func__, + MG_Util::ConvertGLEnumToString(target).c_str(), pointIndex, buffer); + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferBindingPointTarget(bufferTarget)) return; - void DeleteBuffers(GLsizei n, const GLuint* buffers) { - DeleteBuffers_State(n, buffers); + Bool doesBufferObjectCreated = MG_State::pGLContext->ValidateBufferObject(buffer); + if (!doesBufferObjectCreated) { + MG_State::pGLContext->CreateBufferObject(buffer); } + auto& bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) { - FlushMappedBufferRange_State(target, offset, length); - } + auto& point = MG_State::pGLContext->GetBufferBindingPoint(bufferTarget, pointIndex); + point.Bind(bufferObject); + point.SetRange(Range1D(0, bufferObject->GetSize())); + MGLOG_D("%s: set range (0, %d)", __func__, bufferObject->GetSize()); + } - GLboolean UnmapBuffer(GLenum target) { - return UnmapBuffer_State(target); - } + void BindBufferRange_State(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { + MGLOG_D("%s: target = %s, index = %u, buffer = %u, offset = %d, size = %d", __func__, + MG_Util::ConvertGLEnumToString(target).c_str(), index, buffer, offset, size); + BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target); + if (!BufferImpl::ValidateBufferBindingPointTarget(bufferTarget)) return; - void* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { - return MapBufferRange_State(target, offset, length, access); + Bool doesBufferObjectCreated = MG_State::pGLContext->ValidateBufferObject(buffer); + if (!doesBufferObjectCreated) { + MG_State::pGLContext->CreateBufferObject(buffer); } + auto& bufferObject = MG_State::pGLContext->GetBufferObject(buffer); - void* MapBuffer(GLenum target, GLenum access) { - return MapBuffer_State(target, access); - } + auto& point = MG_State::pGLContext->GetBufferBindingPoint(bufferTarget, index); + point.Bind(bufferObject); + point.SetRange(Range1D(offset, offset + size)); + } - // FIXME: this should be a "backend" function - void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, - GLsizeiptr size) { - CopyBufferSubData_State(readTarget, writeTarget, readOffset, writeOffset, size); - } + /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ + void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params) { + GetBufferParameteriv_State(target, pname, params); + } - void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { - BufferSubData_State(target, offset, size, data); - } + GLboolean IsBuffer(GLuint buffer) { + return IsBuffer_State(buffer); + } - void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) { - BufferData_State(target, size, data, usage); - } + void DeleteBuffers(GLsizei n, const GLuint* buffers) { + DeleteBuffers_State(n, buffers); + } - void BindBuffer(GLenum target, GLuint buffer) { - BindBuffer_State(target, buffer); - } + void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) { + FlushMappedBufferRange_State(target, offset, length); + } - void GenBuffers(GLsizei n, GLuint* buffers) { - GenBuffers_State(n, buffers); - } + GLboolean UnmapBuffer(GLenum target) { + return UnmapBuffer_State(target); + } - void BindBufferBase(GLenum target, GLuint index, GLuint buffer) { - BindBufferBase_State(target, index, buffer); - } + void* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { + return MapBufferRange_State(target, offset, length, access); + } - void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { - BindBufferRange_State(target, index, buffer, offset, size); - } - } // namespace MG_Impl::GLImpl -} // namespace MobileGL + void* MapBuffer(GLenum target, GLenum access) { + return MapBuffer_State(target, access); + } + + // FIXME: this should be a "backend" function + void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, + GLsizeiptr size) { + CopyBufferSubData_State(readTarget, writeTarget, readOffset, writeOffset, size); + } + + void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { + BufferSubData_State(target, offset, size, data); + } + + void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) { + BufferData_State(target, size, data, usage); + } + + void BindBuffer(GLenum target, GLuint buffer) { + BindBuffer_State(target, buffer); + } + + void GenBuffers(GLsizei n, GLuint* buffers) { + GenBuffers_State(n, buffers); + } + + void BindBufferBase(GLenum target, GLuint index, GLuint buffer) { + BindBufferBase_State(target, index, buffer); + } + + void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { + BindBufferRange_State(target, index, buffer, offset, size); + } +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.h b/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.h index d42d9a2f..c24f9eea 100644 --- a/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.h +++ b/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.h @@ -9,24 +9,22 @@ #pragma once #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ - void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params); - GLboolean IsBuffer(GLuint buffer); - void DeleteBuffers(GLsizei n, const GLuint* buffers); - void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length); - GLboolean UnmapBuffer(GLenum target); - void* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - void* MapBuffer(GLenum target, GLenum access); - void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, - GLsizeiptr size); - void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data); - void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage); - void BindBuffer(GLenum target, GLuint buffer); - void GenBuffers(GLsizei n, GLuint* buffers); - void BindBufferBase(GLenum target, GLuint index, GLuint buffer); - void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +namespace MobileGL::MG_Impl::GLImpl { + /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ + void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params); + GLboolean IsBuffer(GLuint buffer); + void DeleteBuffers(GLsizei n, const GLuint* buffers); + void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length); + GLboolean UnmapBuffer(GLenum target); + void* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + void* MapBuffer(GLenum target, GLenum access); + void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, + GLsizeiptr size); + void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data); + void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage); + void BindBuffer(GLenum target, GLuint buffer); + void GenBuffers(GLsizei n, GLuint* buffers); + void BindBufferBase(GLenum target, GLuint index, GLuint buffer); + void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); - } // namespace MG_Impl::GLImpl -} // namespace MobileGL +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Buffer/Validators.cpp b/MobileGL/MG_Impl/GLImpl/Buffer/Validators.cpp index a767a855..0946c0da 100644 --- a/MobileGL/MG_Impl/GLImpl/Buffer/Validators.cpp +++ b/MobileGL/MG_Impl/GLImpl/Buffer/Validators.cpp @@ -13,105 +13,100 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace BufferImpl { - Bool ValidateBufferTarget(BufferTarget target) { - if (target == BufferTarget::Unknown) { - using namespace MG_Util; - String bufferTargetStr = ConvertBufferTargetToString(target); - String glTargetStr = ConvertGLEnumToString(ConvertBufferTargetToGLEnum(target)); - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared( - "MG_Impl/GLImpl/BufferImpl", "ValidateBufferTarget", - std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr))); - return false; - } - - if (target == BufferTarget::Index && MG_State::pGLContext->GetBoundVertexArray() == nullptr) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl/BufferImpl", - "ValidateBufferTarget", - "No vertex array object is bound.")); - return false; - } - - return true; - } - - Bool ValidateBufferBindingPointTarget(BufferTarget target) { - if (target != BufferTarget::Uniform && target != BufferTarget::AtomicCounter && - target != BufferTarget::TransformFeedback && target != BufferTarget::ShaderStorage) { - using namespace MG_Util; - String bufferTargetStr = ConvertBufferTargetToString(target); - String glTargetStr = ConvertGLEnumToString(ConvertBufferTargetToGLEnum(target)); - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared( - "MG_Impl/GLImpl/BufferImpl", "ValidateBufferTarget", - std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr))); - return false; - } - return true; - } - - Bool ValidateBufferName(Uint index, Bool allowZero) { - if (index == 0) { - if (allowZero) return true; - - MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl/BufferImpl", - "ValidateBufferName", - "Buffer name 0 is not valid.")); - return false; - } - Bool isValid = MG_State::pGLContext->ValidateBufferName(index); - if (isValid) return true; +namespace MobileGL::MG_Impl::GLImpl::BufferImpl { + Bool ValidateBufferTarget(BufferTarget target) { + if (target == BufferTarget::Unknown) { + using namespace MG_Util; + String bufferTargetStr = ConvertBufferTargetToString(target); + String glTargetStr = ConvertGLEnumToString(ConvertBufferTargetToGLEnum(target)); MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl/BufferImpl", "ValidateBufferName", - std::format("Buffer name {} is not valid.", index))); + ErrorCode::InvalidEnum, MakeUnique( + "MG_Impl/GLImpl/BufferImpl", "ValidateBufferTarget", + std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr))); return false; } - Bool ValidateBufferUsage(BufferUsage usage) { - if (usage != BufferUsage::Unknown) { - return true; - } + if (target == BufferTarget::Index && MG_State::pGLContext->GetBoundVertexArray() == nullptr) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl/BufferImpl", + "ValidateBufferTarget", + "No vertex array object is bound.")); + return false; + } + + return true; + } + + Bool ValidateBufferBindingPointTarget(BufferTarget target) { + if (target != BufferTarget::Uniform && target != BufferTarget::AtomicCounter && + target != BufferTarget::TransformFeedback && target != BufferTarget::ShaderStorage) { using namespace MG_Util; - String bufferUsageStr = ConvertBufferUsageToString(usage); - String glUsageStr = ConvertGLEnumToString(ConvertBufferUsageToGLEnum(usage)); + String bufferTargetStr = ConvertBufferTargetToString(target); + String glTargetStr = ConvertGLEnumToString(ConvertBufferTargetToGLEnum(target)); + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeUnique( + "MG_Impl/GLImpl/BufferImpl", "ValidateBufferTarget", + std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr))); + return false; + } + return true; + } + + Bool ValidateBufferName(Uint index, Bool allowZero) { + if (index == 0) { + if (allowZero) return true; + + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl/BufferImpl", "ValidateBufferName", + "Buffer name 0 is not valid.")); + return false; + } + Bool isValid = MG_State::pGLContext->ValidateBufferName(index); + if (isValid) return true; + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl/BufferImpl", "ValidateBufferName", + std::format("Buffer name {} is not valid.", index))); + return false; + } + + Bool ValidateBufferUsage(BufferUsage usage) { + if (usage != BufferUsage::Unknown) { + return true; + } + using namespace MG_Util; + String bufferUsageStr = ConvertBufferUsageToString(usage); + String glUsageStr = ConvertGLEnumToString(ConvertBufferUsageToGLEnum(usage)); + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique( + "MG_Impl/GLImpl/BufferImpl", "ValidateBufferUsage", + std::format("Usage {} ({}) is not one of the allowable values.", bufferUsageStr, glUsageStr))); + return false; + } + + Bool ValidateBufferMappingAccess(Flags accessBits) { + if (accessBits == BufferMappingAccessBit::Null) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl/BufferImpl", + "ValidateBufferMappingAccess", + "Access bits cannot be null.")); + return false; + } + + const auto validBits = BufferMappingAccessBit::Read | BufferMappingAccessBit::Write | + BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer | + BufferMappingAccessBit::FlushExplicit | BufferMappingAccessBit::Unsynchronized | + BufferMappingAccessBit::Persistent | BufferMappingAccessBit::Coherent; + + if ((accessBits & validBits) != accessBits) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared( - "MG_Impl/GLImpl/BufferImpl", "ValidateBufferUsage", - std::format("Usage {} ({}) is not one of the allowable values.", bufferUsageStr, glUsageStr))); + MakeUnique("MG_Impl/GLImpl/BufferImpl", "ValidateBufferMappingAccess", + "Access bits cannot contain invalid flags.")); return false; } - Bool ValidateBufferMappingAccess(Flags accessBits) { - if (accessBits == BufferMappingAccessBit::Null) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl/BufferImpl", - "ValidateBufferMappingAccess", - "Access bits cannot be null.")); - return false; - } - - const auto validBits = BufferMappingAccessBit::Read | BufferMappingAccessBit::Write | - BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer | - BufferMappingAccessBit::FlushExplicit | BufferMappingAccessBit::Unsynchronized | - BufferMappingAccessBit::Persistent | BufferMappingAccessBit::Coherent; - - if ((accessBits & validBits) != accessBits) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl/BufferImpl", "ValidateBufferMappingAccess", - "Access bits cannot contain invalid flags.")); - return false; - } - - return true; - } - } // namespace BufferImpl -} // namespace MobileGL::MG_Impl::GLImpl \ No newline at end of file + return true; + } +} // namespace MobileGL::MG_Impl::GLImpl::BufferImpl diff --git a/MobileGL/MG_Impl/GLImpl/Buffer/Validators.h b/MobileGL/MG_Impl/GLImpl/Buffer/Validators.h index b02533f4..e98568e5 100644 --- a/MobileGL/MG_Impl/GLImpl/Buffer/Validators.h +++ b/MobileGL/MG_Impl/GLImpl/Buffer/Validators.h @@ -10,12 +10,10 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace BufferImpl { - Bool ValidateBufferTarget(BufferTarget target); - Bool ValidateBufferName(Uint index, Bool allowZero = false); - Bool ValidateBufferUsage(BufferUsage usage); - Bool ValidateBufferMappingAccess(Flags accessBits); - Bool ValidateBufferBindingPointTarget(BufferTarget target); - } // namespace BufferImpl -} // namespace MobileGL::MG_Impl::GLImpl \ No newline at end of file +namespace MobileGL::MG_Impl::GLImpl::BufferImpl { + Bool ValidateBufferTarget(BufferTarget target); + Bool ValidateBufferName(Uint index, Bool allowZero = false); + Bool ValidateBufferUsage(BufferUsage usage); + Bool ValidateBufferMappingAccess(Flags accessBits); + Bool ValidateBufferBindingPointTarget(BufferTarget target); +} // namespace MobileGL::MG_Impl::GLImpl::BufferImpl diff --git a/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.h b/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.h index fe1f0339..b49702d7 100644 --- a/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.h +++ b/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.h @@ -9,34 +9,31 @@ #pragma once #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ - void MultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, - GLsizei stride); - void MultiDrawArraysIndirect(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride); - void DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, - const void* indices, GLint basevertex); - void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices); - void DrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei instancecount, GLint basevertex, GLuint baseinstance); - void DrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei instancecount, GLint basevertex); - void DrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei instancecount, GLuint baseinstance); - void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount); - void DrawElementsIndirect(GLenum mode, GLenum type, const void* indirect); - void DrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, - GLuint baseinstance); - void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); - void DrawArraysIndirect(GLenum mode, const void* indirect); - void DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex); - void DrawArrays(GLenum mode, GLint first, GLsizei count); - void MultiDrawElements(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, - GLsizei drawcount); - void MultiDrawElementsBaseVertex(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, - GLsizei drawcount, const GLint* basevertex); - void Clear(GLbitfield mask); - void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices); - } // namespace MG_Impl::GLImpl -} // namespace MobileGL +namespace MobileGL::MG_Impl::GLImpl { + /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ + void MultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride); + void MultiDrawArraysIndirect(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride); + void DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, + const void* indices, GLint basevertex); + void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices); + void DrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, + GLsizei instancecount, GLint basevertex, GLuint baseinstance); + void DrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, + GLsizei instancecount, GLint basevertex); + void DrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, + GLsizei instancecount, GLuint baseinstance); + void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount); + void DrawElementsIndirect(GLenum mode, GLenum type, const void* indirect); + void DrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, + GLuint baseinstance); + void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); + void DrawArraysIndirect(GLenum mode, const void* indirect); + void DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex); + void DrawArrays(GLenum mode, GLint first, GLsizei count); + void MultiDrawElements(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, + GLsizei drawcount); + void MultiDrawElementsBaseVertex(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, + GLsizei drawcount, const GLint* basevertex); + void Clear(GLbitfield mask); + void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices); +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp b/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp index 8c5422a8..cb4da481 100644 --- a/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp +++ b/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp @@ -38,11 +38,11 @@ namespace MobileGL::MG_Impl::GLImpl { RenderbufferTarget rbTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target); if (!FramebufferImpl::ValidateRenderbufferTarget(rbTarget)) return; auto& bindingSlot = MG_State::pGLContext->GetRenderbufferBindingSlot(rbTarget); - auto renderbufferObject = bindingSlot.GetBoundObject(); + auto& renderbufferObject = bindingSlot.GetBoundObject(); if (!renderbufferObject) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "RenderbufferStorage_State", + MakeUnique("MG_Impl/GLImpl", "RenderbufferStorage_State", "Renderbuffer target is bound to no renderbuffer object.")); return; } @@ -50,7 +50,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!TextureImpl::ValidateTextureInternalFormat(format)) return; if (width < 0 || height < 0) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "RenderbufferStorage_State", + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "RenderbufferStorage_State", "Width and height must be non-negative.")); return; } @@ -74,10 +74,11 @@ namespace MobileGL::MG_Impl::GLImpl { if (n < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GenRenderbuffers_State", "n must be non-negative")); + MakeUnique("MG_Impl/GLImpl", "GenRenderbuffers_State", "n must be non-negative")); return; } - auto renderbufferNames = MG_State::pGLContext->GenRenderbufferNames(n); + static thread_local Vector renderbufferNames; + MG_State::pGLContext->GenRenderbufferNames(n, renderbufferNames); Memcpy(renderbuffers, renderbufferNames.data(), sizeof(GLuint) * static_cast(n)); } @@ -85,10 +86,11 @@ namespace MobileGL::MG_Impl::GLImpl { if (n < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GenFramebuffers_State", "n must be non-negative")); + MakeUnique("MG_Impl/GLImpl", "GenFramebuffers_State", "n must be non-negative")); return; } - auto framebuffersNames = MG_State::pGLContext->GenFramebufferNames(n); + static thread_local Vector framebuffersNames; + MG_State::pGLContext->GenFramebufferNames(n, framebuffersNames); Memcpy(framebuffers, framebuffersNames.data(), sizeof(GLuint) * static_cast(n)); } @@ -119,11 +121,11 @@ namespace MobileGL::MG_Impl::GLImpl { if (!TextureImpl::ValidateTextureName(texture, true)) return; auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget); - auto framebufferObject = bindingSlot.GetBoundObject(); + auto& framebufferObject = bindingSlot.GetBoundObject(); if (!framebufferObject) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "FramebufferTexture2D_State", + MakeUnique("MG_Impl/GLImpl", "FramebufferTexture2D_State", "Framebuffer target is bound to no framebuffer object.")); return; } @@ -133,11 +135,11 @@ namespace MobileGL::MG_Impl::GLImpl { return; } - auto textureObject = MG_State::pGLContext->GetTextureObject(texture); + auto& textureObject = MG_State::pGLContext->GetTextureObject(texture); if (!textureObject) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "FramebufferTexture2D_State", + MakeUnique("MG_Impl/GLImpl", "FramebufferTexture2D_State", std::format("Texture object {} is not valid.", texture))); return; } @@ -166,11 +168,11 @@ namespace MobileGL::MG_Impl::GLImpl { if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return; if (!FramebufferImpl::ValidateRenderbufferName(renderbuffer)) return; auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget); - auto framebufferObject = bindingSlot.GetBoundObject(); + auto& framebufferObject = bindingSlot.GetBoundObject(); if (!framebufferObject) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "FramebufferRenderbuffer_State", + MakeUnique("MG_Impl/GLImpl", "FramebufferRenderbuffer_State", "Framebuffer target is bound to no framebuffer object.")); return; } @@ -180,11 +182,11 @@ namespace MobileGL::MG_Impl::GLImpl { return; } - auto renderbufferObject = MG_State::pGLContext->GetRenderbufferObject(renderbuffer); + auto& renderbufferObject = MG_State::pGLContext->GetRenderbufferObject(renderbuffer); if (!renderbufferObject) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "FramebufferRenderbuffer_State", + MakeUnique("MG_Impl/GLImpl", "FramebufferRenderbuffer_State", std::format("Renderbuffer object {} is not valid.", renderbuffer))); return; } @@ -196,18 +198,18 @@ namespace MobileGL::MG_Impl::GLImpl { if (n < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, "`n` is less than 0.")); + MakeUnique("MG_Impl/GLImpl", __func__, "`n` is less than 0.")); return; } else if (n > MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, "`n` is greater than `GL_MAX_DRAW_BUFFERS`.")); + MakeUnique("MG_Impl/GLImpl", __func__, "`n` is greater than `GL_MAX_DRAW_BUFFERS`.")); return; } // Get bound framebuffer auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw); - auto fbo = bindingSlot.GetBoundObject(); + auto& fbo = bindingSlot.GetBoundObject(); bool isDefaultFBO = (fbo == FramebufferImpl::pDefaultFramebufferInfo->defaultFBO); static int existenceMap[(SizeT)FramebufferAttachmentType::FramebufferAttachmentTypeCount] = {-1}; @@ -220,7 +222,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (attType == FramebufferAttachmentType::Unknown) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", __func__, + MakeUnique("MG_Impl/GLImpl", __func__, std::format("bufs[{}] = {} is not an accepted value.", i, MG_Util::ConvertGLEnumToString(bufs[i])))); return; @@ -230,7 +232,7 @@ namespace MobileGL::MG_Impl::GLImpl { attType <= FramebufferAttachmentType::Color31) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared( + MakeUnique( "MG_Impl/GLImpl", __func__, std::format( "FBO is default FBO, but bufs[{}] = {} is one of the `GL_COLOR_ATTACHMENTn` tokens.", i, @@ -242,7 +244,7 @@ namespace MobileGL::MG_Impl::GLImpl { attType <= FramebufferAttachmentType::BackRight) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared( + MakeUnique( "MG_Impl/GLImpl", __func__, std::format("FBO is not default FBO, but bufs[{}] = {} is anything other than `GL_NONE` or " "one of the `GL_COLOR_ATTACHMENTn` tokens.", @@ -253,7 +255,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (attType != FramebufferAttachmentType::None && existenceMap[(SizeT)attType] >= 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, + MakeUnique("MG_Impl/GLImpl", __func__, std::format("a symbolic constant other than `GL_NONE` appears " "more than once in bufs. bufs[{}] == bufs[{}] == {}.", i, existenceMap[(SizeT)attType], @@ -267,7 +269,7 @@ namespace MobileGL::MG_Impl::GLImpl { (SizeT)FramebufferAttachmentType::Color0 + MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, + MakeUnique("MG_Impl/GLImpl", __func__, std::format("bufs[{}] == {} indicates a color buffer that does " "not exist in the current GL context.", i, MG_Util::ConvertGLEnumToString(bufs[i])))); @@ -297,7 +299,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (attType == FramebufferAttachmentType::Unknown) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared( + MakeUnique( "MG_Impl/GLImpl", __func__, std::format("`mode` = {} is not an accepted value.", MG_Util::ConvertGLEnumToString(mode)))); return; @@ -305,7 +307,7 @@ namespace MobileGL::MG_Impl::GLImpl { // Get bound framebuffer auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read); - auto fbo = bindingSlot.GetBoundObject(); + auto& fbo = bindingSlot.GetBoundObject(); fbo->SetReadBuffer(attType); } @@ -313,13 +315,13 @@ namespace MobileGL::MG_Impl::GLImpl { if (n < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "DeleteRenderbuffers_State", "n must be non-negative.")); + MakeUnique("MG_Impl/GLImpl", "DeleteRenderbuffers_State", "n must be non-negative.")); return; } if (!renderbuffers) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "DeleteRenderbuffers_State", + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "DeleteRenderbuffers_State", "Renderbuffer names array cannot be null.")); return; } @@ -336,13 +338,13 @@ namespace MobileGL::MG_Impl::GLImpl { if (n < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "DeleteFramebuffers_State", "n must be non-negative.")); + MakeUnique("MG_Impl/GLImpl", "DeleteFramebuffers_State", "n must be non-negative.")); return; } if (!framebuffers) { MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "DeleteFramebuffers_State", + MakeUnique("MG_Impl/GLImpl", "DeleteFramebuffers_State", "Framebuffer names array cannot be null.")); return; } @@ -360,11 +362,11 @@ namespace MobileGL::MG_Impl::GLImpl { if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return GL_FRAMEBUFFER_UNDEFINED; auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget); - auto framebufferObject = bindingSlot.GetBoundObject(); + auto& framebufferObject = bindingSlot.GetBoundObject(); if (!framebufferObject) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "CheckFramebufferStatus_State", + MakeUnique("MG_Impl/GLImpl", "CheckFramebufferStatus_State", "Framebuffer target is bound to no framebuffer object.")); return GL_FRAMEBUFFER_UNDEFINED; } @@ -382,11 +384,11 @@ namespace MobileGL::MG_Impl::GLImpl { RenderbufferTarget renderbufferTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target); if (!FramebufferImpl::ValidateRenderbufferTarget(renderbufferTarget)) return; - auto renderbufferObject = MG_State::pGLContext->GetRenderbufferObject(renderbuffer); - if (!renderbufferObject) { + Bool doesRenderbufferCreated = MG_State::pGLContext->ValidateRenderbufferObject(renderbuffer); + if (!doesRenderbufferCreated) { MG_State::pGLContext->CreateRenderbufferObject(renderbuffer); - renderbufferObject = MG_State::pGLContext->GetRenderbufferObject(renderbuffer); } + auto& renderbufferObject = MG_State::pGLContext->GetRenderbufferObject(renderbuffer); auto& bindingSlot = MG_State::pGLContext->GetRenderbufferBindingSlot(renderbufferTarget); bindingSlot.Bind(renderbufferObject); @@ -403,11 +405,11 @@ namespace MobileGL::MG_Impl::GLImpl { FramebufferTarget framebufferTarget = MG_Util::ConvertGLEnumToFramebufferTarget(target); if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return; - auto framebufferObject = MG_State::pGLContext->GetFramebufferObject(framebuffer); - if (!framebufferObject) { + Bool doesFramebufferCreated = MG_State::pGLContext->ValidateFramebufferObject(framebuffer); + if (!doesFramebufferCreated) { MG_State::pGLContext->CreateFramebufferObject(framebuffer); - framebufferObject = MG_State::pGLContext->GetFramebufferObject(framebuffer); } + auto& framebufferObject = MG_State::pGLContext->GetFramebufferObject(framebuffer); auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget); bindingSlot.Bind(framebufferObject); @@ -419,11 +421,11 @@ namespace MobileGL::MG_Impl::GLImpl { RenderbufferTarget renderbufferTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target); if (!FramebufferImpl::ValidateRenderbufferTarget(renderbufferTarget)) return; auto& bindingSlot = MG_State::pGLContext->GetRenderbufferBindingSlot(renderbufferTarget); - auto renderbufferObject = bindingSlot.GetBoundObject(); + auto& renderbufferObject = bindingSlot.GetBoundObject(); if (!renderbufferObject) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "GetRenderbufferParameteriv_State", + MakeUnique("MG_Impl/GLImpl", "GetRenderbufferParameteriv_State", "Renderbuffer target is bound to no renderbuffer object.")); return; } @@ -462,7 +464,7 @@ namespace MobileGL::MG_Impl::GLImpl { default: MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared( + MakeUnique( "MG_Impl/GLImpl", "GetRenderbufferParameteriv_State", std::format("pname {} is not an accepted value.", MG_Util::ConvertGLEnumToString(pname)))); return; @@ -492,7 +494,7 @@ namespace MobileGL::MG_Impl::GLImpl { // Check width/height if (width < 0 || height < 0) { MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "Width and height must be non-negative")); return; } @@ -501,7 +503,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!TextureImpl::ValidateTextureInputFormat(textureInputFormat)) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", "Invalid format")); + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "Invalid format")); return; } @@ -509,17 +511,17 @@ namespace MobileGL::MG_Impl::GLImpl { if (!TextureImpl::ValidateTexturePixelDataType(texturePixelDataType)) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", "Invalid pixel data type")); + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "Invalid pixel data type")); return; } // Get bound framebuffer auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read); - auto framebufferObject = bindingSlot.GetBoundObject(); + auto& framebufferObject = bindingSlot.GetBoundObject(); if (!framebufferObject) { MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "No framebuffer bound to read target")); return; } @@ -528,7 +530,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!framebufferObject->CheckCompleteness()) { MG_State::pGLContext->RecordError( ErrorCode::InvalidFramebufferOperation, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", "Framebuffer is incomplete")); + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "Framebuffer is incomplete")); return; } @@ -537,7 +539,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!framebufferObject->GetAttachment(FramebufferAttachmentType::Stencil).IsValid()) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "No stencil buffer for stencil index format")); return; } @@ -545,7 +547,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!framebufferObject->GetAttachment(FramebufferAttachmentType::Depth).IsValid()) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "No depth buffer for depth component format")); return; } @@ -554,7 +556,7 @@ namespace MobileGL::MG_Impl::GLImpl { !framebufferObject->GetAttachment(FramebufferAttachmentType::Stencil).IsValid()) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "No depth/stencil buffer for depth-stencil format")); return; } @@ -563,7 +565,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (texturePixelDataType != TexturePixelDataType::UnsignedInt248 && texturePixelDataType != TexturePixelDataType::Float32UnsignedInt248Rev) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + ErrorCode::InvalidEnum, MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "Invalid type for depth-stencil format")); return; } @@ -577,7 +579,7 @@ namespace MobileGL::MG_Impl::GLImpl { // Check if PBO is mapped if (pixelPackBufferObject->IsMapped()) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + ErrorCode::InvalidOperation, MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "Pixel pack buffer is currently mapped")); return; } @@ -587,7 +589,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (reinterpret_cast(pixels) % typeSize != 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "Pixel data not aligned for pixel pack buffer")); return; } @@ -595,11 +597,11 @@ namespace MobileGL::MG_Impl::GLImpl { // Check multisampling if (framebufferObject->GetAttachment(FramebufferAttachmentType::Color0).IsRenderbuffer()) { - auto rbo = framebufferObject->GetAttachment(FramebufferAttachmentType::Color0).GetRenderbuffer(); + auto& rbo = framebufferObject->GetAttachment(FramebufferAttachmentType::Color0).GetRenderbuffer(); if (rbo && rbo->GetSamples() > 1) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ReadPixels_State", + MakeUnique("MG_Impl/GLImpl", "ReadPixels_State", "ReadPixels not supported for multisampled framebuffers")); return; } @@ -732,6 +734,6 @@ namespace MobileGL::MG_Impl::GLImpl { } namespace FramebufferImpl { - DefaultFramebufferInfo* pDefaultFramebufferInfo; + UniquePtr pDefaultFramebufferInfo; } // namespace FramebufferImpl } // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.h b/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.h index c1263355..abf1b7a0 100644 --- a/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.h +++ b/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.h @@ -11,51 +11,49 @@ #include #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ - void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); - void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); - void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value); - void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value); - void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value); - void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height); - void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - GLboolean IsRenderbuffer(GLuint renderbuffer); - void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params); - void GenRenderbuffers(GLsizei n, GLuint* renderbuffers); - void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers); - void BindRenderbuffer(GLenum target, GLuint renderbuffer); - void SampleMaski(GLuint maskNumber, GLbitfield mask); - GLboolean IsFramebuffer(GLuint framebuffer); - void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params); - void GenFramebuffers(GLsizei n, GLuint* framebuffers); - void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - void FramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, - GLint zoffset); - void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - void FramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - void FramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level); - void DrawBuffer(GLenum buf); - void DrawBuffers(GLsizei n, const GLenum* bufs); - void ReadBuffer(GLenum src); - void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers); - GLenum CheckFramebufferStatus(GLenum target); - void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, - GLint dstY1, GLbitfield mask, GLenum filter); - void BindFramebuffer(GLenum target, GLuint framebuffer); +namespace MobileGL::MG_Impl::GLImpl { + /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ + void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); + void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); + void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value); + void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value); + void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value); + void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLsizei height); + void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + GLboolean IsRenderbuffer(GLuint renderbuffer); + void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params); + void GenRenderbuffers(GLsizei n, GLuint* renderbuffers); + void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers); + void BindRenderbuffer(GLenum target, GLuint renderbuffer); + void SampleMaski(GLuint maskNumber, GLbitfield mask); + GLboolean IsFramebuffer(GLuint framebuffer); + void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params); + void GenFramebuffers(GLsizei n, GLuint* framebuffers); + void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + void FramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, + GLint zoffset); + void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + void FramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + void FramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level); + void DrawBuffer(GLenum buf); + void DrawBuffers(GLsizei n, const GLenum* bufs); + void ReadBuffer(GLenum src); + void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers); + GLenum CheckFramebufferStatus(GLenum target); + void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, + GLint dstY1, GLbitfield mask, GLenum filter); + void BindFramebuffer(GLenum target, GLuint framebuffer); - namespace FramebufferImpl { - struct DefaultFramebufferInfo { - SharedPtr defaultFBO; - SharedPtr colorAttachment; - SharedPtr depthAttachment; - SharedPtr stencilAttachment; - }; + namespace FramebufferImpl { + struct DefaultFramebufferInfo { + SharedPtr defaultFBO; + SharedPtr colorAttachment; + SharedPtr depthAttachment; + SharedPtr stencilAttachment; + }; - extern DefaultFramebufferInfo* pDefaultFramebufferInfo; - } // namespace FramebufferImpl - } // namespace MG_Impl::GLImpl -} // namespace MobileGL + extern UniquePtr pDefaultFramebufferInfo; + } // namespace FramebufferImpl +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.cpp b/MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.cpp index e137cca9..0ae604b6 100644 --- a/MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.cpp +++ b/MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.cpp @@ -13,85 +13,82 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace FramebufferImpl { - Bool ValidateFramebufferTarget(FramebufferTarget target) { - if (target == FramebufferTarget::Unknown) { - using namespace MG_Util; - String bufferTargetStr = ConvertFramebufferTargetToString(target); - String glTargetStr = ConvertGLEnumToString(ConvertFramebufferTargetToGLEnum(target)); - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared( - "MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferTarget", - std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr))); - return false; - } - return true; - } - - Bool ValidateFramebufferName(Uint index, Bool allowZero) { - if (index == 0 && !allowZero) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferName", - "Framebuffer name 0 is not valid in this situation.")); - return false; - } - Bool isValid = MG_State::pGLContext->ValidateFramebufferName(index); - if (isValid) return true; +namespace MobileGL::MG_Impl::GLImpl::FramebufferImpl { + Bool ValidateFramebufferTarget(FramebufferTarget target) { + if (target == FramebufferTarget::Unknown) { + using namespace MG_Util; + String bufferTargetStr = ConvertFramebufferTargetToString(target); + String glTargetStr = ConvertGLEnumToString(ConvertFramebufferTargetToGLEnum(target)); MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferName", - std::format("Framebuffer name {} is not valid.", index))); + ErrorCode::InvalidEnum, MakeUnique( + "MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferTarget", + std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr))); return false; } + return true; + } - Bool ValidateFramebufferAttachmentType(FramebufferAttachmentType attachment) { - if (attachment == FramebufferAttachmentType::Unknown) { - using namespace MG_Util; - String attachmentStr = ConvertFramebufferAttachmentTypeToString(attachment); - String glAttachmentStr = ConvertGLEnumToString(ConvertFramebufferAttachmentTypeToGLEnum(attachment)); - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared( - "MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferAttachmentType", - std::format("Attachment type {} ({}) is not valid.", attachmentStr, glAttachmentStr))); - return false; - } - return true; - } - - Bool ValidateRenderbufferTarget(RenderbufferTarget target) { - if (target == RenderbufferTarget::Unknown) { - using namespace MG_Util; - String renderbufferTargetStr = ConvertRenderbufferTargetToString(target); - String glTargetStr = ConvertGLEnumToString(ConvertRenderbufferTargetToGLEnum(target)); - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared( - "MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferTarget", - std::format("Target {} ({}) is not valid.", renderbufferTargetStr, glTargetStr))); - return false; - } - return true; - } - - Bool ValidateRenderbufferName(Uint index, Bool allowZero) { - if (index == 0 && !allowZero) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferName", - "Renderbuffer name 0 is not valid in this situation.")); - return false; - } - Bool isValid = MG_State::pGLContext->ValidateRenderbufferName(index); - if (isValid) return true; + Bool ValidateFramebufferName(Uint index, Bool allowZero) { + if (index == 0 && !allowZero) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferName", - std::format("Renderbuffer name {} is not valid.", index))); + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferName", + "Framebuffer name 0 is not valid in this situation.")); return false; } - } // namespace FramebufferImpl -} // namespace MobileGL::MG_Impl::GLImpl \ No newline at end of file + Bool isValid = MG_State::pGLContext->ValidateFramebufferName(index); + if (isValid) return true; + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferName", + std::format("Framebuffer name {} is not valid.", index))); + return false; + } + + Bool ValidateFramebufferAttachmentType(FramebufferAttachmentType attachment) { + if (attachment == FramebufferAttachmentType::Unknown) { + using namespace MG_Util; + String attachmentStr = ConvertFramebufferAttachmentTypeToString(attachment); + String glAttachmentStr = ConvertGLEnumToString(ConvertFramebufferAttachmentTypeToGLEnum(attachment)); + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique( + "MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferAttachmentType", + std::format("Attachment type {} ({}) is not valid.", attachmentStr, glAttachmentStr))); + return false; + } + return true; + } + + Bool ValidateRenderbufferTarget(RenderbufferTarget target) { + if (target == RenderbufferTarget::Unknown) { + using namespace MG_Util; + String renderbufferTargetStr = ConvertRenderbufferTargetToString(target); + String glTargetStr = ConvertGLEnumToString(ConvertRenderbufferTargetToGLEnum(target)); + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique( + "MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferTarget", + std::format("Target {} ({}) is not valid.", renderbufferTargetStr, glTargetStr))); + return false; + } + return true; + } + + Bool ValidateRenderbufferName(Uint index, Bool allowZero) { + if (index == 0 && !allowZero) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferName", + "Renderbuffer name 0 is not valid in this situation.")); + return false; + } + Bool isValid = MG_State::pGLContext->ValidateRenderbufferName(index); + if (isValid) return true; + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferName", + std::format("Renderbuffer name {} is not valid.", index))); + return false; + } +} // namespace MobileGL::MG_Impl::GLImpl::FramebufferImpl diff --git a/MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.h b/MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.h index 6de2e49a..7e5216e4 100644 --- a/MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.h +++ b/MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.h @@ -10,12 +10,10 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace FramebufferImpl { - Bool ValidateFramebufferTarget(FramebufferTarget target); - Bool ValidateFramebufferName(Uint index, Bool allowZero = true); - Bool ValidateFramebufferAttachmentType(FramebufferAttachmentType attachment); - Bool ValidateRenderbufferTarget(RenderbufferTarget target); - Bool ValidateRenderbufferName(Uint index, Bool allowZero = true); - } // namespace FramebufferImpl -} // namespace MobileGL::MG_Impl::GLImpl \ No newline at end of file +namespace MobileGL::MG_Impl::GLImpl::FramebufferImpl { + Bool ValidateFramebufferTarget(FramebufferTarget target); + Bool ValidateFramebufferName(Uint index, Bool allowZero = true); + Bool ValidateFramebufferAttachmentType(FramebufferAttachmentType attachment); + Bool ValidateRenderbufferTarget(RenderbufferTarget target); + Bool ValidateRenderbufferName(Uint index, Bool allowZero = true); +} // namespace MobileGL::MG_Impl::GLImpl::FramebufferImpl diff --git a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp index a4233874..788b7299 100644 --- a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp +++ b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp @@ -7,8 +7,6 @@ // End of Source File Header #include "GL_Getter.h" -#include "GL/gl.h" -#include "MG_Util/Debug/Log.h" #include #include #include @@ -127,7 +125,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!params) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GetIntegerv", "params pointer cannot be null")); + MakeUnique("MG_Impl/GLImpl", "GetIntegerv", "params pointer cannot be null")); return; } @@ -146,9 +144,9 @@ namespace MobileGL::MG_Impl::GLImpl { *params = 0; // TODO break; case GL_ARRAY_BUFFER_BINDING: { - auto obj = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex).GetBoundObject(); + auto& obj = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex).GetBoundObject(); if (obj) - *params = obj->GetExternalIndex(); + *params = (GLint)obj->GetExternalIndex(); else *params = 0; break; @@ -256,14 +254,14 @@ namespace MobileGL::MG_Impl::GLImpl { break; case GL_CURRENT_PROGRAM: { const auto& currentProgram = MG_State::pGLContext->GetCurrentProgram(); - *params = currentProgram ? currentProgram->GetExternalIndex() : 0; + *params = currentProgram ? (GLint)currentProgram->GetExternalIndex() : 0; break; } case GL_DEPTH_CLEAR_VALUE: - *params = MG_State::pGLContext->GetClearDepth(); + *params = (GLint)MG_State::pGLContext->GetClearDepth(); break; case GL_DEPTH_FUNC: - *params = MG_Util::ConvertDepthTestFuncToGLEnum(MG_State::pGLContext->GetDepthFunc()); + *params = (GLint)MG_Util::ConvertDepthTestFuncToGLEnum(MG_State::pGLContext->GetDepthFunc()); break; case GL_DEPTH_RANGE: *params = 0; // TODO @@ -288,12 +286,12 @@ namespace MobileGL::MG_Impl::GLImpl { break; case GL_DRAW_FRAMEBUFFER_BINDING: { const auto& FBO = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw).GetBoundObject(); - *params = FBO ? FBO->GetExternalIndex() : 0; + *params = FBO ? (GLint)FBO->GetExternalIndex() : 0; break; } case GL_READ_FRAMEBUFFER_BINDING: { const auto& FBO = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read).GetBoundObject(); - *params = FBO ? FBO->GetExternalIndex() : 0; + *params = FBO ? (GLint)FBO->GetExternalIndex() : 0; break; } case GL_ELEMENT_ARRAY_BUFFER_BINDING: { @@ -302,7 +300,7 @@ namespace MobileGL::MG_Impl::GLImpl { break; } const auto& bufferObject = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).GetBoundObject(); - *params = bufferObject ? bufferObject->GetExternalIndex() : 0; + *params = bufferObject ? (GLint)bufferObject->GetExternalIndex() : 0; break; } case GL_FRAGMENT_SHADER_DERIVATIVE_HINT: @@ -886,7 +884,7 @@ namespace MobileGL::MG_Impl::GLImpl { default: MGLOG_E("glGetIntegerv: Invalid enum %s (0x%X)", MG_Util::ConvertGLEnumToString(pname).c_str(), pname); MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "GetIntegerv", + MakeUnique("MG_Impl/GLImpl", "GetIntegerv", std::format("Invalid enum: 0x{:X}", pname))); break; @@ -894,7 +892,10 @@ namespace MobileGL::MG_Impl::GLImpl { } GLenum GetError() { - ErrorCode errorCode = MG_State::pGLContext->PopGLError().value_or(Error{ErrorCode::NoError, nullptr}).code; - return MG_Util::ConvertErrorCodeToGLEnum(errorCode); + auto error = MG_State::pGLContext->PopGLError(); + if (!error || !error->get()) { + return GL_NO_ERROR; + } + return MG_Util::ConvertErrorCodeToGLEnum(error->get()->code); } } // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index b938a348..79014bef 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -8,1168 +8,1162 @@ #include "GL_Program.h" #include "Config.h" -#include "MG_Util/Converters/GLToStr/GLEnumConverter.h" #include +#include #include #include #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - static bool CheckShaderNameValidity(Uint shader) { - if (shader == 0 || !MG_State::pGLContext->ValidateShaderName(shader)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(shader) + " is not a valid name.")); - return false; - } - return true; +namespace MobileGL::MG_Impl::GLImpl { + static bool CheckShaderNameValidity(Uint shader) { + if (shader == 0 || !MG_State::pGLContext->ValidateShaderName(shader)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(shader) + " is not a valid name.")); + return false; + } + return true; + } + + static const SharedPtr& TryToGetShaderObject(Uint shader) { + static const SharedPtr nullShaderObject = nullptr; + if (!CheckShaderNameValidity(shader)) return nullShaderObject; + + auto& shaderObject = MG_State::pGLContext->GetShaderObject(shader); + if (!shaderObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(shader) + " is not a shader object.")); + return nullShaderObject; + } + return shaderObject; + } + + static bool CheckProgramNameValidity(GLuint program) { + if (!MG_State::pGLContext->ValidateProgramName(program)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(program) + " is not a valid name.")); + return false; + } + return true; + } + + static const SharedPtr& TryToGetProgramObject(GLuint program) { + static const SharedPtr nullProgramObject = nullptr; + if (!CheckProgramNameValidity(program)) return nullProgramObject; + + auto& programObject = MG_State::pGLContext->GetProgramObject(program); + if (!programObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(program) + " is not a program object.")); + return nullProgramObject; + } + return programObject; + } + + void CopyStr(GLsizei bufSize, GLsizei* length, GLchar* dst, const char* src, GLsizei srcLength) { + auto sz = std::min(bufSize - 1, srcLength); + if (length) *length = sz; + + if (bufSize == 0) return; + + Memcpy(dst, src, sz); + dst[sz] = '\0'; + } + + void AttachShader_State(GLuint program, GLuint shader) { + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + auto& shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) return; + if (!programObject->AttachShader(shaderObject)) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(shader) + + " is already attached to " + + std::to_string(program) + ".")); + return; + } + } + + void BindAttribLocation_State(GLuint program, GLuint index, const GLchar* name) { + if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + "index " + std::to_string(index) + + " is greater than or equal to `GL_MAX_VERTEX_ATTRIBS`.")); + return; } - static SharedPtr TryToGetShaderObject(Uint shader) { - if (!CheckShaderNameValidity(shader)) return nullptr; - - auto shaderObject = MG_State::pGLContext->GetShaderObject(shader); - if (!shaderObject) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(shader) + " is not a shader object.")); - return nullptr; - } - return shaderObject; + if (strncmp(name, "gl_", 3) == 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "name " + std::string(name) + " starts with the reserved prefix `gl_`.")); + return; } - static bool CheckProgramNameValidity(GLuint program) { - if (!MG_State::pGLContext->ValidateProgramName(program)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(program) + " is not a valid name.")); - return false; - } - return true; + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + + MGLOG_D("%s: loc %02d = \"%s\"", __func__, index, name); + programObject->SetExplicitVertexInLocation(index, name); + } + + void CompileShader_State(GLuint shader) { + auto& shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) return; + shaderObject->Compile(); + } + + GLuint CreateProgram_State() { + return MG_State::pGLContext->CreateProgram(); + } + + GLuint CreateShader_State(GLenum type) { + auto shaderId = MG_State::pGLContext->CreateShader(MG_Util::ConvertGLEnumToShaderStage(type)); + if (shaderId == 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, "`shaderType` is not an accepted value.")); + return 0; + } + return shaderId; + } + + void DeleteProgram_State(GLuint program) { + if (!CheckProgramNameValidity(program)) return; + MG_State::pGLContext->MarkProgramForDeletion(program); + } + + void DeleteShader_State(GLuint shader) { + if (!CheckShaderNameValidity(shader)) return; + MG_State::pGLContext->MarkShaderForDeletion(shader); + } + + void DetachShader_State(GLuint program, GLuint shader) { + auto& shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) return; + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + + auto count = programObject->DetachShader(shaderObject); + if (count <= 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, "Shader is not attached to program.")); + return; + } + } + + void GetActiveAttrib_State(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, + GLenum* type, GLchar* name) { + if (bufSize < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + "bufSize " + std::to_string(bufSize) + " is less than 0.")); + return; + } + auto& programObject = TryToGetProgramObject(program); + if (!programObject || !programObject->GetLinkStatus()) return; + auto attribCount = programObject->GetActiveAttributesCount(); + if (index >= attribCount) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", __func__, + "index " + std::to_string(index) + + " is greater than or equal to the number of active attribute variables in " + + std::to_string(program) + ".")); + return; + } + if (type != nullptr) *type = programObject->GetAttribType(index); + if (bufSize == 0) return; + auto& attribName = programObject->GetAttribName(index); + CopyStr(bufSize, length, name, attribName.c_str(), (GLsizei)attribName.length()); + } + + void GetActiveUniform_State(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, + GLenum* type, GLchar* name) { + if (bufSize < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + "bufSize " + std::to_string(bufSize) + " is less than 0.")); + return; + } + auto& programObject = TryToGetProgramObject(program); + if (!programObject || !programObject->GetLinkStatus()) return; + auto uniformCount = programObject->GetUniformCount(); + if (index >= uniformCount) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", __func__, + "index " + std::to_string(index) + + " is greater than or equal to the number of active uniform variables in " + + std::to_string(program) + ".")); + return; } - static SharedPtr TryToGetProgramObject(GLuint program) { - if (!CheckProgramNameValidity(program)) return nullptr; + if (type != nullptr) *type = programObject->GetUniformType(index); + if (bufSize == 0) return; + auto& uniformName = programObject->GetUniformName(index); + CopyStr(bufSize, length, name, uniformName.c_str(), (GLsizei)uniformName.length()); + } - auto programObject = MG_State::pGLContext->GetProgramObject(program); - if (!programObject) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(program) + " is not a program object.")); - return nullptr; - } - return programObject; + void GetAttachedShaders_State(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) { + if (maxCount < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + "maxCount " + std::to_string(maxCount) + " is less than 0.")); + return; } - - void CopyStr(GLsizei bufSize, GLsizei* length, GLchar* dst, const char* src, GLsizei srcLength) { - auto sz = std::min(bufSize - 1, srcLength); - if (length) *length = sz; - - if (bufSize == 0) return; - - Memcpy(dst, src, sz); - dst[sz] = '\0'; + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + const auto& s = programObject->GetAttachedShaders(); + GLsizei c = std::min((GLsizei)s.size(), maxCount); + if (count) *count = c; + for (GLsizei i = 0; i < c; ++i) { + shaders[i] = s[i]->GetExternalIndex(); } + } - void AttachShader_State(GLuint program, GLuint shader) { - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - auto shaderObject = TryToGetShaderObject(shader); - if (!shaderObject) return; - if (!programObject->AttachShader(shaderObject)) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(shader) + - " is already attached to " + - std::to_string(program) + ".")); - return; - } - } + GLint GetAttribLocation_State(GLuint program, const GLchar* name) { + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return -1; + if (strncmp(name, "gl_", 3) == 0) return -1; + if (!programObject->GetLinkStatus()) return -1; + return programObject->GetAttributeLocation(name); + } - void BindAttribLocation_State(GLuint program, GLuint index, const GLchar* name) { - if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, - "index " + std::to_string(index) + - " is greater than or equal to `GL_MAX_VERTEX_ATTRIBS`.")); - return; - } - - if (strncmp(name, "gl_", 3) == 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "name " + std::string(name) + - " starts with the reserved prefix `gl_`.")); - return; - } - - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - - MGLOG_D("%s: loc %02d = \"%s\"", __func__, index, name); - programObject->SetExplicitVertexInLocation(index, name); - } - - void CompileShader_State(GLuint shader) { - auto shaderObject = TryToGetShaderObject(shader); - if (!shaderObject) return; - shaderObject->Compile(); - } - - GLuint CreateProgram_State(void) { - return MG_State::pGLContext->CreateProgram(); - } - - GLuint CreateShader_State(GLenum type) { - auto shaderId = MG_State::pGLContext->CreateShader(MG_Util::ConvertGLEnumToShaderStage(type)); - if (shaderId == 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, "`shaderType` is not an accepted value.")); - return 0; - } - return shaderId; - } - - void DeleteProgram_State(GLuint program) { - if (!CheckProgramNameValidity(program)) return; - MG_State::pGLContext->MarkProgramForDeletion(program); - } - - void DeleteShader_State(GLuint shader) { - if (!CheckShaderNameValidity(shader)) return; - MG_State::pGLContext->MarkShaderForDeletion(shader); - } - - void DetachShader_State(GLuint program, GLuint shader) { - auto shaderObject = TryToGetShaderObject(shader); - if (!shaderObject) return; - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - - auto count = programObject->DetachShader(shaderObject); - if (count <= 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, "Shader is not attached to program.")); - return; - } - } - - void GetActiveAttrib_State(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, - GLenum* type, GLchar* name) { - if (bufSize < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, - "bufSize " + std::to_string(bufSize) + " is less than 0.")); - return; - } - auto programObject = TryToGetProgramObject(program); - if (!programObject || !programObject->GetLinkStatus()) return; - auto attribCount = programObject->GetActiveAttributesCount(); - if (index >= attribCount) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", __func__, - "index " + std::to_string(index) + - " is greater than or equal to the number of active attribute variables in " + - std::to_string(program) + ".")); - return; - } - if (type != nullptr) *type = programObject->GetAttribType(index); - if (bufSize == 0) return; - auto& attribName = programObject->GetAttribName(index); - CopyStr(bufSize, length, name, attribName.c_str(), attribName.length()); - } - - void GetActiveUniform_State(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, - GLenum* type, GLchar* name) { - if (bufSize < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, - "bufSize " + std::to_string(bufSize) + " is less than 0.")); - return; - } - auto programObject = TryToGetProgramObject(program); - if (!programObject || !programObject->GetLinkStatus()) return; - auto uniformCount = programObject->GetUniformCount(); - if (index >= uniformCount) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", __func__, - "index " + std::to_string(index) + - " is greater than or equal to the number of active uniform variables in " + - std::to_string(program) + ".")); - return; - } - - if (type != nullptr) *type = programObject->GetUniformType(index); - if (bufSize == 0) return; - auto& uniformName = programObject->GetUniformName(index); - CopyStr(bufSize, length, name, uniformName.c_str(), uniformName.length()); - } - - void GetAttachedShaders_State(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) { - if (maxCount < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, - "maxCount " + std::to_string(maxCount) + " is less than 0.")); - return; - } - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - const auto& s = programObject->GetAttachedShaders(); - GLsizei c = std::min((GLsizei)s.size(), maxCount); - if (count) *count = c; - for (GLsizei i = 0; i < c; ++i) { - shaders[i] = s[i]->GetExternalIndex(); - } - } - - GLint GetAttribLocation_State(GLuint program, const GLchar* name) { - auto programObject = TryToGetProgramObject(program); - if (!programObject) return -1; - if (strncmp(name, "gl_", 3) == 0) return -1; - if (!programObject->GetLinkStatus()) return -1; - return programObject->GetAttributeLocation(name); - } - - void GetProgramiv_State(GLuint program, GLenum pname, GLint* params) { - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - - switch (pname) { - case GL_DELETE_STATUS: - *params = programObject->GetDeleteStatus(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_LINK_STATUS: - *params = programObject->GetLinkStatus(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_VALIDATE_STATUS: - *params = programObject->GetValidateStatus(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_INFO_LOG_LENGTH: { - const auto& log = programObject->GetInfoLog(); - *params = log.length(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - } - case GL_ATTACHED_SHADERS: { - const auto& attachedShaders = programObject->GetAttachedShaders(); - *params = attachedShaders.size(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - } - case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS: - *params = programObject->GetActiveAtomicCounterCount(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_ACTIVE_ATTRIBUTES: - *params = programObject->GetActiveAttributesCount(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: - *params = programObject->GetActiveAttributesMaxLength(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_ACTIVE_UNIFORMS: - *params = programObject->GetUniformCount(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_ACTIVE_UNIFORM_MAX_LENGTH: - *params = programObject->GetUniformMaxLength(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_ACTIVE_UNIFORM_BLOCKS: // GL >= 3.1 - *params = programObject->GetActiveUniformBlocksCount(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: // ditto. - *params = programObject->GetActiveUniformBlocksMaxNameLength(); - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); - break; - case GL_COMPUTE_WORK_GROUP_SIZE: // GL >= 4.3 - - case GL_PROGRAM_BINARY_LENGTH: - - case GL_TRANSFORM_FEEDBACK_BUFFER_MODE: - case GL_TRANSFORM_FEEDBACK_VARYINGS: - case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: - case GL_GEOMETRY_VERTICES_OUT: - case GL_GEOMETRY_INPUT_TYPE: - case GL_GEOMETRY_OUTPUT_TYPE: - default: - MGLOG_D("%s: %s", __func__, MG_Util::ConvertGLEnumToString(pname).c_str()); - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", __func__, - "pname " + std::to_string(pname) + " is not an accepted value.")); - return; - } - } - - void GetProgramInfoLog_State(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; + void GetProgramiv_State(GLuint program, GLenum pname, GLint* params) { + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + switch (pname) { + case GL_DELETE_STATUS: + *params = programObject->GetDeleteStatus(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_LINK_STATUS: + *params = programObject->GetLinkStatus(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_VALIDATE_STATUS: + *params = programObject->GetValidateStatus(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_INFO_LOG_LENGTH: { const auto& log = programObject->GetInfoLog(); - CopyStr(bufSize, length, infoLog, log.c_str(), log.length()); + *params = (GLint)log.length(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + } + case GL_ATTACHED_SHADERS: { + const auto& attachedShaders = programObject->GetAttachedShaders(); + *params = (GLint)attachedShaders.size(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + } + case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS: + *params = programObject->GetActiveAtomicCounterCount(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_ACTIVE_ATTRIBUTES: + *params = programObject->GetActiveAttributesCount(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: + *params = programObject->GetActiveAttributesMaxLength(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_ACTIVE_UNIFORMS: + *params = (GLint)programObject->GetUniformCount(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_ACTIVE_UNIFORM_MAX_LENGTH: + *params = programObject->GetUniformMaxLength(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_ACTIVE_UNIFORM_BLOCKS: // GL >= 3.1 + *params = programObject->GetActiveUniformBlocksCount(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: // ditto. + *params = programObject->GetActiveUniformBlocksMaxNameLength(); + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params); + break; + case GL_COMPUTE_WORK_GROUP_SIZE: // GL >= 4.3 + + case GL_PROGRAM_BINARY_LENGTH: + + case GL_TRANSFORM_FEEDBACK_BUFFER_MODE: + case GL_TRANSFORM_FEEDBACK_VARYINGS: + case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: + case GL_GEOMETRY_VERTICES_OUT: + case GL_GEOMETRY_INPUT_TYPE: + case GL_GEOMETRY_OUTPUT_TYPE: + default: + MGLOG_D("%s: %s", __func__, MG_Util::ConvertGLEnumToString(pname).c_str()); + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", __func__, + "pname " + std::to_string(pname) + " is not an accepted value.")); + return; + } + } + + void GetProgramInfoLog_State(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + + const auto& log = programObject->GetInfoLog(); + CopyStr(bufSize, length, infoLog, log.c_str(), (GLsizei)log.length()); + } + + void GetShaderiv_State(GLuint shader, GLenum pname, GLint* params) { + auto& shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) return; + + switch (pname) { + case GL_SHADER_TYPE: + *params = (GLint)MG_Util::ConvertShaderStageToGLEnum(shaderObject->GetShaderStage()); + break; + case GL_DELETE_STATUS: + *params = shaderObject->GetDeleteStatus(); + break; + case GL_COMPILE_STATUS: + *params = shaderObject->GetCompileStatus(); + break; + case GL_INFO_LOG_LENGTH: + *params = (GLint)shaderObject->GetInfoLog().length(); + break; + case GL_SHADER_SOURCE_LENGTH: + *params = (GLint)shaderObject->GetShaderSource().length(); + break; + default: + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", __func__, + "pname " + std::to_string(pname) + " is not an accepted value.")); + return; + } + } + + void GetShaderInfoLog_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { + auto& shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) return; + + const auto& log = shaderObject->GetInfoLog(); + CopyStr(bufSize, length, infoLog, log.c_str(), (GLsizei)log.length()); + } + + void GetShaderSource_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) { + if (bufSize < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + "bufSize " + std::to_string(bufSize) + " is less than 0.")); } - void GetShaderiv_State(GLuint shader, GLenum pname, GLint* params) { - auto shaderObject = TryToGetShaderObject(shader); - if (!shaderObject) return; + auto& shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) return; - switch (pname) { - case GL_SHADER_TYPE: - *params = MG_Util::ConvertShaderStageToGLEnum(shaderObject->GetShaderStage()); - break; - case GL_DELETE_STATUS: - *params = shaderObject->GetDeleteStatus(); - break; - case GL_COMPILE_STATUS: - *params = shaderObject->GetCompileStatus(); - break; - case GL_INFO_LOG_LENGTH: - *params = shaderObject->GetInfoLog().length(); - break; - case GL_SHADER_SOURCE_LENGTH: - *params = shaderObject->GetShaderSource().length(); - break; - default: - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", __func__, - "pname " + std::to_string(pname) + " is not an accepted value.")); - return; - } + auto& src = shaderObject->GetShaderSource(); + CopyStr(bufSize, length, source, src.c_str(), (GLsizei)src.length()); + } + + GLint GetUniformLocation_State(GLuint program, const GLchar* name) { + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return -1; + auto loc = programObject->GetUniformLocation(name); + MGLOG_D("%s: loc %02d = %s", __func__, loc, name); + return loc; + } + + void GetUniform_State(GLuint program, GLint location, void* params) { + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(program) + " has not been successfully linked.")); + return; } - void GetShaderInfoLog_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { - auto shaderObject = TryToGetShaderObject(shader); - if (!shaderObject) return; - - const auto& log = shaderObject->GetInfoLog(); - CopyStr(bufSize, length, infoLog, log.c_str(), log.length()); + // Check if location is valid + if (location < 0 || location > programObject->GetMaxUniformLocation()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " does not correspond to a valid uniform variable location " + "for the specified program object.")); + return; } - void GetShaderSource_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) { - if (bufSize < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, - "bufSize " + std::to_string(bufSize) + " is less than 0.")); - } - - auto shaderObject = TryToGetShaderObject(shader); - if (!shaderObject) return; - - auto& src = shaderObject->GetShaderSource(); - CopyStr(bufSize, length, source, src.c_str(), src.length()); + // Check if the location corresponds to an active uniform + const auto& uniformName = programObject->GetUniformName(location); + if (uniformName.empty()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " does not correspond to a valid uniform variable location " + "for the specified program object.")); + return; } - GLint GetUniformLocation_State(GLuint program, const GLchar* name) { - auto programObject = TryToGetProgramObject(program); - if (!programObject) return -1; - auto loc = programObject->GetUniformLocation(name); - MGLOG_D("%s: loc %02d = %s", __func__, loc, name); - return loc; - } + auto isOpaque = programObject->IsUniformOpaqueAtLocation(location); + if (!isOpaque) { + // TODO: probably handle int/float differences + auto offset = programObject->GetUniformOffset(location); + auto size = programObject->GetUniformSizesInBytes(location); + char* pUBO = (char*)programObject->MapUBO(); + auto* ttype = programObject->GetUniformTType(location); - void GetUniform_State(GLuint program, GLint location, void* params) { - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - - if (!programObject->GetLinkStatus()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(program) + " has not been successfully linked.")); - return; - } - - // Check if location is valid - if (location < 0 || location > programObject->GetMaxUniformLocation()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "location " + std::to_string(location) + - " does not correspond to a valid uniform variable location " - "for the specified program object.")); - return; - } - - // Check if the location corresponds to an active uniform - const auto& uniformName = programObject->GetUniformName(location); - if (uniformName.empty()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "location " + std::to_string(location) + - " does not correspond to a valid uniform variable location " - "for the specified program object.")); - return; - } - - auto isOpaque = programObject->IsUniformOpaqueAtLocation(location); - if (!isOpaque) { - // TODO: probably handle int/float differences - auto offset = programObject->GetUniformOffset(location); - auto size = programObject->GetUniformSizesInBytes(location); - char* pUBO = (char*)programObject->MapUBO(); - auto* ttype = programObject->GetUniformTType(location); - - if (!ttype->isMatrix() || ttype->getMatrixCols() != 3) - Memcpy(params, pUBO + offset, size); - else { - // TODO: we only deal with mat3 yet, deal with other types later - // assuming float here, which may not be the case - auto* pBase = pUBO + offset; - for (int i = 0; i < ttype->getMatrixRows(); i++) { - Memcpy((char*)params + ttype->getMatrixCols() * sizeof(float) * i, - pBase + 4 * sizeof(float) * i, ttype->getMatrixCols() * sizeof(float)); - } + if (!ttype->isMatrix() || ttype->getMatrixCols() != 3) + Memcpy(params, pUBO + offset, size); + else { + // TODO: we only deal with mat3 yet, deal with other types later + // assuming float here, which may not be the case + auto* pBase = pUBO + offset; + for (int i = 0; i < ttype->getMatrixRows(); i++) { + Memcpy((char*)params + ttype->getMatrixCols() * sizeof(float) * i, pBase + 4 * sizeof(float) * i, + ttype->getMatrixCols() * sizeof(float)); } } - // TODO: handle 1i variant as texture unit } + // TODO: handle 1i variant as texture unit + } - void GetUniformfv_State(GLuint program, GLint location, GLfloat* params) { - GetUniform_State(program, location, params); - } + void GetUniformfv_State(GLuint program, GLint location, GLfloat* params) { + GetUniform_State(program, location, params); + } - void GetUniformiv_State(GLuint program, GLint location, GLint* params) { - GetUniform_State(program, location, params); - } + void GetUniformiv_State(GLuint program, GLint location, GLint* params) { + GetUniform_State(program, location, params); + } - GLboolean IsProgram_State(GLuint program) { - /* FIXME: Handle situations that: - * A program object marked for deletion with glDeleteProgram but still in use as part of current - * rendering state is still considered a program object and glIsProgram will return GL_TRUE. - */ - return CheckProgramNameValidity(program); - } + GLboolean IsProgram_State(GLuint program) { + /* FIXME: Handle situations that: + * A program object marked for deletion with glDeleteProgram but still in use as part of current + * rendering state is still considered a program object and glIsProgram will return GL_TRUE. + */ + return CheckProgramNameValidity(program); + } - GLboolean IsShader_State(GLuint shader) { - /* FIXME: Handle situations that: - * A shader object marked for deletion with glDeleteShader but still attached to a program object is still - * considered a shader object and glIsShader will return GL_TRUE. - */ - return CheckShaderNameValidity(shader); - } + GLboolean IsShader_State(GLuint shader) { + /* FIXME: Handle situations that: + * A shader object marked for deletion with glDeleteShader but still attached to a program object is still + * considered a shader object and glIsShader will return GL_TRUE. + */ + return CheckShaderNameValidity(shader); + } - void LinkProgram_State(GLuint program) { - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - MGLOG_D("%s: linking program %d", __func__, program); + void LinkProgram_State(GLuint program) { + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + MGLOG_D("%s: linking program %d", __func__, program); - static Bool allowVSOnlyPrograms; - static Bool initialized = false; - if (!initialized) { - const auto& activeBackendObject = MG_Backend::pActiveBackendObject; - if (!activeBackendObject) { - MGLOG_E("activeBackendObject is not initialized!"); - return; - } - const auto& rendererInfo = activeBackendObject->GetRendererInfo(); - allowVSOnlyPrograms = (Int)rendererInfo.StaticBackendCapability.AllowVSOnlyPrograms; - } - programObject->Link(!allowVSOnlyPrograms); - } - - void ShaderSource_State(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length) { - if (count < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", __func__, - "count " + std::to_string(count) + " is less than 0.")); + static Bool allowVSOnlyPrograms; + static Bool initialized = false; + if (!initialized) { + const auto& activeBackendObject = MG_Backend::pActiveBackendObject; + if (!activeBackendObject) { + MGLOG_E("activeBackendObject is not initialized!"); return; } + const auto& rendererInfo = activeBackendObject->GetRendererInfo(); + allowVSOnlyPrograms = (Int)rendererInfo.StaticBackendCapability.AllowVSOnlyPrograms; + } + programObject->Link(!allowVSOnlyPrograms); + } - auto shaderObject = TryToGetShaderObject(shader); - if (!shaderObject) return; - - std::string src; - for (GLsizei i = 0; i < count; i++) { - src += (length == nullptr || length[i] <= 0) ? string[i] : std::string(string[i], length[i]); - } - shaderObject->SetShaderSource(Move(src)); + void ShaderSource_State(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length) { + if (count < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + "count " + std::to_string(count) + " is less than 0.")); + return; } - void UseProgram_State(GLint program) { - MGLOG_D("UseProgram_State: program=%u", program); + auto& shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) return; - if (program == 0) { - MG_State::pGLContext->UseProgram(0); - return; - } + std::string src; + for (GLsizei i = 0; i < count; i++) { + src += (length == nullptr || length[i] <= 0) ? string[i] : std::string(string[i], length[i]); + } + shaderObject->SetShaderSource(Move(src)); + } - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - MG_State::pGLContext->UseProgram(program); + void UseProgram_State(GLuint program) { + MGLOG_D("UseProgram_State: program=%u", program); + + if (program == 0) { + MG_State::pGLContext->UseProgram(0); + return; } - template - void Uniform_State(MG_State::GLState::ProgramObject& programObject, GLuint location, T* value, - SizeT byteOffsetInsideUniform = 0) { - if (!programObject.IsUniformOpaqueAtLocation(location)) { - MGLOG_D("%s: program = %d, location = %d, maxLocation = %d", __func__, programObject.GetExternalIndex(), - location, programObject.GetMaxUniformLocation()); - auto size = programObject.GetUniformSizesInBytes(location); - auto offset = programObject.GetUniformOffset(location); - MOBILEGL_ASSERT(size >= ItemCount * sizeof(T), - "Uniform size mismatch, expected at least %zu bytes, got %zu bytes.", - ItemCount * sizeof(T), size); - MGLOG_D("%s: program = %d, location = %d, byteOffset = %d", __func__, programObject.GetExternalIndex(), - location, offset + byteOffsetInsideUniform); - Memcpy((char*)programObject.MapUBO() + offset + byteOffsetInsideUniform, value, ItemCount * sizeof(T)); + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + MG_State::pGLContext->UseProgram(program); + } + + template + void Uniform_State(MG_State::GLState::ProgramObject& programObject, GLuint location, T* value, + SizeT byteOffsetInsideUniform = 0) { + if (!programObject.IsUniformOpaqueAtLocation(location)) { + MGLOG_D("%s: program = %d, location = %d, maxLocation = %d", __func__, programObject.GetExternalIndex(), + location, programObject.GetMaxUniformLocation()); + auto size = programObject.GetUniformSizesInBytes(location); + auto offset = programObject.GetUniformOffset(location); + MOBILEGL_ASSERT(size >= ItemCount * sizeof(T), + "Uniform size mismatch, expected at least %zu bytes, got %zu bytes.", ItemCount * sizeof(T), + size); + MGLOG_D("%s: program = %d, location = %d, byteOffset = %d", __func__, programObject.GetExternalIndex(), + location, offset + byteOffsetInsideUniform); + Memcpy((char*)programObject.MapUBO() + offset + byteOffsetInsideUniform, value, ItemCount * sizeof(T)); + } else { + auto* ttype = programObject.GetUniformTType(location); + if (ttype->isTexture() || ttype->isImage()) { + programObject.SetUniformSamplerOrImageUnitIndex(location, *value); + } + } + } + + template + void Uniformv_State(GLint location, GLsizei count, T* value) { + if (location == -1) return; + + auto& programObject = MG_State::pGLContext->GetCurrentProgram(); + if (programObject == nullptr) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, "There is no current program object.")); + return; + } + + if (location > programObject->GetMaxUniformLocation() || location < -1) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " is an invalid uniform location for the current program " + "object and location " + + std::to_string(location) + " is not equal to -1.")); + return; + } + + for (GLint offset = 0; offset < count; offset++) { + Uniform_State(*programObject, location + offset, value + offset * ItemCount); + } + } + + // Helper function to transpose a 2x2 matrix + void TransposeMatrix2x2(const GLfloat* input, GLfloat* output) { + // Input matrix is in column-major order (OpenGL default) + // [0 2] + // [1 3] + // + // Output matrix should be in row-major order if transpose is true + // [0 1] + // [2 3] + output[0] = input[0]; // 0,0 element stays the same + output[1] = input[2]; // 0,1 element becomes 1,0 + output[2] = input[1]; // 1,0 element becomes 0,1 + output[3] = input[3]; // 1,1 element stays the same + } + + // Helper function to transpose a 3x3 matrix + void TransposeMatrix3x3(const GLfloat* input, GLfloat* output) { + // Input matrix is in column-major order (OpenGL default) + // [0 3 6] + // [1 4 7] + // [2 5 8] + // + // Output matrix should be in row-major order if transpose is true + // [0 1 2] + // [3 4 5] + // [6 7 8] + output[0] = input[0]; // 0,0 element stays the same + output[1] = input[3]; // 0,1 element becomes 1,0 + output[2] = input[6]; // 0,2 element becomes 2,0 + output[3] = input[1]; // 1,0 element becomes 0,1 + output[4] = input[4]; // 1,1 element stays the same + output[5] = input[7]; // 1,2 element becomes 2,1 + output[6] = input[2]; // 2,0 element becomes 0,2 + output[7] = input[5]; // 2,1 element becomes 1,2 + output[8] = input[8]; // 2,2 element stays the same + } + + // Helper function to transpose a 4x4 matrix + void TransposeMatrix4x4(const GLfloat* input, GLfloat* output) { + // Input matrix is in column-major order (OpenGL default) + // [0 4 8 12] + // [1 5 9 13] + // [2 6 10 14] + // [3 7 11 15] + // + // Output matrix should be in row-major order if transpose is true + // [0 1 2 3] + // [4 5 6 7] + // [8 9 10 11] + // [12 13 14 15] + output[0] = input[0]; // 0,0 element stays the same + output[1] = input[4]; // 0,1 element becomes 1,0 + output[2] = input[8]; // 0,2 element becomes 2,0 + output[3] = input[12]; // 0,3 element becomes 3,0 + output[4] = input[1]; // 1,0 element becomes 0,1 + output[5] = input[5]; // 1,1 element stays the same + output[6] = input[9]; // 1,2 element becomes 2,1 + output[7] = input[13]; // 1,3 element becomes 3,1 + output[8] = input[2]; // 2,0 element becomes 0,2 + output[9] = input[6]; // 2,1 element becomes 1,2 + output[10] = input[10]; // 2,2 element stays the same + output[11] = input[14]; // 2,3 element becomes 3,2 + output[12] = input[3]; // 3,0 element becomes 0,3 + output[13] = input[7]; // 3,1 element becomes 1,3 + output[14] = input[11]; // 3,2 element becomes 2,3 + output[15] = input[15]; // 3,3 element stays the same + } + + void Uniform1fv_State(GLint location, GLsizei count, const GLfloat* value) { + Uniformv_State<1>(location, count, value); + } + + void Uniform2fv_State(GLint location, GLsizei count, const GLfloat* value) { + Uniformv_State<2>(location, count, value); + } + + void Uniform3fv_State(GLint location, GLsizei count, const GLfloat* value) { + Uniformv_State<3>(location, count, value); + } + + void Uniform4fv_State(GLint location, GLsizei count, const GLfloat* value) { + Uniformv_State<4>(location, count, value); + } + + void Uniform1iv_State(GLint location, GLsizei count, const GLint* value) { + Uniformv_State<1>(location, count, value); + } + + void Uniform2iv_State(GLint location, GLsizei count, const GLint* value) { + Uniformv_State<2>(location, count, value); + } + + void Uniform3iv_State(GLint location, GLsizei count, const GLint* value) { + Uniformv_State<3>(location, count, value); + } + + void Uniform4iv_State(GLint location, GLsizei count, const GLint* value) { + Uniformv_State<4>(location, count, value); + } + + void UniformMatrix2fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { + // For 2x2 matrices, we have 4 elements per matrix + // If transpose is GL_TRUE, we need to transpose the matrix data + if (location == -1) return; + + auto& programObject = MG_State::pGLContext->GetCurrentProgram(); + if (programObject == nullptr) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, "There is no current program object.")); + return; + } + + if (location > programObject->GetMaxUniformLocation() || location < -1) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " is an invalid uniform location for the current program " + "object and location " + + std::to_string(location) + " is not equal to -1.")); + return; + } + + // For matrix uniforms, we handle each matrix individually + for (GLint i = 0; i < count; i++) { + if (transpose == GL_TRUE) { + // Transpose the matrix before uploading + GLfloat transposedMatrix[4]; + TransposeMatrix2x2(value + i * 4, transposedMatrix); + Uniform_State<4>(*programObject, location + i, transposedMatrix); } else { - auto* ttype = programObject.GetUniformTType(location); - if (ttype->isTexture() || ttype->isImage()) { - programObject.SetUniformSamplerOrImageUnitIndex(location, *value); + // No transpose needed, directly copy the matrix data + Uniform_State<4>(*programObject, location + i, value + i * 4); + } + } + } + + void UniformMatrix3fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { + // For 3x3 matrices, we have 9 elements per matrix + // If transpose is GL_TRUE, we need to transpose the matrix data + if (location == -1) return; + + auto& programObject = MG_State::pGLContext->GetCurrentProgram(); + if (programObject == nullptr) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, "There is no current program object.")); + return; + } + + if (location > programObject->GetMaxUniformLocation() || location < -1) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " is an invalid uniform location for the current program " + "object and location " + + std::to_string(location) + " is not equal to -1.")); + return; + } + + // For matrix uniforms, we handle each matrix individually + // Handle padding in mat3 correctly!! + for (GLint i = 0; i < count; i++) { + if (transpose == GL_TRUE) { + // Transpose the matrix before uploading + GLfloat transposedMatrix[9]; + TransposeMatrix3x3(value + i * 9, transposedMatrix); + for (int row = 0; row < 3; ++row) { + Uniform_State<3>(*programObject, location + i, transposedMatrix + row * 3, row * 4 * sizeof(float)); + } + } else { + // No transpose needed, directly copy the matrix data + for (int row = 0; row < 3; ++row) { + Uniform_State<3>(*programObject, location + i, value + i * 9 + row * 3, row * 4 * sizeof(float)); } } } + } - template - void Uniformv_State(GLint location, GLsizei count, T* value) { - if (location == -1) return; + void UniformMatrix4fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { + // For 4x4 matrices, we have 16 elements per matrix + // If transpose is GL_TRUE, we need to transpose the matrix data + if (location == -1) return; - auto programObject = MG_State::pGLContext->GetCurrentProgram(); - if (programObject == nullptr) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, "There is no current program object.")); - return; - } + auto& programObject = MG_State::pGLContext->GetCurrentProgram(); + if (programObject == nullptr) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, "There is no current program object.")); + return; + } - if (location > programObject->GetMaxUniformLocation() || location < -1) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "location " + std::to_string(location) + - " is an invalid uniform location for the current program " - "object and location " + - std::to_string(location) + " is not equal to -1.")); - return; - } + if (location > programObject->GetMaxUniformLocation() || location < -1) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " is an invalid uniform location for the current program " + "object and location " + + std::to_string(location) + " is not equal to -1.")); + return; + } - for (GLint offset = 0; offset < count; offset++) { - Uniform_State(*programObject, location + offset, value + offset * ItemCount); + // For matrix uniforms, we handle each matrix individually + for (GLint i = 0; i < count; i++) { + if (transpose == GL_TRUE) { + // Transpose the matrix before uploading + GLfloat transposedMatrix[16]; + TransposeMatrix4x4(value + i * 16, transposedMatrix); + Uniform_State<16>(*programObject, location + i, transposedMatrix); + } else { + // No transpose needed, directly copy the matrix data + Uniform_State<16>(*programObject, location + i, value + i * 16); } } - - // Helper function to transpose a 2x2 matrix - void TransposeMatrix2x2(const GLfloat* input, GLfloat* output) { - // Input matrix is in column-major order (OpenGL default) - // [0 2] - // [1 3] - // - // Output matrix should be in row-major order if transpose is true - // [0 1] - // [2 3] - output[0] = input[0]; // 0,0 element stays the same - output[1] = input[2]; // 0,1 element becomes 1,0 - output[2] = input[1]; // 1,0 element becomes 0,1 - output[3] = input[3]; // 1,1 element stays the same - } - - // Helper function to transpose a 3x3 matrix - void TransposeMatrix3x3(const GLfloat* input, GLfloat* output) { - // Input matrix is in column-major order (OpenGL default) - // [0 3 6] - // [1 4 7] - // [2 5 8] - // - // Output matrix should be in row-major order if transpose is true - // [0 1 2] - // [3 4 5] - // [6 7 8] - output[0] = input[0]; // 0,0 element stays the same - output[1] = input[3]; // 0,1 element becomes 1,0 - output[2] = input[6]; // 0,2 element becomes 2,0 - output[3] = input[1]; // 1,0 element becomes 0,1 - output[4] = input[4]; // 1,1 element stays the same - output[5] = input[7]; // 1,2 element becomes 2,1 - output[6] = input[2]; // 2,0 element becomes 0,2 - output[7] = input[5]; // 2,1 element becomes 1,2 - output[8] = input[8]; // 2,2 element stays the same - } - - // Helper function to transpose a 4x4 matrix - void TransposeMatrix4x4(const GLfloat* input, GLfloat* output) { - // Input matrix is in column-major order (OpenGL default) - // [0 4 8 12] - // [1 5 9 13] - // [2 6 10 14] - // [3 7 11 15] - // - // Output matrix should be in row-major order if transpose is true - // [0 1 2 3] - // [4 5 6 7] - // [8 9 10 11] - // [12 13 14 15] - output[0] = input[0]; // 0,0 element stays the same - output[1] = input[4]; // 0,1 element becomes 1,0 - output[2] = input[8]; // 0,2 element becomes 2,0 - output[3] = input[12]; // 0,3 element becomes 3,0 - output[4] = input[1]; // 1,0 element becomes 0,1 - output[5] = input[5]; // 1,1 element stays the same - output[6] = input[9]; // 1,2 element becomes 2,1 - output[7] = input[13]; // 1,3 element becomes 3,1 - output[8] = input[2]; // 2,0 element becomes 0,2 - output[9] = input[6]; // 2,1 element becomes 1,2 - output[10] = input[10]; // 2,2 element stays the same - output[11] = input[14]; // 2,3 element becomes 3,2 - output[12] = input[3]; // 3,0 element becomes 0,3 - output[13] = input[7]; // 3,1 element becomes 1,3 - output[14] = input[11]; // 3,2 element becomes 2,3 - output[15] = input[15]; // 3,3 element stays the same - } - - void Uniform1fv_State(GLint location, GLsizei count, const GLfloat* value) { - Uniformv_State<1>(location, count, value); - } - - void Uniform2fv_State(GLint location, GLsizei count, const GLfloat* value) { - Uniformv_State<2>(location, count, value); - } - - void Uniform3fv_State(GLint location, GLsizei count, const GLfloat* value) { - Uniformv_State<3>(location, count, value); - } - - void Uniform4fv_State(GLint location, GLsizei count, const GLfloat* value) { - Uniformv_State<4>(location, count, value); - } - - void Uniform1iv_State(GLint location, GLsizei count, const GLint* value) { - Uniformv_State<1>(location, count, value); - } - - void Uniform2iv_State(GLint location, GLsizei count, const GLint* value) { - Uniformv_State<2>(location, count, value); - } - - void Uniform3iv_State(GLint location, GLsizei count, const GLint* value) { - Uniformv_State<3>(location, count, value); - } - - void Uniform4iv_State(GLint location, GLsizei count, const GLint* value) { - Uniformv_State<4>(location, count, value); - } - - void UniformMatrix2fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { - // For 2x2 matrices, we have 4 elements per matrix - // If transpose is GL_TRUE, we need to transpose the matrix data - if (location == -1) return; - - auto programObject = MG_State::pGLContext->GetCurrentProgram(); - if (programObject == nullptr) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, "There is no current program object.")); - return; - } - - if (location > programObject->GetMaxUniformLocation() || location < -1) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "location " + std::to_string(location) + - " is an invalid uniform location for the current program " - "object and location " + - std::to_string(location) + " is not equal to -1.")); - return; - } - - // For matrix uniforms, we handle each matrix individually - for (GLint i = 0; i < count; i++) { - if (transpose == GL_TRUE) { - // Transpose the matrix before uploading - GLfloat transposedMatrix[4]; - TransposeMatrix2x2(value + i * 4, transposedMatrix); - Uniform_State<4>(*programObject, location + i, transposedMatrix); - } else { - // No transpose needed, directly copy the matrix data - Uniform_State<4>(*programObject, location + i, value + i * 4); - } - } - } - - void UniformMatrix3fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { - // For 3x3 matrices, we have 9 elements per matrix - // If transpose is GL_TRUE, we need to transpose the matrix data - if (location == -1) return; - - auto programObject = MG_State::pGLContext->GetCurrentProgram(); - if (programObject == nullptr) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, "There is no current program object.")); - return; - } - - if (location > programObject->GetMaxUniformLocation() || location < -1) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "location " + std::to_string(location) + - " is an invalid uniform location for the current program " - "object and location " + - std::to_string(location) + " is not equal to -1.")); - return; - } - - // For matrix uniforms, we handle each matrix individually - // Handle padding in mat3 correctly!! - for (GLint i = 0; i < count; i++) { - if (transpose == GL_TRUE) { - // Transpose the matrix before uploading - GLfloat transposedMatrix[9]; - TransposeMatrix3x3(value + i * 9, transposedMatrix); - for (int row = 0; row < 3; ++row) { - Uniform_State<3>(*programObject, location + i, transposedMatrix + row * 3, - row * 4 * sizeof(float)); - } - } else { - // No transpose needed, directly copy the matrix data - for (int row = 0; row < 3; ++row) { - Uniform_State<3>(*programObject, location + i, value + i * 9 + row * 3, - row * 4 * sizeof(float)); - } - } - } - } - - void UniformMatrix4fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { - // For 4x4 matrices, we have 16 elements per matrix - // If transpose is GL_TRUE, we need to transpose the matrix data - if (location == -1) return; - - auto programObject = MG_State::pGLContext->GetCurrentProgram(); - if (programObject == nullptr) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, "There is no current program object.")); - return; - } - - if (location > programObject->GetMaxUniformLocation() || location < -1) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "location " + std::to_string(location) + - " is an invalid uniform location for the current program " - "object and location " + - std::to_string(location) + " is not equal to -1.")); - return; - } - - // For matrix uniforms, we handle each matrix individually - for (GLint i = 0; i < count; i++) { - if (transpose == GL_TRUE) { - // Transpose the matrix before uploading - GLfloat transposedMatrix[16]; - TransposeMatrix4x4(value + i * 16, transposedMatrix); - Uniform_State<16>(*programObject, location + i, transposedMatrix); - } else { - // No transpose needed, directly copy the matrix data - Uniform_State<16>(*programObject, location + i, value + i * 16); - } - } - } - - GLuint GetUniformBlockIndex_State(GLuint program, const GLchar* uniformBlockName) { - const auto& programObject = TryToGetProgramObject(program); - if (!programObject) return GL_INVALID_INDEX; - if (!programObject->GetLinkStatus()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(program) + - " is not a program object that has been linked.")); - return GL_INVALID_INDEX; - } - - const auto& index = programObject->GetUniformBlockIndex(uniformBlockName); - return index; - } - - void UniformBlockBinding_State(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { - const auto& programObject = TryToGetProgramObject(program); - if (!programObject->GetLinkStatus()) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "Program object" + - std::to_string(program) + - " that has been linked.")); - return; - } - if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", __func__, - "uniformBlockIndex " + std::to_string(uniformBlockIndex) + - " is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is " - "not the index of an active uniform block in program" + - std::to_string(program) + ".")); - return; - } - programObject->SetUniformBlockBinding(uniformBlockIndex, uniformBlockBinding); - } - - void GetActiveUniformBlockiv_State(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) { - const auto& programObject = TryToGetProgramObject(program); - if (!programObject->GetLinkStatus()) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "Program object" + - std::to_string(program) + - " that has been linked.")); - return; - } - if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", __func__, - "uniformBlockIndex " + std::to_string(uniformBlockIndex) + - " is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is " - "not the index of an active uniform block in program" + - std::to_string(program) + ".")); - return; - } - switch (pname) { - case GL_UNIFORM_BLOCK_DATA_SIZE: { - *params = programObject->GetUBOSizeAt(uniformBlockIndex); - MGLOG_D("%s: GL_UNIFORM_BLOCK_DATA_SIZE = %d", __func__, *params); - break; - } - case GL_UNIFORM_BLOCK_NAME_LENGTH: { - *params = programObject->GetUniformBlockName(uniformBlockIndex).length() + 1; - MGLOG_D("%s: GL_UNIFORM_BLOCK_NAME_LENGTH = %d", __func__, *params); - break; - } - case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS: { - // TODO: deduct global ubo? - *params = programObject->GetActiveUniformBlocksCount(); - MGLOG_D("%s: GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = %d", __func__, *params); - break; - } - case GL_UNIFORM_BLOCK_BINDING: { - // TODO - MGLOG_D("%s: GL_UNIFORM_BLOCK_BINDING = ", __func__, *params); - } - case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: - case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: - case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER: - case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER: - case GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER: - case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: - case GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER: - default: - MGLOG_E("%s: unknown pname = %p %s", __func__, pname, MG_Util::ConvertGLEnumToString(pname).c_str()); - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", __func__, - "pname " + std::to_string(pname) + - " is not one of the accepted tokens.")); - break; - } - } - - void GetActiveUniformBlockName_State(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, - GLchar* uniformBlockName) { - auto programObject = TryToGetProgramObject(program); - if (!programObject) return; - if (!programObject->GetLinkStatus()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(program) + - " is not a program object that has been linked.")); - return; - } - if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", __func__, - "uniformBlockIndex " + std::to_string(uniformBlockIndex) + - " is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is " - "not the index of an active uniform block in program.")); - return; - } - const auto& name = programObject->GetUniformBlockName(uniformBlockIndex); - CopyStr(bufSize, length, uniformBlockName, name.c_str(), name.length()); - MGLOG_D("%s: \"%s\" at uniformBlockIndex %02d, length = %d", __func__, uniformBlockName, uniformBlockIndex, - *length); - } - - void BindFragDataLocation_State(GLuint program, GLuint colorNumber, const char* name) { - auto programObject = TryToGetProgramObject(program); - if (programObject == nullptr) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(program) + " is not the name of a program object.")); - return; - } - if (strncmp(name, "gl_", 3) == 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - "name " + std::string(name) + - " starts with the reserved prefix `gl_`.")); - return; - } - // TODO: Emit error "if `colorNumber` is greater than or equal to `GL_MAX_DRAW_BUFFERS`" - - MGLOG_D("%s: loc %02d = \"%s\"", __func__, colorNumber, name); - programObject->SetExplicitFragmentOutLocation(colorNumber, name); - } - - GLint GetFragDataLocation_State(GLuint program, const char* name) { - auto programObject = TryToGetProgramObject(program); - if (programObject == nullptr) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, - std::to_string(program) + " is not the name of a program object.")); - return -1; - } - return programObject->GetFragmentDataLocation(name); - } - - void ValidateProgram_State(GLuint program) { - // THROW_UNIMPL_EXCEPTION; - } - - void AttachShader(GLuint program, GLuint shader) { - AttachShader_State(program, shader); - } - - void BindAttribLocation(GLuint program, GLuint index, const GLchar* name) { - BindAttribLocation_State(program, index, name); - } - - void CompileShader(GLuint shader) { - CompileShader_State(shader); - } - GLuint CreateProgram(void) { - return CreateProgram_State(); - } - - GLuint CreateShader(GLenum type) { - return CreateShader_State(type); - } - - void DeleteProgram(GLuint program) { - DeleteProgram_State(program); - } - - void DeleteShader(GLuint shader) { - DeleteShader_State(shader); - } - - void DetachShader(GLuint program, GLuint shader) { - DetachShader_State(program, shader); - } - - void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, - GLchar* name) { - GetActiveAttrib_State(program, index, bufSize, length, size, type, name); - } - - void GetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, - GLchar* name) { - GetActiveUniform_State(program, index, bufSize, length, size, type, name); - } - - void GetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) { - GetAttachedShaders_State(program, maxCount, count, shaders); - } - - GLint GetAttribLocation(GLuint program, const GLchar* name) { - return GetAttribLocation_State(program, name); - } - - void GetProgramiv(GLuint program, GLenum pname, GLint* params) { - GetProgramiv_State(program, pname, params); - } - - void GetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { - GetProgramInfoLog_State(program, bufSize, length, infoLog); - } - - void GetShaderiv(GLuint shader, GLenum pname, GLint* params) { - GetShaderiv_State(shader, pname, params); - } - - void GetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { - GetShaderInfoLog_State(shader, bufSize, length, infoLog); - } - - void GetShaderSource(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) { - GetShaderSource_State(shader, bufSize, length, source); - } - - GLint GetUniformLocation(GLuint program, const GLchar* name) { - return GetUniformLocation_State(program, name); - } - - void GetUniformfv(GLuint program, GLint location, GLfloat* params) { - GetUniformfv_State(program, location, params); - } - - void GetUniformiv(GLuint program, GLint location, GLint* params) { - GetUniformiv_State(program, location, params); - } - - GLboolean IsProgram(GLuint program) { - return IsProgram_State(program); - } - GLboolean IsShader(GLuint shader) { - return IsShader_State(shader); - } - - void LinkProgram(GLuint program) { - LinkProgram_State(program); - } - - void ShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length) { - ShaderSource_State(shader, count, string, length); - } - - void UseProgram(GLuint program) { - UseProgram_State(program); - } - - void Uniform1f(GLint location, GLfloat v0) { - Uniform1fv(location, 1, &v0); - } - - void Uniform2f(GLint location, GLfloat v0, GLfloat v1) { - GLfloat v[] = {v0, v1}; - Uniform2fv(location, 1, v); - } - - void Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { - GLfloat v[] = {v0, v1, v2}; - Uniform3fv(location, 1, v); - } - - void Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { - GLfloat v[] = {v0, v1, v2, v3}; - Uniform4fv(location, 1, v); - } - - void Uniform1i(GLint location, GLint v0) { - Uniform1iv(location, 1, &v0); - } - - void Uniform2i(GLint location, GLint v0, GLint v1) { - GLint v[] = {v0, v1}; - Uniform2iv(location, 1, v); - } - - void Uniform3i(GLint location, GLint v0, GLint v1, GLint v2) { - GLint v[] = {v0, v1, v2}; - Uniform3iv(location, 1, v); - } - - void Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { - GLint v[] = {v0, v1, v2, v3}; - Uniform4iv(location, 1, v); - } - - void Uniform1fv(GLint location, GLsizei count, const GLfloat* value) { - Uniform1fv_State(location, count, value); - } - - void Uniform2fv(GLint location, GLsizei count, const GLfloat* value) { - Uniform2fv_State(location, count, value); - } - - void Uniform3fv(GLint location, GLsizei count, const GLfloat* value) { - Uniform3fv_State(location, count, value); - } - - void Uniform4fv(GLint location, GLsizei count, const GLfloat* value) { - Uniform4fv_State(location, count, value); - } - - void Uniform1iv(GLint location, GLsizei count, const GLint* value) { - Uniform1iv_State(location, count, value); - } - - void Uniform2iv(GLint location, GLsizei count, const GLint* value) { - Uniform2iv_State(location, count, value); - } - - void Uniform3iv(GLint location, GLsizei count, const GLint* value) { - Uniform3iv_State(location, count, value); - } - - void Uniform4iv(GLint location, GLsizei count, const GLint* value) { - Uniform4iv_State(location, count, value); - } - - void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { - UniformMatrix2fv_State(location, count, transpose, value); - } - - void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { - UniformMatrix3fv_State(location, count, transpose, value); - } - - void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { - UniformMatrix4fv_State(location, count, transpose, value); - } - - GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName) { - return GetUniformBlockIndex_State(program, uniformBlockName); - } - - void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { - UniformBlockBinding_State(program, uniformBlockIndex, uniformBlockBinding); - } - - void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) { - GetActiveUniformBlockiv_State(program, uniformBlockIndex, pname, params); - } - - void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, - GLchar* uniformBlockName) { - GetActiveUniformBlockName_State(program, uniformBlockIndex, bufSize, length, uniformBlockName); - } - - void BindFragDataLocation(GLuint program, GLuint colorNumber, const char* name) { - BindFragDataLocation_State(program, colorNumber, name); - } - - GLint GetFragDataLocation(GLuint program, const char* name) { - return GetFragDataLocation_State(program, name); - } - - void ValidateProgram(GLuint program) { - ValidateProgram_State(program); - } - } // namespace MG_Impl::GLImpl -} // namespace MobileGL + } + + GLuint GetUniformBlockIndex_State(GLuint program, const GLchar* uniformBlockName) { + const auto& programObject = TryToGetProgramObject(program); + if (!programObject) return GL_INVALID_INDEX; + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(program) + + " is not a program object that has been linked.")); + return GL_INVALID_INDEX; + } + + const auto& index = programObject->GetUniformBlockIndex(uniformBlockName); + return index; + } + + void UniformBlockBinding_State(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { + const auto& programObject = TryToGetProgramObject(program); + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "Program object" + std::to_string(program) + " that has been linked.")); + return; + } + if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", __func__, + "uniformBlockIndex " + std::to_string(uniformBlockIndex) + + " is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is " + "not the index of an active uniform block in program" + + std::to_string(program) + ".")); + return; + } + programObject->SetUniformBlockBinding(uniformBlockIndex, uniformBlockBinding); + } + + void GetActiveUniformBlockiv_State(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) { + const auto& programObject = TryToGetProgramObject(program); + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "Program object" + std::to_string(program) + " that has been linked.")); + return; + } + if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", __func__, + "uniformBlockIndex " + std::to_string(uniformBlockIndex) + + " is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is " + "not the index of an active uniform block in program" + + std::to_string(program) + ".")); + return; + } + switch (pname) { + case GL_UNIFORM_BLOCK_DATA_SIZE: { + *params = (GLint)programObject->GetUBOSizeAt(uniformBlockIndex); + MGLOG_D("%s: GL_UNIFORM_BLOCK_DATA_SIZE = %d", __func__, *params); + break; + } + case GL_UNIFORM_BLOCK_NAME_LENGTH: { + *params = (GLint)programObject->GetUniformBlockName(uniformBlockIndex).length() + 1; + MGLOG_D("%s: GL_UNIFORM_BLOCK_NAME_LENGTH = %d", __func__, *params); + break; + } + case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS: { + // TODO: deduct global ubo? + *params = programObject->GetActiveUniformBlocksCount(); + MGLOG_D("%s: GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = %d", __func__, *params); + break; + } + case GL_UNIFORM_BLOCK_BINDING: { + // TODO + MGLOG_D("%s: GL_UNIFORM_BLOCK_BINDING = ", __func__, *params); + } + case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: + case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: + case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER: + case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER: + case GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER: + case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: + case GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER: + default: + MGLOG_E("%s: unknown pname = %p %s", __func__, pname, MG_Util::ConvertGLEnumToString(pname).c_str()); + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", __func__, + "pname " + std::to_string(pname) + " is not one of the accepted tokens.")); + break; + } + } + + void GetActiveUniformBlockName_State(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, + GLchar* uniformBlockName) { + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(program) + + " is not a program object that has been linked.")); + return; + } + if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", __func__, + "uniformBlockIndex " + std::to_string(uniformBlockIndex) + + " is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is " + "not the index of an active uniform block in program.")); + return; + } + const auto& name = programObject->GetUniformBlockName(uniformBlockIndex); + CopyStr(bufSize, length, uniformBlockName, name.c_str(), (GLsizei)name.length()); + MGLOG_D("%s: \"%s\" at uniformBlockIndex %02d, length = %d", __func__, uniformBlockName, uniformBlockIndex, + *length); + } + + void BindFragDataLocation_State(GLuint program, GLuint colorNumber, const char* name) { + auto& programObject = TryToGetProgramObject(program); + if (programObject == nullptr) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(program) + " is not the name of a program object.")); + return; + } + if (strncmp(name, "gl_", 3) == 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "name " + std::string(name) + " starts with the reserved prefix `gl_`.")); + return; + } + // TODO: Emit error "if `colorNumber` is greater than or equal to `GL_MAX_DRAW_BUFFERS`" + + MGLOG_D("%s: loc %02d = \"%s\"", __func__, colorNumber, name); + programObject->SetExplicitFragmentOutLocation(colorNumber, name); + } + + GLint GetFragDataLocation_State(GLuint program, const char* name) { + auto& programObject = TryToGetProgramObject(program); + if (programObject == nullptr) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + std::to_string(program) + " is not the name of a program object.")); + return -1; + } + return programObject->GetFragmentDataLocation(name); + } + + void ValidateProgram_State(GLuint program) { + // THROW_UNIMPL_EXCEPTION; + } + + void AttachShader(GLuint program, GLuint shader) { + AttachShader_State(program, shader); + } + + void BindAttribLocation(GLuint program, GLuint index, const GLchar* name) { + BindAttribLocation_State(program, index, name); + } + + void CompileShader(GLuint shader) { + CompileShader_State(shader); + } + GLuint CreateProgram(void) { + return CreateProgram_State(); + } + + GLuint CreateShader(GLenum type) { + return CreateShader_State(type); + } + + void DeleteProgram(GLuint program) { + DeleteProgram_State(program); + } + + void DeleteShader(GLuint shader) { + DeleteShader_State(shader); + } + + void DetachShader(GLuint program, GLuint shader) { + DetachShader_State(program, shader); + } + + void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, + GLchar* name) { + GetActiveAttrib_State(program, index, bufSize, length, size, type, name); + } + + void GetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, + GLchar* name) { + GetActiveUniform_State(program, index, bufSize, length, size, type, name); + } + + void GetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) { + GetAttachedShaders_State(program, maxCount, count, shaders); + } + + GLint GetAttribLocation(GLuint program, const GLchar* name) { + return GetAttribLocation_State(program, name); + } + + void GetProgramiv(GLuint program, GLenum pname, GLint* params) { + GetProgramiv_State(program, pname, params); + } + + void GetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { + GetProgramInfoLog_State(program, bufSize, length, infoLog); + } + + void GetShaderiv(GLuint shader, GLenum pname, GLint* params) { + GetShaderiv_State(shader, pname, params); + } + + void GetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { + GetShaderInfoLog_State(shader, bufSize, length, infoLog); + } + + void GetShaderSource(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) { + GetShaderSource_State(shader, bufSize, length, source); + } + + GLint GetUniformLocation(GLuint program, const GLchar* name) { + return GetUniformLocation_State(program, name); + } + + void GetUniformfv(GLuint program, GLint location, GLfloat* params) { + GetUniformfv_State(program, location, params); + } + + void GetUniformiv(GLuint program, GLint location, GLint* params) { + GetUniformiv_State(program, location, params); + } + + GLboolean IsProgram(GLuint program) { + return IsProgram_State(program); + } + GLboolean IsShader(GLuint shader) { + return IsShader_State(shader); + } + + void LinkProgram(GLuint program) { + LinkProgram_State(program); + } + + void ShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length) { + ShaderSource_State(shader, count, string, length); + } + + void UseProgram(GLuint program) { + UseProgram_State(program); + } + + void Uniform1f(GLint location, GLfloat v0) { + Uniform1fv(location, 1, &v0); + } + + void Uniform2f(GLint location, GLfloat v0, GLfloat v1) { + GLfloat v[] = {v0, v1}; + Uniform2fv(location, 1, v); + } + + void Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { + GLfloat v[] = {v0, v1, v2}; + Uniform3fv(location, 1, v); + } + + void Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { + GLfloat v[] = {v0, v1, v2, v3}; + Uniform4fv(location, 1, v); + } + + void Uniform1i(GLint location, GLint v0) { + Uniform1iv(location, 1, &v0); + } + + void Uniform2i(GLint location, GLint v0, GLint v1) { + GLint v[] = {v0, v1}; + Uniform2iv(location, 1, v); + } + + void Uniform3i(GLint location, GLint v0, GLint v1, GLint v2) { + GLint v[] = {v0, v1, v2}; + Uniform3iv(location, 1, v); + } + + void Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { + GLint v[] = {v0, v1, v2, v3}; + Uniform4iv(location, 1, v); + } + + void Uniform1fv(GLint location, GLsizei count, const GLfloat* value) { + Uniform1fv_State(location, count, value); + } + + void Uniform2fv(GLint location, GLsizei count, const GLfloat* value) { + Uniform2fv_State(location, count, value); + } + + void Uniform3fv(GLint location, GLsizei count, const GLfloat* value) { + Uniform3fv_State(location, count, value); + } + + void Uniform4fv(GLint location, GLsizei count, const GLfloat* value) { + Uniform4fv_State(location, count, value); + } + + void Uniform1iv(GLint location, GLsizei count, const GLint* value) { + Uniform1iv_State(location, count, value); + } + + void Uniform2iv(GLint location, GLsizei count, const GLint* value) { + Uniform2iv_State(location, count, value); + } + + void Uniform3iv(GLint location, GLsizei count, const GLint* value) { + Uniform3iv_State(location, count, value); + } + + void Uniform4iv(GLint location, GLsizei count, const GLint* value) { + Uniform4iv_State(location, count, value); + } + + void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { + UniformMatrix2fv_State(location, count, transpose, value); + } + + void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { + UniformMatrix3fv_State(location, count, transpose, value); + } + + void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { + UniformMatrix4fv_State(location, count, transpose, value); + } + + GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName) { + return GetUniformBlockIndex_State(program, uniformBlockName); + } + + void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { + UniformBlockBinding_State(program, uniformBlockIndex, uniformBlockBinding); + } + + void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) { + GetActiveUniformBlockiv_State(program, uniformBlockIndex, pname, params); + } + + void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, + GLchar* uniformBlockName) { + GetActiveUniformBlockName_State(program, uniformBlockIndex, bufSize, length, uniformBlockName); + } + + void BindFragDataLocation(GLuint program, GLuint colorNumber, const char* name) { + BindFragDataLocation_State(program, colorNumber, name); + } + + GLint GetFragDataLocation(GLuint program, const char* name) { + return GetFragDataLocation_State(program, name); + } + + void ValidateProgram(GLuint program) { + ValidateProgram_State(program); + } +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.h b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.h index a5c66926..53f56a90 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.h +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.h @@ -9,61 +9,59 @@ #pragma once #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - void AttachShader(GLuint program, GLuint shader); - void BindAttribLocation(GLuint program, GLuint index, const GLchar* name); - void CompileShader(GLuint shader); - GLuint CreateProgram(void); - GLuint CreateShader(GLenum type); - void DeleteProgram(GLuint program); - void DeleteShader(GLuint shader); - void DetachShader(GLuint program, GLuint shader); - void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, - GLchar* name); - void GetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, - GLchar* name); - void GetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); - GLint GetAttribLocation(GLuint program, const GLchar* name); - void GetProgramiv(GLuint program, GLenum pname, GLint* params); - void GetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); - void GetShaderiv(GLuint shader, GLenum pname, GLint* params); - void GetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); - void GetShaderSource(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source); - GLint GetUniformLocation(GLuint program, const GLchar* name); - void GetUniformfv(GLuint program, GLint location, GLfloat* params); - void GetUniformiv(GLuint program, GLint location, GLint* params); - GLboolean IsProgram(GLuint program); - GLboolean IsShader(GLuint shader); - void LinkProgram(GLuint program); - void ShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length); - void UseProgram(GLuint program); - void Uniform1f(GLint location, GLfloat v0); - void Uniform2f(GLint location, GLfloat v0, GLfloat v1); - void Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - void Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - void Uniform1i(GLint location, GLint v0); - void Uniform2i(GLint location, GLint v0, GLint v1); - void Uniform3i(GLint location, GLint v0, GLint v1, GLint v2); - void Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - void Uniform1fv(GLint location, GLsizei count, const GLfloat* value); - void Uniform2fv(GLint location, GLsizei count, const GLfloat* value); - void Uniform3fv(GLint location, GLsizei count, const GLfloat* value); - void Uniform4fv(GLint location, GLsizei count, const GLfloat* value); - void Uniform1iv(GLint location, GLsizei count, const GLint* value); - void Uniform2iv(GLint location, GLsizei count, const GLint* value); - void Uniform3iv(GLint location, GLsizei count, const GLint* value); - void Uniform4iv(GLint location, GLsizei count, const GLint* value); - void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); - void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); - void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); - GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName); - void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); - void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); - void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, - GLchar* uniformBlockName); - void BindFragDataLocation(GLuint program, GLuint colorNumber, const char* name); - GLint GetFragDataLocation(GLuint program, const char* name); - void ValidateProgram(GLuint program); - } // namespace MG_Impl::GLImpl -} // namespace MobileGL +namespace MobileGL::MG_Impl::GLImpl { + void AttachShader(GLuint program, GLuint shader); + void BindAttribLocation(GLuint program, GLuint index, const GLchar* name); + void CompileShader(GLuint shader); + GLuint CreateProgram(void); + GLuint CreateShader(GLenum type); + void DeleteProgram(GLuint program); + void DeleteShader(GLuint shader); + void DetachShader(GLuint program, GLuint shader); + void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, + GLchar* name); + void GetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, + GLchar* name); + void GetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); + GLint GetAttribLocation(GLuint program, const GLchar* name); + void GetProgramiv(GLuint program, GLenum pname, GLint* params); + void GetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); + void GetShaderiv(GLuint shader, GLenum pname, GLint* params); + void GetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); + void GetShaderSource(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source); + GLint GetUniformLocation(GLuint program, const GLchar* name); + void GetUniformfv(GLuint program, GLint location, GLfloat* params); + void GetUniformiv(GLuint program, GLint location, GLint* params); + GLboolean IsProgram(GLuint program); + GLboolean IsShader(GLuint shader); + void LinkProgram(GLuint program); + void ShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length); + void UseProgram(GLuint program); + void Uniform1f(GLint location, GLfloat v0); + void Uniform2f(GLint location, GLfloat v0, GLfloat v1); + void Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + void Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + void Uniform1i(GLint location, GLint v0); + void Uniform2i(GLint location, GLint v0, GLint v1); + void Uniform3i(GLint location, GLint v0, GLint v1, GLint v2); + void Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + void Uniform1fv(GLint location, GLsizei count, const GLfloat* value); + void Uniform2fv(GLint location, GLsizei count, const GLfloat* value); + void Uniform3fv(GLint location, GLsizei count, const GLfloat* value); + void Uniform4fv(GLint location, GLsizei count, const GLfloat* value); + void Uniform1iv(GLint location, GLsizei count, const GLint* value); + void Uniform2iv(GLint location, GLsizei count, const GLint* value); + void Uniform3iv(GLint location, GLsizei count, const GLint* value); + void Uniform4iv(GLint location, GLsizei count, const GLint* value); + void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); + void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); + void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); + GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName); + void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); + void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); + void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, + GLchar* uniformBlockName); + void BindFragDataLocation(GLuint program, GLuint colorNumber, const char* name); + GLint GetFragDataLocation(GLuint program, const char* name); + void ValidateProgram(GLuint program); +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.cpp b/MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.cpp index bc3b9150..b32e7aab 100644 --- a/MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.cpp +++ b/MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.cpp @@ -7,474 +7,467 @@ // End of Source File Header #include "GL_RenderState.h" -#include "MG_State/GLState/RenderState/RenderState.h" -#include "MG_Util/Converters/GLToStr/GLEnumConverter.h" #include +#include #include #include #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - void Viewport_State(GLint x, GLint y, GLsizei width, GLsizei height) { - if (width < 0 || height < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "Viewport_State", - "Width abd height must be non-negative.")); - return; - } - - MG_State::pGLContext->SetViewport(IntVec4(x, y, width, height)); - } - - void StencilOpSeparate_State(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { - // TODO: implement - } - - void StencilOp_State(GLenum fail, GLenum zfail, GLenum zpass) { - // TODO: implement - } - - void StencilMaskSeparate_State(GLenum face, GLuint mask) { - // TODO: implement - } - - void StencilMask_State(GLuint mask) { - // TODO: implement - } - - void StencilFuncSeparate_State(GLenum face, GLenum func, GLint ref, GLuint mask) { - // TODO: implement - } - - void StencilFunc_State(GLenum func, GLint ref, GLuint mask) { - // TODO: implement - } - - void Scissor_State(GLint x, GLint y, GLsizei width, GLsizei height) { - if (width < 0 || height < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "Scissor_State", - "Width abd height must be non-negative.")); - return; - } - - MG_State::pGLContext->SetScissorBox(IntVec4(x, y, width, height)); - } - - void SampleCoverage_State(GLfloat value, GLboolean invert) { - // TODO: implement - } - - void PolygonOffset_State(GLfloat factor, GLfloat units) { - // TODO: implement - } - - void PolygonMode_State(GLenum face, GLenum mode) { - // TODO: implement - } - - void PointSize_State(GLfloat size) { - // TODO: implement - } - - void PointParameterf_State(GLenum pname, GLfloat param) { - // TODO: implement - } - - void PointParameteri_State(GLenum pname, GLint param) { - // TODO: implement - } - - void PixelStorei_State(GLenum pname, GLint param) { - MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), param); - PixelStoreParam pixelStoreParam = MG_Util::ConvertGLEnumToPixelStoreParam(pname); - if (pixelStoreParam == PixelStoreParam::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "PixelStorei_State", - "Pixel store param enum " + - MG_Util::ConvertPixelStoreParamToString(pixelStoreParam) + "(" + - MG_Util::ConvertGLEnumToString(pname) + ") is not supported.")); - return; - } - - MG_State::pGLContext->SetPixelStoreParam(pixelStoreParam, param); - } - - void LogicOp_State(GLenum opcode) { - // TODO: implement - } - - void LineWidth_State(GLfloat width) { - // TODO: implement - } - - GLboolean IsEnabledi_State(GLenum target, GLuint index) { - CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(target); - if (capInput == CapabilityInput::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "IsEnabledi_State", - "Capability enum " + - MG_Util::ConvertCapabilityInputToString(capInput) + "(" + - MG_Util::ConvertGLEnumToString(target) + ") is not supported.")); - return GL_FALSE; - } - - return MG_State::pGLContext->IsCapabilityEnabledIndexed(capInput, index) ? GL_TRUE : GL_FALSE; - } - - GLboolean IsEnabled_State(GLenum cap) { - CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap); - if (capInput == CapabilityInput::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared( - "MG_Impl/GLImpl", "IsEnabled_State", - "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + - "(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported.")); - return GL_FALSE; - } - - return MG_State::pGLContext->IsCapabilityEnabled(capInput) ? GL_TRUE : GL_FALSE; - } - - void Hint_State(GLenum target, GLenum mode) { - // TODO: implement - } - - void FrontFace_State(GLenum mode) { - // TODO: implement - } - - void Enable_State(GLenum cap) { - CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap); - if (capInput == CapabilityInput::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared( - "MG_Impl/GLImpl", "Enable_State", - "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + - "(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported.")); - return; - } - - MG_State::pGLContext->SetCapability(capInput, true); - } - - void Disable_State(GLenum cap) { - CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap); - if (capInput == CapabilityInput::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared( - "MG_Impl/GLImpl", "Disable_State", - "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + - "(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported.")); - return; - } - - MG_State::pGLContext->SetCapability(capInput, false); - } - - void DepthRange_State(GLclampd near_val, GLclampd far_val) { - // TODO: implement - } - - void DepthMask_State(GLboolean flag) { - MG_State::pGLContext->SetDepthMask(flag == GL_TRUE); - } - - void DepthFunc_State(GLenum func) { - DepthTestFunc depthFunc = MG_Util::ConvertGLEnumToDepthTestFunc(func); - if (depthFunc == DepthTestFunc::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "DepthFunc_State", - "Depth function enum " + - MG_Util::ConvertDepthTestFuncToString(depthFunc) + "(" + - MG_Util::ConvertGLEnumToString(func) + ") is not supported.")); - return; - } - - MG_State::pGLContext->SetDepthFunc(depthFunc); - } - - void CullFace_State(GLenum mode) { - CullFaceMode cullFaceMode = MG_Util::ConvertGLEnumToCullFaceMode(mode); - if (cullFaceMode == CullFaceMode::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "CullFace_State", - "Cull face mode enum " + - MG_Util::ConvertCullFaceModeToString(cullFaceMode) + "(" + - MG_Util::ConvertGLEnumToString(mode) + ") is not supported.")); - return; - } - - MG_State::pGLContext->SetCullFaceMode(cullFaceMode); - } - - void ColorMask_State(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { - MG_State::pGLContext->SetColorMask( - BoolVec4(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE)); - } - - void ClampColor_State(GLenum target, GLenum clamp) { - // TODO: implement - } - - void BlendFuncSeparate_State(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { - BlendFactor srcRGB = MG_Util::ConvertGLEnumToBlendFactor(sfactorRGB); - BlendFactor dstRGB = MG_Util::ConvertGLEnumToBlendFactor(dfactorRGB); - BlendFactor srcAlpha = MG_Util::ConvertGLEnumToBlendFactor(sfactorAlpha); - BlendFactor dstAlpha = MG_Util::ConvertGLEnumToBlendFactor(dfactorAlpha); - - if (srcRGB == BlendFactor::Unknown || dstRGB == BlendFactor::Unknown || srcAlpha == BlendFactor::Unknown || - dstAlpha == BlendFactor::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "BlendFuncSeparate_State", - "One of the blend factor enums is not supported: srcRGB " + - MG_Util::ConvertBlendFactorToString(srcRGB) + "(" + - MG_Util::ConvertGLEnumToString(sfactorRGB) + "), dstRGB " + - MG_Util::ConvertBlendFactorToString(dstRGB) + "(" + - MG_Util::ConvertGLEnumToString(dfactorRGB) + "), srcAlpha " + - MG_Util::ConvertBlendFactorToString(srcAlpha) + "(" + - MG_Util::ConvertGLEnumToString(sfactorAlpha) + "), dstAlpha " + - MG_Util::ConvertBlendFactorToString(dstAlpha) + "(" + - MG_Util::ConvertGLEnumToString(dfactorAlpha) + ").")); - return; - } - - MG_State::pGLContext->SetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); - } - - void BlendFunc_State(GLenum sfactor, GLenum dfactor) { - BlendFuncSeparate_State(sfactor, dfactor, sfactor, dfactor); - } - - void BlendEquation_State(GLenum mode) { - // TODO: implement - } - - void BlendColor_State(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { - // TODO: implement - } - - void ClearStencil_State(GLint s) { - MG_State::pGLContext->SetClearStencil(static_cast(s)); - } - - void ClearDepth_State(GLclampd depth) { - MG_State::pGLContext->SetClearDepth(static_cast(depth)); - } +namespace MobileGL::MG_Impl::GLImpl { + void Viewport_State(GLint x, GLint y, GLsizei width, GLsizei height) { + if (width < 0 || height < 0) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "Viewport_State", + "Width abd height must be non-negative.")); + return; + } + + MG_State::pGLContext->SetViewport(IntVec4(x, y, width, height)); + } + + void StencilOpSeparate_State(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { + // TODO: implement + } + + void StencilOp_State(GLenum fail, GLenum zfail, GLenum zpass) { + // TODO: implement + } + + void StencilMaskSeparate_State(GLenum face, GLuint mask) { + // TODO: implement + } + + void StencilMask_State(GLuint mask) { + // TODO: implement + } + + void StencilFuncSeparate_State(GLenum face, GLenum func, GLint ref, GLuint mask) { + // TODO: implement + } + + void StencilFunc_State(GLenum func, GLint ref, GLuint mask) { + // TODO: implement + } + + void Scissor_State(GLint x, GLint y, GLsizei width, GLsizei height) { + if (width < 0 || height < 0) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "Scissor_State", + "Width abd height must be non-negative.")); + return; + } + + MG_State::pGLContext->SetScissorBox(IntVec4(x, y, width, height)); + } + + void SampleCoverage_State(GLfloat value, GLboolean invert) { + // TODO: implement + } + + void PolygonOffset_State(GLfloat factor, GLfloat units) { + // TODO: implement + } + + void PolygonMode_State(GLenum face, GLenum mode) { + // TODO: implement + } + + void PointSize_State(GLfloat size) { + // TODO: implement + } + + void PointParameterf_State(GLenum pname, GLfloat param) { + // TODO: implement + } + + void PointParameteri_State(GLenum pname, GLint param) { + // TODO: implement + } + + void PixelStorei_State(GLenum pname, GLint param) { + MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), param); + PixelStoreParam pixelStoreParam = MG_Util::ConvertGLEnumToPixelStoreParam(pname); + if (pixelStoreParam == PixelStoreParam::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "PixelStorei_State", + "Pixel store param enum " + + MG_Util::ConvertPixelStoreParamToString(pixelStoreParam) + "(" + + MG_Util::ConvertGLEnumToString(pname) + ") is not supported.")); + return; + } + + MG_State::pGLContext->SetPixelStoreParam(pixelStoreParam, param); + } + + void LogicOp_State(GLenum opcode) { + // TODO: implement + } + + void LineWidth_State(GLfloat width) { + // TODO: implement + } + + GLboolean IsEnabledi_State(GLenum target, GLuint index) { + CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(target); + if (capInput == CapabilityInput::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "IsEnabledi_State", + "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + + "(" + MG_Util::ConvertGLEnumToString(target) + ") is not supported.")); + return GL_FALSE; + } + + return MG_State::pGLContext->IsCapabilityEnabledIndexed(capInput, index) ? GL_TRUE : GL_FALSE; + } + + GLboolean IsEnabled_State(GLenum cap) { + CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap); + if (capInput == CapabilityInput::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "IsEnabled_State", + "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + + "(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported.")); + return GL_FALSE; + } + + return MG_State::pGLContext->IsCapabilityEnabled(capInput) ? GL_TRUE : GL_FALSE; + } + + void Hint_State(GLenum target, GLenum mode) { + // TODO: implement + } + + void FrontFace_State(GLenum mode) { + // TODO: implement + } + + void Enable_State(GLenum cap) { + CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap); + if (capInput == CapabilityInput::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "Enable_State", + "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + + "(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported.")); + return; + } + + MG_State::pGLContext->SetCapability(capInput, true); + } + + void Disable_State(GLenum cap) { + CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap); + if (capInput == CapabilityInput::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "Disable_State", + "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + + "(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported.")); + return; + } + + MG_State::pGLContext->SetCapability(capInput, false); + } + + void DepthRange_State(GLclampd near_val, GLclampd far_val) { + // TODO: implement + } + + void DepthMask_State(GLboolean flag) { + MG_State::pGLContext->SetDepthMask(flag == GL_TRUE); + } + + void DepthFunc_State(GLenum func) { + DepthTestFunc depthFunc = MG_Util::ConvertGLEnumToDepthTestFunc(func); + if (depthFunc == DepthTestFunc::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "DepthFunc_State", + "Depth function enum " + MG_Util::ConvertDepthTestFuncToString(depthFunc) + + "(" + MG_Util::ConvertGLEnumToString(func) + ") is not supported.")); + return; + } + + MG_State::pGLContext->SetDepthFunc(depthFunc); + } + + void CullFace_State(GLenum mode) { + CullFaceMode cullFaceMode = MG_Util::ConvertGLEnumToCullFaceMode(mode); + if (cullFaceMode == CullFaceMode::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "CullFace_State", + "Cull face mode enum " + + MG_Util::ConvertCullFaceModeToString(cullFaceMode) + "(" + + MG_Util::ConvertGLEnumToString(mode) + ") is not supported.")); + return; + } + + MG_State::pGLContext->SetCullFaceMode(cullFaceMode); + } + + void ColorMask_State(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { + MG_State::pGLContext->SetColorMask( + BoolVec4(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE)); + } + + void ClampColor_State(GLenum target, GLenum clamp) { + // TODO: implement + } + + void BlendFuncSeparate_State(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { + BlendFactor srcRGB = MG_Util::ConvertGLEnumToBlendFactor(sfactorRGB); + BlendFactor dstRGB = MG_Util::ConvertGLEnumToBlendFactor(dfactorRGB); + BlendFactor srcAlpha = MG_Util::ConvertGLEnumToBlendFactor(sfactorAlpha); + BlendFactor dstAlpha = MG_Util::ConvertGLEnumToBlendFactor(dfactorAlpha); + + if (srcRGB == BlendFactor::Unknown || dstRGB == BlendFactor::Unknown || srcAlpha == BlendFactor::Unknown || + dstAlpha == BlendFactor::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "BlendFuncSeparate_State", + "One of the blend factor enums is not supported: srcRGB " + + MG_Util::ConvertBlendFactorToString(srcRGB) + "(" + + MG_Util::ConvertGLEnumToString(sfactorRGB) + "), dstRGB " + + MG_Util::ConvertBlendFactorToString(dstRGB) + "(" + + MG_Util::ConvertGLEnumToString(dfactorRGB) + "), srcAlpha " + + MG_Util::ConvertBlendFactorToString(srcAlpha) + "(" + + MG_Util::ConvertGLEnumToString(sfactorAlpha) + "), dstAlpha " + + MG_Util::ConvertBlendFactorToString(dstAlpha) + "(" + + MG_Util::ConvertGLEnumToString(dfactorAlpha) + ").")); + return; + } + + MG_State::pGLContext->SetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + void BlendFunc_State(GLenum sfactor, GLenum dfactor) { + BlendFuncSeparate_State(sfactor, dfactor, sfactor, dfactor); + } + + void BlendEquation_State(GLenum mode) { + // TODO: implement + } + + void BlendColor_State(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { + // TODO: implement + } + + void ClearStencil_State(GLint s) { + MG_State::pGLContext->SetClearStencil(static_cast(s)); + } + + void ClearDepth_State(GLclampd depth) { + MG_State::pGLContext->SetClearDepth(static_cast(depth)); + } + + void ClearColor_State(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { + MG_State::pGLContext->SetClearColor(FloatVec4(red, green, blue, alpha)); + } + + void BlendFuncSeparatei_State(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { + if (buf >= MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", "BlendFuncSeparatei_State", + "Buffer index " + std::to_string(buf) + " is out of range. Max supported is " + + std::to_string(MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS - 1) + ".")); + return; + } + + BlendFactor srcRGBM = MG_Util::ConvertGLEnumToBlendFactor(srcRGB); + BlendFactor dstRGBM = MG_Util::ConvertGLEnumToBlendFactor(dstRGB); + BlendFactor srcAlphaM = MG_Util::ConvertGLEnumToBlendFactor(srcAlpha); + BlendFactor dstAlphaM = MG_Util::ConvertGLEnumToBlendFactor(dstAlpha); + MG_State::pGLContext->SetBlendFuncIndexed(buf, srcRGBM, dstRGBM, srcAlphaM, dstAlphaM); + } + + void Disablei_State(GLenum target, GLuint index) { + auto capInput = MG_Util::ConvertGLEnumToCapabilityInput(target); + if (capInput == CapabilityInput::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "Disablei_State", + "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + + "(" + MG_Util::ConvertGLEnumToString(target) + ") is not supported.")); + return; + } + + MG_State::pGLContext->SetCapabilityIndexed(capInput, index, false); + } + + void Enablei_State(GLenum target, GLuint index) { + auto capInput = MG_Util::ConvertGLEnumToCapabilityInput(target); + if (capInput == CapabilityInput::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "Enablei_State", + "Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) + + "(" + MG_Util::ConvertGLEnumToString(target) + ") is not supported.")); + return; + } + + MG_State::pGLContext->SetCapabilityIndexed(capInput, index, true); + } + + /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ + void BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { + BlendFuncSeparatei_State(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + void Disablei(GLenum target, GLuint index) { + Disablei_State(target, index); + } + + void Enablei(GLenum target, GLuint index) { + Enablei_State(target, index); + } + + void BlendFunc(GLenum sfactor, GLenum dfactor) { + BlendFunc_State(sfactor, dfactor); + } + + void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) { + Viewport_State(x, y, width, height); + } + + void StencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { + StencilOpSeparate_State(face, sfail, dpfail, dppass); + } + + void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { + StencilOp_State(fail, zfail, zpass); + } + + void StencilMaskSeparate(GLenum face, GLuint mask) { + StencilMaskSeparate_State(face, mask); + } + + void StencilMask(GLuint mask) { + StencilMask_State(mask); + } + + void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { + StencilFuncSeparate_State(face, func, ref, mask); + } + + void StencilFunc(GLenum func, GLint ref, GLuint mask) { + StencilFunc_State(func, ref, mask); + } + + void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) { + Scissor_State(x, y, width, height); + } + + void SampleCoverage(GLfloat value, GLboolean invert) { + SampleCoverage_State(value, invert); + } + + void PolygonOffset(GLfloat factor, GLfloat units) { + PolygonOffset_State(factor, units); + } + + void PolygonMode(GLenum face, GLenum mode) { + PolygonMode_State(face, mode); + } + + void PointSize(GLfloat size) { + PointSize_State(size); + } + + void PointParameterf(GLenum pname, GLfloat param) { + PointParameterf_State(pname, param); + } + + void PointParameteri(GLenum pname, GLint param) { + PointParameteri_State(pname, param); + } + + void PixelStorei(GLenum pname, GLint param) { + PixelStorei_State(pname, param); + } + + void LogicOp(GLenum opcode) { + LogicOp_State(opcode); + } - void ClearColor_State(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { - MG_State::pGLContext->SetClearColor(FloatVec4(red, green, blue, alpha)); - } - - void BlendFuncSeparatei_State(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { - if (buf >= MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", "BlendFuncSeparatei_State", - "Buffer index " + std::to_string(buf) + " is out of range. Max supported is " + - std::to_string(MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS - 1) + ".")); - return; - } - - BlendFactor srcRGBM = MG_Util::ConvertGLEnumToBlendFactor(srcRGB); - BlendFactor dstRGBM = MG_Util::ConvertGLEnumToBlendFactor(dstRGB); - BlendFactor srcAlphaM = MG_Util::ConvertGLEnumToBlendFactor(srcAlpha); - BlendFactor dstAlphaM = MG_Util::ConvertGLEnumToBlendFactor(dstAlpha); - MG_State::pGLContext->SetBlendFuncIndexed(buf, srcRGBM, dstRGBM, srcAlphaM, dstAlphaM); - } - - void Disablei_State(GLenum target, GLuint index) { - auto capInput = MG_Util::ConvertGLEnumToCapabilityInput(target); - if (capInput == CapabilityInput::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "Disablei_State", - "Capability enum " + - MG_Util::ConvertCapabilityInputToString(capInput) + "(" + - MG_Util::ConvertGLEnumToString(target) + ") is not supported.")); - return; - } - - MG_State::pGLContext->SetCapabilityIndexed(capInput, index, false); - } - - void Enablei_State(GLenum target, GLuint index) { - auto capInput = MG_Util::ConvertGLEnumToCapabilityInput(target); - if (capInput == CapabilityInput::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "Enablei_State", - "Capability enum " + - MG_Util::ConvertCapabilityInputToString(capInput) + "(" + - MG_Util::ConvertGLEnumToString(target) + ") is not supported.")); - return; - } - - MG_State::pGLContext->SetCapabilityIndexed(capInput, index, true); - } - - /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ - void BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { - BlendFuncSeparatei_State(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); - } - - void Disablei(GLenum target, GLuint index) { - Disablei_State(target, index); - } - - void Enablei(GLenum target, GLuint index) { - Enablei_State(target, index); - } - - void BlendFunc(GLenum sfactor, GLenum dfactor) { - BlendFunc_State(sfactor, dfactor); - } - - void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) { - Viewport_State(x, y, width, height); - } - - void StencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { - StencilOpSeparate_State(face, sfail, dpfail, dppass); - } - - void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { - StencilOp_State(fail, zfail, zpass); - } - - void StencilMaskSeparate(GLenum face, GLuint mask) { - StencilMaskSeparate_State(face, mask); - } - - void StencilMask(GLuint mask) { - StencilMask_State(mask); - } - - void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { - StencilFuncSeparate_State(face, func, ref, mask); - } - - void StencilFunc(GLenum func, GLint ref, GLuint mask) { - StencilFunc_State(func, ref, mask); - } - - void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) { - Scissor_State(x, y, width, height); - } - - void SampleCoverage(GLfloat value, GLboolean invert) { - SampleCoverage_State(value, invert); - } - - void PolygonOffset(GLfloat factor, GLfloat units) { - PolygonOffset_State(factor, units); - } + void LineWidth(GLfloat width) { + LineWidth_State(width); + } + + GLboolean IsEnabledi(GLenum target, GLuint index) { + return IsEnabledi_State(target, index); + } + + GLboolean IsEnabled(GLenum cap) { + return IsEnabled_State(cap); + } - void PolygonMode(GLenum face, GLenum mode) { - PolygonMode_State(face, mode); - } + void Hint(GLenum target, GLenum mode) { + Hint_State(target, mode); + } - void PointSize(GLfloat size) { - PointSize_State(size); - } + void FrontFace(GLenum mode) { + FrontFace_State(mode); + } + + void Enable(GLenum cap) { + Enable_State(cap); + } - void PointParameterf(GLenum pname, GLfloat param) { - PointParameterf_State(pname, param); - } + void Disable(GLenum cap) { + Disable_State(cap); + } - void PointParameteri(GLenum pname, GLint param) { - PointParameteri_State(pname, param); - } + void DepthRange(GLclampd near_val, GLclampd far_val) { + DepthRange_State(near_val, far_val); + } - void PixelStorei(GLenum pname, GLint param) { - PixelStorei_State(pname, param); - } - - void LogicOp(GLenum opcode) { - LogicOp_State(opcode); - } - - void LineWidth(GLfloat width) { - LineWidth_State(width); - } + void DepthMask(GLboolean flag) { + DepthMask_State(flag); + } - GLboolean IsEnabledi(GLenum target, GLuint index) { - return IsEnabledi_State(target, index); - } + void DepthFunc(GLenum func) { + DepthFunc_State(func); + } - GLboolean IsEnabled(GLenum cap) { - return IsEnabled_State(cap); - } + void CullFace(GLenum mode) { + CullFace_State(mode); + } - void Hint(GLenum target, GLenum mode) { - Hint_State(target, mode); - } + void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { + ColorMask_State(red, green, blue, alpha); + } - void FrontFace(GLenum mode) { - FrontFace_State(mode); - } + void ClampColor(GLenum target, GLenum clamp) { + ClampColor_State(target, clamp); + } - void Enable(GLenum cap) { - Enable_State(cap); - } + void BlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { + BlendFuncSeparate_State(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); + } - void Disable(GLenum cap) { - Disable_State(cap); - } + void BlendEquation(GLenum mode) { + BlendEquation_State(mode); + } - void DepthRange(GLclampd near_val, GLclampd far_val) { - DepthRange_State(near_val, far_val); - } + void BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { + BlendColor_State(red, green, blue, alpha); + } - void DepthMask(GLboolean flag) { - DepthMask_State(flag); - } + void ClearStencil(GLint s) { + ClearStencil_State(s); + } - void DepthFunc(GLenum func) { - DepthFunc_State(func); - } + void ClearDepth(GLclampd depth) { + ClearDepth_State(depth); + } - void CullFace(GLenum mode) { - CullFace_State(mode); - } - - void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { - ColorMask_State(red, green, blue, alpha); - } - - void ClampColor(GLenum target, GLenum clamp) { - ClampColor_State(target, clamp); - } - - void BlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { - BlendFuncSeparate_State(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); - } - - void BlendEquation(GLenum mode) { - BlendEquation_State(mode); - } - - void BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { - BlendColor_State(red, green, blue, alpha); - } - - void ClearStencil(GLint s) { - ClearStencil_State(s); - } - - void ClearDepth(GLclampd depth) { - ClearDepth_State(depth); - } - - void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { - ClearColor_State(red, green, blue, alpha); - } - } // namespace MG_Impl::GLImpl -} // namespace MobileGL + void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { + ClearColor_State(red, green, blue, alpha); + } +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.h b/MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.h index 36e1551d..6838103c 100644 --- a/MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.h +++ b/MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.h @@ -9,47 +9,45 @@ #pragma once #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ - void BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); - void Disablei(GLenum target, GLuint index); - void Enablei(GLenum target, GLuint index); - void BlendFunc(GLenum sfactor, GLenum dfactor); - void Viewport(GLint x, GLint y, GLsizei width, GLsizei height); - void StencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - void StencilOp(GLenum fail, GLenum zfail, GLenum zpass); - void StencilMaskSeparate(GLenum face, GLuint mask); - void StencilMask(GLuint mask); - void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask); - void StencilFunc(GLenum func, GLint ref, GLuint mask); - void Scissor(GLint x, GLint y, GLsizei width, GLsizei height); - void SampleCoverage(GLfloat value, GLboolean invert); - void PolygonOffset(GLfloat factor, GLfloat units); - void PolygonMode(GLenum face, GLenum mode); - void PointSize(GLfloat size); - void PointParameterf(GLenum pname, GLfloat param); - void PointParameteri(GLenum pname, GLint param); - void PixelStorei(GLenum pname, GLint param); - void LogicOp(GLenum opcode); - void LineWidth(GLfloat width); - GLboolean IsEnabledi(GLenum target, GLuint index); - GLboolean IsEnabled(GLenum cap); - void Hint(GLenum target, GLenum mode); - void FrontFace(GLenum mode); - void Enable(GLenum cap); - void Disable(GLenum cap); - void DepthRange(GLclampd near_val, GLclampd far_val); - void DepthMask(GLboolean flag); - void DepthFunc(GLenum func); - void CullFace(GLenum mode); - void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); - void ClampColor(GLenum target, GLenum clamp); - void BlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - void BlendEquation(GLenum mode); - void BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); - void ClearStencil(GLint s); - void ClearDepth(GLclampd depth); - void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); - } // namespace MG_Impl::GLImpl -} // namespace MobileGL +namespace MobileGL::MG_Impl::GLImpl { + /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ + void BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + void Disablei(GLenum target, GLuint index); + void Enablei(GLenum target, GLuint index); + void BlendFunc(GLenum sfactor, GLenum dfactor); + void Viewport(GLint x, GLint y, GLsizei width, GLsizei height); + void StencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + void StencilOp(GLenum fail, GLenum zfail, GLenum zpass); + void StencilMaskSeparate(GLenum face, GLuint mask); + void StencilMask(GLuint mask); + void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask); + void StencilFunc(GLenum func, GLint ref, GLuint mask); + void Scissor(GLint x, GLint y, GLsizei width, GLsizei height); + void SampleCoverage(GLfloat value, GLboolean invert); + void PolygonOffset(GLfloat factor, GLfloat units); + void PolygonMode(GLenum face, GLenum mode); + void PointSize(GLfloat size); + void PointParameterf(GLenum pname, GLfloat param); + void PointParameteri(GLenum pname, GLint param); + void PixelStorei(GLenum pname, GLint param); + void LogicOp(GLenum opcode); + void LineWidth(GLfloat width); + GLboolean IsEnabledi(GLenum target, GLuint index); + GLboolean IsEnabled(GLenum cap); + void Hint(GLenum target, GLenum mode); + void FrontFace(GLenum mode); + void Enable(GLenum cap); + void Disable(GLenum cap); + void DepthRange(GLclampd near_val, GLclampd far_val); + void DepthMask(GLboolean flag); + void DepthFunc(GLenum func); + void CullFace(GLenum mode); + void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); + void ClampColor(GLenum target, GLenum clamp); + void BlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + void BlendEquation(GLenum mode); + void BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); + void ClearStencil(GLint s); + void ClearDepth(GLclampd depth); + void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp index a7d8f3f0..786f2ce2 100644 --- a/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp +++ b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp @@ -12,254 +12,258 @@ #include #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - void SetSamplerParam_State(GLuint sampler, GLenum pname, const void* param, bool isFloat, bool isInteger) { +namespace MobileGL::MG_Impl::GLImpl { + void SetSamplerParam_State(GLuint sampler, GLenum pname, const void* param, bool isFloat, bool isInteger) { + if (!SamplerImpl::ValidateSamplerName(sampler)) return; + + Bool doesSamplerObjectCreated = MG_State::pGLContext->ValidateSamplerObject(sampler); + if (!doesSamplerObjectCreated) { + // Create one for compatibility + MG_State::pGLContext->CreateSamplerObject(sampler); + } + auto& samplerObj = MG_State::pGLContext->GetSamplerObject(sampler); + if (!SamplerImpl::ValidateSamplerObject(sampler)) return; + + using namespace MG_Util; + switch (pname) { + case GL_TEXTURE_WRAP_S: + samplerObj->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); + break; + case GL_TEXTURE_WRAP_T: + samplerObj->SetWrapT(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); + break; + case GL_TEXTURE_WRAP_R: + samplerObj->SetWrapR(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); + break; + case GL_TEXTURE_MIN_FILTER: + samplerObj->SetMinFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(*(const GLint*)param)); + samplerObj->SetMipmapMode(MG_Util::ConvertGLEnumToSamplerMipmapMode(*(const GLint*)param)); + break; + case GL_TEXTURE_MAG_FILTER: + samplerObj->SetMagFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(*(const GLint*)param)); + break; + case GL_TEXTURE_MIN_LOD: + samplerObj->SetLodRange(*(const GLfloat*)param, samplerObj->GetMaxLod()); + break; + case GL_TEXTURE_MAX_LOD: + samplerObj->SetLodRange(samplerObj->GetMinLod(), *(const GLfloat*)param); + break; + case GL_TEXTURE_LOD_BIAS: + samplerObj->SetLodBias(*(const GLfloat*)param); + break; + case GL_TEXTURE_COMPARE_MODE: + samplerObj->SetCompareMode(MG_Util::ConvertGLEnumToSamplerCompareMode(*(const GLint*)param)); + break; + case GL_TEXTURE_COMPARE_FUNC: + samplerObj->SetSamplerCompareFunc(MG_Util::ConvertGLEnumToSamplerCompareFunc(*(const GLint*)param)); + break; + default: + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "SetSamplerParam_State", + "Invalid pname for sampler parameter")); + } + } + + void GetSamplerParam_State(GLuint sampler, GLenum pname, void* params, bool isFloat, bool isInteger) { + if (!SamplerImpl::ValidateSamplerName(sampler)) return; + + Bool doesSamplerObjectCreated = MG_State::pGLContext->ValidateSamplerObject(sampler); + if (!doesSamplerObjectCreated) { + // Create one for compatibility + MG_State::pGLContext->CreateSamplerObject(sampler); + } + auto& samplerObj = MG_State::pGLContext->GetSamplerObject(sampler); + if (!SamplerImpl::ValidateSamplerObject(sampler)) return; + + using namespace MG_Util; + switch (pname) { + case GL_TEXTURE_WRAP_S: + *(GLuint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapS()); + break; + case GL_TEXTURE_WRAP_T: + *(GLuint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapT()); + break; + case GL_TEXTURE_WRAP_R: + *(GLuint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapR()); + break; + case GL_TEXTURE_MIN_FILTER: + *(GLuint*)params = + MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMinFilter(), samplerObj->GetMipmapMode()); + break; + case GL_TEXTURE_MAG_FILTER: + *(GLuint*)params = + MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMagFilter(), SamplerMipmapMode::None); + break; + case GL_TEXTURE_MIN_LOD: + *(GLfloat*)params = samplerObj->GetMinLod(); + break; + case GL_TEXTURE_MAX_LOD: + *(GLfloat*)params = samplerObj->GetMaxLod(); + break; + case GL_TEXTURE_LOD_BIAS: + *(GLfloat*)params = samplerObj->GetLodBias(); + break; + case GL_TEXTURE_COMPARE_MODE: + *(GLuint*)params = MG_Util::ConvertSamplerCompareModeToGLEnum(samplerObj->GetCompareMode()); + break; + case GL_TEXTURE_COMPARE_FUNC: + *(GLuint*)params = MG_Util::ConvertSamplerCompareFuncToGLEnum(samplerObj->GetSamplerCompareFunc()); + break; + default: + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "GetSamplerParam_State", + "Invalid pname for sampler parameter")); + } + } + + GLboolean IsSampler_State(GLuint sampler) { + return MG_State::pGLContext->ValidateSamplerObject(sampler) ? GL_TRUE : GL_FALSE; + } + + // migrate below functions without "_State" into this section + void GenSamplers_State(GLsizei count, GLuint* samplers) { + if (count < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative")); + return; + } + + static thread_local Vector names; + MG_State::pGLContext->GenSamplerNames(count, names); + Memcpy(samplers, names.data(), count * sizeof(GLuint)); + } + + void DeleteSamplers_State(GLsizei count, const GLuint* samplers) { + if (count < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "DeleteSamplers", "count must be non-negative")); + return; + } + + for (GLsizei i = 0; i < count; ++i) { + if (samplers[i] != 0) { + MG_State::pGLContext->MarkSamplerObjectForDeletion(samplers[i]); + } + } + } + + void CreateSamplers_State(GLsizei n, GLuint* samplers) { + if (n < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative")); + return; + } + + static thread_local Vector names; + MG_State::pGLContext->GenSamplerNames(n, names); + Memcpy(samplers, names.data(), n * sizeof(GLuint)); + for (GLsizei i = 0; i < n; ++i) { + samplers[i] = names[i]; + MG_State::pGLContext->CreateSamplerObject(names[i]); + } + } + + void BindSampler_State(GLuint unit, GLuint sampler) { + if (unit >= MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "BindSampler", "texture unit out of range")); + return; + } + + auto& textureUnit = MG_State::pGLContext->GetTextureUnitObject((Int)unit); + if (sampler == 0) { + textureUnit.SetSamplerObject(nullptr); + } else { if (!SamplerImpl::ValidateSamplerName(sampler)) return; - - auto samplerObj = MG_State::pGLContext->GetSamplerObject(sampler); - if (!samplerObj) { - samplerObj = MG_State::pGLContext->CreateSamplerObject(sampler); // for compatibility + Bool doesSamplerObjectCreated = MG_State::pGLContext->ValidateSamplerObject(sampler); + if (!doesSamplerObjectCreated) { + MG_State::pGLContext->CreateSamplerObject(sampler); } - if (!SamplerImpl::ValidateSamplerObject(sampler)) return; + auto& samplerObject = MG_State::pGLContext->GetSamplerObject(sampler); - using namespace MG_Util; - switch (pname) { - case GL_TEXTURE_WRAP_S: - samplerObj->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); - break; - case GL_TEXTURE_WRAP_T: - samplerObj->SetWrapT(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); - break; - case GL_TEXTURE_WRAP_R: - samplerObj->SetWrapR(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); - break; - case GL_TEXTURE_MIN_FILTER: - samplerObj->SetMinFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(*(const GLint*)param)); - samplerObj->SetMipmapMode(MG_Util::ConvertGLEnumToSamplerMipmapMode(*(const GLint*)param)); - break; - case GL_TEXTURE_MAG_FILTER: - samplerObj->SetMagFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(*(const GLint*)param)); - break; - case GL_TEXTURE_MIN_LOD: - samplerObj->SetLodRange(*(const GLfloat*)param, samplerObj->GetMaxLod()); - break; - case GL_TEXTURE_MAX_LOD: - samplerObj->SetLodRange(samplerObj->GetMinLod(), *(const GLfloat*)param); - break; - case GL_TEXTURE_LOD_BIAS: - samplerObj->SetLodBias(*(const GLfloat*)param); - break; - case GL_TEXTURE_COMPARE_MODE: - samplerObj->SetCompareMode(MG_Util::ConvertGLEnumToSamplerCompareMode(*(const GLint*)param)); - break; - case GL_TEXTURE_COMPARE_FUNC: - samplerObj->SetSamplerCompareFunc(MG_Util::ConvertGLEnumToSamplerCompareFunc(*(const GLint*)param)); - break; - default: - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "SetSamplerParam_State", - "Invalid pname for sampler parameter")); - } + textureUnit.SetSamplerObject(MG_State::pGLContext->GetSamplerObject(sampler)); + } + } + + void BindSamplers_State(GLuint first, GLsizei count, const GLuint* samplers) { + if (count < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "BindSamplers", "count must be non-negative")); + return; } - void GetSamplerParam_State(GLuint sampler, GLenum pname, void* params, bool isFloat, bool isInteger) { - if (!SamplerImpl::ValidateSamplerName(sampler)) return; - - auto samplerObj = MG_State::pGLContext->GetSamplerObject(sampler); - if (!samplerObj) { - samplerObj = MG_State::pGLContext->CreateSamplerObject(sampler); // for compatibility - } - if (!SamplerImpl::ValidateSamplerObject(sampler)) return; - - using namespace MG_Util; - switch (pname) { - case GL_TEXTURE_WRAP_S: - *(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapS()); - break; - case GL_TEXTURE_WRAP_T: - *(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapT()); - break; - case GL_TEXTURE_WRAP_R: - *(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapR()); - break; - case GL_TEXTURE_MIN_FILTER: - *(GLint*)params = - MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMinFilter(), samplerObj->GetMipmapMode()); - break; - case GL_TEXTURE_MAG_FILTER: - *(GLint*)params = - MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMagFilter(), SamplerMipmapMode::None); - break; - case GL_TEXTURE_MIN_LOD: - *(GLfloat*)params = samplerObj->GetMinLod(); - break; - case GL_TEXTURE_MAX_LOD: - *(GLfloat*)params = samplerObj->GetMaxLod(); - break; - case GL_TEXTURE_LOD_BIAS: - *(GLfloat*)params = samplerObj->GetLodBias(); - break; - case GL_TEXTURE_COMPARE_MODE: - *(GLint*)params = MG_Util::ConvertSamplerCompareModeToGLEnum(samplerObj->GetCompareMode()); - break; - case GL_TEXTURE_COMPARE_FUNC: - *(GLint*)params = MG_Util::ConvertSamplerCompareFuncToGLEnum(samplerObj->GetSamplerCompareFunc()); - break; - default: - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "GetSamplerParam_State", - "Invalid pname for sampler parameter")); - } + for (GLsizei i = 0; i < count; ++i) { + BindSampler_State(first + i, samplers ? samplers[i] : 0); } + } - GLboolean IsSampler_State(GLuint sampler) { - return MG_State::pGLContext->ValidateSamplerObject(sampler) ? GL_TRUE : GL_FALSE; - } + /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ + void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) { + GetSamplerParam_State(sampler, pname, params, false, false); + } - // migrate below functions without "_State" into this section - void GenSamplers_State(GLsizei count, GLuint* samplers) { - if (count < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative")); - return; - } + void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param) { + SetSamplerParam_State(sampler, pname, param, false, true); + } - auto names = MG_State::pGLContext->GenSamplerNames(count); - for (GLsizei i = 0; i < count; ++i) { - samplers[i] = names[i]; - } - } + void SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param) { + SetSamplerParam_State(sampler, pname, param, false, true); + } - void DeleteSamplers_State(GLsizei count, const GLuint* samplers) { - if (count < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "DeleteSamplers", "count must be non-negative")); - return; - } + void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param) { + SetSamplerParam_State(sampler, pname, param, false, false); + } - for (GLsizei i = 0; i < count; ++i) { - if (samplers[i] != 0) { - MG_State::pGLContext->MarkSamplerObjectForDeletion(samplers[i]); - } - } - } + void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param) { + SetSamplerParam_State(sampler, pname, param, true, false); + } - void CreateSamplers_State(GLsizei n, GLuint* samplers) { - if (n < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative")); - return; - } + void SamplerParameteri(GLuint sampler, GLenum pname, GLint param) { + SamplerParameteriv(sampler, pname, ¶m); + } - auto names = MG_State::pGLContext->GenSamplerNames(n); - for (GLsizei i = 0; i < n; ++i) { - samplers[i] = names[i]; - MG_State::pGLContext->CreateSamplerObject(names[i]); - } - } + void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) { + SamplerParameterfv(sampler, pname, ¶m); + } - void BindSampler_State(GLuint unit, GLuint sampler) { - if (unit >= MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "BindSampler", "texture unit out of range")); - return; - } + GLboolean IsSampler(GLuint sampler) { + return IsSampler_State(sampler); + } - auto& textureUnit = MG_State::pGLContext->GetTextureUnitObject(unit); - if (sampler == 0) { - textureUnit.SetSamplerObject(nullptr); - } else { - if (!SamplerImpl::ValidateSamplerName(sampler)) return; - auto samplerObject = MG_State::pGLContext->GetSamplerObject(sampler); - if (!samplerObject) { - samplerObject = MG_State::pGLContext->CreateSamplerObject(sampler); - } + void GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params) { + GetSamplerParam_State(sampler, pname, params, false, true); + } - textureUnit.SetSamplerObject(MG_State::pGLContext->GetSamplerObject(sampler)); - } - } + void GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params) { + GetSamplerParam_State(sampler, pname, params, false, true); + } - void BindSamplers_State(GLuint first, GLsizei count, const GLuint* samplers) { - if (count < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "BindSamplers", "count must be non-negative")); - return; - } + void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) { + GetSamplerParam_State(sampler, pname, params, true, false); + } - for (GLsizei i = 0; i < count; ++i) { - BindSampler_State(first + i, samplers ? samplers[i] : 0); - } - } + void GenSamplers(GLsizei count, GLuint* samplers) { + GenSamplers_State(count, samplers); + } - /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ - void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) { - GetSamplerParam_State(sampler, pname, params, false, false); - } + void DeleteSamplers(GLsizei count, const GLuint* samplers) { + DeleteSamplers_State(count, samplers); + } - void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param) { - SetSamplerParam_State(sampler, pname, param, false, true); - } + void CreateSamplers(GLsizei n, GLuint* samplers) { + CreateSamplers_State(n, samplers); + } - void SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param) { - SetSamplerParam_State(sampler, pname, param, false, true); - } + void BindSamplers(GLuint first, GLsizei count, const GLuint* samplers) { + BindSamplers_State(first, count, samplers); + } - void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param) { - SetSamplerParam_State(sampler, pname, param, false, false); - } - - void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param) { - SetSamplerParam_State(sampler, pname, param, true, false); - } - - void SamplerParameteri(GLuint sampler, GLenum pname, GLint param) { - SamplerParameteriv(sampler, pname, ¶m); - } - - void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) { - SamplerParameterfv(sampler, pname, ¶m); - } - - GLboolean IsSampler(GLuint sampler) { - return IsSampler_State(sampler); - } - - void GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params) { - GetSamplerParam_State(sampler, pname, params, false, true); - } - - void GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params) { - GetSamplerParam_State(sampler, pname, params, false, true); - } - - void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) { - GetSamplerParam_State(sampler, pname, params, true, false); - } - - void GenSamplers(GLsizei count, GLuint* samplers) { - GenSamplers_State(count, samplers); - } - - void DeleteSamplers(GLsizei count, const GLuint* samplers) { - DeleteSamplers_State(count, samplers); - } - - void CreateSamplers(GLsizei n, GLuint* samplers) { - CreateSamplers_State(n, samplers); - } - - void BindSamplers(GLuint first, GLsizei count, const GLuint* samplers) { - BindSamplers_State(first, count, samplers); - } - - void BindSampler(GLuint unit, GLuint sampler) { - BindSampler_State(unit, sampler); - } - } // namespace MG_Impl::GLImpl -} // namespace MobileGL + void BindSampler(GLuint unit, GLuint sampler) { + BindSampler_State(unit, sampler); + } +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h index 15115f63..a08a728e 100644 --- a/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h +++ b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h @@ -9,24 +9,22 @@ #pragma once #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ - void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params); - void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param); - void SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param); - void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param); - void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param); - void SamplerParameteri(GLuint sampler, GLenum pname, GLint param); - void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param); - GLboolean IsSampler(GLuint sampler); - void GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params); - void GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params); - void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params); - void GenSamplers(GLsizei count, GLuint* samplers); - void DeleteSamplers(GLsizei count, const GLuint* samplers); - void CreateSamplers(GLsizei n, GLuint* samplers); - void BindSamplers(GLuint first, GLsizei count, const GLuint* samplers); - void BindSampler(GLuint unit, GLuint sampler); - } // namespace MG_Impl::GLImpl -} // namespace MobileGL +namespace MobileGL::MG_Impl::GLImpl { + /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ + void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params); + void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param); + void SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param); + void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param); + void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param); + void SamplerParameteri(GLuint sampler, GLenum pname, GLint param); + void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param); + GLboolean IsSampler(GLuint sampler); + void GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params); + void GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params); + void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params); + void GenSamplers(GLsizei count, GLuint* samplers); + void DeleteSamplers(GLsizei count, const GLuint* samplers); + void CreateSamplers(GLsizei n, GLuint* samplers); + void BindSamplers(GLuint first, GLsizei count, const GLuint* samplers); + void BindSampler(GLuint unit, GLuint sampler); +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp b/MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp index 63e8c069..83934ce3 100644 --- a/MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp +++ b/MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp @@ -11,126 +11,122 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace SamplerImpl { - Bool ValidateSamplerName(GLuint sampler) { - if (!MG_State::pGLContext->ValidateSamplerName(sampler)) { +namespace MobileGL::MG_Impl::GLImpl::SamplerImpl { + Bool ValidateSamplerName(GLuint sampler) { + if (!MG_State::pGLContext->ValidateSamplerName(sampler)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "ValidateSamplerName", + std::format("Invalid sampler name {}", sampler))); + return false; + } + return true; + } + + Bool ValidateSamplerObject(GLuint sampler) { + if (!MG_State::pGLContext->ValidateSamplerObject(sampler)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "ValidateSamplerObject", + std::format("Sampler object {} does not exist", sampler))); + return false; + } + return true; + } + + Bool ValidateSamplerParam(GLenum pname, GLenum param) { + using namespace MG_Util; + switch (pname) { + case GL_TEXTURE_WRAP_S: + case GL_TEXTURE_WRAP_T: + case GL_TEXTURE_WRAP_R: + if (MG_Util::ConvertGLEnumToSamplerWrapMode(param) == SamplerWrapMode::Unknown) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid wrap mode parameter")); + return false; + } + break; + + case GL_TEXTURE_MIN_FILTER: + if (MG_Util::ConvertGLEnumToSamplerFilterMode(param) == SamplerFilterMode::Unknown) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid min filter parameter")); + return false; + } + break; + + case GL_TEXTURE_MAG_FILTER: + if (param != GL_NEAREST && param != GL_LINEAR) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid mag filter parameter")); + return false; + } + break; + + case GL_TEXTURE_COMPARE_MODE: + if (param != GL_NONE && param != GL_COMPARE_REF_TO_TEXTURE) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid compare mode parameter")); + return false; + } + break; + + case GL_TEXTURE_COMPARE_FUNC: + if (param < GL_LEQUAL || param > GL_ALWAYS) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid compare function parameter")); + return false; + } + break; + + default: + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid pname for sampler parameter")); + return false; + } + return true; + } + + Bool ValidateSamplerFloatParam(GLenum pname, GLfloat param) { + switch (pname) { + case GL_TEXTURE_MIN_LOD: + case GL_TEXTURE_MAX_LOD: + case GL_TEXTURE_LOD_BIAS: + return true; + + case GL_TEXTURE_BORDER_COLOR: + if (param < 0.0f || param > 1.0f) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "ValidateSamplerFloatParam", + "Border color component out of [0,1] range")); + return false; + } + return true; + + default: + return ValidateSamplerParam(pname, static_cast(param)); + } + } + + Bool ValidateSamplerIntParam(GLenum pname, GLint param) { + switch (pname) { + case GL_TEXTURE_BORDER_COLOR: + if (param < 0 || param > 255) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateSamplerName", - std::format("Invalid sampler name {}", sampler))); + MakeUnique("MG_Impl/GLImpl", "ValidateSamplerIntParam", + "Border color component out of [0,255] range")); return false; } return true; + + default: + return ValidateSamplerParam(pname, static_cast(param)); } - - Bool ValidateSamplerObject(GLuint sampler) { - if (!MG_State::pGLContext->ValidateSamplerObject(sampler)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ValidateSamplerObject", - std::format("Sampler object {} does not exist", sampler))); - return false; - } - return true; - } - - Bool ValidateSamplerParam(GLenum pname, GLenum param) { - using namespace MG_Util; - switch (pname) { - case GL_TEXTURE_WRAP_S: - case GL_TEXTURE_WRAP_T: - case GL_TEXTURE_WRAP_R: - if (MG_Util::ConvertGLEnumToSamplerWrapMode(param) == SamplerWrapMode::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", - "Invalid wrap mode parameter")); - return false; - } - break; - - case GL_TEXTURE_MIN_FILTER: - if (MG_Util::ConvertGLEnumToSamplerFilterMode(param) == SamplerFilterMode::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", - "Invalid min filter parameter")); - return false; - } - break; - - case GL_TEXTURE_MAG_FILTER: - if (param != GL_NEAREST && param != GL_LINEAR) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", - "Invalid mag filter parameter")); - return false; - } - break; - - case GL_TEXTURE_COMPARE_MODE: - if (param != GL_NONE && param != GL_COMPARE_REF_TO_TEXTURE) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", - "Invalid compare mode parameter")); - return false; - } - break; - - case GL_TEXTURE_COMPARE_FUNC: - if (param < GL_LEQUAL || param > GL_ALWAYS) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", - "Invalid compare function parameter")); - return false; - } - break; - - default: - MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", - "Invalid pname for sampler parameter")); - return false; - } - return true; - } - - Bool ValidateSamplerFloatParam(GLenum pname, GLfloat param) { - switch (pname) { - case GL_TEXTURE_MIN_LOD: - case GL_TEXTURE_MAX_LOD: - case GL_TEXTURE_LOD_BIAS: - return true; - - case GL_TEXTURE_BORDER_COLOR: - if (param < 0.0f || param > 1.0f) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateSamplerFloatParam", - "Border color component out of [0,1] range")); - return false; - } - return true; - - default: - return ValidateSamplerParam(pname, static_cast(param)); - } - } - - Bool ValidateSamplerIntParam(GLenum pname, GLint param) { - switch (pname) { - case GL_TEXTURE_BORDER_COLOR: - if (param < 0 || param > 255) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateSamplerIntParam", - "Border color component out of [0,255] range")); - return false; - } - return true; - - default: - return ValidateSamplerParam(pname, static_cast(param)); - } - } - } // namespace SamplerImpl -} // namespace MobileGL::MG_Impl::GLImpl + } +} // namespace MobileGL::MG_Impl::GLImpl::SamplerImpl diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/Validators.h b/MobileGL/MG_Impl/GLImpl/Sampler/Validators.h index 5337779c..3ac93510 100644 --- a/MobileGL/MG_Impl/GLImpl/Sampler/Validators.h +++ b/MobileGL/MG_Impl/GLImpl/Sampler/Validators.h @@ -10,12 +10,10 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace SamplerImpl { - Bool ValidateSamplerName(GLuint sampler); - Bool ValidateSamplerObject(GLuint sampler); - Bool ValidateSamplerParam(GLenum pname, GLenum param); - Bool ValidateSamplerFloatParam(GLenum pname, GLfloat param); - Bool ValidateSamplerIntParam(GLenum pname, GLint param); - } // namespace SamplerImpl -} // namespace MobileGL::MG_Impl::GLImpl +namespace MobileGL::MG_Impl::GLImpl::SamplerImpl { + Bool ValidateSamplerName(GLuint sampler); + Bool ValidateSamplerObject(GLuint sampler); + Bool ValidateSamplerParam(GLenum pname, GLenum param); + Bool ValidateSamplerFloatParam(GLenum pname, GLfloat param); + Bool ValidateSamplerIntParam(GLenum pname, GLint param); +} // namespace MobileGL::MG_Impl::GLImpl::SamplerImpl diff --git a/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp b/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp index d8cc8acb..4bff1afc 100644 --- a/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp +++ b/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp @@ -10,36 +10,34 @@ #include "MG_State/GLState/Core.h" -namespace MobileGL { - namespace MG_Impl::GLImpl { - GLsync FenceSync_Backend(GLenum condition, GLbitfield flags) { - return 0; - } +namespace MobileGL::MG_Impl::GLImpl { + GLsync FenceSync_Backend(GLenum condition, GLbitfield flags) { + return 0; + } - GLenum ClientWaitSync_Backend(GLsync sync, GLbitfield flags, GLuint64 timeout) { - return 0; - } + GLenum ClientWaitSync_Backend(GLsync sync, GLbitfield flags, GLuint64 timeout) { + return 0; + } - void DeleteSync_Backend(GLsync sync) {} + void DeleteSync_Backend(GLsync sync) {} - GLsync FenceSync_State(GLenum condition, GLbitfield flags) { - return 0; - } + GLsync FenceSync_State(GLenum condition, GLbitfield flags) { + return 0; + } - GLenum ClientWaitSync_State(GLsync sync, GLbitfield flags, GLuint64 timeout) { - return 0; - } + GLenum ClientWaitSync_State(GLsync sync, GLbitfield flags, GLuint64 timeout) { + return 0; + } - void DeleteSync_State(GLsync sync) {} + void DeleteSync_State(GLsync sync) {} - GLsync FenceSync(GLenum condition, GLbitfield flags) { - return 0; - } + GLsync FenceSync(GLenum condition, GLbitfield flags) { + return 0; + } - GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { - return 0; - } + GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { + return 0; + } - void DeleteSync(GLsync sync) {} - } // namespace MG_Impl::GLImpl -} // namespace MobileGL \ No newline at end of file + void DeleteSync(GLsync sync) {} +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.h b/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.h index 78190a4c..356967da 100644 --- a/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.h +++ b/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.h @@ -9,10 +9,8 @@ #pragma once #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - GLsync FenceSync(GLenum condition, GLbitfield flags); - GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout); - void DeleteSync(GLsync sync); - } // namespace MG_Impl::GLImpl -} // namespace MobileGL +namespace MobileGL::MG_Impl::GLImpl { + GLsync FenceSync(GLenum condition, GLbitfield flags); + GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout); + void DeleteSync(GLsync sync); +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp index fa57f434..fa54de40 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp @@ -8,6 +8,7 @@ #include "GL_Texture.h" #include "Config.h" +#include "MG_State/GLState/TextureState/TextureObject2D.h" #include "MG_Util/Types.h" #include "Validators.h" #include "ProxyTexture.h" @@ -27,21 +28,22 @@ #include namespace MobileGL::MG_Impl::GLImpl { - SharedPtr GetTextureObjectByTarget(TextureUploadTarget textureUploadingTarget, - TextureTarget textureTarget) { - SharedPtr textureObject = nullptr; - if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) { - textureObject = - TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget); + static SharedPtr nullTextureObject; + + const SharedPtr& GetTextureObjectByTarget( + TextureUploadTarget textureUploadTarget, TextureTarget textureTarget) { + if (TextureImpl::IsProxyTextureTarget(textureUploadTarget)) { + auto& textureObject = + TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadTarget); + if (!TextureImpl::ValidateTextureObject(textureObject)) return nullTextureObject; + return textureObject; } else { - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); + auto& textureObject = bindingSlot.GetBoundObject(); + if (!TextureImpl::ValidateTextureObject(textureObject)) return nullTextureObject; + return textureObject; } - - if (!TextureImpl::ValidateTextureObject(textureObject)) return nullptr; - - return textureObject; } void GenerateMipmap_Backend(GLenum target) { @@ -56,7 +58,7 @@ namespace MobileGL::MG_Impl::GLImpl { void TexSubImage2D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); TextureInputFormat textureInputFormat = MG_Util::ConvertGLEnumToTextureInputFormat(format); TexturePixelDataType texturePixelDataType = MG_Util::ConvertGLEnumToTexturePixelDataType(type); @@ -68,11 +70,11 @@ namespace MobileGL::MG_Impl::GLImpl { // ===================== Error Checking ============================== if (!TextureImpl::ValidateTexturePixelDataType(texturePixelDataType)) return; if (!TextureImpl::ValidateTextureInputFormat(textureInputFormat)) return; - if (!TextureImpl::ValidateTextureUploadTarget(textureUploadingTarget)) return; + if (!TextureImpl::ValidateTextureUploadTarget(textureUploadTarget)) return; if (!TextureImpl::ValidateTextureLevelNumber(level)) return; - if (!TextureImpl::ValidateTextureSizeWithTextureUploadTarget(textureUploadingTarget, width, height)) return; + if (!TextureImpl::ValidateTextureSizeWithTextureUploadTarget(textureUploadTarget, width, height)) return; if (!TextureImpl::ValidateTextureSizeRange(width, height, 1)) return; - if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadingTarget, level)) return; + if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadTarget, level)) return; // TODO: GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the // GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped. @@ -83,9 +85,9 @@ namespace MobileGL::MG_Impl::GLImpl { // divisible into the number of bytes needed to store in memory a datum indicated by type. // ======================= Processing ================================ - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - auto textureObject = bindingSlot.GetBoundObject(); + auto& textureObject = bindingSlot.GetBoundObject(); TextureInternalFormat textureInternalFormat = textureObject->GetFormat(); MGLOG_D("%s: working on texture %d", __func__, textureObject->GetExternalIndex()); @@ -103,8 +105,8 @@ namespace MobileGL::MG_Impl::GLImpl { // so that we don't take the perf hit of dyn-cast. MOBILEGL_ASSERT(nullptr != dynamic_cast(textureObject.get()), "Texture object here should always be an object with mipmap"); - auto textureMipmapObject = static_cast(textureObject.get()); - auto texelSize = textureMipmapObject->GetMipmapTexelSize(textureUploadingTarget, level); + auto textureMipmapObject = dynamic_cast(textureObject.get()); + auto texelSize = textureMipmapObject->GetMipmapTexelSize(textureUploadTarget, level); SizeT inputSize = 0; @@ -123,7 +125,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!originalPixels) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, + MakeUnique("MG_Impl/GLImpl", __func__, "No data supplied from pixels parameter and no PBO bound.")); return; } @@ -153,7 +155,7 @@ namespace MobileGL::MG_Impl::GLImpl { } const auto* srcData = static_cast(processedPixels); - Uint8* destData = static_cast(textureMipmapObject->MapMipmapData(textureUploadingTarget, level)); + Uint8* destData = static_cast(textureMipmapObject->MapMipmapData(textureUploadTarget, level)); if (destData) { for (GLsizei y = 0; y < height; y++) { @@ -166,7 +168,7 @@ namespace MobileGL::MG_Impl::GLImpl { free(processedPixels); MGLOG_D("%s: mark mip %d as dirty", __func__, level); - textureMipmapObject->MarkStorageDirty(textureUploadingTarget, level, true); + textureMipmapObject->MarkStorageDirty(textureUploadTarget, level, true); } void TexSubImage1D_State(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, @@ -178,21 +180,20 @@ namespace MobileGL::MG_Impl::GLImpl { void TexParameterf_State(GLenum target, GLenum pname, GLfloat param) { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = - GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + auto& textureObject = GetTextureObjectByTarget(textureUploadTarget, textureTarget); if (!textureObject) return; switch (pname) { case GL_TEXTURE_MAG_FILTER: - textureObject->GetSamplerObject()->SetMagFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(param)); + textureObject->GetSamplerObject()->SetMagFilter(MG_Util::ConvertGLEnumToSamplerFilterMode((GLenum)param)); break; case GL_TEXTURE_MIN_FILTER: - textureObject->GetSamplerObject()->SetMinFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(param)); - textureObject->GetSamplerObject()->SetMipmapMode(MG_Util::ConvertGLEnumToSamplerMipmapMode(param)); + textureObject->GetSamplerObject()->SetMinFilter(MG_Util::ConvertGLEnumToSamplerFilterMode((GLenum)param)); + textureObject->GetSamplerObject()->SetMipmapMode(MG_Util::ConvertGLEnumToSamplerMipmapMode((GLenum)param)); break; case GL_TEXTURE_MIN_LOD: { Float maxLod = textureObject->GetSamplerObject()->GetMaxLod(); @@ -205,34 +206,36 @@ namespace MobileGL::MG_Impl::GLImpl { break; } case GL_TEXTURE_BASE_LEVEL: - textureObject->SetBaseLevel(param); + textureObject->SetBaseLevel((Uint)param); break; case GL_TEXTURE_MAX_LEVEL: - textureObject->SetMaxLevel(param); + textureObject->SetMaxLevel((Uint)param); break; case GL_TEXTURE_SWIZZLE_R: case GL_TEXTURE_SWIZZLE_G: case GL_TEXTURE_SWIZZLE_B: case GL_TEXTURE_SWIZZLE_A: { auto swizzleParam = MG_Util::ConvertGLEnumPnameToTextureSwizzleParam(pname); - auto swizzleValue = MG_Util::ConvertGLEnumToTextureSwizzleParam(param); + auto swizzleValue = MG_Util::ConvertGLEnumToTextureSwizzleParam((GLenum)param); textureObject->SetSwizzleParam(swizzleParam, swizzleValue); break; } case GL_TEXTURE_WRAP_S: - textureObject->GetSamplerObject()->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(param)); + textureObject->GetSamplerObject()->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode((GLenum)param)); break; case GL_TEXTURE_WRAP_T: - textureObject->GetSamplerObject()->SetWrapT(MG_Util::ConvertGLEnumToSamplerWrapMode(param)); + textureObject->GetSamplerObject()->SetWrapT(MG_Util::ConvertGLEnumToSamplerWrapMode((GLenum)param)); break; case GL_TEXTURE_WRAP_R: - textureObject->GetSamplerObject()->SetWrapR(MG_Util::ConvertGLEnumToSamplerWrapMode(param)); + textureObject->GetSamplerObject()->SetWrapR(MG_Util::ConvertGLEnumToSamplerWrapMode((GLenum)param)); break; case GL_TEXTURE_COMPARE_MODE: - textureObject->GetSamplerObject()->SetCompareMode(MG_Util::ConvertGLEnumToSamplerCompareMode(param)); + textureObject->GetSamplerObject()->SetCompareMode( + MG_Util::ConvertGLEnumToSamplerCompareMode((GLenum)param)); break; case GL_TEXTURE_COMPARE_FUNC: - textureObject->GetSamplerObject()->SetSamplerCompareFunc(MG_Util::ConvertGLEnumToSamplerCompareFunc(param)); + textureObject->GetSamplerObject()->SetSamplerCompareFunc( + MG_Util::ConvertGLEnumToSamplerCompareFunc((GLenum)param)); break; case GL_TEXTURE_LOD_BIAS: textureObject->GetSamplerObject()->SetLodBias(param); @@ -244,7 +247,7 @@ namespace MobileGL::MG_Impl::GLImpl { default: MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared( + MakeUnique( "MG_Impl/GLImpl", __func__, std::format("pname {} is not a valid texture parameter.", MG_Util::ConvertGLEnumToString(pname)))); return; @@ -253,12 +256,11 @@ namespace MobileGL::MG_Impl::GLImpl { void TexParameteri_State(GLenum target, GLenum pname, GLint param) { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = - GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + auto& textureObject = GetTextureObjectByTarget(textureUploadTarget, textureTarget); if (!textureObject) return; switch (pname) { @@ -319,7 +321,7 @@ namespace MobileGL::MG_Impl::GLImpl { default: MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared( + MakeUnique( "MG_Impl/GLImpl", __func__, std::format("pname {} is not a valid texture parameter.", MG_Util::ConvertGLEnumToString(pname)))); return; @@ -332,24 +334,22 @@ namespace MobileGL::MG_Impl::GLImpl { switch (pname) { case GL_TEXTURE_BORDER_COLOR: { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = - GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + auto& textureObject = GetTextureObjectByTarget(textureUploadTarget, textureTarget); if (!textureObject) return; THROW_UNIMPL_EXCEPTION; break; } case GL_TEXTURE_SWIZZLE_RGBA: { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = - GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + auto& textureObject = GetTextureObjectByTarget(textureUploadTarget, textureTarget); if (!textureObject) return; Vec4 swizzleParams; @@ -358,7 +358,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (TextureSwizzleParam::Unknown == swizzleParams[i]) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", __func__, "`params` is not valid.")); + MakeUnique("MG_Impl/GLImpl", __func__, "`params` is not valid.")); return; } } @@ -375,12 +375,11 @@ namespace MobileGL::MG_Impl::GLImpl { switch (pname) { case GL_TEXTURE_BORDER_COLOR: { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = - GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + auto& textureObject = GetTextureObjectByTarget(textureUploadTarget, textureTarget); if (!textureObject) return; THROW_UNIMPL_EXCEPTION; @@ -388,12 +387,11 @@ namespace MobileGL::MG_Impl::GLImpl { } case GL_TEXTURE_SWIZZLE_RGBA: { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = - GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + auto& textureObject = GetTextureObjectByTarget(textureUploadTarget, textureTarget); if (!textureObject) return; Vec4 swizzleParams; @@ -402,7 +400,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (TextureSwizzleParam::Unknown == swizzleParams[i]) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", __func__, "`params` is not valid.")); + MakeUnique("MG_Impl/GLImpl", __func__, "`params` is not valid.")); return; } } @@ -423,12 +421,11 @@ namespace MobileGL::MG_Impl::GLImpl { } case GL_TEXTURE_SWIZZLE_RGBA: { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = - GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + auto& textureObject = GetTextureObjectByTarget(textureUploadTarget, textureTarget); if (!textureObject) return; Vec4 swizzleParams; @@ -437,7 +434,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (TextureSwizzleParam::Unknown == swizzleParams[i]) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", __func__, "`params` is not valid.")); + MakeUnique("MG_Impl/GLImpl", __func__, "`params` is not valid.")); return; } } @@ -458,12 +455,11 @@ namespace MobileGL::MG_Impl::GLImpl { } case GL_TEXTURE_SWIZZLE_RGBA: { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = - GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + auto& textureObject = GetTextureObjectByTarget(textureUploadTarget, textureTarget); if (!textureObject) return; Vec4 swizzleParams; @@ -472,7 +468,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (TextureSwizzleParam::Unknown == swizzleParams[i]) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", __func__, "`params` is not valid.")); + MakeUnique("MG_Impl/GLImpl", __func__, "`params` is not valid.")); return; } } @@ -510,7 +506,7 @@ namespace MobileGL::MG_Impl::GLImpl { MG_Util::ConvertTexturePixelDataTypeToString(MG_Util::ConvertGLEnumToTexturePixelDataType(type)).c_str(), type, pixels); // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); TextureInputFormat textureInputFormat = MG_Util::ConvertGLEnumToTextureInputFormat(format); TexturePixelDataType texturePixelDataType = MG_Util::ConvertGLEnumToTexturePixelDataType(type); @@ -519,16 +515,16 @@ namespace MobileGL::MG_Impl::GLImpl { // ===================== Error Checking ============================== if (!TextureImpl::ValidateTexturePixelDataType(texturePixelDataType)) return; if (!TextureImpl::ValidateTextureInputFormat(textureInputFormat)) return; - if (!TextureImpl::ValidateTextureUploadTarget(textureUploadingTarget)) return; + if (!TextureImpl::ValidateTextureUploadTarget(textureUploadTarget)) return; if (!TextureImpl::ValidateTextureLevelNumber(level)) return; - if (!TextureImpl::ValidateTextureSizeWithTextureUploadTarget(textureUploadingTarget, width, height)) return; + if (!TextureImpl::ValidateTextureSizeWithTextureUploadTarget(textureUploadTarget, width, height)) return; if (!TextureImpl::ValidateTextureSizeRange(width, height, depth)) return; if (!TextureImpl::ValidateTextureInternalFormat(textureInternalFormat)) return; if (!TextureImpl::ValidateTextureBorderNumber(border)) return; if (!TextureImpl::ValidateTextureInternalFormatCompatibleWithInput(textureInputFormat, textureInternalFormat, texturePixelDataType)) return; - if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadingTarget, level)) return; + if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadTarget, level)) return; // TODO: GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the // GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped. @@ -539,16 +535,12 @@ namespace MobileGL::MG_Impl::GLImpl { // target and data is not evenly divisible into the number of bytes needed to store in memory a datum // indicated by type. // ======================= Processing ================================ - SharedPtr textureObject = nullptr; - Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadingTarget); - if (isProxy) { - textureObject = - TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget); - } else { - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); + Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadTarget); + auto& textureObject = + isProxy ? TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadTarget) + : bindingSlot.GetBoundObject(); // ===================== Error Checking ============================== if (!TextureImpl::ValidateTextureObject(textureObject)) return; @@ -579,10 +571,10 @@ namespace MobileGL::MG_Impl::GLImpl { MOBILEGL_ASSERT(nullptr != dynamic_cast(textureObject.get()), "Texture object here should always be an object with mipmap"); - auto textureMipmapObject = static_cast(textureObject.get()); + auto textureMipmapObject = dynamic_cast(textureObject.get()); // Allocate in TextureObject - textureMipmapObject->AllocateStorage(textureUploadingTarget, level, {{width, height, depth}, internalBytes}); + textureMipmapObject->AllocateStorage(textureUploadTarget, level, {{width, height, depth}, internalBytes}); if (!originalPixels) { MGLOG_D("%s: No input pixel and no PBO bound, no pixel transfer", __func__); @@ -603,10 +595,10 @@ namespace MobileGL::MG_Impl::GLImpl { const SizeT copySize = std::min(imageSize, internalBytes); DataPtr texelInput{processedPixels, copySize}; - textureMipmapObject->UpdateMipmapSubData(textureUploadingTarget, level, texelInput); + textureMipmapObject->UpdateMipmapSubData(textureUploadTarget, level, texelInput); } - textureMipmapObject->MarkStorageDirty(textureUploadingTarget, level, true); + textureMipmapObject->MarkStorageDirty(textureUploadTarget, level, true); free(processedPixels); } @@ -614,14 +606,14 @@ namespace MobileGL::MG_Impl::GLImpl { void TexImage2D_State(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); TextureInputFormat textureInputFormat = MG_Util::ConvertGLEnumToTextureInputFormat(format); TexturePixelDataType texturePixelDataType = MG_Util::ConvertGLEnumToTexturePixelDataType(type); TextureInternalFormat textureInternalFormat = MG_Util::ConvertGLEnumToTextureInternalFormat(internalformat); MGLOG_D("%s called with target: %s (%s), level: %d, internalformat: %s (%s), width: %d, height: %d, " "border: %d, format: %s (%s), type: %s (%s), pixels: %p", - __func__, MG_Util::ConvertTextureUploadTargetToString(textureUploadingTarget).c_str(), + __func__, MG_Util::ConvertTextureUploadTargetToString(textureUploadTarget).c_str(), MG_Util::ConvertGLEnumToString(target).c_str(), level, MG_Util::ConvertTextureInternalFormatToString(textureInternalFormat).c_str(), MG_Util::ConvertGLEnumToString(internalformat).c_str(), width, height, border, @@ -632,16 +624,16 @@ namespace MobileGL::MG_Impl::GLImpl { // ===================== Error Checking ============================== if (!TextureImpl::ValidateTexturePixelDataType(texturePixelDataType)) return; if (!TextureImpl::ValidateTextureInputFormat(textureInputFormat)) return; - if (!TextureImpl::ValidateTextureUploadTarget(textureUploadingTarget)) return; + if (!TextureImpl::ValidateTextureUploadTarget(textureUploadTarget)) return; if (!TextureImpl::ValidateTextureLevelNumber(level)) return; - if (!TextureImpl::ValidateTextureSizeWithTextureUploadTarget(textureUploadingTarget, width, height)) return; + if (!TextureImpl::ValidateTextureSizeWithTextureUploadTarget(textureUploadTarget, width, height)) return; if (!TextureImpl::ValidateTextureSizeRange(width, height, 1)) return; if (!TextureImpl::ValidateTextureInternalFormat(textureInternalFormat)) return; if (!TextureImpl::ValidateTextureBorderNumber(border)) return; if (!TextureImpl::ValidateTextureInternalFormatCompatibleWithInput(textureInputFormat, textureInternalFormat, texturePixelDataType)) return; - if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadingTarget, level)) return; + if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadTarget, level)) return; // TODO: GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the // GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped. @@ -655,16 +647,12 @@ namespace MobileGL::MG_Impl::GLImpl { // ======================= Processing ================================ textureInternalFormat = MG_Util::ConvertInternalFormatToSized(textureInternalFormat, textureInputFormat, texturePixelDataType); - SharedPtr textureObject = nullptr; - Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadingTarget); - if (isProxy) { - textureObject = - TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget); - } else { - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); + Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadTarget); + auto& textureObject = + isProxy ? TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadTarget) + : bindingSlot.GetBoundObject(); // ===================== Error Checking ============================== if (!TextureImpl::ValidateTextureObject(textureObject)) return; @@ -700,11 +688,11 @@ namespace MobileGL::MG_Impl::GLImpl { MOBILEGL_ASSERT(nullptr != dynamic_cast(textureObject.get()), "Texture object here should always be an object with mipmap"); - auto textureMipmapObject = static_cast(textureObject.get()); + auto textureMipmapObject = dynamic_cast(textureObject.get()); // Allocate in TextureObject MGLOG_D("%s: Allocating %d bytes at mip %d", __func__, internalBytes, level); - textureMipmapObject->AllocateStorage(textureUploadingTarget, level, {{width, height, 1}, internalBytes}); + textureMipmapObject->AllocateStorage(textureUploadTarget, level, {{width, height, 1}, internalBytes}); if (!originalPixels) { MGLOG_D("%s: No input pixel and no PBO bound, no pixel transfer", __func__); @@ -725,13 +713,13 @@ namespace MobileGL::MG_Impl::GLImpl { const SizeT copySize = std::min(imageSize, internalBytes); DataPtr texelInput{processedPixels, copySize}; - textureMipmapObject->UpdateMipmapSubData(textureUploadingTarget, level, texelInput); + textureMipmapObject->UpdateMipmapSubData(textureUploadTarget, level, texelInput); } free(processedPixels); MGLOG_D("%s: mark mip %d as dirty", __func__, level); - textureMipmapObject->MarkStorageDirty(textureUploadingTarget, level, true); + textureMipmapObject->MarkStorageDirty(textureUploadTarget, level, true); } void TexImage1D_State(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, @@ -743,40 +731,40 @@ namespace MobileGL::MG_Impl::GLImpl { void TexBuffer_State(GLenum target, GLenum internalformat, GLuint buffer) { // ======================= Converting ================================ TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureInternalFormat textureInternalFormat = MG_Util::ConvertGLEnumToTextureInternalFormat(internalformat); // ===================== Error Checking ============================== - if (!TextureImpl::ValidateTextureUploadTarget(textureUploadingTarget)) return; + if (!TextureImpl::ValidateTextureUploadTarget(textureUploadTarget)) return; if (!TextureImpl::ValidateTextureInternalFormat(textureInternalFormat)) return; // TODO: make sure `internalformat` is in one of supported format for TexBuffer - auto bufferObject = MG_State::pGLContext->GetBufferObject(buffer); + auto& bufferObject = MG_State::pGLContext->GetBufferObject(buffer); if (!bufferObject) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", __func__, + MakeUnique("MG_Impl/GLImpl", __func__, "`buffer` is not zero and is not the name of an existing buffer object.")); return; } // ======================= Processing ================================ - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - auto textureObject = bindingSlot.GetBoundObject(); + auto& textureObject = bindingSlot.GetBoundObject(); // ===================== Error Checking ============================== if (!TextureImpl::ValidateTextureObject(textureObject)) return; if (textureObject->GetStorageType() != TextureStorageType::Buffer) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", __func__, + MakeUnique("MG_Impl/GLImpl", __func__, "The effective target of `texture` is not `GL_TEXTURE_BUFFER`.")); return; } // ======================= Processing ================================ // Now we can rest assured, and down-cast texture object to texture buffer - auto* texBufferObject = static_cast(textureObject.get()); + auto* texBufferObject = dynamic_cast(textureObject.get()); auto& bufferSlot = texBufferObject->GetBufferBindingSlot(); bufferSlot.Bind(bufferObject); @@ -801,32 +789,31 @@ namespace MobileGL::MG_Impl::GLImpl { void GetTexParameteriv_State(GLenum target, GLenum pname, GLint* params) { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = nullptr; - if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) { - textureObject = TextureImpl::pProxyTextureManager->GetProxyTextureObject(textureUploadingTarget); - } else { - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); + Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadTarget); + auto& textureObject = + isProxy ? TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadTarget) + : bindingSlot.GetBoundObject(); if (!TextureImpl::ValidateTextureObject(textureObject)) return; switch (pname) { case GL_TEXTURE_MAG_FILTER: if (params) { - *params = MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMagFilter(), - SamplerMipmapMode::None); + *params = (GLint)MG_Util::ConvertSamplerFilterModeToGLEnum( + textureObject->GetSamplerObject()->GetMagFilter(), SamplerMipmapMode::None); } break; case GL_TEXTURE_MIN_FILTER: if (params) { - *params = MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMinFilter(), - textureObject->GetSamplerObject()->GetMipmapMode()); + *params = (GLint)MG_Util::ConvertSamplerFilterModeToGLEnum( + textureObject->GetSamplerObject()->GetMinFilter(), + textureObject->GetSamplerObject()->GetMipmapMode()); } break; case GL_TEXTURE_MIN_LOD: @@ -845,34 +832,34 @@ namespace MobileGL::MG_Impl::GLImpl { break; // TODO case GL_TEXTURE_WRAP_S: if (params) { - *params = MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapS()); + *params = (GLint)MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapS()); } break; case GL_TEXTURE_WRAP_T: if (params) { - *params = MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapT()); + *params = (GLint)MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapT()); } break; case GL_TEXTURE_WRAP_R: if (params) { - *params = MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapR()); + *params = (GLint)MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapR()); } break; case GL_TEXTURE_COMPARE_MODE: if (params) { - *params = - MG_Util::ConvertSamplerCompareModeToGLEnum(textureObject->GetSamplerObject()->GetCompareMode()); + *params = (GLint)MG_Util::ConvertSamplerCompareModeToGLEnum( + textureObject->GetSamplerObject()->GetCompareMode()); } break; case GL_TEXTURE_COMPARE_FUNC: if (params) { - *params = MG_Util::ConvertSamplerCompareFuncToGLEnum( + *params = (GLint)MG_Util::ConvertSamplerCompareFuncToGLEnum( textureObject->GetSamplerObject()->GetSamplerCompareFunc()); } break; default: MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "GetTexParameteriv_State", + MakeUnique("MG_Impl/GLImpl", "GetTexParameteriv_State", "pname is not a valid texture parameter.")); return; } @@ -880,32 +867,31 @@ namespace MobileGL::MG_Impl::GLImpl { void GetTexParameterfv_State(GLenum target, GLenum pname, GLfloat* params) { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = nullptr; - if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) { - textureObject = TextureImpl::pProxyTextureManager->GetProxyTextureObject(textureUploadingTarget); - } else { - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); + Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadTarget); + auto& textureObject = + isProxy ? TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadTarget) + : bindingSlot.GetBoundObject(); if (!TextureImpl::ValidateTextureObject(textureObject)) return; switch (pname) { case GL_TEXTURE_MAG_FILTER: if (params) { - *params = MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMagFilter(), - SamplerMipmapMode::None); + *params = (GLfloat)MG_Util::ConvertSamplerFilterModeToGLEnum( + textureObject->GetSamplerObject()->GetMagFilter(), SamplerMipmapMode::None); } break; case GL_TEXTURE_MIN_FILTER: if (params) { - *params = MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMinFilter(), - textureObject->GetSamplerObject()->GetMipmapMode()); + *params = (GLfloat)MG_Util::ConvertSamplerFilterModeToGLEnum( + textureObject->GetSamplerObject()->GetMinFilter(), + textureObject->GetSamplerObject()->GetMipmapMode()); } break; case GL_TEXTURE_MIN_LOD: @@ -929,34 +915,37 @@ namespace MobileGL::MG_Impl::GLImpl { break; // TODO case GL_TEXTURE_WRAP_S: if (params) { - *params = MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapS()); + *params = + (GLfloat)MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapS()); } break; case GL_TEXTURE_WRAP_T: if (params) { - *params = MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapT()); + *params = + (GLfloat)MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapT()); } break; case GL_TEXTURE_WRAP_R: if (params) { - *params = MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapR()); + *params = + (GLfloat)MG_Util::ConvertSamplerWrapModeToGLEnum(textureObject->GetSamplerObject()->GetWrapR()); } break; case GL_TEXTURE_COMPARE_MODE: if (params) { - *params = - MG_Util::ConvertSamplerCompareModeToGLEnum(textureObject->GetSamplerObject()->GetCompareMode()); + *params = (GLfloat)MG_Util::ConvertSamplerCompareModeToGLEnum( + textureObject->GetSamplerObject()->GetCompareMode()); } break; case GL_TEXTURE_COMPARE_FUNC: if (params) { - *params = MG_Util::ConvertSamplerCompareFuncToGLEnum( + *params = (GLfloat)MG_Util::ConvertSamplerCompareFuncToGLEnum( textureObject->GetSamplerObject()->GetSamplerCompareFunc()); } break; default: MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "GetTexParameterfv_State", + MakeUnique("MG_Impl/GLImpl", "GetTexParameterfv_State", "pname is not a valid texture parameter.")); return; } @@ -965,24 +954,21 @@ namespace MobileGL::MG_Impl::GLImpl { void GetTexLevelParameteriv_State(GLenum target, GLint level, GLenum pname, GLint* params) { MGLOG_D("GetTexLevelParameteriv_State called"); // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ===================== Error Checking ============================== - if (!TextureImpl::ValidateTextureUploadTarget(textureUploadingTarget)) return; + if (!TextureImpl::ValidateTextureUploadTarget(textureUploadTarget)) return; if (!TextureImpl::ValidateTextureLevelNumber(level)) return; - if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadingTarget, level)) return; + if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadTarget, level)) return; // ======================= Processing ================================ - SharedPtr textureObject = nullptr; - - if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) { - textureObject = TextureImpl::pProxyTextureManager->GetProxyTextureObject(textureUploadingTarget); - } else { - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); + Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadTarget); + auto& textureObject = + isProxy ? TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadTarget) + : bindingSlot.GetBoundObject(); if (!TextureImpl::ValidateTextureObject(textureObject)) return; @@ -992,8 +978,8 @@ namespace MobileGL::MG_Impl::GLImpl { switch (textureObject->GetStorageType()) { case TextureStorageType::Mipmap: { const auto textureMipmapObject = - static_cast(textureObject.get()); - *params = textureMipmapObject->GetMipmapTexelSize(textureUploadingTarget, level).x(); + dynamic_cast(textureObject.get()); + *params = textureMipmapObject->GetMipmapTexelSize(textureUploadTarget, level).x(); break; } default: @@ -1006,8 +992,8 @@ namespace MobileGL::MG_Impl::GLImpl { switch (textureObject->GetStorageType()) { case TextureStorageType::Mipmap: { const auto textureMipmapObject = - static_cast(textureObject.get()); - *params = textureMipmapObject->GetMipmapTexelSize(textureUploadingTarget, level).y(); + dynamic_cast(textureObject.get()); + *params = textureMipmapObject->GetMipmapTexelSize(textureUploadTarget, level).y(); break; } default: @@ -1020,8 +1006,8 @@ namespace MobileGL::MG_Impl::GLImpl { switch (textureObject->GetStorageType()) { case TextureStorageType::Mipmap: { const auto textureMipmapObject = - static_cast(textureObject.get()); - *params = textureMipmapObject->GetMipmapTexelSize(textureUploadingTarget, level).z(); + dynamic_cast(textureObject.get()); + *params = textureMipmapObject->GetMipmapTexelSize(textureUploadTarget, level).z(); break; } default: @@ -1031,7 +1017,7 @@ namespace MobileGL::MG_Impl::GLImpl { break; case GL_TEXTURE_INTERNAL_FORMAT: if (params) { - *params = MG_Util::ConvertTextureInternalFormatToGLEnum(textureObject->GetFormat()); + *params = (GLint)MG_Util::ConvertTextureInternalFormatToGLEnum(textureObject->GetFormat()); } break; case GL_TEXTURE_RED_TYPE: @@ -1049,7 +1035,7 @@ namespace MobileGL::MG_Impl::GLImpl { break; // TODO default: MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "GetTexLevelParameteriv_State", + ErrorCode::InvalidEnum, MakeUnique("MG_Impl/GLImpl", "GetTexLevelParameteriv_State", "pname is not a valid texture level parameter.")); return; } @@ -1057,23 +1043,21 @@ namespace MobileGL::MG_Impl::GLImpl { void GetTexLevelParameterfv_State(GLenum target, GLint level, GLenum pname, GLfloat* params) { // ======================= Converting ================================ - TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureUploadTarget textureUploadTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ===================== Error Checking ============================== - if (!TextureImpl::ValidateTextureUploadTarget(textureUploadingTarget)) return; + if (!TextureImpl::ValidateTextureUploadTarget(textureUploadTarget)) return; if (!TextureImpl::ValidateTextureLevelNumber(level)) return; - if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadingTarget, level)) return; + if (!TextureImpl::ValidateTextureLevelWithUploadTarget(textureUploadTarget, level)) return; // ======================= Processing ================================ - SharedPtr textureObject = nullptr; - if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) { - textureObject = TextureImpl::pProxyTextureManager->GetProxyTextureObject(textureUploadingTarget); - } else { - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); + Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadTarget); + auto& textureObject = + isProxy ? TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadTarget) + : bindingSlot.GetBoundObject(); if (!TextureImpl::ValidateTextureObject(textureObject)) return; @@ -1083,8 +1067,8 @@ namespace MobileGL::MG_Impl::GLImpl { switch (textureObject->GetStorageType()) { case TextureStorageType::Mipmap: { const auto textureMipmapObject = - static_cast(textureObject.get()); - *params = textureMipmapObject->GetMipmapTexelSize(textureUploadingTarget, level).x(); + dynamic_cast(textureObject.get()); + *params = (GLfloat)textureMipmapObject->GetMipmapTexelSize(textureUploadTarget, level).x(); break; } default: @@ -1097,8 +1081,8 @@ namespace MobileGL::MG_Impl::GLImpl { switch (textureObject->GetStorageType()) { case TextureStorageType::Mipmap: { const auto textureMipmapObject = - static_cast(textureObject.get()); - *params = textureMipmapObject->GetMipmapTexelSize(textureUploadingTarget, level).y(); + dynamic_cast(textureObject.get()); + *params = (GLfloat)textureMipmapObject->GetMipmapTexelSize(textureUploadTarget, level).y(); break; } default: @@ -1111,8 +1095,8 @@ namespace MobileGL::MG_Impl::GLImpl { switch (textureObject->GetStorageType()) { case TextureStorageType::Mipmap: { const auto textureMipmapObject = - static_cast(textureObject.get()); - *params = textureMipmapObject->GetMipmapTexelSize(textureUploadingTarget, level).z(); + dynamic_cast(textureObject.get()); + *params = (GLfloat)textureMipmapObject->GetMipmapTexelSize(textureUploadTarget, level).z(); break; } default: @@ -1122,7 +1106,7 @@ namespace MobileGL::MG_Impl::GLImpl { break; case GL_TEXTURE_INTERNAL_FORMAT: if (params) { - *params = MG_Util::ConvertTextureInternalFormatToGLEnum(textureObject->GetFormat()); + *params = (GLfloat)MG_Util::ConvertTextureInternalFormatToGLEnum(textureObject->GetFormat()); } break; case GL_TEXTURE_RED_TYPE: @@ -1140,7 +1124,7 @@ namespace MobileGL::MG_Impl::GLImpl { break; // TODO default: MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "GetTexLevelParameterfv_State", + ErrorCode::InvalidEnum, MakeUnique("MG_Impl/GLImpl", "GetTexLevelParameterfv_State", "pname is not a valid texture level parameter.")); return; } @@ -1155,13 +1139,14 @@ namespace MobileGL::MG_Impl::GLImpl { if (n < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GenTextures_State", "n must be non-negative")); + MakeUnique("MG_Impl/GLImpl", "GenTextures_State", "n must be non-negative")); return; } // ======================= Processing ================================ - auto textureNames = MG_State::pGLContext->GenTextureNames(n); - Copy(textureNames.data(), textures, textureNames.size()); + static thread_local Vector textureNames; + MG_State::pGLContext->GenTextureNames(n, textureNames); + Memcpy(textures, textureNames.data(), n * sizeof(GLuint)); } void DeleteTextures_State(GLsizei n, const GLuint* textures) { @@ -1169,13 +1154,13 @@ namespace MobileGL::MG_Impl::GLImpl { if (n < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "DeleteTextures_State", "n must be non-negative.")); + MakeUnique("MG_Impl/GLImpl", "DeleteTextures_State", "n must be non-negative.")); return; } if (!textures) { MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "DeleteTextures_State", + MakeUnique("MG_Impl/GLImpl", "DeleteTextures_State", "Texture names array cannot be null.")); return; } @@ -1211,7 +1196,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!currentReadFBO) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "CopyTexImage2D_State", + MakeUnique("MG_Impl/GLImpl", "CopyTexImage2D_State", "No framebuffer is currently bound to the GL_READ_FRAMEBUFFER target.")); return; } @@ -1230,7 +1215,7 @@ namespace MobileGL::MG_Impl::GLImpl { } else { \ MG_State::pGLContext->RecordError( \ ErrorCode::InvalidOperation, \ - MakeShared("MG_Impl/GLImpl", "CopyTexImage2D_State", \ + MakeUnique("MG_Impl/GLImpl", "CopyTexImage2D_State", \ "The attachment specified by the read buffer is incomplete.")); \ return; \ } @@ -1251,9 +1236,9 @@ namespace MobileGL::MG_Impl::GLImpl { GLenum type = GL_UNSIGNED_INT; MG_Util::TextureFormatProcessor::NormalizePixelFormat(outInternalFormat, PixelFormatNormalizeOptionBit::None, &realInternalFormat, &format, &type); - const auto pixelUnpackBufferObject = + const auto& pixelUnpackBufferObject = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::PixelUnpack).GetBoundObject(); - TexImage2D_State(target, level, realInternalFormat, width, height, border, format, type, nullptr); + TexImage2D_State(target, level, (GLint)realInternalFormat, width, height, border, format, type, nullptr); MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::PixelUnpack).Bind(pixelUnpackBufferObject); } @@ -1317,16 +1302,16 @@ namespace MobileGL::MG_Impl::GLImpl { if (!TextureImpl::ValidateTextureTarget(textureTarget)) return; // ======================= Processing ================================ - auto textureObject = MG_State::pGLContext->GetTextureObject(texture); + Bool doesTextureExist = MG_State::pGLContext->ValidateTextureObject(texture); + if (!doesTextureExist) { + MG_State::pGLContext->CreateTextureObject(texture, textureTarget); + } + auto& textureObject = MG_State::pGLContext->GetTextureObject(texture); // ===================== Error Checking ============================== - if (!TextureImpl::ValidateTextureTargetUniformity(textureObject, textureTarget)) return; + if (doesTextureExist && !TextureImpl::ValidateTextureTargetUniformity(textureObject, textureTarget)) return; // ======================= Processing ================================ - if (!textureObject) { - textureObject = MG_State::pGLContext->CreateTextureObject(texture, textureTarget); - } - auto& currentUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); auto& bindingSlot = currentUnit.GetBindingSlot(textureTarget); bindingSlot.Bind(textureObject); @@ -1337,7 +1322,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (texture < GL_TEXTURE0 || texture > GL_TEXTURE31) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared( + MakeUnique( "MG_Impl/GLImpl", "ActiveTexture_State", std::format("Texture must be one of GL_TEXTUREi, where i is in the range 0 to 31, but got " "invalid enum: 0x{:X}, which may stand for unit {}.", @@ -1366,7 +1351,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!TextureImpl::ValidateTextureUploadTarget(textureUploadTarget)) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", "Invalid texture target")); + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "Invalid texture target")); return; } @@ -1374,7 +1359,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (level < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", "Level must be non-negative")); + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "Level must be non-negative")); return; } @@ -1382,7 +1367,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!TextureImpl::ValidateTextureInputFormat(textureInputFormat)) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", "Invalid format")); + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "Invalid format")); return; } @@ -1390,23 +1375,21 @@ namespace MobileGL::MG_Impl::GLImpl { if (!TextureImpl::ValidateTexturePixelDataType(texturePixelDataType)) { MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", "Invalid pixel data type")); + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "Invalid pixel data type")); return; } // Get texture object - SharedPtr textureObject = nullptr; - if (TextureImpl::IsProxyTextureTarget(textureUploadTarget)) { - textureObject = TextureImpl::pProxyTextureManager->GetProxyTextureObject(textureUploadTarget); - } else { - auto activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } + auto& activeUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); + Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadTarget); + auto& textureObject = + isProxy ? TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadTarget) + : bindingSlot.GetBoundObject(); if (!TextureImpl::ValidateTextureObject(textureObject)) { MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "No valid texture bound to target")); return; } @@ -1415,7 +1398,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!textureObject->IsComplete()) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", "Texture is incomplete")); + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "Texture is incomplete")); return; } @@ -1427,7 +1410,7 @@ namespace MobileGL::MG_Impl::GLImpl { // Check if PBO is mapped if (pixelPackBufferObject->IsMapped()) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, MakeShared("MG_Impl/GLImpl", "GetTexImage_State", + ErrorCode::InvalidOperation, MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "Pixel pack buffer is currently mapped")); return; } @@ -1437,7 +1420,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (reinterpret_cast(pixels) % typeSize != 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "Pixel data not aligned for pixel pack buffer")); return; } @@ -1450,7 +1433,7 @@ namespace MobileGL::MG_Impl::GLImpl { textureObject->GetFormat() != TextureInternalFormat::Depth32FStencil8) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "No stencil buffer for stencil index format")); return; } @@ -1458,11 +1441,11 @@ namespace MobileGL::MG_Impl::GLImpl { // Check for multisampling if (textureObject->GetStorageType() == TextureStorageType::Mipmap) { - auto mipmapObject = static_cast(textureObject.get()); + auto mipmapObject = dynamic_cast(textureObject.get()); if (mipmapObject->GetMipmapLevelCount() > 1) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "GetTexImage_State", + MakeUnique("MG_Impl/GLImpl", "GetTexImage_State", "Multisampled textures not supported for GetTexImage")); return; } diff --git a/MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.cpp b/MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.cpp index b992aa31..5b7a8c71 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.cpp @@ -7,48 +7,47 @@ // End of Source File Header #include "ProxyTexture.h" -#include "MG_State/GLState/TextureState/TextureObject2D.h" -#include "MG_Util/Types.h" +#include -namespace MobileGL::MG_Impl::GLImpl { - namespace TextureImpl { - ProxyTextureManager* pProxyTextureManager; +namespace MobileGL::MG_Impl::GLImpl::TextureImpl { + UniquePtr pProxyTextureManager; - Bool IsProxyTextureTarget(TextureUploadTarget target) { - switch (target) { - case TextureUploadTarget::ProxyCubeMap: - case TextureUploadTarget::ProxyTexture1DArray: - case TextureUploadTarget::ProxyTexture2DArray: - case TextureUploadTarget::ProxyTexture1D: - case TextureUploadTarget::ProxyTexture2D: - case TextureUploadTarget::ProxyTexture3D: - case TextureUploadTarget::ProxyTexture2DMultisample: - case TextureUploadTarget::ProxyTexture2DMultisampleArray: - case TextureUploadTarget::ProxyTextureRectangle: - case TextureUploadTarget::ProxyCubeMapArray: - return true; - default: - return false; - } + Bool IsProxyTextureTarget(TextureUploadTarget target) { + switch (target) { + case TextureUploadTarget::ProxyCubeMap: + case TextureUploadTarget::ProxyTexture1DArray: + case TextureUploadTarget::ProxyTexture2DArray: + case TextureUploadTarget::ProxyTexture1D: + case TextureUploadTarget::ProxyTexture2D: + case TextureUploadTarget::ProxyTexture3D: + case TextureUploadTarget::ProxyTexture2DMultisample: + case TextureUploadTarget::ProxyTexture2DMultisampleArray: + case TextureUploadTarget::ProxyTextureRectangle: + case TextureUploadTarget::ProxyCubeMapArray: + return true; + default: + return false; } + } - SharedPtr ProxyTextureManager::CreateOrReplaceProxyTextureObject( - TextureUploadTarget target) { - auto it = m_proxyTexturesMap.find(target); - if (it != m_proxyTexturesMap.end()) { - m_proxyTexturesMap.erase(it); - } - m_proxyTexturesMap[target] = MakeShared(0); - return m_proxyTexturesMap[target]; + const SharedPtr& ProxyTextureManager::CreateOrReplaceProxyTextureObject( + TextureUploadTarget target) { + auto it = m_proxyTexturesMap.find(target); + if (it != m_proxyTexturesMap.end()) { + m_proxyTexturesMap.erase(it); } + auto& obj = m_proxyTexturesMap[target]; + obj = MakeShared(0); + return obj; + } - SharedPtr ProxyTextureManager::GetProxyTextureObject( - TextureUploadTarget target) { - auto it = m_proxyTexturesMap.find(target); - if (it != m_proxyTexturesMap.end()) { - return it->second; - } - return nullptr; + const SharedPtr& ProxyTextureManager::GetProxyTextureObject( + TextureUploadTarget target) { + auto it = m_proxyTexturesMap.find(target); + if (it != m_proxyTexturesMap.end()) { + return it->second; } - } // namespace TextureImpl -} // namespace MobileGL::MG_Impl::GLImpl + static SharedPtr nullTextureObject = nullptr; + return nullTextureObject; + } +} // namespace MobileGL::MG_Impl::GLImpl::TextureImpl diff --git a/MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.h b/MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.h index 944bc777..59196829 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.h +++ b/MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.h @@ -10,19 +10,18 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace TextureImpl { - Bool IsProxyTextureTarget(TextureUploadTarget target); +namespace MobileGL::MG_Impl::GLImpl::TextureImpl { + Bool IsProxyTextureTarget(TextureUploadTarget target); - class ProxyTextureManager { - public: - SharedPtr CreateOrReplaceProxyTextureObject(TextureUploadTarget target); - SharedPtr GetProxyTextureObject(TextureUploadTarget target); + class ProxyTextureManager { + public: + const SharedPtr& CreateOrReplaceProxyTextureObject( + TextureUploadTarget target); + const SharedPtr& GetProxyTextureObject(TextureUploadTarget target); - private: - UnorderedMap> m_proxyTexturesMap; - }; + private: + UnorderedMap> m_proxyTexturesMap; + }; - extern ProxyTextureManager* pProxyTextureManager; - } // namespace TextureImpl -} // namespace MobileGL::MG_Impl::GLImpl + extern UniquePtr pProxyTextureManager; +} // namespace MobileGL::MG_Impl::GLImpl::TextureImpl diff --git a/MobileGL/MG_Impl/GLImpl/Texture/Validators.cpp b/MobileGL/MG_Impl/GLImpl/Texture/Validators.cpp index 1978765b..d6d36ef3 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/Validators.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/Validators.cpp @@ -15,309 +15,295 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace TextureImpl { - Bool ValidateTextureTarget(TextureTarget target) { - if (target == TextureTarget::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "ValidateTextureTarget", "Invalid texture target")); - return false; - } - return true; +namespace MobileGL::MG_Impl::GLImpl::TextureImpl { + Bool ValidateTextureTarget(TextureTarget target) { + if (target == TextureTarget::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureTarget", "Invalid texture target")); + return false; + } + return true; + } + + Bool ValidateTextureUploadTarget(TextureUploadTarget textureUploadTarget) { + if (textureUploadTarget == TextureUploadTarget::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeUnique("MG_Impl/GLImpl", "ValidateTextureUploadTarget", + "Invalid texture upload target")); + return false; + } + return true; + } + + Bool ValidateTextureName(Uint texture, Bool allowZero) { + if (texture == 0) { + if (allowZero) return true; + + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureName", "Texture name cannot be zero")); + return false; } - Bool ValidateTextureUploadTarget(TextureUploadTarget textureUploadTarget) { - if (textureUploadTarget == TextureUploadTarget::Unknown) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", - "ValidateTextureUploadTarget", - "Invalid texture upload target")); - return false; - } - return true; + if (!MG_State::pGLContext->ValidateTextureName(texture)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureName", "Invalid texture name")); + return false; + } + return true; + } + + Bool ValidateTextureInputFormat(TextureInputFormat format) { + if (format == TextureInputFormat::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeUnique("MG_Impl/GLImpl", "ValidateTextureInputFormat", + "Invalid texture input format")); + return false; + } + return true; + } + + Bool ValidateTexturePixelDataType(TexturePixelDataType texturePixelDataType) { + if (texturePixelDataType == TexturePixelDataType::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeUnique("MG_Impl/GLImpl", "ValidateTexturePixelDataType", + "Invalid texture pixel data type")); + return false; + } + return true; + } + + Bool ValidateTextureLevelNumber(GLint level) { + if (level < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "ValidateTextureLevelNumber", + "Texture level must be non-negative")); + return false; } - Bool ValidateTextureName(Uint texture, Bool allowZero) { - if (texture == 0) { - if (allowZero) return true; + // TODO: GL_INVALID_VALUE may be generated if level is greater than log2(max), where max is the returned + // value of GL_MAX_TEXTURE_SIZE. - MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureName", - "Texture name cannot be zero")); - return false; - } + return true; + } - if (!MG_State::pGLContext->ValidateTextureName(texture)) { + Bool ValidateTextureSizeWithTextureUploadTarget(TextureUploadTarget target, GLsizei width, GLsizei height) { + if (target == TextureUploadTarget::CubeMapPositiveX || target == TextureUploadTarget::CubeMapNegativeX || + target == TextureUploadTarget::CubeMapPositiveY || target == TextureUploadTarget::CubeMapNegativeY || + target == TextureUploadTarget::CubeMapPositiveZ || target == TextureUploadTarget::CubeMapNegativeZ) { + if (width != height) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureName", "Invalid texture name")); + MakeUnique("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget", + "Width and height must be equal for cube map textures")); return false; } - return true; } - Bool ValidateTextureInputFormat(TextureInputFormat format) { - if (format == TextureInputFormat::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateTextureInputFormat", - "Invalid texture input format")); - return false; - } - return true; - } - - Bool ValidateTexturePixelDataType(TexturePixelDataType texturePixelDataType) { - if (texturePixelDataType == TexturePixelDataType::Unknown) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", - "ValidateTexturePixelDataType", - "Invalid texture pixel data type")); - return false; - } - return true; - } - - Bool ValidateTextureLevelNumber(GLint level) { - if (level < 0) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", - "ValidateTextureLevelNumber", - "Texture level must be non-negative")); - return false; - } - - // TODO: GL_INVALID_VALUE may be generated if level is greater than log2(max), where max is the returned - // value of GL_MAX_TEXTURE_SIZE. - - return true; - } - - Bool ValidateTextureSizeWithTextureUploadTarget(TextureUploadTarget target, GLsizei width, GLsizei height) { - if (target == TextureUploadTarget::CubeMapPositiveX || target == TextureUploadTarget::CubeMapNegativeX || - target == TextureUploadTarget::CubeMapPositiveY || target == TextureUploadTarget::CubeMapNegativeY || - target == TextureUploadTarget::CubeMapPositiveZ || target == TextureUploadTarget::CubeMapNegativeZ) { - if (width != height) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget", - "Width and height must be equal for cube map textures")); - return false; - } - } - - if (!(target == TextureUploadTarget::Texture1DArray || - target == TextureUploadTarget::ProxyTexture1DArray)) { - if (height < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget", - "Height must be greater than or equal to zero")); - return false; - } - // TODO: GL_INVALID_VALUE is generated if target is not GL_TEXTURE_1D_ARRAY or GL_PROXY_TEXTURE_1D_ARRAY - // and height is greater than GL_MAX_TEXTURE_SIZE. - } - - if (target == TextureUploadTarget::Texture1DArray || target == TextureUploadTarget::ProxyTexture1DArray) { - if (height < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget", - "Height must be greater than or equal to zero")); - return false; - } - // TODO: GL_INVALID_VALUE is generated if target is GL_TEXTURE_1D_ARRAY or GL_PROXY_TEXTURE_1D_ARRAY and - // height is greater than GL_MAX_ARRAY_TEXTURE_LAYERS. - } - - return true; - } - - Bool ValidateTextureSizeRange(SizeT width, SizeT height, SizeT depth) { - if (width < 0 || height < 0 || depth < 0) { + if (!(target == TextureUploadTarget::Texture1DArray || target == TextureUploadTarget::ProxyTexture1DArray)) { + if (height < 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureSizeRange", - "Width and height must be greater than zero")); + MakeUnique("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget", + "Height must be greater than or equal to zero")); return false; } - - // TODO: GL_INVALID_VALUE is generated if width is greater than GL_MAX_TEXTURE_SIZE. - - return true; + // TODO: GL_INVALID_VALUE is generated if target is not GL_TEXTURE_1D_ARRAY or GL_PROXY_TEXTURE_1D_ARRAY + // and height is greater than GL_MAX_TEXTURE_SIZE. } - Bool ValidateTextureInternalFormat(TextureInternalFormat format) { - if (format == TextureInternalFormat::Unknown) { + if (target == TextureUploadTarget::Texture1DArray || target == TextureUploadTarget::ProxyTexture1DArray) { + if (height < 0) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "ValidateTextureInternalFormat", - "Invalid texture sized internal format")); + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget", + "Height must be greater than or equal to zero")); return false; } - return true; + // TODO: GL_INVALID_VALUE is generated if target is GL_TEXTURE_1D_ARRAY or GL_PROXY_TEXTURE_1D_ARRAY and + // height is greater than GL_MAX_ARRAY_TEXTURE_LAYERS. } - Bool ValidateTextureBorderNumber(Int border) { - if (border != 0) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", - "ValidateTextureBorderNumber", - "Border must be zero")); - return false; - } - return true; + return true; + } + + Bool ValidateTextureSizeRange(SizeT width, SizeT height, SizeT depth) { + if (width < 0 || height < 0 || depth < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, MakeUnique("MG_Impl/GLImpl", "ValidateTextureSizeRange", + "Width and height must be greater than zero")); + return false; } - Bool ValidateTextureInternalFormatCompatibleWithInput(TextureInputFormat format, - TextureInternalFormat internalFormat, - TexturePixelDataType type) { - if (type == TexturePixelDataType::UnsignedByte332 || type == TexturePixelDataType::UnsignedByte233Rev || - type == TexturePixelDataType::UnsignedShort565 || type == TexturePixelDataType::UnsignedShort565Rev || - type == TexturePixelDataType::UnsignedInt101111Rev) { - if (format != TextureInputFormat::RGB) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", - "ValidateTextureInternalFormatCompatibleWithInput", - "Invalid format for the given type")); - return false; - } - } + // TODO: GL_INVALID_VALUE is generated if width is greater than GL_MAX_TEXTURE_SIZE. - if (type == TexturePixelDataType::UnsignedShort4444 || type == TexturePixelDataType::UnsignedShort4444Rev || - type == TexturePixelDataType::UnsignedShort5551 || type == TexturePixelDataType::UnsignedShort1555Rev || - type == TexturePixelDataType::UnsignedInt8888 || type == TexturePixelDataType::UnsignedInt8888Rev || - type == TexturePixelDataType::UnsignedInt1010102 || - type == TexturePixelDataType::UnsignedInt2101010Rev || - type == TexturePixelDataType::UnsignedInt5999Rev) { - if (format != TextureInputFormat::RGBA && format != TextureInputFormat::BGRA) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", - "ValidateTextureInternalFormatCompatibleWithInput", - "Invalid format for the given type")); - return false; - } - } + return true; + } - if (internalFormat == TextureInternalFormat::DepthComponent || - internalFormat == TextureInternalFormat::DepthComponent16 || - internalFormat == TextureInternalFormat::DepthComponent24 || - internalFormat == TextureInternalFormat::DepthComponent32F) { - if (format != TextureInputFormat::DepthComponent) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", - "ValidateTextureInternalFormatCompatibleWithInput", - "Invalid format for depth component internal format")); - return false; - } - } + Bool ValidateTextureInternalFormat(TextureInternalFormat format) { + if (format == TextureInternalFormat::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeUnique("MG_Impl/GLImpl", "ValidateTextureInternalFormat", + "Invalid texture sized internal format")); + return false; + } + return true; + } - if (format == TextureInputFormat::DepthComponent && - (internalFormat != TextureInternalFormat::DepthComponent && - internalFormat != TextureInternalFormat::DepthComponent16 && - internalFormat != TextureInternalFormat::DepthComponent24 && - internalFormat != TextureInternalFormat::DepthComponent32F && - internalFormat != TextureInternalFormat::DepthComponent32 // workaround for Minecraft 1.21.5+ - )) { + Bool ValidateTextureBorderNumber(Int border) { + if (border != 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureBorderNumber", "Border must be zero")); + return false; + } + return true; + } + + Bool ValidateTextureInternalFormatCompatibleWithInput(TextureInputFormat format, + TextureInternalFormat internalFormat, + TexturePixelDataType type) { + if (type == TexturePixelDataType::UnsignedByte332 || type == TexturePixelDataType::UnsignedByte233Rev || + type == TexturePixelDataType::UnsignedShort565 || type == TexturePixelDataType::UnsignedShort565Rev || + type == TexturePixelDataType::UnsignedInt101111Rev) { + if (format != TextureInputFormat::RGB) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput", - "Invalid internal format for depth component format")); + MakeUnique("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput", + "Invalid format for the given type")); return false; } - return true; } - Bool ValidateTextureLevelWithUploadTarget(TextureUploadTarget target, Int level) { - if (target == TextureUploadTarget::TextureRectangle || - target == TextureUploadTarget::ProxyTextureRectangle) { - if (level != 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureLevelWithUploadTarget", - "Level must be zero for rectangle textures")); - return false; - } - } - return true; - } - - Bool ValidateTextureObject(SharedPtr textureObject) { - if (!textureObject) { + if (type == TexturePixelDataType::UnsignedShort4444 || type == TexturePixelDataType::UnsignedShort4444Rev || + type == TexturePixelDataType::UnsignedShort5551 || type == TexturePixelDataType::UnsignedShort1555Rev || + type == TexturePixelDataType::UnsignedInt8888 || type == TexturePixelDataType::UnsignedInt8888Rev || + type == TexturePixelDataType::UnsignedInt1010102 || type == TexturePixelDataType::UnsignedInt2101010Rev || + type == TexturePixelDataType::UnsignedInt5999Rev) { + if (format != TextureInputFormat::RGBA && format != TextureInputFormat::BGRA) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ValidateTextureObject", "Texture object is null")); + MakeUnique("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput", + "Invalid format for the given type")); return false; } - return true; } - Bool ValidateTextureTargetUniformity(SharedPtr textureObject, - TextureTarget target) { - if (!textureObject) return true; // should be created later - TextureTarget prevTarget = textureObject->GetTarget(); - if (prevTarget != target) { + if (internalFormat == TextureInternalFormat::DepthComponent || + internalFormat == TextureInternalFormat::DepthComponent16 || + internalFormat == TextureInternalFormat::DepthComponent24 || + internalFormat == TextureInternalFormat::DepthComponent32F) { + if (format != TextureInputFormat::DepthComponent) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ValidateTextureTargetUniformity", - "Texture target does not match the previously created texture")); + MakeUnique("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput", + "Invalid format for depth component internal format")); return false; } - return true; } - Bool ValidateTextureSubImageOffsets(SharedPtr textureObject, Int xoffset, - Int width, Int yoffset, Int height, Int zoffset, Int depth) { - auto baseSize = textureObject->GetBaseSize(); - if (xoffset < 0 || (xoffset + width) > baseSize.x()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets", - "xoffset must be non-negative and (xoffset + width) must not exceed " - "the texture width.")); - return false; - } - if (baseSize.y() == 0) return true; - - if (yoffset < 0 || (yoffset + height) > baseSize.y()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets", - "yoffset must be non-negative and (yoffset + height) must not exceed " - "the texture height.")); - return false; - } - if (baseSize.z() == 0) return true; - - if (zoffset < 0 || (zoffset + depth) > baseSize.z()) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets", - "zoffset must be non-negative and (zoffset + depth) must not exceed " - "the texture depth.")); - return false; - } - return true; + if (format == TextureInputFormat::DepthComponent && + (internalFormat != TextureInternalFormat::DepthComponent && + internalFormat != TextureInternalFormat::DepthComponent16 && + internalFormat != TextureInternalFormat::DepthComponent24 && + internalFormat != TextureInternalFormat::DepthComponent32F && + internalFormat != TextureInternalFormat::DepthComponent32 // workaround for Minecraft 1.21.5+ + )) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput", + "Invalid internal format for depth component format")); + return false; } + return true; + } - Bool ValidateBaseInternalFormatMatch(TextureInternalFormat format1, TextureInternalFormat format2) { - auto unsizedFormat1 = MG_Util::ConvertInternalFormatToUnsized(format1); - auto unsizedFormat2 = MG_Util::ConvertInternalFormatToUnsized(format2); - if (unsizedFormat1 != unsizedFormat2) { + Bool ValidateTextureLevelWithUploadTarget(TextureUploadTarget target, Int level) { + if (target == TextureUploadTarget::TextureRectangle || target == TextureUploadTarget::ProxyTextureRectangle) { + if (level != 0) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared( - std::format("MG_Impl/GLImpl", "ValidateBaseInternalFormatMatch", - "The base internal format of the two formats do not match ({} vs. {})", - MG_Util::ConvertTextureInternalFormatToString(unsizedFormat1).c_str(), - MG_Util::ConvertTextureInternalFormatToString(unsizedFormat2).c_str()))); + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureLevelWithUploadTarget", + "Level must be zero for rectangle textures")); return false; } - return true; - } // namespace TextureImpl + } + return true; + } + + Bool ValidateTextureObject(SharedPtr textureObject) { + if (!textureObject) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureObject", "Texture object is null")); + return false; + } + return true; + } + + Bool ValidateTextureTargetUniformity(SharedPtr textureObject, + TextureTarget target) { + if (!textureObject) return true; // should be created later + TextureTarget prevTarget = textureObject->GetTarget(); + if (prevTarget != target) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureTargetUniformity", + "Texture target does not match the previously created texture")); + return false; + } + return true; + } + + Bool ValidateTextureSubImageOffsets(SharedPtr textureObject, Int xoffset, + Int width, Int yoffset, Int height, Int zoffset, Int depth) { + auto baseSize = textureObject->GetBaseSize(); + if (xoffset < 0 || (xoffset + width) > baseSize.x()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets", + "xoffset must be non-negative and (xoffset + width) must not exceed " + "the texture width.")); + return false; + } + if (baseSize.y() == 0) return true; + + if (yoffset < 0 || (yoffset + height) > baseSize.y()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets", + "yoffset must be non-negative and (yoffset + height) must not exceed " + "the texture height.")); + return false; + } + if (baseSize.z() == 0) return true; + + if (zoffset < 0 || (zoffset + depth) > baseSize.z()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets", + "zoffset must be non-negative and (zoffset + depth) must not exceed " + "the texture depth.")); + return false; + } + return true; + } + + Bool ValidateBaseInternalFormatMatch(TextureInternalFormat format1, TextureInternalFormat format2) { + auto unsizedFormat1 = MG_Util::ConvertInternalFormatToUnsized(format1); + auto unsizedFormat2 = MG_Util::ConvertInternalFormatToUnsized(format2); + if (unsizedFormat1 != unsizedFormat2) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique( + std::format("MG_Impl/GLImpl", "ValidateBaseInternalFormatMatch", + "The base internal format of the two formats do not match ({} vs. {})", + MG_Util::ConvertTextureInternalFormatToString(unsizedFormat1).c_str(), + MG_Util::ConvertTextureInternalFormatToString(unsizedFormat2).c_str()))); + return false; + } + return true; } // namespace TextureImpl -} // namespace MobileGL::MG_Impl::GLImpl \ No newline at end of file +} // namespace MobileGL::MG_Impl::GLImpl::TextureImpl diff --git a/MobileGL/MG_Impl/GLImpl/Texture/Validators.h b/MobileGL/MG_Impl/GLImpl/Texture/Validators.h index 2a15aba6..e4d22f84 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/Validators.h +++ b/MobileGL/MG_Impl/GLImpl/Texture/Validators.h @@ -12,27 +12,25 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace TextureImpl { - Bool ValidateTextureTarget(TextureTarget target); - Bool ValidateTextureUploadTarget(TextureUploadTarget textureUploadTarget); - Bool ValidateTextureName(Uint texture, Bool allowZero = false); - Bool ValidateTextureInputFormat(TextureInputFormat format); - Bool ValidateTexturePixelDataType(TexturePixelDataType texturePixelDataType); - Bool ValidateTextureLevelNumber(Int level); - Bool ValidateTextureSizeWithTextureUploadTarget(TextureUploadTarget target, GLsizei width, GLsizei height); - Bool ValidateTextureSizeRange(SizeT width, SizeT height, SizeT depth); - Bool ValidateTextureInternalFormat(TextureInternalFormat format); - Bool ValidateTextureBorderNumber(Int border); - Bool ValidateTextureInternalFormatCompatibleWithInput(TextureInputFormat format, - TextureInternalFormat internalFormat, - TexturePixelDataType type); - Bool ValidateTextureLevelWithUploadTarget(TextureUploadTarget target, Int level); - Bool ValidateTextureObject(SharedPtr textureObject); - Bool ValidateTextureTargetUniformity(SharedPtr textureObject, - TextureTarget target); - Bool ValidateTextureSubImageOffsets(SharedPtr textureObject, Int xoffset, - Int width, Int yoffset = 0, Int height = 0, Int zoffset = 0, Int depth = 0); - Bool ValidateBaseInternalFormatMatch(TextureInternalFormat format1, TextureInternalFormat format2); - } // namespace TextureImpl -} // namespace MobileGL::MG_Impl::GLImpl \ No newline at end of file +namespace MobileGL::MG_Impl::GLImpl::TextureImpl { + Bool ValidateTextureTarget(TextureTarget target); + Bool ValidateTextureUploadTarget(TextureUploadTarget textureUploadTarget); + Bool ValidateTextureName(Uint texture, Bool allowZero = false); + Bool ValidateTextureInputFormat(TextureInputFormat format); + Bool ValidateTexturePixelDataType(TexturePixelDataType texturePixelDataType); + Bool ValidateTextureLevelNumber(Int level); + Bool ValidateTextureSizeWithTextureUploadTarget(TextureUploadTarget target, GLsizei width, GLsizei height); + Bool ValidateTextureSizeRange(SizeT width, SizeT height, SizeT depth); + Bool ValidateTextureInternalFormat(TextureInternalFormat format); + Bool ValidateTextureBorderNumber(Int border); + Bool ValidateTextureInternalFormatCompatibleWithInput(TextureInputFormat format, + TextureInternalFormat internalFormat, + TexturePixelDataType type); + Bool ValidateTextureLevelWithUploadTarget(TextureUploadTarget target, Int level); + Bool ValidateTextureObject(SharedPtr textureObject); + Bool ValidateTextureTargetUniformity(SharedPtr textureObject, + TextureTarget target); + Bool ValidateTextureSubImageOffsets(SharedPtr textureObject, Int xoffset, + Int width, Int yoffset = 0, Int height = 0, Int zoffset = 0, Int depth = 0); + Bool ValidateBaseInternalFormatMatch(TextureInternalFormat format1, TextureInternalFormat format2); +} // namespace MobileGL::MG_Impl::GLImpl::TextureImpl diff --git a/MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.cpp b/MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.cpp index c78a9611..67f2fdf7 100644 --- a/MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.cpp +++ b/MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.cpp @@ -12,222 +12,216 @@ #include #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - void DisableVertexAttribArray_State(GLuint index) { - if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; +namespace MobileGL::MG_Impl::GLImpl { + void DisableVertexAttribArray_State(GLuint index) { + if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; - auto vao = MG_State::pGLContext->GetBoundVertexArray(); - if (!vao) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", - "EnableVertexAttribArray_State", - "No vertex array object is bound.")); - return; - } - - vao->DisableAttribute(index); + auto& vao = MG_State::pGLContext->GetBoundVertexArray(); + if (!vao) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", + "EnableVertexAttribArray_State", + "No vertex array object is bound.")); + return; } - void EnableVertexAttribArray_State(GLuint index) { - if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; + vao->DisableAttribute(index); + } - auto vao = MG_State::pGLContext->GetBoundVertexArray(); - if (!vao) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", - "EnableVertexAttribArray_State", - "No vertex array object is bound.")); - return; - } + void EnableVertexAttribArray_State(GLuint index) { + if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; - vao->EnableAttribute(index); + auto& vao = MG_State::pGLContext->GetBoundVertexArray(); + if (!vao) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", + "EnableVertexAttribArray_State", + "No vertex array object is bound.")); + return; } - // TODO: implement GL_BGRA support - void VertexAttribIPointer_State(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { - if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; + vao->EnableAttribute(index); + } - DataType dataType = MG_Util::ConvertGLEnumToDataType(type); - if (!VertexArrayImpl::ValidateVertexAttribPointerParams(index, size, dataType, stride)) return; + // TODO: implement GL_BGRA support + void VertexAttribIPointer_State(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { + if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; - auto vao = MG_State::pGLContext->GetBoundVertexArray(); - if (!vao) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", - "VertexAttribPointer_State", - "No vertex array object is bound.")); - return; - } + DataType dataType = MG_Util::ConvertGLEnumToDataType(type); + if (!VertexArrayImpl::ValidateVertexAttribPointerParams(index, size, dataType, stride)) return; - auto& vboSlot = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex); - auto vbo = vboSlot.GetBoundObject(); - if (!vbo) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "VertexAttribPointer_State", - "No buffer is bound to GL_ARRAY_BUFFER.")); - return; - } - - SizeT offset = reinterpret_cast(pointer); - - vao->SetAttributeFormat(index, size, dataType, false, stride, offset, true); - vao->BindAttributeBuffer(index, vbo); + auto& vao = MG_State::pGLContext->GetBoundVertexArray(); + if (!vao) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, MakeUnique("MG_Impl/GLImpl", "VertexAttribPointer_State", + "No vertex array object is bound.")); + return; } - // TODO: implement GL_BGRA support - void VertexAttribPointer_State(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* pointer) { - if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; - - DataType dataType = MG_Util::ConvertGLEnumToDataType(type); - if (!VertexArrayImpl::ValidateVertexAttribPointerParams(index, size, dataType, stride)) return; - - auto vao = MG_State::pGLContext->GetBoundVertexArray(); - if (!vao) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", - "VertexAttribPointer_State", - "No vertex array object is bound.")); - return; - } - - auto& vboSlot = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex); - auto vbo = vboSlot.GetBoundObject(); - if (!vbo) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "VertexAttribPointer_State", - "No buffer is bound to GL_ARRAY_BUFFER.")); - return; - } - - SizeT offset = reinterpret_cast(pointer); - - vao->SetAttributeFormat(index, size, dataType, normalized, stride, offset, false); - vao->BindAttributeBuffer(index, vbo); + auto& vboSlot = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex); + auto& vbo = vboSlot.GetBoundObject(); + if (!vbo) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, MakeUnique("MG_Impl/GLImpl", "VertexAttribPointer_State", + "No buffer is bound to GL_ARRAY_BUFFER.")); + return; } - void BindVertexArray_State(GLuint array) { - if (array == 0) { + auto offset = reinterpret_cast(pointer); + + vao->SetAttributeFormat(index, size, dataType, false, stride, offset, true); + vao->BindAttributeBuffer(index, vbo); + } + + // TODO: implement GL_BGRA support + void VertexAttribPointer_State(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, + const void* pointer) { + if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; + + DataType dataType = MG_Util::ConvertGLEnumToDataType(type); + if (!VertexArrayImpl::ValidateVertexAttribPointerParams(index, size, dataType, stride)) return; + + auto& vao = MG_State::pGLContext->GetBoundVertexArray(); + if (!vao) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, MakeUnique("MG_Impl/GLImpl", "VertexAttribPointer_State", + "No vertex array object is bound.")); + return; + } + + auto& vboSlot = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex); + auto& vbo = vboSlot.GetBoundObject(); + if (!vbo) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, MakeUnique("MG_Impl/GLImpl", "VertexAttribPointer_State", + "No buffer is bound to GL_ARRAY_BUFFER.")); + return; + } + + SizeT offset = reinterpret_cast(pointer); + + vao->SetAttributeFormat(index, size, dataType, normalized, stride, offset, false); + vao->BindAttributeBuffer(index, vbo); + } + + void BindVertexArray_State(GLuint array) { + if (array == 0) { + MG_State::pGLContext->BindVertexArray(0); + return; + } + + if (!VertexArrayImpl::ValidateVertexArrayName(array)) return; + + if (!MG_State::pGLContext->ValidateVertexArrayObject(array)) { + MG_State::pGLContext->CreateVertexArrayObject(array); + } + + MG_State::pGLContext->BindVertexArray(array); + } + + void DeleteVertexArrays_State(GLsizei n, const GLuint* arrays) { + if (n < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "DeleteVertexArrays_State", "n must be non-negative.")); + return; + } + + for (GLsizei i = 0; i < n; ++i) { + GLuint vao = arrays[i]; + if (vao == 0) continue; + + if (!VertexArrayImpl::ValidateVertexArrayName(vao)) continue; + + if (MG_State::pGLContext->GetBoundVertexArray() && + MG_State::pGLContext->GetBoundVertexArray() == MG_State::pGLContext->GetVertexArrayObject(vao)) { MG_State::pGLContext->BindVertexArray(0); - return; } - if (!VertexArrayImpl::ValidateVertexArrayName(array)) return; + MG_State::pGLContext->MarkVertexArrayForDeletion(vao); + } + } - if (!MG_State::pGLContext->ValidateVertexArrayObject(array)) { - MG_State::pGLContext->CreateVertexArrayObject(array); - } - - MG_State::pGLContext->BindVertexArray(array); + void GenVertexArrays_State(GLsizei n, GLuint* arrays) { + if (n < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "GenVertexArrays_State", "n must be non-negative.")); + return; } - void DeleteVertexArrays_State(GLsizei n, const GLuint* arrays) { - if (n < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "DeleteVertexArrays_State", - "n must be non-negative.")); - return; - } + static thread_local Vector vaos; + MG_State::pGLContext->GenVertexArrayNames(n, vaos); + Memcpy(arrays, vaos.data(), n * sizeof(GLuint)); + } - for (GLsizei i = 0; i < n; ++i) { - GLuint vao = arrays[i]; - if (vao == 0) continue; + GLboolean IsVertexArray_State(GLuint array) { + if (array == 0) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", "IsVertexArray_State", + "Vertex array name 0 is not supported.")); + return GL_FALSE; + } + if (!VertexArrayImpl::ValidateVertexArrayName(array)) return GL_FALSE; + if (!MG_State::pGLContext->ValidateVertexArrayObject(array)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "IsVertexArray_State", + std::format("Vertex array object {} does not exist.", array))); + return GL_FALSE; + } + return GL_TRUE; + } - if (!VertexArrayImpl::ValidateVertexArrayName(vao)) continue; + void VertexAttribDivisor_State(GLuint index, GLuint divisor) { + if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; - if (MG_State::pGLContext->GetBoundVertexArray() && - MG_State::pGLContext->GetBoundVertexArray() == MG_State::pGLContext->GetVertexArrayObject(vao)) { - MG_State::pGLContext->BindVertexArray(0); - } - - MG_State::pGLContext->MarkVertexArrayForDeletion(vao); - } + auto& vao = MG_State::pGLContext->GetBoundVertexArray(); + if (!vao) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, MakeUnique("MG_Impl/GLImpl", "VertexAttribDivisor_State", + "No vertex array object is bound.")); + return; } - void GenVertexArrays_State(GLsizei n, GLuint* arrays) { - if (n < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared("MG_Impl/GLImpl", "GenVertexArrays_State", "n must be non-negative.")); - return; - } + vao->SetAttributeDivisor(index, divisor); + } - auto vaoNames = MG_State::pGLContext->GenVertexArrayNames(n); - Copy(vaoNames.data(), arrays, vaoNames.size()); - } + /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ + void VertexAttribDivisor(GLuint index, GLuint divisor) { + VertexAttribDivisor_State(index, divisor); + } - GLboolean IsVertexArray_State(GLuint array) { - if (array == 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", "IsVertexArray_State", - "Vertex array name 0 is not supported.")); - return GL_FALSE; - } - if (!VertexArrayImpl::ValidateVertexArrayName(array)) return GL_FALSE; - if (!MG_State::pGLContext->ValidateVertexArrayObject(array)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "IsVertexArray_State", - std::format("Vertex array object {} does not exist.", array))); - return GL_FALSE; - } - return GL_TRUE; - } + GLboolean IsVertexArray(GLuint array) { + return IsVertexArray_State(array); + } - void VertexAttribDivisor_State(GLuint index, GLuint divisor) { - if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return; + void DisableVertexAttribArray(GLuint index) { + DisableVertexAttribArray_State(index); + } - auto vao = MG_State::pGLContext->GetBoundVertexArray(); - if (!vao) { - MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", - "VertexAttribDivisor_State", - "No vertex array object is bound.")); - return; - } + void EnableVertexAttribArray(GLuint index) { + EnableVertexAttribArray_State(index); + } - vao->SetAttributeDivisor(index, divisor); - } + void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { + VertexAttribIPointer_State(index, size, type, stride, pointer); + } - /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ - void VertexAttribDivisor(GLuint index, GLuint divisor) { - VertexAttribDivisor_State(index, divisor); - } + void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, + const void* pointer) { + VertexAttribPointer_State(index, size, type, normalized, stride, pointer); + } - GLboolean IsVertexArray(GLuint array) { - return IsVertexArray_State(array); - } + void BindVertexArray(GLuint array) { + BindVertexArray_State(array); + } - void DisableVertexAttribArray(GLuint index) { - DisableVertexAttribArray_State(index); - } + void DeleteVertexArrays(GLsizei n, const GLuint* arrays) { + DeleteVertexArrays_State(n, arrays); + } - void EnableVertexAttribArray(GLuint index) { - EnableVertexAttribArray_State(index); - } - - void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { - VertexAttribIPointer_State(index, size, type, stride, pointer); - } - - void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* pointer) { - VertexAttribPointer_State(index, size, type, normalized, stride, pointer); - } - - void BindVertexArray(GLuint array) { - BindVertexArray_State(array); - } - - void DeleteVertexArrays(GLsizei n, const GLuint* arrays) { - DeleteVertexArrays_State(n, arrays); - } - - void GenVertexArrays(GLsizei n, GLuint* arrays) { - GenVertexArrays_State(n, arrays); - } - } // namespace MG_Impl::GLImpl -} // namespace MobileGL + void GenVertexArrays(GLsizei n, GLuint* arrays) { + GenVertexArrays_State(n, arrays); + } +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.h b/MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.h index 4389756a..2dafde79 100644 --- a/MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.h +++ b/MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.h @@ -9,18 +9,16 @@ #pragma once #include -namespace MobileGL { - namespace MG_Impl::GLImpl { - /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ - void VertexAttribDivisor(GLuint index, GLuint divisor); - GLboolean IsVertexArray(GLuint array); - void DisableVertexAttribArray(GLuint index); - void EnableVertexAttribArray(GLuint index); - void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); - void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* pointer); - void BindVertexArray(GLuint array); - void DeleteVertexArrays(GLsizei n, const GLuint* arrays); - void GenVertexArrays(GLsizei n, GLuint* arrays); - } // namespace MG_Impl::GLImpl -} // namespace MobileGL +namespace MobileGL::MG_Impl::GLImpl { + /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ + void VertexAttribDivisor(GLuint index, GLuint divisor); + GLboolean IsVertexArray(GLuint array); + void DisableVertexAttribArray(GLuint index); + void EnableVertexAttribArray(GLuint index); + void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); + void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, + const void* pointer); + void BindVertexArray(GLuint array); + void DeleteVertexArrays(GLsizei n, const GLuint* arrays); + void GenVertexArrays(GLsizei n, GLuint* arrays); +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/VertexArray/Validators.cpp b/MobileGL/MG_Impl/GLImpl/VertexArray/Validators.cpp index 97dd7777..9adf089f 100644 --- a/MobileGL/MG_Impl/GLImpl/VertexArray/Validators.cpp +++ b/MobileGL/MG_Impl/GLImpl/VertexArray/Validators.cpp @@ -12,74 +12,71 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace VertexArrayImpl { +namespace MobileGL::MG_Impl::GLImpl::VertexArrayImpl { + Bool ValidateVertexArrayName(Uint index) { + Bool isValid = MG_State::pGLContext->ValidateVertexArrayName(index); + if (!isValid) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "ValidateVertexArrayName", + std::format("Vertex array name {} is not valid.", index))); + return false; + } + return true; + } - Bool ValidateVertexArrayName(Uint index) { - Bool isValid = MG_State::pGLContext->ValidateVertexArrayName(index); - if (!isValid) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ValidateVertexArrayName", - std::format("Vertex array name {} is not valid.", index))); - return false; - } - return true; + Bool ValidateVertexArrayObject(Uint index) { + if (!MG_State::pGLContext->ValidateVertexArrayObject(index)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", "ValidateVertexArrayObject", + std::format("Vertex array object {} does not exist.", index))); + return false; + } + return true; + } + + Bool ValidateVertexAttributeIndex(Uint index) { + if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", "ValidateVertexAttributeIndex", + std::format("Attribute index {} exceeds maximum of {}.", index, + MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS - 1))); + return false; + } + return true; + } + + Bool ValidateVertexAttribPointerParams(Uint index, SizeT size, DataType type, Int stride) { + if (size < 1 || size > 4) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", "ValidateVertexAttribPointerParams", + std::format("Invalid size {} for attribute {}. Must be 1-4.", size, index))); + return false; } - Bool ValidateVertexArrayObject(Uint index) { - if (!MG_State::pGLContext->ValidateVertexArrayObject(index)) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, - MakeShared("MG_Impl/GLImpl", "ValidateVertexArrayObject", - std::format("Vertex array object {} does not exist.", index))); - return false; - } - return true; + if (type == DataType::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeUnique( + "MG_Impl/GLImpl", "ValidateVertexAttribPointerParams", + std::format("Invalid type {} for attribute {}.", MG_Util::ConvertDataTypeToString(type), index))); + return false; } - Bool ValidateVertexAttributeIndex(Uint index) { - if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", "ValidateVertexAttributeIndex", - std::format("Attribute index {} exceeds maximum of {}.", index, - MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS - 1))); - return false; - } - return true; + if (stride < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique( + "MG_Impl/GLImpl", "ValidateVertexAttribPointerParams", + std::format("Negative stride {} is not allowed for attribute {}.", stride, index))); + return false; } - Bool ValidateVertexAttribPointerParams(Uint index, SizeT size, DataType type, Int stride) { - if (size < 1 || size > 4) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", "ValidateVertexAttribPointerParams", - std::format("Invalid size {} for attribute {}. Must be 1-4.", size, index))); - return false; - } - - if (type == DataType::Unknown) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, - MakeShared("MG_Impl/GLImpl", "ValidateVertexAttribPointerParams", - std::format("Invalid type {} for attribute {}.", - MG_Util::ConvertDataTypeToString(type).c_str(), index))); - return false; - } - - if (stride < 0) { - MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, - MakeShared( - "MG_Impl/GLImpl", "ValidateVertexAttribPointerParams", - std::format("Negative stride {} is not allowed for attribute {}.", stride, index))); - return false; - } - - return true; - } - } // namespace VertexArrayImpl -} // namespace MobileGL::MG_Impl::GLImpl \ No newline at end of file + return true; + } +} // namespace MobileGL::MG_Impl::GLImpl::VertexArrayImpl diff --git a/MobileGL/MG_Impl/GLImpl/VertexArray/Validators.h b/MobileGL/MG_Impl/GLImpl/VertexArray/Validators.h index 03e10591..198c70b6 100644 --- a/MobileGL/MG_Impl/GLImpl/VertexArray/Validators.h +++ b/MobileGL/MG_Impl/GLImpl/VertexArray/Validators.h @@ -10,11 +10,9 @@ #include #include -namespace MobileGL::MG_Impl::GLImpl { - namespace VertexArrayImpl { - Bool ValidateVertexArrayName(Uint index); - Bool ValidateVertexArrayObject(Uint index); - Bool ValidateVertexAttributeIndex(Uint index); - Bool ValidateVertexAttribPointerParams(Uint index, SizeT size, DataType type, Int stride); - } // namespace VertexArrayImpl -} // namespace MobileGL::MG_Impl::GLImpl \ No newline at end of file +namespace MobileGL::MG_Impl::GLImpl::VertexArrayImpl { + Bool ValidateVertexArrayName(Uint index); + Bool ValidateVertexArrayObject(Uint index); + Bool ValidateVertexAttributeIndex(Uint index); + Bool ValidateVertexAttribPointerParams(Uint index, SizeT size, DataType type, Int stride); +} // namespace MobileGL::MG_Impl::GLImpl::VertexArrayImpl diff --git a/MobileGL/MG_Impl/GLXImpl/LookUp/LookUp.h b/MobileGL/MG_Impl/GLXImpl/LookUp/LookUp.h index c98ee5bd..db896f01 100644 --- a/MobileGL/MG_Impl/GLXImpl/LookUp/LookUp.h +++ b/MobileGL/MG_Impl/GLXImpl/LookUp/LookUp.h @@ -10,9 +10,7 @@ #include #include "MG_Impl/GetProcAddress.h" -namespace MG_Impl { - namespace GLXImpl { - void* GetProcAddress(const char* name); - void* GetProcAddressARB(const char* name); - } // namespace GLXImpl -} // namespace MG_Impl \ No newline at end of file +namespace MG_Impl::GLXImpl { + void* GetProcAddress(const char* name); + void* GetProcAddressARB(const char* name); +} // namespace MG_Impl::GLXImpl diff --git a/MobileGL/MG_Impl/GetProcAddress.cpp b/MobileGL/MG_Impl/GetProcAddress.cpp index a9f6f699..2304c6e4 100644 --- a/MobileGL/MG_Impl/GetProcAddress.cpp +++ b/MobileGL/MG_Impl/GetProcAddress.cpp @@ -12,1345 +12,1343 @@ return (void*)name; \ } -namespace MobileGL { - namespace MG_Impl { - void* GetProcAddress(const char* name) { - MGLOG_D("GetProcAddress(%s)", name); - GETPROC(eglChooseConfig, name); - GETPROC(eglCopyBuffers, name); - GETPROC(eglCreateContext, name); - GETPROC(eglCreatePbufferSurface, name); - GETPROC(eglCreatePixmapSurface, name); - GETPROC(eglCreateWindowSurface, name); - GETPROC(eglDestroyContext, name); - GETPROC(eglDestroySurface, name); - GETPROC(eglGetConfigAttrib, name); - GETPROC(eglGetConfigs, name); - GETPROC(eglGetCurrentDisplay, name); - GETPROC(eglGetCurrentSurface, name); - GETPROC(eglGetDisplay, name); - GETPROC(eglGetError, name); - GETPROC(eglGetProcAddress, name); - GETPROC(eglInitialize, name); - GETPROC(eglMakeCurrent, name); - GETPROC(eglQueryContext, name); - GETPROC(eglQueryString, name); - GETPROC(eglQuerySurface, name); - GETPROC(eglSwapBuffers, name); - GETPROC(eglTerminate, name); - GETPROC(eglWaitGL, name); - GETPROC(eglWaitNative, name); - GETPROC(eglBindTexImage, name); - GETPROC(eglReleaseTexImage, name); - GETPROC(eglSurfaceAttrib, name); - GETPROC(eglSwapInterval, name); - GETPROC(eglBindAPI, name); - GETPROC(eglQueryAPI, name); - GETPROC(eglCreatePbufferFromClientBuffer, name); - GETPROC(eglReleaseThread, name); - GETPROC(eglWaitClient, name); - GETPROC(eglGetCurrentContext, name); - GETPROC(eglCreateSync, name); - GETPROC(eglDestroySync, name); - GETPROC(eglClientWaitSync, name); - GETPROC(eglGetSyncAttrib, name); - GETPROC(eglCreateImage, name); - GETPROC(eglDestroyImage, name); - GETPROC(eglGetPlatformDisplay, name); - GETPROC(eglCreatePlatformWindowSurface, name); - GETPROC(eglCreatePlatformPixmapSurface, name); - GETPROC(eglWaitSync, name); +namespace MobileGL::MG_Impl { + void* GetProcAddress(const char* name) { + MGLOG_D("GetProcAddress(%s)", name); + GETPROC(eglChooseConfig, name); + GETPROC(eglCopyBuffers, name); + GETPROC(eglCreateContext, name); + GETPROC(eglCreatePbufferSurface, name); + GETPROC(eglCreatePixmapSurface, name); + GETPROC(eglCreateWindowSurface, name); + GETPROC(eglDestroyContext, name); + GETPROC(eglDestroySurface, name); + GETPROC(eglGetConfigAttrib, name); + GETPROC(eglGetConfigs, name); + GETPROC(eglGetCurrentDisplay, name); + GETPROC(eglGetCurrentSurface, name); + GETPROC(eglGetDisplay, name); + GETPROC(eglGetError, name); + GETPROC(eglGetProcAddress, name); + GETPROC(eglInitialize, name); + GETPROC(eglMakeCurrent, name); + GETPROC(eglQueryContext, name); + GETPROC(eglQueryString, name); + GETPROC(eglQuerySurface, name); + GETPROC(eglSwapBuffers, name); + GETPROC(eglTerminate, name); + GETPROC(eglWaitGL, name); + GETPROC(eglWaitNative, name); + GETPROC(eglBindTexImage, name); + GETPROC(eglReleaseTexImage, name); + GETPROC(eglSurfaceAttrib, name); + GETPROC(eglSwapInterval, name); + GETPROC(eglBindAPI, name); + GETPROC(eglQueryAPI, name); + GETPROC(eglCreatePbufferFromClientBuffer, name); + GETPROC(eglReleaseThread, name); + GETPROC(eglWaitClient, name); + GETPROC(eglGetCurrentContext, name); + GETPROC(eglCreateSync, name); + GETPROC(eglDestroySync, name); + GETPROC(eglClientWaitSync, name); + GETPROC(eglGetSyncAttrib, name); + GETPROC(eglCreateImage, name); + GETPROC(eglDestroyImage, name); + GETPROC(eglGetPlatformDisplay, name); + GETPROC(eglCreatePlatformWindowSurface, name); + GETPROC(eglCreatePlatformPixmapSurface, name); + GETPROC(eglWaitSync, name); - GETPROC(glCullFace, name); - GETPROC(glFrontFace, name); - GETPROC(glHint, name); - GETPROC(glLineWidth, name); - GETPROC(glPointSize, name); - GETPROC(glPolygonMode, name); - GETPROC(glScissor, name); - GETPROC(glTexParameterf, name); - GETPROC(glTexParameterfv, name); - GETPROC(glTexParameteri, name); - GETPROC(glTexParameteriv, name); - GETPROC(glTexImage1D, name); - GETPROC(glTexImage2D, name); - GETPROC(glDrawBuffer, name); - GETPROC(glClear, name); - GETPROC(glClearColor, name); - GETPROC(glClearStencil, name); - GETPROC(glClearDepth, name); - GETPROC(glStencilMask, name); - GETPROC(glColorMask, name); - GETPROC(glDepthMask, name); - GETPROC(glDisable, name); - GETPROC(glEnable, name); - GETPROC(glFinish, name); - GETPROC(glFlush, name); - GETPROC(glBlendFunc, name); - GETPROC(glLogicOp, name); - GETPROC(glStencilFunc, name); - GETPROC(glStencilOp, name); - GETPROC(glDepthFunc, name); - GETPROC(glPixelStoref, name); - GETPROC(glPixelStorei, name); - GETPROC(glReadBuffer, name); - GETPROC(glReadPixels, name); - GETPROC(glGetBooleanv, name); - GETPROC(glGetDoublev, name); - GETPROC(glGetError, name); - GETPROC(glGetFloatv, name); - GETPROC(glGetIntegerv, name); - GETPROC(glGetString, name); - GETPROC(glGetTexImage, name); - GETPROC(glGetTexParameterfv, name); - GETPROC(glGetTexParameteriv, name); - GETPROC(glGetTexLevelParameterfv, name); - GETPROC(glGetTexLevelParameteriv, name); - GETPROC(glIsEnabled, name); - GETPROC(glDepthRange, name); - GETPROC(glViewport, name); - GETPROC(glDrawArrays, name); - GETPROC(glDrawElements, name); - GETPROC(glGetPointerv, name); - GETPROC(glPolygonOffset, name); - GETPROC(glCopyTexImage1D, name); - GETPROC(glCopyTexImage2D, name); - GETPROC(glCopyTexSubImage1D, name); - GETPROC(glCopyTexSubImage2D, name); - GETPROC(glTexSubImage1D, name); - GETPROC(glTexSubImage2D, name); - GETPROC(glBindTexture, name); - GETPROC(glDeleteTextures, name); - GETPROC(glGenTextures, name); - GETPROC(glIsTexture, name); - GETPROC(glDrawRangeElements, name); - GETPROC(glTexImage3D, name); - GETPROC(glTexSubImage3D, name); - GETPROC(glCopyTexSubImage3D, name); - GETPROC(glActiveTexture, name); - GETPROC(glSampleCoverage, name); - GETPROC(glCompressedTexImage3D, name); - GETPROC(glCompressedTexImage2D, name); - GETPROC(glCompressedTexImage1D, name); - GETPROC(glCompressedTexSubImage3D, name); - GETPROC(glCompressedTexSubImage2D, name); - GETPROC(glCompressedTexSubImage1D, name); - GETPROC(glGetCompressedTexImage, name); - GETPROC(glBlendFuncSeparate, name); - GETPROC(glMultiDrawArrays, name); - GETPROC(glMultiDrawElements, name); - GETPROC(glPointParameterf, name); - GETPROC(glPointParameterfv, name); - GETPROC(glPointParameteri, name); - GETPROC(glPointParameteriv, name); - GETPROC(glBlendColor, name); - GETPROC(glBlendEquation, name); - GETPROC(glGenQueries, name); - GETPROC(glDeleteQueries, name); - GETPROC(glIsQuery, name); - GETPROC(glBeginQuery, name); - GETPROC(glEndQuery, name); - GETPROC(glGetQueryiv, name); - GETPROC(glGetQueryObjectiv, name); - GETPROC(glGetQueryObjectuiv, name); - GETPROC(glBindBuffer, name); - GETPROC(glDeleteBuffers, name); - GETPROC(glGenBuffers, name); - GETPROC(glIsBuffer, name); - GETPROC(glBufferData, name); - GETPROC(glBufferSubData, name); - GETPROC(glGetBufferSubData, name); - GETPROC(glMapBuffer, name); - GETPROC(glUnmapBuffer, name); - GETPROC(glGetBufferParameteriv, name); - GETPROC(glGetBufferPointerv, name); - GETPROC(glBlendEquationSeparate, name); - GETPROC(glDrawBuffers, name); - GETPROC(glStencilOpSeparate, name); - GETPROC(glStencilFuncSeparate, name); - GETPROC(glStencilMaskSeparate, name); - GETPROC(glAttachShader, name); - GETPROC(glBindAttribLocation, name); - GETPROC(glCompileShader, name); - GETPROC(glCreateProgram, name); - GETPROC(glCreateShader, name); - GETPROC(glDeleteProgram, name); - GETPROC(glDeleteShader, name); - GETPROC(glDetachShader, name); - GETPROC(glDisableVertexAttribArray, name); - GETPROC(glEnableVertexAttribArray, name); - GETPROC(glGetActiveAttrib, name); - GETPROC(glGetActiveUniform, name); - GETPROC(glGetAttachedShaders, name); - GETPROC(glGetAttribLocation, name); - GETPROC(glGetProgramiv, name); - GETPROC(glGetProgramInfoLog, name); - GETPROC(glGetShaderiv, name); - GETPROC(glGetShaderInfoLog, name); - GETPROC(glGetShaderSource, name); - GETPROC(glGetUniformLocation, name); - GETPROC(glGetUniformfv, name); - GETPROC(glGetUniformiv, name); - GETPROC(glGetVertexAttribdv, name); - GETPROC(glGetVertexAttribfv, name); - GETPROC(glGetVertexAttribiv, name); - GETPROC(glGetVertexAttribPointerv, name); - GETPROC(glIsProgram, name); - GETPROC(glIsShader, name); - GETPROC(glLinkProgram, name); - GETPROC(glShaderSource, name); - GETPROC(glUseProgram, name); - GETPROC(glUniform1f, name); - GETPROC(glUniform2f, name); - GETPROC(glUniform3f, name); - GETPROC(glUniform4f, name); - GETPROC(glUniform1i, name); - GETPROC(glUniform2i, name); - GETPROC(glUniform3i, name); - GETPROC(glUniform4i, name); - GETPROC(glUniform1fv, name); - GETPROC(glUniform2fv, name); - GETPROC(glUniform3fv, name); - GETPROC(glUniform4fv, name); - GETPROC(glUniform1iv, name); - GETPROC(glUniform2iv, name); - GETPROC(glUniform3iv, name); - GETPROC(glUniform4iv, name); - GETPROC(glUniformMatrix2fv, name); - GETPROC(glUniformMatrix3fv, name); - GETPROC(glUniformMatrix4fv, name); - GETPROC(glValidateProgram, name); - GETPROC(glVertexAttrib1d, name); - GETPROC(glVertexAttrib1dv, name); - GETPROC(glVertexAttrib1f, name); - GETPROC(glVertexAttrib1fv, name); - GETPROC(glVertexAttrib1s, name); - GETPROC(glVertexAttrib1sv, name); - GETPROC(glVertexAttrib2d, name); - GETPROC(glVertexAttrib2dv, name); - GETPROC(glVertexAttrib2f, name); - GETPROC(glVertexAttrib2fv, name); - GETPROC(glVertexAttrib2s, name); - GETPROC(glVertexAttrib2sv, name); - GETPROC(glVertexAttrib3d, name); - GETPROC(glVertexAttrib3dv, name); - GETPROC(glVertexAttrib3f, name); - GETPROC(glVertexAttrib3fv, name); - GETPROC(glVertexAttrib3s, name); - GETPROC(glVertexAttrib3sv, name); - GETPROC(glVertexAttrib4Nbv, name); - GETPROC(glVertexAttrib4Niv, name); - GETPROC(glVertexAttrib4Nsv, name); - GETPROC(glVertexAttrib4Nub, name); - GETPROC(glVertexAttrib4Nubv, name); - GETPROC(glVertexAttrib4Nuiv, name); - GETPROC(glVertexAttrib4Nusv, name); - GETPROC(glVertexAttrib4bv, name); - GETPROC(glVertexAttrib4d, name); - GETPROC(glVertexAttrib4dv, name); - GETPROC(glVertexAttrib4f, name); - GETPROC(glVertexAttrib4fv, name); - GETPROC(glVertexAttrib4iv, name); - GETPROC(glVertexAttrib4s, name); - GETPROC(glVertexAttrib4sv, name); - GETPROC(glVertexAttrib4ubv, name); - GETPROC(glVertexAttrib4uiv, name); - GETPROC(glVertexAttrib4usv, name); - GETPROC(glVertexAttribPointer, name); - GETPROC(glUniformMatrix2x3fv, name); - GETPROC(glUniformMatrix3x2fv, name); - GETPROC(glUniformMatrix2x4fv, name); - GETPROC(glUniformMatrix4x2fv, name); - GETPROC(glUniformMatrix3x4fv, name); - GETPROC(glUniformMatrix4x3fv, name); - GETPROC(glColorMaski, name); - GETPROC(glGetBooleani_v, name); - GETPROC(glGetIntegeri_v, name); - GETPROC(glEnablei, name); - GETPROC(glDisablei, name); - GETPROC(glIsEnabledi, name); - GETPROC(glBeginTransformFeedback, name); - GETPROC(glEndTransformFeedback, name); - GETPROC(glBindBufferRange, name); - GETPROC(glBindBufferBase, name); - GETPROC(glTransformFeedbackVaryings, name); - GETPROC(glGetTransformFeedbackVarying, name); - GETPROC(glClampColor, name); - GETPROC(glBeginConditionalRender, name); - GETPROC(glEndConditionalRender, name); - GETPROC(glVertexAttribIPointer, name); - GETPROC(glGetVertexAttribIiv, name); - GETPROC(glGetVertexAttribIuiv, name); - GETPROC(glVertexAttribI1i, name); - GETPROC(glVertexAttribI2i, name); - GETPROC(glVertexAttribI3i, name); - GETPROC(glVertexAttribI4i, name); - GETPROC(glVertexAttribI1ui, name); - GETPROC(glVertexAttribI2ui, name); - GETPROC(glVertexAttribI3ui, name); - GETPROC(glVertexAttribI4ui, name); - GETPROC(glVertexAttribI1iv, name); - GETPROC(glVertexAttribI2iv, name); - GETPROC(glVertexAttribI3iv, name); - GETPROC(glVertexAttribI4iv, name); - GETPROC(glVertexAttribI1uiv, name); - GETPROC(glVertexAttribI2uiv, name); - GETPROC(glVertexAttribI3uiv, name); - GETPROC(glVertexAttribI4uiv, name); - GETPROC(glVertexAttribI4bv, name); - GETPROC(glVertexAttribI4sv, name); - GETPROC(glVertexAttribI4ubv, name); - GETPROC(glVertexAttribI4usv, name); - GETPROC(glGetUniformuiv, name); - GETPROC(glBindFragDataLocation, name); - GETPROC(glGetFragDataLocation, name); - GETPROC(glUniform1ui, name); - GETPROC(glUniform2ui, name); - GETPROC(glUniform3ui, name); - GETPROC(glUniform4ui, name); - GETPROC(glUniform1uiv, name); - GETPROC(glUniform2uiv, name); - GETPROC(glUniform3uiv, name); - GETPROC(glUniform4uiv, name); - GETPROC(glTexParameterIiv, name); - GETPROC(glTexParameterIuiv, name); - GETPROC(glGetTexParameterIiv, name); - GETPROC(glGetTexParameterIuiv, name); - GETPROC(glClearBufferiv, name); - GETPROC(glClearBufferuiv, name); - GETPROC(glClearBufferfv, name); - GETPROC(glClearBufferfi, name); - GETPROC(glGetStringi, name); - GETPROC(glIsRenderbuffer, name); - GETPROC(glBindRenderbuffer, name); - GETPROC(glDeleteRenderbuffers, name); - GETPROC(glGenRenderbuffers, name); - GETPROC(glRenderbufferStorage, name); - GETPROC(glGetRenderbufferParameteriv, name); - GETPROC(glIsFramebuffer, name); - GETPROC(glBindFramebuffer, name); - GETPROC(glDeleteFramebuffers, name); - GETPROC(glGenFramebuffers, name); - GETPROC(glCheckFramebufferStatus, name); - GETPROC(glFramebufferTexture1D, name); - GETPROC(glFramebufferTexture2D, name); - GETPROC(glFramebufferTexture3D, name); - GETPROC(glFramebufferRenderbuffer, name); - GETPROC(glGetFramebufferAttachmentParameteriv, name); - GETPROC(glGenerateMipmap, name); - GETPROC(glBlitFramebuffer, name); - GETPROC(glRenderbufferStorageMultisample, name); - GETPROC(glFramebufferTextureLayer, name); - GETPROC(glMapBufferRange, name); - GETPROC(glFlushMappedBufferRange, name); - GETPROC(glBindVertexArray, name); - GETPROC(glDeleteVertexArrays, name); - GETPROC(glGenVertexArrays, name); - GETPROC(glIsVertexArray, name); - GETPROC(glDrawArraysInstanced, name); - GETPROC(glDrawElementsInstanced, name); - GETPROC(glTexBuffer, name); - GETPROC(glPrimitiveRestartIndex, name); - GETPROC(glCopyBufferSubData, name); - GETPROC(glGetUniformIndices, name); - GETPROC(glGetActiveUniformsiv, name); - GETPROC(glGetActiveUniformName, name); - GETPROC(glGetUniformBlockIndex, name); - GETPROC(glGetActiveUniformBlockiv, name); - GETPROC(glGetActiveUniformBlockName, name); - GETPROC(glUniformBlockBinding, name); - GETPROC(glDrawElementsBaseVertex, name); - GETPROC(glDrawRangeElementsBaseVertex, name); - GETPROC(glDrawElementsInstancedBaseVertex, name); - GETPROC(glMultiDrawElementsBaseVertex, name); - GETPROC(glProvokingVertex, name); - GETPROC(glFenceSync, name); - GETPROC(glIsSync, name); - GETPROC(glDeleteSync, name); - GETPROC(glClientWaitSync, name); - GETPROC(glWaitSync, name); - GETPROC(glGetInteger64v, name); - GETPROC(glGetSynciv, name); - GETPROC(glGetInteger64i_v, name); - GETPROC(glGetBufferParameteri64v, name); - GETPROC(glFramebufferTexture, name); - GETPROC(glTexImage2DMultisample, name); - GETPROC(glTexImage3DMultisample, name); - GETPROC(glGetMultisamplefv, name); - GETPROC(glSampleMaski, name); - GETPROC(glBindFragDataLocationIndexed, name); - GETPROC(glGetFragDataIndex, name); - GETPROC(glGenSamplers, name); - GETPROC(glDeleteSamplers, name); - GETPROC(glIsSampler, name); - GETPROC(glBindSampler, name); - GETPROC(glSamplerParameteri, name); - GETPROC(glSamplerParameteriv, name); - GETPROC(glSamplerParameterf, name); - GETPROC(glSamplerParameterfv, name); - GETPROC(glSamplerParameterIiv, name); - GETPROC(glSamplerParameterIuiv, name); - GETPROC(glGetSamplerParameteriv, name); - GETPROC(glGetSamplerParameterIiv, name); - GETPROC(glGetSamplerParameterfv, name); - GETPROC(glGetSamplerParameterIuiv, name); - GETPROC(glQueryCounter, name); - GETPROC(glGetQueryObjecti64v, name); - GETPROC(glGetQueryObjectui64v, name); - GETPROC(glVertexAttribDivisor, name); - GETPROC(glVertexAttribP1ui, name); - GETPROC(glVertexAttribP1uiv, name); - GETPROC(glVertexAttribP2ui, name); - GETPROC(glVertexAttribP2uiv, name); - GETPROC(glVertexAttribP3ui, name); - GETPROC(glVertexAttribP3uiv, name); - GETPROC(glVertexAttribP4ui, name); - GETPROC(glVertexAttribP4uiv, name); - GETPROC(glMinSampleShading, name); - GETPROC(glBlendEquationi, name); - GETPROC(glBlendEquationSeparatei, name); - GETPROC(glBlendFunci, name); - GETPROC(glBlendFuncSeparatei, name); - GETPROC(glDrawArraysIndirect, name); - GETPROC(glDrawElementsIndirect, name); - GETPROC(glUniform1d, name); - GETPROC(glUniform2d, name); - GETPROC(glUniform3d, name); - GETPROC(glUniform4d, name); - GETPROC(glUniform1dv, name); - GETPROC(glUniform2dv, name); - GETPROC(glUniform3dv, name); - GETPROC(glUniform4dv, name); - GETPROC(glUniformMatrix2dv, name); - GETPROC(glUniformMatrix3dv, name); - GETPROC(glUniformMatrix4dv, name); - GETPROC(glUniformMatrix2x3dv, name); - GETPROC(glUniformMatrix2x4dv, name); - GETPROC(glUniformMatrix3x2dv, name); - GETPROC(glUniformMatrix3x4dv, name); - GETPROC(glUniformMatrix4x2dv, name); - GETPROC(glUniformMatrix4x3dv, name); - GETPROC(glGetUniformdv, name); - GETPROC(glGetSubroutineUniformLocation, name); - GETPROC(glGetSubroutineIndex, name); - GETPROC(glGetActiveSubroutineUniformiv, name); - GETPROC(glGetActiveSubroutineUniformName, name); - GETPROC(glGetActiveSubroutineName, name); - GETPROC(glUniformSubroutinesuiv, name); - GETPROC(glGetUniformSubroutineuiv, name); - GETPROC(glGetProgramStageiv, name); - GETPROC(glPatchParameteri, name); - GETPROC(glPatchParameterfv, name); - GETPROC(glBindTransformFeedback, name); - GETPROC(glDeleteTransformFeedbacks, name); - GETPROC(glGenTransformFeedbacks, name); - GETPROC(glIsTransformFeedback, name); - GETPROC(glPauseTransformFeedback, name); - GETPROC(glResumeTransformFeedback, name); - GETPROC(glDrawTransformFeedback, name); - GETPROC(glDrawTransformFeedbackStream, name); - GETPROC(glBeginQueryIndexed, name); - GETPROC(glEndQueryIndexed, name); - GETPROC(glGetQueryIndexediv, name); - GETPROC(glReleaseShaderCompiler, name); - GETPROC(glShaderBinary, name); - GETPROC(glGetShaderPrecisionFormat, name); - GETPROC(glDepthRangef, name); - GETPROC(glClearDepthf, name); - GETPROC(glGetProgramBinary, name); - GETPROC(glProgramBinary, name); - GETPROC(glProgramParameteri, name); - GETPROC(glUseProgramStages, name); - GETPROC(glActiveShaderProgram, name); - GETPROC(glCreateShaderProgramv, name); - GETPROC(glBindProgramPipeline, name); - GETPROC(glDeleteProgramPipelines, name); - GETPROC(glGenProgramPipelines, name); - GETPROC(glIsProgramPipeline, name); - GETPROC(glGetProgramPipelineiv, name); - GETPROC(glProgramUniform1i, name); - GETPROC(glProgramUniform1iv, name); - GETPROC(glProgramUniform1f, name); - GETPROC(glProgramUniform1fv, name); - GETPROC(glProgramUniform1d, name); - GETPROC(glProgramUniform1dv, name); - GETPROC(glProgramUniform1ui, name); - GETPROC(glProgramUniform1uiv, name); - GETPROC(glProgramUniform2i, name); - GETPROC(glProgramUniform2iv, name); - GETPROC(glProgramUniform2f, name); - GETPROC(glProgramUniform2fv, name); - GETPROC(glProgramUniform2d, name); - GETPROC(glProgramUniform2dv, name); - GETPROC(glProgramUniform2ui, name); - GETPROC(glProgramUniform2uiv, name); - GETPROC(glProgramUniform3i, name); - GETPROC(glProgramUniform3iv, name); - GETPROC(glProgramUniform3f, name); - GETPROC(glProgramUniform3fv, name); - GETPROC(glProgramUniform3d, name); - GETPROC(glProgramUniform3dv, name); - GETPROC(glProgramUniform3ui, name); - GETPROC(glProgramUniform3uiv, name); - GETPROC(glProgramUniform4i, name); - GETPROC(glProgramUniform4iv, name); - GETPROC(glProgramUniform4f, name); - GETPROC(glProgramUniform4fv, name); - GETPROC(glProgramUniform4d, name); - GETPROC(glProgramUniform4dv, name); - GETPROC(glProgramUniform4ui, name); - GETPROC(glProgramUniform4uiv, name); - GETPROC(glProgramUniformMatrix2fv, name); - GETPROC(glProgramUniformMatrix3fv, name); - GETPROC(glProgramUniformMatrix4fv, name); - GETPROC(glProgramUniformMatrix2dv, name); - GETPROC(glProgramUniformMatrix3dv, name); - GETPROC(glProgramUniformMatrix4dv, name); - GETPROC(glProgramUniformMatrix2x3fv, name); - GETPROC(glProgramUniformMatrix3x2fv, name); - GETPROC(glProgramUniformMatrix2x4fv, name); - GETPROC(glProgramUniformMatrix4x2fv, name); - GETPROC(glProgramUniformMatrix3x4fv, name); - GETPROC(glProgramUniformMatrix4x3fv, name); - GETPROC(glProgramUniformMatrix2x3dv, name); - GETPROC(glProgramUniformMatrix3x2dv, name); - GETPROC(glProgramUniformMatrix2x4dv, name); - GETPROC(glProgramUniformMatrix4x2dv, name); - GETPROC(glProgramUniformMatrix3x4dv, name); - GETPROC(glProgramUniformMatrix4x3dv, name); - GETPROC(glValidateProgramPipeline, name); - GETPROC(glGetProgramPipelineInfoLog, name); - GETPROC(glVertexAttribL1d, name); - GETPROC(glVertexAttribL2d, name); - GETPROC(glVertexAttribL3d, name); - GETPROC(glVertexAttribL4d, name); - GETPROC(glVertexAttribL1dv, name); - GETPROC(glVertexAttribL2dv, name); - GETPROC(glVertexAttribL3dv, name); - GETPROC(glVertexAttribL4dv, name); - GETPROC(glVertexAttribLPointer, name); - GETPROC(glGetVertexAttribLdv, name); - GETPROC(glViewportArrayv, name); - GETPROC(glViewportIndexedf, name); - GETPROC(glViewportIndexedfv, name); - GETPROC(glScissorArrayv, name); - GETPROC(glScissorIndexed, name); - GETPROC(glScissorIndexedv, name); - GETPROC(glDepthRangeArrayv, name); - GETPROC(glDepthRangeIndexed, name); - GETPROC(glGetFloati_v, name); - GETPROC(glGetDoublei_v, name); - GETPROC(glDrawArraysInstancedBaseInstance, name); - GETPROC(glDrawElementsInstancedBaseInstance, name); - GETPROC(glDrawElementsInstancedBaseVertexBaseInstance, name); - GETPROC(glGetInternalformativ, name); - GETPROC(glGetActiveAtomicCounterBufferiv, name); - GETPROC(glBindImageTexture, name); - GETPROC(glMemoryBarrier, name); - GETPROC(glTexStorage1D, name); - GETPROC(glTexStorage2D, name); - GETPROC(glTexStorage3D, name); - GETPROC(glDrawTransformFeedbackInstanced, name); - GETPROC(glDrawTransformFeedbackStreamInstanced, name); - GETPROC(glClearBufferData, name); - GETPROC(glClearBufferSubData, name); - GETPROC(glDispatchCompute, name); - GETPROC(glDispatchComputeIndirect, name); - GETPROC(glCopyImageSubData, name); - GETPROC(glFramebufferParameteri, name); - GETPROC(glGetFramebufferParameteriv, name); - GETPROC(glGetInternalformati64v, name); - GETPROC(glInvalidateTexSubImage, name); - GETPROC(glInvalidateTexImage, name); - GETPROC(glInvalidateBufferSubData, name); - GETPROC(glInvalidateBufferData, name); - GETPROC(glInvalidateFramebuffer, name); - GETPROC(glInvalidateSubFramebuffer, name); - GETPROC(glMultiDrawArraysIndirect, name); - GETPROC(glMultiDrawElementsIndirect, name); - GETPROC(glGetProgramInterfaceiv, name); - GETPROC(glGetProgramResourceIndex, name); - GETPROC(glGetProgramResourceName, name); - GETPROC(glGetProgramResourceiv, name); - GETPROC(glGetProgramResourceLocation, name); - GETPROC(glGetProgramResourceLocationIndex, name); - GETPROC(glShaderStorageBlockBinding, name); - GETPROC(glTexBufferRange, name); - GETPROC(glTexStorage2DMultisample, name); - GETPROC(glTexStorage3DMultisample, name); - GETPROC(glTextureView, name); - GETPROC(glBindVertexBuffer, name); - GETPROC(glVertexAttribFormat, name); - GETPROC(glVertexAttribIFormat, name); - GETPROC(glVertexAttribLFormat, name); - GETPROC(glVertexAttribBinding, name); - GETPROC(glVertexBindingDivisor, name); - GETPROC(glDebugMessageControl, name); - GETPROC(glDebugMessageInsert, name); - GETPROC(glDebugMessageCallback, name); - GETPROC(glGetDebugMessageLog, name); - GETPROC(glPushDebugGroup, name); - GETPROC(glPopDebugGroup, name); - GETPROC(glObjectLabel, name); - GETPROC(glGetObjectLabel, name); - GETPROC(glObjectPtrLabel, name); - GETPROC(glGetObjectPtrLabel, name); - GETPROC(glBufferStorage, name); - GETPROC(glClearTexImage, name); - GETPROC(glClearTexSubImage, name); - GETPROC(glBindBuffersBase, name); - GETPROC(glBindBuffersRange, name); - GETPROC(glBindTextures, name); - GETPROC(glBindSamplers, name); - GETPROC(glBindImageTextures, name); - GETPROC(glBindVertexBuffers, name); - GETPROC(glClipControl, name); - GETPROC(glCreateTransformFeedbacks, name); - GETPROC(glTransformFeedbackBufferBase, name); - GETPROC(glTransformFeedbackBufferRange, name); - GETPROC(glGetTransformFeedbackiv, name); - GETPROC(glGetTransformFeedbacki_v, name); - GETPROC(glGetTransformFeedbacki64_v, name); - GETPROC(glCreateBuffers, name); - GETPROC(glNamedBufferStorage, name); - GETPROC(glNamedBufferData, name); - GETPROC(glNamedBufferSubData, name); - GETPROC(glCopyNamedBufferSubData, name); - GETPROC(glClearNamedBufferData, name); - GETPROC(glClearNamedBufferSubData, name); - GETPROC(glMapNamedBuffer, name); - GETPROC(glMapNamedBufferRange, name); - GETPROC(glUnmapNamedBuffer, name); - GETPROC(glFlushMappedNamedBufferRange, name); - GETPROC(glGetNamedBufferParameteriv, name); - GETPROC(glGetNamedBufferParameteri64v, name); - GETPROC(glGetNamedBufferPointerv, name); - GETPROC(glGetNamedBufferSubData, name); - GETPROC(glCreateFramebuffers, name); - GETPROC(glNamedFramebufferRenderbuffer, name); - GETPROC(glNamedFramebufferParameteri, name); - GETPROC(glNamedFramebufferTexture, name); - GETPROC(glNamedFramebufferTextureLayer, name); - GETPROC(glNamedFramebufferDrawBuffer, name); - GETPROC(glNamedFramebufferDrawBuffers, name); - GETPROC(glNamedFramebufferReadBuffer, name); - GETPROC(glInvalidateNamedFramebufferData, name); - GETPROC(glInvalidateNamedFramebufferSubData, name); - GETPROC(glClearNamedFramebufferiv, name); - GETPROC(glClearNamedFramebufferuiv, name); - GETPROC(glClearNamedFramebufferfv, name); - GETPROC(glClearNamedFramebufferfi, name); - GETPROC(glBlitNamedFramebuffer, name); - GETPROC(glCheckNamedFramebufferStatus, name); - GETPROC(glGetNamedFramebufferParameteriv, name); - GETPROC(glGetNamedFramebufferAttachmentParameteriv, name); - GETPROC(glCreateRenderbuffers, name); - GETPROC(glNamedRenderbufferStorage, name); - GETPROC(glNamedRenderbufferStorageMultisample, name); - GETPROC(glGetNamedRenderbufferParameteriv, name); - GETPROC(glCreateTextures, name); - GETPROC(glTextureBuffer, name); - GETPROC(glTextureBufferRange, name); - GETPROC(glTextureStorage1D, name); - GETPROC(glTextureStorage2D, name); - GETPROC(glTextureStorage3D, name); - GETPROC(glTextureStorage2DMultisample, name); - GETPROC(glTextureStorage3DMultisample, name); - GETPROC(glTextureSubImage1D, name); - GETPROC(glTextureSubImage2D, name); - GETPROC(glTextureSubImage3D, name); - GETPROC(glCompressedTextureSubImage1D, name); - GETPROC(glCompressedTextureSubImage2D, name); - GETPROC(glCompressedTextureSubImage3D, name); - GETPROC(glCopyTextureSubImage1D, name); - GETPROC(glCopyTextureSubImage2D, name); - GETPROC(glCopyTextureSubImage3D, name); - GETPROC(glTextureParameterf, name); - GETPROC(glTextureParameterfv, name); - GETPROC(glTextureParameteri, name); - GETPROC(glTextureParameterIiv, name); - GETPROC(glTextureParameterIuiv, name); - GETPROC(glTextureParameteriv, name); - GETPROC(glGenerateTextureMipmap, name); - GETPROC(glBindTextureUnit, name); - GETPROC(glGetTextureImage, name); - GETPROC(glGetCompressedTextureImage, name); - GETPROC(glGetTextureLevelParameterfv, name); - GETPROC(glGetTextureLevelParameteriv, name); - GETPROC(glGetTextureParameterfv, name); - GETPROC(glGetTextureParameterIiv, name); - GETPROC(glGetTextureParameterIuiv, name); - GETPROC(glGetTextureParameteriv, name); - GETPROC(glCreateVertexArrays, name); - GETPROC(glDisableVertexArrayAttrib, name); - GETPROC(glEnableVertexArrayAttrib, name); - GETPROC(glVertexArrayElementBuffer, name); - GETPROC(glVertexArrayVertexBuffer, name); - GETPROC(glVertexArrayVertexBuffers, name); - GETPROC(glVertexArrayAttribBinding, name); - GETPROC(glVertexArrayAttribFormat, name); - GETPROC(glVertexArrayAttribIFormat, name); - GETPROC(glVertexArrayAttribLFormat, name); - GETPROC(glVertexArrayBindingDivisor, name); - GETPROC(glGetVertexArrayiv, name); - GETPROC(glGetVertexArrayIndexediv, name); - GETPROC(glGetVertexArrayIndexed64iv, name); - GETPROC(glCreateSamplers, name); - GETPROC(glCreateProgramPipelines, name); - GETPROC(glCreateQueries, name); - GETPROC(glGetQueryBufferObjecti64v, name); - GETPROC(glGetQueryBufferObjectiv, name); - GETPROC(glGetQueryBufferObjectui64v, name); - GETPROC(glGetQueryBufferObjectuiv, name); - GETPROC(glMemoryBarrierByRegion, name); - GETPROC(glGetTextureSubImage, name); - GETPROC(glGetCompressedTextureSubImage, name); - GETPROC(glGetGraphicsResetStatus, name); - GETPROC(glGetnCompressedTexImage, name); - GETPROC(glGetnTexImage, name); - GETPROC(glGetnUniformdv, name); - GETPROC(glGetnUniformfv, name); - GETPROC(glGetnUniformiv, name); - GETPROC(glGetnUniformuiv, name); - GETPROC(glReadnPixels, name); - GETPROC(glTextureBarrier, name); - GETPROC(glSpecializeShader, name); - GETPROC(glMultiDrawArraysIndirectCount, name); - GETPROC(glMultiDrawElementsIndirectCount, name); - GETPROC(glPolygonOffsetClamp, name); - GETPROC(glPrimitiveBoundingBoxARB, name); - GETPROC(glGetTextureHandleARB, name); - GETPROC(glGetTextureSamplerHandleARB, name); - GETPROC(glMakeTextureHandleResidentARB, name); - GETPROC(glMakeTextureHandleNonResidentARB, name); - GETPROC(glGetImageHandleARB, name); - GETPROC(glMakeImageHandleResidentARB, name); - GETPROC(glMakeImageHandleNonResidentARB, name); - GETPROC(glUniformHandleui64ARB, name); - GETPROC(glUniformHandleui64vARB, name); - GETPROC(glProgramUniformHandleui64ARB, name); - GETPROC(glProgramUniformHandleui64vARB, name); - GETPROC(glIsTextureHandleResidentARB, name); - GETPROC(glIsImageHandleResidentARB, name); - GETPROC(glVertexAttribL1ui64ARB, name); - GETPROC(glVertexAttribL1ui64vARB, name); - GETPROC(glGetVertexAttribLui64vARB, name); - GETPROC(glCreateSyncFromCLeventARB, name); - GETPROC(glDispatchComputeGroupSizeARB, name); - GETPROC(glDebugMessageControlARB, name); - GETPROC(glDebugMessageInsertARB, name); - GETPROC(glDebugMessageCallbackARB, name); - GETPROC(glGetDebugMessageLogARB, name); - GETPROC(glBlendEquationiARB, name); - GETPROC(glBlendEquationSeparateiARB, name); - GETPROC(glBlendFunciARB, name); - GETPROC(glBlendFuncSeparateiARB, name); - GETPROC(glDrawArraysInstancedARB, name); - GETPROC(glDrawElementsInstancedARB, name); - GETPROC(glProgramParameteriARB, name); - GETPROC(glFramebufferTextureARB, name); - GETPROC(glFramebufferTextureLayerARB, name); - GETPROC(glFramebufferTextureFaceARB, name); - GETPROC(glSpecializeShaderARB, name); - GETPROC(glUniform1i64ARB, name); - GETPROC(glUniform2i64ARB, name); - GETPROC(glUniform3i64ARB, name); - GETPROC(glUniform4i64ARB, name); - GETPROC(glUniform1i64vARB, name); - GETPROC(glUniform2i64vARB, name); - GETPROC(glUniform3i64vARB, name); - GETPROC(glUniform4i64vARB, name); - GETPROC(glUniform1ui64ARB, name); - GETPROC(glUniform2ui64ARB, name); - GETPROC(glUniform3ui64ARB, name); - GETPROC(glUniform4ui64ARB, name); - GETPROC(glUniform1ui64vARB, name); - GETPROC(glUniform2ui64vARB, name); - GETPROC(glUniform3ui64vARB, name); - GETPROC(glUniform4ui64vARB, name); - GETPROC(glGetUniformi64vARB, name); - GETPROC(glGetUniformui64vARB, name); - GETPROC(glGetnUniformi64vARB, name); - GETPROC(glGetnUniformui64vARB, name); - GETPROC(glProgramUniform1i64ARB, name); - GETPROC(glProgramUniform2i64ARB, name); - GETPROC(glProgramUniform3i64ARB, name); - GETPROC(glProgramUniform4i64ARB, name); - GETPROC(glProgramUniform1i64vARB, name); - GETPROC(glProgramUniform2i64vARB, name); - GETPROC(glProgramUniform3i64vARB, name); - GETPROC(glProgramUniform4i64vARB, name); - GETPROC(glProgramUniform1ui64ARB, name); - GETPROC(glProgramUniform2ui64ARB, name); - GETPROC(glProgramUniform3ui64ARB, name); - GETPROC(glProgramUniform4ui64ARB, name); - GETPROC(glProgramUniform1ui64vARB, name); - GETPROC(glProgramUniform2ui64vARB, name); - GETPROC(glProgramUniform3ui64vARB, name); - GETPROC(glProgramUniform4ui64vARB, name); - GETPROC(glMultiDrawArraysIndirectCountARB, name); - GETPROC(glMultiDrawElementsIndirectCountARB, name); - GETPROC(glVertexAttribDivisorARB, name); - GETPROC(glMaxShaderCompilerThreadsARB, name); - GETPROC(glGetGraphicsResetStatusARB, name); - GETPROC(glGetnTexImageARB, name); - GETPROC(glReadnPixelsARB, name); - GETPROC(glGetnCompressedTexImageARB, name); - GETPROC(glGetnUniformfvARB, name); - GETPROC(glGetnUniformivARB, name); - GETPROC(glGetnUniformuivARB, name); - GETPROC(glGetnUniformdvARB, name); - GETPROC(glFramebufferSampleLocationsfvARB, name); - GETPROC(glNamedFramebufferSampleLocationsfvARB, name); - GETPROC(glEvaluateDepthValuesARB, name); - GETPROC(glMinSampleShadingARB, name); - GETPROC(glNamedStringARB, name); - GETPROC(glDeleteNamedStringARB, name); - GETPROC(glCompileShaderIncludeARB, name); - GETPROC(glIsNamedStringARB, name); - GETPROC(glGetNamedStringARB, name); - GETPROC(glGetNamedStringivARB, name); - GETPROC(glBufferPageCommitmentARB, name); - GETPROC(glNamedBufferPageCommitmentEXT, name); - GETPROC(glNamedBufferPageCommitmentARB, name); - GETPROC(glTexPageCommitmentARB, name); - GETPROC(glTexBufferARB, name); - GETPROC(glDepthRangeArraydvNV, name); - GETPROC(glDepthRangeIndexeddNV, name); - GETPROC(glBlendBarrierKHR, name); - GETPROC(glMaxShaderCompilerThreadsKHR, name); - GETPROC(glRenderbufferStorageMultisampleAdvancedAMD, name); - GETPROC(glNamedRenderbufferStorageMultisampleAdvancedAMD, name); - GETPROC(glGetPerfMonitorGroupsAMD, name); - GETPROC(glGetPerfMonitorCountersAMD, name); - GETPROC(glGetPerfMonitorGroupStringAMD, name); - GETPROC(glGetPerfMonitorCounterStringAMD, name); - GETPROC(glGetPerfMonitorCounterInfoAMD, name); - GETPROC(glGenPerfMonitorsAMD, name); - GETPROC(glDeletePerfMonitorsAMD, name); - GETPROC(glSelectPerfMonitorCountersAMD, name); - GETPROC(glBeginPerfMonitorAMD, name); - GETPROC(glEndPerfMonitorAMD, name); - GETPROC(glGetPerfMonitorCounterDataAMD, name); - GETPROC(glEGLImageTargetTexStorageEXT, name); - GETPROC(glEGLImageTargetTextureStorageEXT, name); - GETPROC(glLabelObjectEXT, name); - GETPROC(glGetObjectLabelEXT, name); - GETPROC(glInsertEventMarkerEXT, name); - GETPROC(glPushGroupMarkerEXT, name); - GETPROC(glPopGroupMarkerEXT, name); - GETPROC(glMatrixLoadfEXT, name); - GETPROC(glMatrixLoaddEXT, name); - GETPROC(glMatrixMultfEXT, name); - GETPROC(glMatrixMultdEXT, name); - GETPROC(glMatrixLoadIdentityEXT, name); - GETPROC(glMatrixRotatefEXT, name); - GETPROC(glMatrixRotatedEXT, name); - GETPROC(glMatrixScalefEXT, name); - GETPROC(glMatrixScaledEXT, name); - GETPROC(glMatrixTranslatefEXT, name); - GETPROC(glMatrixTranslatedEXT, name); - GETPROC(glMatrixFrustumEXT, name); - GETPROC(glMatrixOrthoEXT, name); - GETPROC(glMatrixPopEXT, name); - GETPROC(glMatrixPushEXT, name); - GETPROC(glClientAttribDefaultEXT, name); - GETPROC(glPushClientAttribDefaultEXT, name); - GETPROC(glTextureParameterfEXT, name); - GETPROC(glTextureParameterfvEXT, name); - GETPROC(glTextureParameteriEXT, name); - GETPROC(glTextureParameterivEXT, name); - GETPROC(glTextureImage1DEXT, name); - GETPROC(glTextureImage2DEXT, name); - GETPROC(glTextureSubImage1DEXT, name); - GETPROC(glTextureSubImage2DEXT, name); - GETPROC(glCopyTextureImage1DEXT, name); - GETPROC(glCopyTextureImage2DEXT, name); - GETPROC(glCopyTextureSubImage1DEXT, name); - GETPROC(glCopyTextureSubImage2DEXT, name); - GETPROC(glGetTextureImageEXT, name); - GETPROC(glGetTextureParameterfvEXT, name); - GETPROC(glGetTextureParameterivEXT, name); - GETPROC(glGetTextureLevelParameterfvEXT, name); - GETPROC(glGetTextureLevelParameterivEXT, name); - GETPROC(glTextureImage3DEXT, name); - GETPROC(glTextureSubImage3DEXT, name); - GETPROC(glCopyTextureSubImage3DEXT, name); - GETPROC(glBindMultiTextureEXT, name); - GETPROC(glMultiTexCoordPointerEXT, name); - GETPROC(glMultiTexEnvfEXT, name); - GETPROC(glMultiTexEnvfvEXT, name); - GETPROC(glMultiTexEnviEXT, name); - GETPROC(glMultiTexEnvivEXT, name); - GETPROC(glMultiTexGendEXT, name); - GETPROC(glMultiTexGendvEXT, name); - GETPROC(glMultiTexGenfEXT, name); - GETPROC(glMultiTexGenfvEXT, name); - GETPROC(glMultiTexGeniEXT, name); - GETPROC(glMultiTexGenivEXT, name); - GETPROC(glGetMultiTexEnvfvEXT, name); - GETPROC(glGetMultiTexEnvivEXT, name); - GETPROC(glGetMultiTexGendvEXT, name); - GETPROC(glGetMultiTexGenfvEXT, name); - GETPROC(glGetMultiTexGenivEXT, name); - GETPROC(glMultiTexParameteriEXT, name); - GETPROC(glMultiTexParameterivEXT, name); - GETPROC(glMultiTexParameterfEXT, name); - GETPROC(glMultiTexParameterfvEXT, name); - GETPROC(glMultiTexImage1DEXT, name); - GETPROC(glMultiTexImage2DEXT, name); - GETPROC(glMultiTexSubImage1DEXT, name); - GETPROC(glMultiTexSubImage2DEXT, name); - GETPROC(glCopyMultiTexImage1DEXT, name); - GETPROC(glCopyMultiTexImage2DEXT, name); - GETPROC(glCopyMultiTexSubImage1DEXT, name); - GETPROC(glCopyMultiTexSubImage2DEXT, name); - GETPROC(glGetMultiTexImageEXT, name); - GETPROC(glGetMultiTexParameterfvEXT, name); - GETPROC(glGetMultiTexParameterivEXT, name); - GETPROC(glGetMultiTexLevelParameterfvEXT, name); - GETPROC(glGetMultiTexLevelParameterivEXT, name); - GETPROC(glMultiTexImage3DEXT, name); - GETPROC(glMultiTexSubImage3DEXT, name); - GETPROC(glCopyMultiTexSubImage3DEXT, name); - GETPROC(glEnableClientStateIndexedEXT, name); - GETPROC(glDisableClientStateIndexedEXT, name); - GETPROC(glGetFloatIndexedvEXT, name); - GETPROC(glGetDoubleIndexedvEXT, name); - GETPROC(glGetPointerIndexedvEXT, name); - GETPROC(glEnableIndexedEXT, name); - GETPROC(glDisableIndexedEXT, name); - GETPROC(glIsEnabledIndexedEXT, name); - GETPROC(glGetIntegerIndexedvEXT, name); - GETPROC(glGetBooleanIndexedvEXT, name); - GETPROC(glCompressedTextureImage3DEXT, name); - GETPROC(glCompressedTextureImage2DEXT, name); - GETPROC(glCompressedTextureImage1DEXT, name); - GETPROC(glCompressedTextureSubImage3DEXT, name); - GETPROC(glCompressedTextureSubImage2DEXT, name); - GETPROC(glCompressedTextureSubImage1DEXT, name); - GETPROC(glGetCompressedTextureImageEXT, name); - GETPROC(glCompressedMultiTexImage3DEXT, name); - GETPROC(glCompressedMultiTexImage2DEXT, name); - GETPROC(glCompressedMultiTexImage1DEXT, name); - GETPROC(glCompressedMultiTexSubImage3DEXT, name); - GETPROC(glCompressedMultiTexSubImage2DEXT, name); - GETPROC(glCompressedMultiTexSubImage1DEXT, name); - GETPROC(glGetCompressedMultiTexImageEXT, name); - GETPROC(glMatrixLoadTransposefEXT, name); - GETPROC(glMatrixLoadTransposedEXT, name); - GETPROC(glMatrixMultTransposefEXT, name); - GETPROC(glMatrixMultTransposedEXT, name); - GETPROC(glNamedBufferDataEXT, name); - GETPROC(glNamedBufferSubDataEXT, name); - GETPROC(glMapNamedBufferEXT, name); - GETPROC(glUnmapNamedBufferEXT, name); - GETPROC(glGetNamedBufferParameterivEXT, name); - GETPROC(glGetNamedBufferPointervEXT, name); - GETPROC(glGetNamedBufferSubDataEXT, name); - GETPROC(glProgramUniform1fEXT, name); - GETPROC(glProgramUniform2fEXT, name); - GETPROC(glProgramUniform3fEXT, name); - GETPROC(glProgramUniform4fEXT, name); - GETPROC(glProgramUniform1iEXT, name); - GETPROC(glProgramUniform2iEXT, name); - GETPROC(glProgramUniform3iEXT, name); - GETPROC(glProgramUniform4iEXT, name); - GETPROC(glProgramUniform1fvEXT, name); - GETPROC(glProgramUniform2fvEXT, name); - GETPROC(glProgramUniform3fvEXT, name); - GETPROC(glProgramUniform4fvEXT, name); - GETPROC(glProgramUniform1ivEXT, name); - GETPROC(glProgramUniform2ivEXT, name); - GETPROC(glProgramUniform3ivEXT, name); - GETPROC(glProgramUniform4ivEXT, name); - GETPROC(glProgramUniformMatrix2fvEXT, name); - GETPROC(glProgramUniformMatrix3fvEXT, name); - GETPROC(glProgramUniformMatrix4fvEXT, name); - GETPROC(glProgramUniformMatrix2x3fvEXT, name); - GETPROC(glProgramUniformMatrix3x2fvEXT, name); - GETPROC(glProgramUniformMatrix2x4fvEXT, name); - GETPROC(glProgramUniformMatrix4x2fvEXT, name); - GETPROC(glProgramUniformMatrix3x4fvEXT, name); - GETPROC(glProgramUniformMatrix4x3fvEXT, name); - GETPROC(glTextureBufferEXT, name); - GETPROC(glMultiTexBufferEXT, name); - GETPROC(glTextureParameterIivEXT, name); - GETPROC(glTextureParameterIuivEXT, name); - GETPROC(glGetTextureParameterIivEXT, name); - GETPROC(glGetTextureParameterIuivEXT, name); - GETPROC(glMultiTexParameterIivEXT, name); - GETPROC(glMultiTexParameterIuivEXT, name); - GETPROC(glGetMultiTexParameterIivEXT, name); - GETPROC(glGetMultiTexParameterIuivEXT, name); - GETPROC(glProgramUniform1uiEXT, name); - GETPROC(glProgramUniform2uiEXT, name); - GETPROC(glProgramUniform3uiEXT, name); - GETPROC(glProgramUniform4uiEXT, name); - GETPROC(glProgramUniform1uivEXT, name); - GETPROC(glProgramUniform2uivEXT, name); - GETPROC(glProgramUniform3uivEXT, name); - GETPROC(glProgramUniform4uivEXT, name); - GETPROC(glNamedProgramLocalParameters4fvEXT, name); - GETPROC(glNamedProgramLocalParameterI4iEXT, name); - GETPROC(glNamedProgramLocalParameterI4ivEXT, name); - GETPROC(glNamedProgramLocalParametersI4ivEXT, name); - GETPROC(glNamedProgramLocalParameterI4uiEXT, name); - GETPROC(glNamedProgramLocalParameterI4uivEXT, name); - GETPROC(glNamedProgramLocalParametersI4uivEXT, name); - GETPROC(glGetNamedProgramLocalParameterIivEXT, name); - GETPROC(glGetNamedProgramLocalParameterIuivEXT, name); - GETPROC(glEnableClientStateiEXT, name); - GETPROC(glDisableClientStateiEXT, name); - GETPROC(glGetFloati_vEXT, name); - GETPROC(glGetDoublei_vEXT, name); - GETPROC(glGetPointeri_vEXT, name); - GETPROC(glNamedProgramStringEXT, name); - GETPROC(glNamedProgramLocalParameter4dEXT, name); - GETPROC(glNamedProgramLocalParameter4dvEXT, name); - GETPROC(glNamedProgramLocalParameter4fEXT, name); - GETPROC(glNamedProgramLocalParameter4fvEXT, name); - GETPROC(glGetNamedProgramLocalParameterdvEXT, name); - GETPROC(glGetNamedProgramLocalParameterfvEXT, name); - GETPROC(glGetNamedProgramivEXT, name); - GETPROC(glGetNamedProgramStringEXT, name); - GETPROC(glNamedRenderbufferStorageEXT, name); - GETPROC(glGetNamedRenderbufferParameterivEXT, name); - GETPROC(glNamedRenderbufferStorageMultisampleEXT, name); - GETPROC(glNamedRenderbufferStorageMultisampleCoverageEXT, name); - GETPROC(glCheckNamedFramebufferStatusEXT, name); - GETPROC(glNamedFramebufferTexture1DEXT, name); - GETPROC(glNamedFramebufferTexture2DEXT, name); - GETPROC(glNamedFramebufferTexture3DEXT, name); - GETPROC(glNamedFramebufferRenderbufferEXT, name); - GETPROC(glGetNamedFramebufferAttachmentParameterivEXT, name); - GETPROC(glGenerateTextureMipmapEXT, name); - GETPROC(glGenerateMultiTexMipmapEXT, name); - GETPROC(glFramebufferDrawBufferEXT, name); - GETPROC(glFramebufferDrawBuffersEXT, name); - GETPROC(glFramebufferReadBufferEXT, name); - GETPROC(glGetFramebufferParameterivEXT, name); - GETPROC(glNamedCopyBufferSubDataEXT, name); - GETPROC(glNamedFramebufferTextureEXT, name); - GETPROC(glNamedFramebufferTextureLayerEXT, name); - GETPROC(glNamedFramebufferTextureFaceEXT, name); - GETPROC(glTextureRenderbufferEXT, name); - GETPROC(glMultiTexRenderbufferEXT, name); - GETPROC(glVertexArrayVertexOffsetEXT, name); - GETPROC(glVertexArrayColorOffsetEXT, name); - GETPROC(glVertexArrayEdgeFlagOffsetEXT, name); - GETPROC(glVertexArrayIndexOffsetEXT, name); - GETPROC(glVertexArrayNormalOffsetEXT, name); - GETPROC(glVertexArrayTexCoordOffsetEXT, name); - GETPROC(glVertexArrayMultiTexCoordOffsetEXT, name); - GETPROC(glVertexArrayFogCoordOffsetEXT, name); - GETPROC(glVertexArraySecondaryColorOffsetEXT, name); - GETPROC(glVertexArrayVertexAttribOffsetEXT, name); - GETPROC(glVertexArrayVertexAttribIOffsetEXT, name); - GETPROC(glEnableVertexArrayEXT, name); - GETPROC(glDisableVertexArrayEXT, name); - GETPROC(glEnableVertexArrayAttribEXT, name); - GETPROC(glDisableVertexArrayAttribEXT, name); - GETPROC(glGetVertexArrayIntegervEXT, name); - GETPROC(glGetVertexArrayPointervEXT, name); - GETPROC(glGetVertexArrayIntegeri_vEXT, name); - GETPROC(glGetVertexArrayPointeri_vEXT, name); - GETPROC(glMapNamedBufferRangeEXT, name); - GETPROC(glFlushMappedNamedBufferRangeEXT, name); - GETPROC(glNamedBufferStorageEXT, name); - GETPROC(glClearNamedBufferDataEXT, name); - GETPROC(glClearNamedBufferSubDataEXT, name); - GETPROC(glNamedFramebufferParameteriEXT, name); - GETPROC(glGetNamedFramebufferParameterivEXT, name); - GETPROC(glProgramUniform1dEXT, name); - GETPROC(glProgramUniform2dEXT, name); - GETPROC(glProgramUniform3dEXT, name); - GETPROC(glProgramUniform4dEXT, name); - GETPROC(glProgramUniform1dvEXT, name); - GETPROC(glProgramUniform2dvEXT, name); - GETPROC(glProgramUniform3dvEXT, name); - GETPROC(glProgramUniform4dvEXT, name); - GETPROC(glProgramUniformMatrix2dvEXT, name); - GETPROC(glProgramUniformMatrix3dvEXT, name); - GETPROC(glProgramUniformMatrix4dvEXT, name); - GETPROC(glProgramUniformMatrix2x3dvEXT, name); - GETPROC(glProgramUniformMatrix2x4dvEXT, name); - GETPROC(glProgramUniformMatrix3x2dvEXT, name); - GETPROC(glProgramUniformMatrix3x4dvEXT, name); - GETPROC(glProgramUniformMatrix4x2dvEXT, name); - GETPROC(glProgramUniformMatrix4x3dvEXT, name); - GETPROC(glTextureBufferRangeEXT, name); - GETPROC(glTextureStorage1DEXT, name); - GETPROC(glTextureStorage2DEXT, name); - GETPROC(glTextureStorage3DEXT, name); - GETPROC(glTextureStorage2DMultisampleEXT, name); - GETPROC(glTextureStorage3DMultisampleEXT, name); - GETPROC(glVertexArrayBindVertexBufferEXT, name); - GETPROC(glVertexArrayVertexAttribFormatEXT, name); - GETPROC(glVertexArrayVertexAttribIFormatEXT, name); - GETPROC(glVertexArrayVertexAttribLFormatEXT, name); - GETPROC(glVertexArrayVertexAttribBindingEXT, name); - GETPROC(glVertexArrayVertexBindingDivisorEXT, name); - GETPROC(glVertexArrayVertexAttribLOffsetEXT, name); - GETPROC(glTexturePageCommitmentEXT, name); - GETPROC(glVertexArrayVertexAttribDivisorEXT, name); - GETPROC(glDrawArraysInstancedEXT, name); - GETPROC(glDrawElementsInstancedEXT, name); - // GETPROC(glGetFragmentShadingRatesEXT, name); - // GETPROC(glShadingRateEXT, name); - // GETPROC(glShadingRateCombinerOpsEXT, name); - // GETPROC(glFramebufferShadingRateEXT, name); - // GETPROC(glDrawMeshTasksEXT, name); - // GETPROC(glDrawMeshTasksIndirectEXT, name); - // GETPROC(glMultiDrawMeshTasksIndirectEXT, name); - // GETPROC(glMultiDrawMeshTasksIndirectCountEXT, name); - GETPROC(glPolygonOffsetClampEXT, name); - GETPROC(glRasterSamplesEXT, name); - GETPROC(glUseShaderProgramEXT, name); - GETPROC(glActiveProgramEXT, name); - GETPROC(glCreateShaderProgramEXT, name); - GETPROC(glFramebufferFetchBarrierEXT, name); - GETPROC(glTexStorage1DEXT, name); - GETPROC(glTexStorage2DEXT, name); - GETPROC(glTexStorage3DEXT, name); - GETPROC(glWindowRectanglesEXT, name); - GETPROC(glApplyFramebufferAttachmentCMAAINTEL, name); - GETPROC(glBeginPerfQueryINTEL, name); - GETPROC(glCreatePerfQueryINTEL, name); - GETPROC(glDeletePerfQueryINTEL, name); - GETPROC(glEndPerfQueryINTEL, name); - GETPROC(glGetFirstPerfQueryIdINTEL, name); - GETPROC(glGetNextPerfQueryIdINTEL, name); - GETPROC(glGetPerfCounterInfoINTEL, name); - GETPROC(glGetPerfQueryDataINTEL, name); - GETPROC(glGetPerfQueryIdByNameINTEL, name); - GETPROC(glGetPerfQueryInfoINTEL, name); - GETPROC(glFramebufferParameteriMESA, name); - GETPROC(glGetFramebufferParameterivMESA, name); - GETPROC(glMultiDrawArraysIndirectBindlessNV, name); - GETPROC(glMultiDrawElementsIndirectBindlessNV, name); - GETPROC(glMultiDrawArraysIndirectBindlessCountNV, name); - GETPROC(glMultiDrawElementsIndirectBindlessCountNV, name); - GETPROC(glGetTextureHandleNV, name); - GETPROC(glGetTextureSamplerHandleNV, name); - GETPROC(glMakeTextureHandleResidentNV, name); - GETPROC(glMakeTextureHandleNonResidentNV, name); - GETPROC(glGetImageHandleNV, name); - GETPROC(glMakeImageHandleResidentNV, name); - GETPROC(glMakeImageHandleNonResidentNV, name); - GETPROC(glUniformHandleui64NV, name); - GETPROC(glUniformHandleui64vNV, name); - GETPROC(glProgramUniformHandleui64NV, name); - GETPROC(glProgramUniformHandleui64vNV, name); - GETPROC(glIsTextureHandleResidentNV, name); - GETPROC(glIsImageHandleResidentNV, name); - GETPROC(glBlendParameteriNV, name); - GETPROC(glBlendBarrierNV, name); - GETPROC(glViewportPositionWScaleNV, name); - GETPROC(glCreateStatesNV, name); - GETPROC(glDeleteStatesNV, name); - GETPROC(glIsStateNV, name); - GETPROC(glStateCaptureNV, name); - GETPROC(glGetCommandHeaderNV, name); - GETPROC(glGetStageIndexNV, name); - GETPROC(glDrawCommandsNV, name); - GETPROC(glDrawCommandsAddressNV, name); - GETPROC(glDrawCommandsStatesNV, name); - GETPROC(glDrawCommandsStatesAddressNV, name); - GETPROC(glCreateCommandListsNV, name); - GETPROC(glDeleteCommandListsNV, name); - GETPROC(glIsCommandListNV, name); - GETPROC(glListDrawCommandsStatesClientNV, name); - GETPROC(glCommandListSegmentsNV, name); - GETPROC(glCompileCommandListNV, name); - GETPROC(glCallCommandListNV, name); - GETPROC(glBeginConditionalRenderNV, name); - GETPROC(glEndConditionalRenderNV, name); - GETPROC(glSubpixelPrecisionBiasNV, name); - GETPROC(glConservativeRasterParameterfNV, name); - GETPROC(glConservativeRasterParameteriNV, name); - GETPROC(glDepthRangedNV, name); - GETPROC(glClearDepthdNV, name); - GETPROC(glDepthBoundsdNV, name); - GETPROC(glDrawVkImageNV, name); - GETPROC(glGetVkProcAddrNV, name); - GETPROC(glWaitVkSemaphoreNV, name); - GETPROC(glSignalVkSemaphoreNV, name); - GETPROC(glSignalVkFenceNV, name); - GETPROC(glFragmentCoverageColorNV, name); - GETPROC(glCoverageModulationTableNV, name); - GETPROC(glGetCoverageModulationTableNV, name); - GETPROC(glCoverageModulationNV, name); - GETPROC(glRenderbufferStorageMultisampleCoverageNV, name); - GETPROC(glUniform1i64NV, name); - GETPROC(glUniform2i64NV, name); - GETPROC(glUniform3i64NV, name); - GETPROC(glUniform4i64NV, name); - GETPROC(glUniform1i64vNV, name); - GETPROC(glUniform2i64vNV, name); - GETPROC(glUniform3i64vNV, name); - GETPROC(glUniform4i64vNV, name); - GETPROC(glUniform1ui64NV, name); - GETPROC(glUniform2ui64NV, name); - GETPROC(glUniform3ui64NV, name); - GETPROC(glUniform4ui64NV, name); - GETPROC(glUniform1ui64vNV, name); - GETPROC(glUniform2ui64vNV, name); - GETPROC(glUniform3ui64vNV, name); - GETPROC(glUniform4ui64vNV, name); - GETPROC(glGetUniformi64vNV, name); - GETPROC(glProgramUniform1i64NV, name); - GETPROC(glProgramUniform2i64NV, name); - GETPROC(glProgramUniform3i64NV, name); - GETPROC(glProgramUniform4i64NV, name); - GETPROC(glProgramUniform1i64vNV, name); - GETPROC(glProgramUniform2i64vNV, name); - GETPROC(glProgramUniform3i64vNV, name); - GETPROC(glProgramUniform4i64vNV, name); - GETPROC(glProgramUniform1ui64NV, name); - GETPROC(glProgramUniform2ui64NV, name); - GETPROC(glProgramUniform3ui64NV, name); - GETPROC(glProgramUniform4ui64NV, name); - GETPROC(glProgramUniform1ui64vNV, name); - GETPROC(glProgramUniform2ui64vNV, name); - GETPROC(glProgramUniform3ui64vNV, name); - GETPROC(glProgramUniform4ui64vNV, name); - GETPROC(glGetInternalformatSampleivNV, name); - GETPROC(glGetMemoryObjectDetachedResourcesuivNV, name); - GETPROC(glResetMemoryObjectParameterNV, name); - GETPROC(glTexAttachMemoryNV, name); - GETPROC(glBufferAttachMemoryNV, name); - GETPROC(glTextureAttachMemoryNV, name); - GETPROC(glNamedBufferAttachMemoryNV, name); - GETPROC(glBufferPageCommitmentMemNV, name); - GETPROC(glTexPageCommitmentMemNV, name); - GETPROC(glNamedBufferPageCommitmentMemNV, name); - GETPROC(glTexturePageCommitmentMemNV, name); - GETPROC(glDrawMeshTasksNV, name); - GETPROC(glDrawMeshTasksIndirectNV, name); - GETPROC(glMultiDrawMeshTasksIndirectNV, name); - GETPROC(glMultiDrawMeshTasksIndirectCountNV, name); - GETPROC(glGenPathsNV, name); - GETPROC(glDeletePathsNV, name); - GETPROC(glIsPathNV, name); - GETPROC(glPathCommandsNV, name); - GETPROC(glPathCoordsNV, name); - GETPROC(glPathSubCommandsNV, name); - GETPROC(glPathSubCoordsNV, name); - GETPROC(glPathStringNV, name); - GETPROC(glPathGlyphsNV, name); - GETPROC(glPathGlyphRangeNV, name); - GETPROC(glWeightPathsNV, name); - GETPROC(glCopyPathNV, name); - GETPROC(glInterpolatePathsNV, name); - GETPROC(glTransformPathNV, name); - GETPROC(glPathParameterivNV, name); - GETPROC(glPathParameteriNV, name); - GETPROC(glPathParameterfvNV, name); - GETPROC(glPathParameterfNV, name); - GETPROC(glPathDashArrayNV, name); - GETPROC(glPathStencilFuncNV, name); - GETPROC(glPathStencilDepthOffsetNV, name); - GETPROC(glStencilFillPathNV, name); - GETPROC(glStencilStrokePathNV, name); - GETPROC(glStencilFillPathInstancedNV, name); - GETPROC(glStencilStrokePathInstancedNV, name); - GETPROC(glPathCoverDepthFuncNV, name); - GETPROC(glCoverFillPathNV, name); - GETPROC(glCoverStrokePathNV, name); - GETPROC(glCoverFillPathInstancedNV, name); - GETPROC(glCoverStrokePathInstancedNV, name); - GETPROC(glGetPathParameterivNV, name); - GETPROC(glGetPathParameterfvNV, name); - GETPROC(glGetPathCommandsNV, name); - GETPROC(glGetPathCoordsNV, name); - GETPROC(glGetPathDashArrayNV, name); - GETPROC(glGetPathMetricsNV, name); - GETPROC(glGetPathMetricRangeNV, name); - GETPROC(glGetPathSpacingNV, name); - GETPROC(glIsPointInFillPathNV, name); - GETPROC(glIsPointInStrokePathNV, name); - GETPROC(glGetPathLengthNV, name); - GETPROC(glPointAlongPathNV, name); - GETPROC(glMatrixLoad3x2fNV, name); - GETPROC(glMatrixLoad3x3fNV, name); - GETPROC(glMatrixLoadTranspose3x3fNV, name); - GETPROC(glMatrixMult3x2fNV, name); - GETPROC(glMatrixMult3x3fNV, name); - GETPROC(glMatrixMultTranspose3x3fNV, name); - GETPROC(glStencilThenCoverFillPathNV, name); - GETPROC(glStencilThenCoverStrokePathNV, name); - GETPROC(glStencilThenCoverFillPathInstancedNV, name); - GETPROC(glStencilThenCoverStrokePathInstancedNV, name); - GETPROC(glPathGlyphIndexRangeNV, name); - GETPROC(glPathGlyphIndexArrayNV, name); - GETPROC(glPathMemoryGlyphIndexArrayNV, name); - GETPROC(glProgramPathFragmentInputGenNV, name); - GETPROC(glGetProgramResourcefvNV, name); - GETPROC(glFramebufferSampleLocationsfvNV, name); - GETPROC(glNamedFramebufferSampleLocationsfvNV, name); - GETPROC(glResolveDepthValuesNV, name); - GETPROC(glScissorExclusiveNV, name); - GETPROC(glScissorExclusiveArrayvNV, name); - GETPROC(glMakeBufferResidentNV, name); - GETPROC(glMakeBufferNonResidentNV, name); - GETPROC(glIsBufferResidentNV, name); - GETPROC(glMakeNamedBufferResidentNV, name); - GETPROC(glMakeNamedBufferNonResidentNV, name); - GETPROC(glIsNamedBufferResidentNV, name); - GETPROC(glGetBufferParameterui64vNV, name); - GETPROC(glGetNamedBufferParameterui64vNV, name); - GETPROC(glGetIntegerui64vNV, name); - GETPROC(glUniformui64NV, name); - GETPROC(glUniformui64vNV, name); - GETPROC(glGetUniformui64vNV, name); - GETPROC(glProgramUniformui64NV, name); - GETPROC(glProgramUniformui64vNV, name); - GETPROC(glBindShadingRateImageNV, name); - GETPROC(glGetShadingRateImagePaletteNV, name); - GETPROC(glGetShadingRateSampleLocationivNV, name); - GETPROC(glShadingRateImageBarrierNV, name); - GETPROC(glShadingRateImagePaletteNV, name); - GETPROC(glShadingRateSampleOrderNV, name); - GETPROC(glShadingRateSampleOrderCustomNV, name); - GETPROC(glTextureBarrierNV, name); - GETPROC(glVertexAttribL1i64NV, name); - GETPROC(glVertexAttribL2i64NV, name); - GETPROC(glVertexAttribL3i64NV, name); - GETPROC(glVertexAttribL4i64NV, name); - GETPROC(glVertexAttribL1i64vNV, name); - GETPROC(glVertexAttribL2i64vNV, name); - GETPROC(glVertexAttribL3i64vNV, name); - GETPROC(glVertexAttribL4i64vNV, name); - GETPROC(glVertexAttribL1ui64NV, name); - GETPROC(glVertexAttribL2ui64NV, name); - GETPROC(glVertexAttribL3ui64NV, name); - GETPROC(glVertexAttribL4ui64NV, name); - GETPROC(glVertexAttribL1ui64vNV, name); - GETPROC(glVertexAttribL2ui64vNV, name); - GETPROC(glVertexAttribL3ui64vNV, name); - GETPROC(glVertexAttribL4ui64vNV, name); - GETPROC(glGetVertexAttribLi64vNV, name); - GETPROC(glGetVertexAttribLui64vNV, name); - GETPROC(glVertexAttribLFormatNV, name); - GETPROC(glBufferAddressRangeNV, name); - GETPROC(glVertexFormatNV, name); - GETPROC(glNormalFormatNV, name); - GETPROC(glColorFormatNV, name); - GETPROC(glIndexFormatNV, name); - GETPROC(glTexCoordFormatNV, name); - GETPROC(glEdgeFlagFormatNV, name); - GETPROC(glSecondaryColorFormatNV, name); - GETPROC(glFogCoordFormatNV, name); - GETPROC(glVertexAttribFormatNV, name); - GETPROC(glVertexAttribIFormatNV, name); - GETPROC(glGetIntegerui64i_vNV, name); - GETPROC(glViewportSwizzleNV, name); - GETPROC(glFramebufferTextureMultiviewOVR, name); - // GETPROC(glNamedFramebufferTextureMultiviewOVR, name); + GETPROC(glCullFace, name); + GETPROC(glFrontFace, name); + GETPROC(glHint, name); + GETPROC(glLineWidth, name); + GETPROC(glPointSize, name); + GETPROC(glPolygonMode, name); + GETPROC(glScissor, name); + GETPROC(glTexParameterf, name); + GETPROC(glTexParameterfv, name); + GETPROC(glTexParameteri, name); + GETPROC(glTexParameteriv, name); + GETPROC(glTexImage1D, name); + GETPROC(glTexImage2D, name); + GETPROC(glDrawBuffer, name); + GETPROC(glClear, name); + GETPROC(glClearColor, name); + GETPROC(glClearStencil, name); + GETPROC(glClearDepth, name); + GETPROC(glStencilMask, name); + GETPROC(glColorMask, name); + GETPROC(glDepthMask, name); + GETPROC(glDisable, name); + GETPROC(glEnable, name); + GETPROC(glFinish, name); + GETPROC(glFlush, name); + GETPROC(glBlendFunc, name); + GETPROC(glLogicOp, name); + GETPROC(glStencilFunc, name); + GETPROC(glStencilOp, name); + GETPROC(glDepthFunc, name); + GETPROC(glPixelStoref, name); + GETPROC(glPixelStorei, name); + GETPROC(glReadBuffer, name); + GETPROC(glReadPixels, name); + GETPROC(glGetBooleanv, name); + GETPROC(glGetDoublev, name); + GETPROC(glGetError, name); + GETPROC(glGetFloatv, name); + GETPROC(glGetIntegerv, name); + GETPROC(glGetString, name); + GETPROC(glGetTexImage, name); + GETPROC(glGetTexParameterfv, name); + GETPROC(glGetTexParameteriv, name); + GETPROC(glGetTexLevelParameterfv, name); + GETPROC(glGetTexLevelParameteriv, name); + GETPROC(glIsEnabled, name); + GETPROC(glDepthRange, name); + GETPROC(glViewport, name); + GETPROC(glDrawArrays, name); + GETPROC(glDrawElements, name); + GETPROC(glGetPointerv, name); + GETPROC(glPolygonOffset, name); + GETPROC(glCopyTexImage1D, name); + GETPROC(glCopyTexImage2D, name); + GETPROC(glCopyTexSubImage1D, name); + GETPROC(glCopyTexSubImage2D, name); + GETPROC(glTexSubImage1D, name); + GETPROC(glTexSubImage2D, name); + GETPROC(glBindTexture, name); + GETPROC(glDeleteTextures, name); + GETPROC(glGenTextures, name); + GETPROC(glIsTexture, name); + GETPROC(glDrawRangeElements, name); + GETPROC(glTexImage3D, name); + GETPROC(glTexSubImage3D, name); + GETPROC(glCopyTexSubImage3D, name); + GETPROC(glActiveTexture, name); + GETPROC(glSampleCoverage, name); + GETPROC(glCompressedTexImage3D, name); + GETPROC(glCompressedTexImage2D, name); + GETPROC(glCompressedTexImage1D, name); + GETPROC(glCompressedTexSubImage3D, name); + GETPROC(glCompressedTexSubImage2D, name); + GETPROC(glCompressedTexSubImage1D, name); + GETPROC(glGetCompressedTexImage, name); + GETPROC(glBlendFuncSeparate, name); + GETPROC(glMultiDrawArrays, name); + GETPROC(glMultiDrawElements, name); + GETPROC(glPointParameterf, name); + GETPROC(glPointParameterfv, name); + GETPROC(glPointParameteri, name); + GETPROC(glPointParameteriv, name); + GETPROC(glBlendColor, name); + GETPROC(glBlendEquation, name); + GETPROC(glGenQueries, name); + GETPROC(glDeleteQueries, name); + GETPROC(glIsQuery, name); + GETPROC(glBeginQuery, name); + GETPROC(glEndQuery, name); + GETPROC(glGetQueryiv, name); + GETPROC(glGetQueryObjectiv, name); + GETPROC(glGetQueryObjectuiv, name); + GETPROC(glBindBuffer, name); + GETPROC(glDeleteBuffers, name); + GETPROC(glGenBuffers, name); + GETPROC(glIsBuffer, name); + GETPROC(glBufferData, name); + GETPROC(glBufferSubData, name); + GETPROC(glGetBufferSubData, name); + GETPROC(glMapBuffer, name); + GETPROC(glUnmapBuffer, name); + GETPROC(glGetBufferParameteriv, name); + GETPROC(glGetBufferPointerv, name); + GETPROC(glBlendEquationSeparate, name); + GETPROC(glDrawBuffers, name); + GETPROC(glStencilOpSeparate, name); + GETPROC(glStencilFuncSeparate, name); + GETPROC(glStencilMaskSeparate, name); + GETPROC(glAttachShader, name); + GETPROC(glBindAttribLocation, name); + GETPROC(glCompileShader, name); + GETPROC(glCreateProgram, name); + GETPROC(glCreateShader, name); + GETPROC(glDeleteProgram, name); + GETPROC(glDeleteShader, name); + GETPROC(glDetachShader, name); + GETPROC(glDisableVertexAttribArray, name); + GETPROC(glEnableVertexAttribArray, name); + GETPROC(glGetActiveAttrib, name); + GETPROC(glGetActiveUniform, name); + GETPROC(glGetAttachedShaders, name); + GETPROC(glGetAttribLocation, name); + GETPROC(glGetProgramiv, name); + GETPROC(glGetProgramInfoLog, name); + GETPROC(glGetShaderiv, name); + GETPROC(glGetShaderInfoLog, name); + GETPROC(glGetShaderSource, name); + GETPROC(glGetUniformLocation, name); + GETPROC(glGetUniformfv, name); + GETPROC(glGetUniformiv, name); + GETPROC(glGetVertexAttribdv, name); + GETPROC(glGetVertexAttribfv, name); + GETPROC(glGetVertexAttribiv, name); + GETPROC(glGetVertexAttribPointerv, name); + GETPROC(glIsProgram, name); + GETPROC(glIsShader, name); + GETPROC(glLinkProgram, name); + GETPROC(glShaderSource, name); + GETPROC(glUseProgram, name); + GETPROC(glUniform1f, name); + GETPROC(glUniform2f, name); + GETPROC(glUniform3f, name); + GETPROC(glUniform4f, name); + GETPROC(glUniform1i, name); + GETPROC(glUniform2i, name); + GETPROC(glUniform3i, name); + GETPROC(glUniform4i, name); + GETPROC(glUniform1fv, name); + GETPROC(glUniform2fv, name); + GETPROC(glUniform3fv, name); + GETPROC(glUniform4fv, name); + GETPROC(glUniform1iv, name); + GETPROC(glUniform2iv, name); + GETPROC(glUniform3iv, name); + GETPROC(glUniform4iv, name); + GETPROC(glUniformMatrix2fv, name); + GETPROC(glUniformMatrix3fv, name); + GETPROC(glUniformMatrix4fv, name); + GETPROC(glValidateProgram, name); + GETPROC(glVertexAttrib1d, name); + GETPROC(glVertexAttrib1dv, name); + GETPROC(glVertexAttrib1f, name); + GETPROC(glVertexAttrib1fv, name); + GETPROC(glVertexAttrib1s, name); + GETPROC(glVertexAttrib1sv, name); + GETPROC(glVertexAttrib2d, name); + GETPROC(glVertexAttrib2dv, name); + GETPROC(glVertexAttrib2f, name); + GETPROC(glVertexAttrib2fv, name); + GETPROC(glVertexAttrib2s, name); + GETPROC(glVertexAttrib2sv, name); + GETPROC(glVertexAttrib3d, name); + GETPROC(glVertexAttrib3dv, name); + GETPROC(glVertexAttrib3f, name); + GETPROC(glVertexAttrib3fv, name); + GETPROC(glVertexAttrib3s, name); + GETPROC(glVertexAttrib3sv, name); + GETPROC(glVertexAttrib4Nbv, name); + GETPROC(glVertexAttrib4Niv, name); + GETPROC(glVertexAttrib4Nsv, name); + GETPROC(glVertexAttrib4Nub, name); + GETPROC(glVertexAttrib4Nubv, name); + GETPROC(glVertexAttrib4Nuiv, name); + GETPROC(glVertexAttrib4Nusv, name); + GETPROC(glVertexAttrib4bv, name); + GETPROC(glVertexAttrib4d, name); + GETPROC(glVertexAttrib4dv, name); + GETPROC(glVertexAttrib4f, name); + GETPROC(glVertexAttrib4fv, name); + GETPROC(glVertexAttrib4iv, name); + GETPROC(glVertexAttrib4s, name); + GETPROC(glVertexAttrib4sv, name); + GETPROC(glVertexAttrib4ubv, name); + GETPROC(glVertexAttrib4uiv, name); + GETPROC(glVertexAttrib4usv, name); + GETPROC(glVertexAttribPointer, name); + GETPROC(glUniformMatrix2x3fv, name); + GETPROC(glUniformMatrix3x2fv, name); + GETPROC(glUniformMatrix2x4fv, name); + GETPROC(glUniformMatrix4x2fv, name); + GETPROC(glUniformMatrix3x4fv, name); + GETPROC(glUniformMatrix4x3fv, name); + GETPROC(glColorMaski, name); + GETPROC(glGetBooleani_v, name); + GETPROC(glGetIntegeri_v, name); + GETPROC(glEnablei, name); + GETPROC(glDisablei, name); + GETPROC(glIsEnabledi, name); + GETPROC(glBeginTransformFeedback, name); + GETPROC(glEndTransformFeedback, name); + GETPROC(glBindBufferRange, name); + GETPROC(glBindBufferBase, name); + GETPROC(glTransformFeedbackVaryings, name); + GETPROC(glGetTransformFeedbackVarying, name); + GETPROC(glClampColor, name); + GETPROC(glBeginConditionalRender, name); + GETPROC(glEndConditionalRender, name); + GETPROC(glVertexAttribIPointer, name); + GETPROC(glGetVertexAttribIiv, name); + GETPROC(glGetVertexAttribIuiv, name); + GETPROC(glVertexAttribI1i, name); + GETPROC(glVertexAttribI2i, name); + GETPROC(glVertexAttribI3i, name); + GETPROC(glVertexAttribI4i, name); + GETPROC(glVertexAttribI1ui, name); + GETPROC(glVertexAttribI2ui, name); + GETPROC(glVertexAttribI3ui, name); + GETPROC(glVertexAttribI4ui, name); + GETPROC(glVertexAttribI1iv, name); + GETPROC(glVertexAttribI2iv, name); + GETPROC(glVertexAttribI3iv, name); + GETPROC(glVertexAttribI4iv, name); + GETPROC(glVertexAttribI1uiv, name); + GETPROC(glVertexAttribI2uiv, name); + GETPROC(glVertexAttribI3uiv, name); + GETPROC(glVertexAttribI4uiv, name); + GETPROC(glVertexAttribI4bv, name); + GETPROC(glVertexAttribI4sv, name); + GETPROC(glVertexAttribI4ubv, name); + GETPROC(glVertexAttribI4usv, name); + GETPROC(glGetUniformuiv, name); + GETPROC(glBindFragDataLocation, name); + GETPROC(glGetFragDataLocation, name); + GETPROC(glUniform1ui, name); + GETPROC(glUniform2ui, name); + GETPROC(glUniform3ui, name); + GETPROC(glUniform4ui, name); + GETPROC(glUniform1uiv, name); + GETPROC(glUniform2uiv, name); + GETPROC(glUniform3uiv, name); + GETPROC(glUniform4uiv, name); + GETPROC(glTexParameterIiv, name); + GETPROC(glTexParameterIuiv, name); + GETPROC(glGetTexParameterIiv, name); + GETPROC(glGetTexParameterIuiv, name); + GETPROC(glClearBufferiv, name); + GETPROC(glClearBufferuiv, name); + GETPROC(glClearBufferfv, name); + GETPROC(glClearBufferfi, name); + GETPROC(glGetStringi, name); + GETPROC(glIsRenderbuffer, name); + GETPROC(glBindRenderbuffer, name); + GETPROC(glDeleteRenderbuffers, name); + GETPROC(glGenRenderbuffers, name); + GETPROC(glRenderbufferStorage, name); + GETPROC(glGetRenderbufferParameteriv, name); + GETPROC(glIsFramebuffer, name); + GETPROC(glBindFramebuffer, name); + GETPROC(glDeleteFramebuffers, name); + GETPROC(glGenFramebuffers, name); + GETPROC(glCheckFramebufferStatus, name); + GETPROC(glFramebufferTexture1D, name); + GETPROC(glFramebufferTexture2D, name); + GETPROC(glFramebufferTexture3D, name); + GETPROC(glFramebufferRenderbuffer, name); + GETPROC(glGetFramebufferAttachmentParameteriv, name); + GETPROC(glGenerateMipmap, name); + GETPROC(glBlitFramebuffer, name); + GETPROC(glRenderbufferStorageMultisample, name); + GETPROC(glFramebufferTextureLayer, name); + GETPROC(glMapBufferRange, name); + GETPROC(glFlushMappedBufferRange, name); + GETPROC(glBindVertexArray, name); + GETPROC(glDeleteVertexArrays, name); + GETPROC(glGenVertexArrays, name); + GETPROC(glIsVertexArray, name); + GETPROC(glDrawArraysInstanced, name); + GETPROC(glDrawElementsInstanced, name); + GETPROC(glTexBuffer, name); + GETPROC(glPrimitiveRestartIndex, name); + GETPROC(glCopyBufferSubData, name); + GETPROC(glGetUniformIndices, name); + GETPROC(glGetActiveUniformsiv, name); + GETPROC(glGetActiveUniformName, name); + GETPROC(glGetUniformBlockIndex, name); + GETPROC(glGetActiveUniformBlockiv, name); + GETPROC(glGetActiveUniformBlockName, name); + GETPROC(glUniformBlockBinding, name); + GETPROC(glDrawElementsBaseVertex, name); + GETPROC(glDrawRangeElementsBaseVertex, name); + GETPROC(glDrawElementsInstancedBaseVertex, name); + GETPROC(glMultiDrawElementsBaseVertex, name); + GETPROC(glProvokingVertex, name); + GETPROC(glFenceSync, name); + GETPROC(glIsSync, name); + GETPROC(glDeleteSync, name); + GETPROC(glClientWaitSync, name); + GETPROC(glWaitSync, name); + GETPROC(glGetInteger64v, name); + GETPROC(glGetSynciv, name); + GETPROC(glGetInteger64i_v, name); + GETPROC(glGetBufferParameteri64v, name); + GETPROC(glFramebufferTexture, name); + GETPROC(glTexImage2DMultisample, name); + GETPROC(glTexImage3DMultisample, name); + GETPROC(glGetMultisamplefv, name); + GETPROC(glSampleMaski, name); + GETPROC(glBindFragDataLocationIndexed, name); + GETPROC(glGetFragDataIndex, name); + GETPROC(glGenSamplers, name); + GETPROC(glDeleteSamplers, name); + GETPROC(glIsSampler, name); + GETPROC(glBindSampler, name); + GETPROC(glSamplerParameteri, name); + GETPROC(glSamplerParameteriv, name); + GETPROC(glSamplerParameterf, name); + GETPROC(glSamplerParameterfv, name); + GETPROC(glSamplerParameterIiv, name); + GETPROC(glSamplerParameterIuiv, name); + GETPROC(glGetSamplerParameteriv, name); + GETPROC(glGetSamplerParameterIiv, name); + GETPROC(glGetSamplerParameterfv, name); + GETPROC(glGetSamplerParameterIuiv, name); + GETPROC(glQueryCounter, name); + GETPROC(glGetQueryObjecti64v, name); + GETPROC(glGetQueryObjectui64v, name); + GETPROC(glVertexAttribDivisor, name); + GETPROC(glVertexAttribP1ui, name); + GETPROC(glVertexAttribP1uiv, name); + GETPROC(glVertexAttribP2ui, name); + GETPROC(glVertexAttribP2uiv, name); + GETPROC(glVertexAttribP3ui, name); + GETPROC(glVertexAttribP3uiv, name); + GETPROC(glVertexAttribP4ui, name); + GETPROC(glVertexAttribP4uiv, name); + GETPROC(glMinSampleShading, name); + GETPROC(glBlendEquationi, name); + GETPROC(glBlendEquationSeparatei, name); + GETPROC(glBlendFunci, name); + GETPROC(glBlendFuncSeparatei, name); + GETPROC(glDrawArraysIndirect, name); + GETPROC(glDrawElementsIndirect, name); + GETPROC(glUniform1d, name); + GETPROC(glUniform2d, name); + GETPROC(glUniform3d, name); + GETPROC(glUniform4d, name); + GETPROC(glUniform1dv, name); + GETPROC(glUniform2dv, name); + GETPROC(glUniform3dv, name); + GETPROC(glUniform4dv, name); + GETPROC(glUniformMatrix2dv, name); + GETPROC(glUniformMatrix3dv, name); + GETPROC(glUniformMatrix4dv, name); + GETPROC(glUniformMatrix2x3dv, name); + GETPROC(glUniformMatrix2x4dv, name); + GETPROC(glUniformMatrix3x2dv, name); + GETPROC(glUniformMatrix3x4dv, name); + GETPROC(glUniformMatrix4x2dv, name); + GETPROC(glUniformMatrix4x3dv, name); + GETPROC(glGetUniformdv, name); + GETPROC(glGetSubroutineUniformLocation, name); + GETPROC(glGetSubroutineIndex, name); + GETPROC(glGetActiveSubroutineUniformiv, name); + GETPROC(glGetActiveSubroutineUniformName, name); + GETPROC(glGetActiveSubroutineName, name); + GETPROC(glUniformSubroutinesuiv, name); + GETPROC(glGetUniformSubroutineuiv, name); + GETPROC(glGetProgramStageiv, name); + GETPROC(glPatchParameteri, name); + GETPROC(glPatchParameterfv, name); + GETPROC(glBindTransformFeedback, name); + GETPROC(glDeleteTransformFeedbacks, name); + GETPROC(glGenTransformFeedbacks, name); + GETPROC(glIsTransformFeedback, name); + GETPROC(glPauseTransformFeedback, name); + GETPROC(glResumeTransformFeedback, name); + GETPROC(glDrawTransformFeedback, name); + GETPROC(glDrawTransformFeedbackStream, name); + GETPROC(glBeginQueryIndexed, name); + GETPROC(glEndQueryIndexed, name); + GETPROC(glGetQueryIndexediv, name); + GETPROC(glReleaseShaderCompiler, name); + GETPROC(glShaderBinary, name); + GETPROC(glGetShaderPrecisionFormat, name); + GETPROC(glDepthRangef, name); + GETPROC(glClearDepthf, name); + GETPROC(glGetProgramBinary, name); + GETPROC(glProgramBinary, name); + GETPROC(glProgramParameteri, name); + GETPROC(glUseProgramStages, name); + GETPROC(glActiveShaderProgram, name); + GETPROC(glCreateShaderProgramv, name); + GETPROC(glBindProgramPipeline, name); + GETPROC(glDeleteProgramPipelines, name); + GETPROC(glGenProgramPipelines, name); + GETPROC(glIsProgramPipeline, name); + GETPROC(glGetProgramPipelineiv, name); + GETPROC(glProgramUniform1i, name); + GETPROC(glProgramUniform1iv, name); + GETPROC(glProgramUniform1f, name); + GETPROC(glProgramUniform1fv, name); + GETPROC(glProgramUniform1d, name); + GETPROC(glProgramUniform1dv, name); + GETPROC(glProgramUniform1ui, name); + GETPROC(glProgramUniform1uiv, name); + GETPROC(glProgramUniform2i, name); + GETPROC(glProgramUniform2iv, name); + GETPROC(glProgramUniform2f, name); + GETPROC(glProgramUniform2fv, name); + GETPROC(glProgramUniform2d, name); + GETPROC(glProgramUniform2dv, name); + GETPROC(glProgramUniform2ui, name); + GETPROC(glProgramUniform2uiv, name); + GETPROC(glProgramUniform3i, name); + GETPROC(glProgramUniform3iv, name); + GETPROC(glProgramUniform3f, name); + GETPROC(glProgramUniform3fv, name); + GETPROC(glProgramUniform3d, name); + GETPROC(glProgramUniform3dv, name); + GETPROC(glProgramUniform3ui, name); + GETPROC(glProgramUniform3uiv, name); + GETPROC(glProgramUniform4i, name); + GETPROC(glProgramUniform4iv, name); + GETPROC(glProgramUniform4f, name); + GETPROC(glProgramUniform4fv, name); + GETPROC(glProgramUniform4d, name); + GETPROC(glProgramUniform4dv, name); + GETPROC(glProgramUniform4ui, name); + GETPROC(glProgramUniform4uiv, name); + GETPROC(glProgramUniformMatrix2fv, name); + GETPROC(glProgramUniformMatrix3fv, name); + GETPROC(glProgramUniformMatrix4fv, name); + GETPROC(glProgramUniformMatrix2dv, name); + GETPROC(glProgramUniformMatrix3dv, name); + GETPROC(glProgramUniformMatrix4dv, name); + GETPROC(glProgramUniformMatrix2x3fv, name); + GETPROC(glProgramUniformMatrix3x2fv, name); + GETPROC(glProgramUniformMatrix2x4fv, name); + GETPROC(glProgramUniformMatrix4x2fv, name); + GETPROC(glProgramUniformMatrix3x4fv, name); + GETPROC(glProgramUniformMatrix4x3fv, name); + GETPROC(glProgramUniformMatrix2x3dv, name); + GETPROC(glProgramUniformMatrix3x2dv, name); + GETPROC(glProgramUniformMatrix2x4dv, name); + GETPROC(glProgramUniformMatrix4x2dv, name); + GETPROC(glProgramUniformMatrix3x4dv, name); + GETPROC(glProgramUniformMatrix4x3dv, name); + GETPROC(glValidateProgramPipeline, name); + GETPROC(glGetProgramPipelineInfoLog, name); + GETPROC(glVertexAttribL1d, name); + GETPROC(glVertexAttribL2d, name); + GETPROC(glVertexAttribL3d, name); + GETPROC(glVertexAttribL4d, name); + GETPROC(glVertexAttribL1dv, name); + GETPROC(glVertexAttribL2dv, name); + GETPROC(glVertexAttribL3dv, name); + GETPROC(glVertexAttribL4dv, name); + GETPROC(glVertexAttribLPointer, name); + GETPROC(glGetVertexAttribLdv, name); + GETPROC(glViewportArrayv, name); + GETPROC(glViewportIndexedf, name); + GETPROC(glViewportIndexedfv, name); + GETPROC(glScissorArrayv, name); + GETPROC(glScissorIndexed, name); + GETPROC(glScissorIndexedv, name); + GETPROC(glDepthRangeArrayv, name); + GETPROC(glDepthRangeIndexed, name); + GETPROC(glGetFloati_v, name); + GETPROC(glGetDoublei_v, name); + GETPROC(glDrawArraysInstancedBaseInstance, name); + GETPROC(glDrawElementsInstancedBaseInstance, name); + GETPROC(glDrawElementsInstancedBaseVertexBaseInstance, name); + GETPROC(glGetInternalformativ, name); + GETPROC(glGetActiveAtomicCounterBufferiv, name); + GETPROC(glBindImageTexture, name); + GETPROC(glMemoryBarrier, name); + GETPROC(glTexStorage1D, name); + GETPROC(glTexStorage2D, name); + GETPROC(glTexStorage3D, name); + GETPROC(glDrawTransformFeedbackInstanced, name); + GETPROC(glDrawTransformFeedbackStreamInstanced, name); + GETPROC(glClearBufferData, name); + GETPROC(glClearBufferSubData, name); + GETPROC(glDispatchCompute, name); + GETPROC(glDispatchComputeIndirect, name); + GETPROC(glCopyImageSubData, name); + GETPROC(glFramebufferParameteri, name); + GETPROC(glGetFramebufferParameteriv, name); + GETPROC(glGetInternalformati64v, name); + GETPROC(glInvalidateTexSubImage, name); + GETPROC(glInvalidateTexImage, name); + GETPROC(glInvalidateBufferSubData, name); + GETPROC(glInvalidateBufferData, name); + GETPROC(glInvalidateFramebuffer, name); + GETPROC(glInvalidateSubFramebuffer, name); + GETPROC(glMultiDrawArraysIndirect, name); + GETPROC(glMultiDrawElementsIndirect, name); + GETPROC(glGetProgramInterfaceiv, name); + GETPROC(glGetProgramResourceIndex, name); + GETPROC(glGetProgramResourceName, name); + GETPROC(glGetProgramResourceiv, name); + GETPROC(glGetProgramResourceLocation, name); + GETPROC(glGetProgramResourceLocationIndex, name); + GETPROC(glShaderStorageBlockBinding, name); + GETPROC(glTexBufferRange, name); + GETPROC(glTexStorage2DMultisample, name); + GETPROC(glTexStorage3DMultisample, name); + GETPROC(glTextureView, name); + GETPROC(glBindVertexBuffer, name); + GETPROC(glVertexAttribFormat, name); + GETPROC(glVertexAttribIFormat, name); + GETPROC(glVertexAttribLFormat, name); + GETPROC(glVertexAttribBinding, name); + GETPROC(glVertexBindingDivisor, name); + GETPROC(glDebugMessageControl, name); + GETPROC(glDebugMessageInsert, name); + GETPROC(glDebugMessageCallback, name); + GETPROC(glGetDebugMessageLog, name); + GETPROC(glPushDebugGroup, name); + GETPROC(glPopDebugGroup, name); + GETPROC(glObjectLabel, name); + GETPROC(glGetObjectLabel, name); + GETPROC(glObjectPtrLabel, name); + GETPROC(glGetObjectPtrLabel, name); + GETPROC(glBufferStorage, name); + GETPROC(glClearTexImage, name); + GETPROC(glClearTexSubImage, name); + GETPROC(glBindBuffersBase, name); + GETPROC(glBindBuffersRange, name); + GETPROC(glBindTextures, name); + GETPROC(glBindSamplers, name); + GETPROC(glBindImageTextures, name); + GETPROC(glBindVertexBuffers, name); + GETPROC(glClipControl, name); + GETPROC(glCreateTransformFeedbacks, name); + GETPROC(glTransformFeedbackBufferBase, name); + GETPROC(glTransformFeedbackBufferRange, name); + GETPROC(glGetTransformFeedbackiv, name); + GETPROC(glGetTransformFeedbacki_v, name); + GETPROC(glGetTransformFeedbacki64_v, name); + GETPROC(glCreateBuffers, name); + GETPROC(glNamedBufferStorage, name); + GETPROC(glNamedBufferData, name); + GETPROC(glNamedBufferSubData, name); + GETPROC(glCopyNamedBufferSubData, name); + GETPROC(glClearNamedBufferData, name); + GETPROC(glClearNamedBufferSubData, name); + GETPROC(glMapNamedBuffer, name); + GETPROC(glMapNamedBufferRange, name); + GETPROC(glUnmapNamedBuffer, name); + GETPROC(glFlushMappedNamedBufferRange, name); + GETPROC(glGetNamedBufferParameteriv, name); + GETPROC(glGetNamedBufferParameteri64v, name); + GETPROC(glGetNamedBufferPointerv, name); + GETPROC(glGetNamedBufferSubData, name); + GETPROC(glCreateFramebuffers, name); + GETPROC(glNamedFramebufferRenderbuffer, name); + GETPROC(glNamedFramebufferParameteri, name); + GETPROC(glNamedFramebufferTexture, name); + GETPROC(glNamedFramebufferTextureLayer, name); + GETPROC(glNamedFramebufferDrawBuffer, name); + GETPROC(glNamedFramebufferDrawBuffers, name); + GETPROC(glNamedFramebufferReadBuffer, name); + GETPROC(glInvalidateNamedFramebufferData, name); + GETPROC(glInvalidateNamedFramebufferSubData, name); + GETPROC(glClearNamedFramebufferiv, name); + GETPROC(glClearNamedFramebufferuiv, name); + GETPROC(glClearNamedFramebufferfv, name); + GETPROC(glClearNamedFramebufferfi, name); + GETPROC(glBlitNamedFramebuffer, name); + GETPROC(glCheckNamedFramebufferStatus, name); + GETPROC(glGetNamedFramebufferParameteriv, name); + GETPROC(glGetNamedFramebufferAttachmentParameteriv, name); + GETPROC(glCreateRenderbuffers, name); + GETPROC(glNamedRenderbufferStorage, name); + GETPROC(glNamedRenderbufferStorageMultisample, name); + GETPROC(glGetNamedRenderbufferParameteriv, name); + GETPROC(glCreateTextures, name); + GETPROC(glTextureBuffer, name); + GETPROC(glTextureBufferRange, name); + GETPROC(glTextureStorage1D, name); + GETPROC(glTextureStorage2D, name); + GETPROC(glTextureStorage3D, name); + GETPROC(glTextureStorage2DMultisample, name); + GETPROC(glTextureStorage3DMultisample, name); + GETPROC(glTextureSubImage1D, name); + GETPROC(glTextureSubImage2D, name); + GETPROC(glTextureSubImage3D, name); + GETPROC(glCompressedTextureSubImage1D, name); + GETPROC(glCompressedTextureSubImage2D, name); + GETPROC(glCompressedTextureSubImage3D, name); + GETPROC(glCopyTextureSubImage1D, name); + GETPROC(glCopyTextureSubImage2D, name); + GETPROC(glCopyTextureSubImage3D, name); + GETPROC(glTextureParameterf, name); + GETPROC(glTextureParameterfv, name); + GETPROC(glTextureParameteri, name); + GETPROC(glTextureParameterIiv, name); + GETPROC(glTextureParameterIuiv, name); + GETPROC(glTextureParameteriv, name); + GETPROC(glGenerateTextureMipmap, name); + GETPROC(glBindTextureUnit, name); + GETPROC(glGetTextureImage, name); + GETPROC(glGetCompressedTextureImage, name); + GETPROC(glGetTextureLevelParameterfv, name); + GETPROC(glGetTextureLevelParameteriv, name); + GETPROC(glGetTextureParameterfv, name); + GETPROC(glGetTextureParameterIiv, name); + GETPROC(glGetTextureParameterIuiv, name); + GETPROC(glGetTextureParameteriv, name); + GETPROC(glCreateVertexArrays, name); + GETPROC(glDisableVertexArrayAttrib, name); + GETPROC(glEnableVertexArrayAttrib, name); + GETPROC(glVertexArrayElementBuffer, name); + GETPROC(glVertexArrayVertexBuffer, name); + GETPROC(glVertexArrayVertexBuffers, name); + GETPROC(glVertexArrayAttribBinding, name); + GETPROC(glVertexArrayAttribFormat, name); + GETPROC(glVertexArrayAttribIFormat, name); + GETPROC(glVertexArrayAttribLFormat, name); + GETPROC(glVertexArrayBindingDivisor, name); + GETPROC(glGetVertexArrayiv, name); + GETPROC(glGetVertexArrayIndexediv, name); + GETPROC(glGetVertexArrayIndexed64iv, name); + GETPROC(glCreateSamplers, name); + GETPROC(glCreateProgramPipelines, name); + GETPROC(glCreateQueries, name); + GETPROC(glGetQueryBufferObjecti64v, name); + GETPROC(glGetQueryBufferObjectiv, name); + GETPROC(glGetQueryBufferObjectui64v, name); + GETPROC(glGetQueryBufferObjectuiv, name); + GETPROC(glMemoryBarrierByRegion, name); + GETPROC(glGetTextureSubImage, name); + GETPROC(glGetCompressedTextureSubImage, name); + GETPROC(glGetGraphicsResetStatus, name); + GETPROC(glGetnCompressedTexImage, name); + GETPROC(glGetnTexImage, name); + GETPROC(glGetnUniformdv, name); + GETPROC(glGetnUniformfv, name); + GETPROC(glGetnUniformiv, name); + GETPROC(glGetnUniformuiv, name); + GETPROC(glReadnPixels, name); + GETPROC(glTextureBarrier, name); + GETPROC(glSpecializeShader, name); + GETPROC(glMultiDrawArraysIndirectCount, name); + GETPROC(glMultiDrawElementsIndirectCount, name); + GETPROC(glPolygonOffsetClamp, name); + GETPROC(glPrimitiveBoundingBoxARB, name); + GETPROC(glGetTextureHandleARB, name); + GETPROC(glGetTextureSamplerHandleARB, name); + GETPROC(glMakeTextureHandleResidentARB, name); + GETPROC(glMakeTextureHandleNonResidentARB, name); + GETPROC(glGetImageHandleARB, name); + GETPROC(glMakeImageHandleResidentARB, name); + GETPROC(glMakeImageHandleNonResidentARB, name); + GETPROC(glUniformHandleui64ARB, name); + GETPROC(glUniformHandleui64vARB, name); + GETPROC(glProgramUniformHandleui64ARB, name); + GETPROC(glProgramUniformHandleui64vARB, name); + GETPROC(glIsTextureHandleResidentARB, name); + GETPROC(glIsImageHandleResidentARB, name); + GETPROC(glVertexAttribL1ui64ARB, name); + GETPROC(glVertexAttribL1ui64vARB, name); + GETPROC(glGetVertexAttribLui64vARB, name); + GETPROC(glCreateSyncFromCLeventARB, name); + GETPROC(glDispatchComputeGroupSizeARB, name); + GETPROC(glDebugMessageControlARB, name); + GETPROC(glDebugMessageInsertARB, name); + GETPROC(glDebugMessageCallbackARB, name); + GETPROC(glGetDebugMessageLogARB, name); + GETPROC(glBlendEquationiARB, name); + GETPROC(glBlendEquationSeparateiARB, name); + GETPROC(glBlendFunciARB, name); + GETPROC(glBlendFuncSeparateiARB, name); + GETPROC(glDrawArraysInstancedARB, name); + GETPROC(glDrawElementsInstancedARB, name); + GETPROC(glProgramParameteriARB, name); + GETPROC(glFramebufferTextureARB, name); + GETPROC(glFramebufferTextureLayerARB, name); + GETPROC(glFramebufferTextureFaceARB, name); + GETPROC(glSpecializeShaderARB, name); + GETPROC(glUniform1i64ARB, name); + GETPROC(glUniform2i64ARB, name); + GETPROC(glUniform3i64ARB, name); + GETPROC(glUniform4i64ARB, name); + GETPROC(glUniform1i64vARB, name); + GETPROC(glUniform2i64vARB, name); + GETPROC(glUniform3i64vARB, name); + GETPROC(glUniform4i64vARB, name); + GETPROC(glUniform1ui64ARB, name); + GETPROC(glUniform2ui64ARB, name); + GETPROC(glUniform3ui64ARB, name); + GETPROC(glUniform4ui64ARB, name); + GETPROC(glUniform1ui64vARB, name); + GETPROC(glUniform2ui64vARB, name); + GETPROC(glUniform3ui64vARB, name); + GETPROC(glUniform4ui64vARB, name); + GETPROC(glGetUniformi64vARB, name); + GETPROC(glGetUniformui64vARB, name); + GETPROC(glGetnUniformi64vARB, name); + GETPROC(glGetnUniformui64vARB, name); + GETPROC(glProgramUniform1i64ARB, name); + GETPROC(glProgramUniform2i64ARB, name); + GETPROC(glProgramUniform3i64ARB, name); + GETPROC(glProgramUniform4i64ARB, name); + GETPROC(glProgramUniform1i64vARB, name); + GETPROC(glProgramUniform2i64vARB, name); + GETPROC(glProgramUniform3i64vARB, name); + GETPROC(glProgramUniform4i64vARB, name); + GETPROC(glProgramUniform1ui64ARB, name); + GETPROC(glProgramUniform2ui64ARB, name); + GETPROC(glProgramUniform3ui64ARB, name); + GETPROC(glProgramUniform4ui64ARB, name); + GETPROC(glProgramUniform1ui64vARB, name); + GETPROC(glProgramUniform2ui64vARB, name); + GETPROC(glProgramUniform3ui64vARB, name); + GETPROC(glProgramUniform4ui64vARB, name); + GETPROC(glMultiDrawArraysIndirectCountARB, name); + GETPROC(glMultiDrawElementsIndirectCountARB, name); + GETPROC(glVertexAttribDivisorARB, name); + GETPROC(glMaxShaderCompilerThreadsARB, name); + GETPROC(glGetGraphicsResetStatusARB, name); + GETPROC(glGetnTexImageARB, name); + GETPROC(glReadnPixelsARB, name); + GETPROC(glGetnCompressedTexImageARB, name); + GETPROC(glGetnUniformfvARB, name); + GETPROC(glGetnUniformivARB, name); + GETPROC(glGetnUniformuivARB, name); + GETPROC(glGetnUniformdvARB, name); + GETPROC(glFramebufferSampleLocationsfvARB, name); + GETPROC(glNamedFramebufferSampleLocationsfvARB, name); + GETPROC(glEvaluateDepthValuesARB, name); + GETPROC(glMinSampleShadingARB, name); + GETPROC(glNamedStringARB, name); + GETPROC(glDeleteNamedStringARB, name); + GETPROC(glCompileShaderIncludeARB, name); + GETPROC(glIsNamedStringARB, name); + GETPROC(glGetNamedStringARB, name); + GETPROC(glGetNamedStringivARB, name); + GETPROC(glBufferPageCommitmentARB, name); + GETPROC(glNamedBufferPageCommitmentEXT, name); + GETPROC(glNamedBufferPageCommitmentARB, name); + GETPROC(glTexPageCommitmentARB, name); + GETPROC(glTexBufferARB, name); + GETPROC(glDepthRangeArraydvNV, name); + GETPROC(glDepthRangeIndexeddNV, name); + GETPROC(glBlendBarrierKHR, name); + GETPROC(glMaxShaderCompilerThreadsKHR, name); + GETPROC(glRenderbufferStorageMultisampleAdvancedAMD, name); + GETPROC(glNamedRenderbufferStorageMultisampleAdvancedAMD, name); + GETPROC(glGetPerfMonitorGroupsAMD, name); + GETPROC(glGetPerfMonitorCountersAMD, name); + GETPROC(glGetPerfMonitorGroupStringAMD, name); + GETPROC(glGetPerfMonitorCounterStringAMD, name); + GETPROC(glGetPerfMonitorCounterInfoAMD, name); + GETPROC(glGenPerfMonitorsAMD, name); + GETPROC(glDeletePerfMonitorsAMD, name); + GETPROC(glSelectPerfMonitorCountersAMD, name); + GETPROC(glBeginPerfMonitorAMD, name); + GETPROC(glEndPerfMonitorAMD, name); + GETPROC(glGetPerfMonitorCounterDataAMD, name); + GETPROC(glEGLImageTargetTexStorageEXT, name); + GETPROC(glEGLImageTargetTextureStorageEXT, name); + GETPROC(glLabelObjectEXT, name); + GETPROC(glGetObjectLabelEXT, name); + GETPROC(glInsertEventMarkerEXT, name); + GETPROC(glPushGroupMarkerEXT, name); + GETPROC(glPopGroupMarkerEXT, name); + GETPROC(glMatrixLoadfEXT, name); + GETPROC(glMatrixLoaddEXT, name); + GETPROC(glMatrixMultfEXT, name); + GETPROC(glMatrixMultdEXT, name); + GETPROC(glMatrixLoadIdentityEXT, name); + GETPROC(glMatrixRotatefEXT, name); + GETPROC(glMatrixRotatedEXT, name); + GETPROC(glMatrixScalefEXT, name); + GETPROC(glMatrixScaledEXT, name); + GETPROC(glMatrixTranslatefEXT, name); + GETPROC(glMatrixTranslatedEXT, name); + GETPROC(glMatrixFrustumEXT, name); + GETPROC(glMatrixOrthoEXT, name); + GETPROC(glMatrixPopEXT, name); + GETPROC(glMatrixPushEXT, name); + GETPROC(glClientAttribDefaultEXT, name); + GETPROC(glPushClientAttribDefaultEXT, name); + GETPROC(glTextureParameterfEXT, name); + GETPROC(glTextureParameterfvEXT, name); + GETPROC(glTextureParameteriEXT, name); + GETPROC(glTextureParameterivEXT, name); + GETPROC(glTextureImage1DEXT, name); + GETPROC(glTextureImage2DEXT, name); + GETPROC(glTextureSubImage1DEXT, name); + GETPROC(glTextureSubImage2DEXT, name); + GETPROC(glCopyTextureImage1DEXT, name); + GETPROC(glCopyTextureImage2DEXT, name); + GETPROC(glCopyTextureSubImage1DEXT, name); + GETPROC(glCopyTextureSubImage2DEXT, name); + GETPROC(glGetTextureImageEXT, name); + GETPROC(glGetTextureParameterfvEXT, name); + GETPROC(glGetTextureParameterivEXT, name); + GETPROC(glGetTextureLevelParameterfvEXT, name); + GETPROC(glGetTextureLevelParameterivEXT, name); + GETPROC(glTextureImage3DEXT, name); + GETPROC(glTextureSubImage3DEXT, name); + GETPROC(glCopyTextureSubImage3DEXT, name); + GETPROC(glBindMultiTextureEXT, name); + GETPROC(glMultiTexCoordPointerEXT, name); + GETPROC(glMultiTexEnvfEXT, name); + GETPROC(glMultiTexEnvfvEXT, name); + GETPROC(glMultiTexEnviEXT, name); + GETPROC(glMultiTexEnvivEXT, name); + GETPROC(glMultiTexGendEXT, name); + GETPROC(glMultiTexGendvEXT, name); + GETPROC(glMultiTexGenfEXT, name); + GETPROC(glMultiTexGenfvEXT, name); + GETPROC(glMultiTexGeniEXT, name); + GETPROC(glMultiTexGenivEXT, name); + GETPROC(glGetMultiTexEnvfvEXT, name); + GETPROC(glGetMultiTexEnvivEXT, name); + GETPROC(glGetMultiTexGendvEXT, name); + GETPROC(glGetMultiTexGenfvEXT, name); + GETPROC(glGetMultiTexGenivEXT, name); + GETPROC(glMultiTexParameteriEXT, name); + GETPROC(glMultiTexParameterivEXT, name); + GETPROC(glMultiTexParameterfEXT, name); + GETPROC(glMultiTexParameterfvEXT, name); + GETPROC(glMultiTexImage1DEXT, name); + GETPROC(glMultiTexImage2DEXT, name); + GETPROC(glMultiTexSubImage1DEXT, name); + GETPROC(glMultiTexSubImage2DEXT, name); + GETPROC(glCopyMultiTexImage1DEXT, name); + GETPROC(glCopyMultiTexImage2DEXT, name); + GETPROC(glCopyMultiTexSubImage1DEXT, name); + GETPROC(glCopyMultiTexSubImage2DEXT, name); + GETPROC(glGetMultiTexImageEXT, name); + GETPROC(glGetMultiTexParameterfvEXT, name); + GETPROC(glGetMultiTexParameterivEXT, name); + GETPROC(glGetMultiTexLevelParameterfvEXT, name); + GETPROC(glGetMultiTexLevelParameterivEXT, name); + GETPROC(glMultiTexImage3DEXT, name); + GETPROC(glMultiTexSubImage3DEXT, name); + GETPROC(glCopyMultiTexSubImage3DEXT, name); + GETPROC(glEnableClientStateIndexedEXT, name); + GETPROC(glDisableClientStateIndexedEXT, name); + GETPROC(glGetFloatIndexedvEXT, name); + GETPROC(glGetDoubleIndexedvEXT, name); + GETPROC(glGetPointerIndexedvEXT, name); + GETPROC(glEnableIndexedEXT, name); + GETPROC(glDisableIndexedEXT, name); + GETPROC(glIsEnabledIndexedEXT, name); + GETPROC(glGetIntegerIndexedvEXT, name); + GETPROC(glGetBooleanIndexedvEXT, name); + GETPROC(glCompressedTextureImage3DEXT, name); + GETPROC(glCompressedTextureImage2DEXT, name); + GETPROC(glCompressedTextureImage1DEXT, name); + GETPROC(glCompressedTextureSubImage3DEXT, name); + GETPROC(glCompressedTextureSubImage2DEXT, name); + GETPROC(glCompressedTextureSubImage1DEXT, name); + GETPROC(glGetCompressedTextureImageEXT, name); + GETPROC(glCompressedMultiTexImage3DEXT, name); + GETPROC(glCompressedMultiTexImage2DEXT, name); + GETPROC(glCompressedMultiTexImage1DEXT, name); + GETPROC(glCompressedMultiTexSubImage3DEXT, name); + GETPROC(glCompressedMultiTexSubImage2DEXT, name); + GETPROC(glCompressedMultiTexSubImage1DEXT, name); + GETPROC(glGetCompressedMultiTexImageEXT, name); + GETPROC(glMatrixLoadTransposefEXT, name); + GETPROC(glMatrixLoadTransposedEXT, name); + GETPROC(glMatrixMultTransposefEXT, name); + GETPROC(glMatrixMultTransposedEXT, name); + GETPROC(glNamedBufferDataEXT, name); + GETPROC(glNamedBufferSubDataEXT, name); + GETPROC(glMapNamedBufferEXT, name); + GETPROC(glUnmapNamedBufferEXT, name); + GETPROC(glGetNamedBufferParameterivEXT, name); + GETPROC(glGetNamedBufferPointervEXT, name); + GETPROC(glGetNamedBufferSubDataEXT, name); + GETPROC(glProgramUniform1fEXT, name); + GETPROC(glProgramUniform2fEXT, name); + GETPROC(glProgramUniform3fEXT, name); + GETPROC(glProgramUniform4fEXT, name); + GETPROC(glProgramUniform1iEXT, name); + GETPROC(glProgramUniform2iEXT, name); + GETPROC(glProgramUniform3iEXT, name); + GETPROC(glProgramUniform4iEXT, name); + GETPROC(glProgramUniform1fvEXT, name); + GETPROC(glProgramUniform2fvEXT, name); + GETPROC(glProgramUniform3fvEXT, name); + GETPROC(glProgramUniform4fvEXT, name); + GETPROC(glProgramUniform1ivEXT, name); + GETPROC(glProgramUniform2ivEXT, name); + GETPROC(glProgramUniform3ivEXT, name); + GETPROC(glProgramUniform4ivEXT, name); + GETPROC(glProgramUniformMatrix2fvEXT, name); + GETPROC(glProgramUniformMatrix3fvEXT, name); + GETPROC(glProgramUniformMatrix4fvEXT, name); + GETPROC(glProgramUniformMatrix2x3fvEXT, name); + GETPROC(glProgramUniformMatrix3x2fvEXT, name); + GETPROC(glProgramUniformMatrix2x4fvEXT, name); + GETPROC(glProgramUniformMatrix4x2fvEXT, name); + GETPROC(glProgramUniformMatrix3x4fvEXT, name); + GETPROC(glProgramUniformMatrix4x3fvEXT, name); + GETPROC(glTextureBufferEXT, name); + GETPROC(glMultiTexBufferEXT, name); + GETPROC(glTextureParameterIivEXT, name); + GETPROC(glTextureParameterIuivEXT, name); + GETPROC(glGetTextureParameterIivEXT, name); + GETPROC(glGetTextureParameterIuivEXT, name); + GETPROC(glMultiTexParameterIivEXT, name); + GETPROC(glMultiTexParameterIuivEXT, name); + GETPROC(glGetMultiTexParameterIivEXT, name); + GETPROC(glGetMultiTexParameterIuivEXT, name); + GETPROC(glProgramUniform1uiEXT, name); + GETPROC(glProgramUniform2uiEXT, name); + GETPROC(glProgramUniform3uiEXT, name); + GETPROC(glProgramUniform4uiEXT, name); + GETPROC(glProgramUniform1uivEXT, name); + GETPROC(glProgramUniform2uivEXT, name); + GETPROC(glProgramUniform3uivEXT, name); + GETPROC(glProgramUniform4uivEXT, name); + GETPROC(glNamedProgramLocalParameters4fvEXT, name); + GETPROC(glNamedProgramLocalParameterI4iEXT, name); + GETPROC(glNamedProgramLocalParameterI4ivEXT, name); + GETPROC(glNamedProgramLocalParametersI4ivEXT, name); + GETPROC(glNamedProgramLocalParameterI4uiEXT, name); + GETPROC(glNamedProgramLocalParameterI4uivEXT, name); + GETPROC(glNamedProgramLocalParametersI4uivEXT, name); + GETPROC(glGetNamedProgramLocalParameterIivEXT, name); + GETPROC(glGetNamedProgramLocalParameterIuivEXT, name); + GETPROC(glEnableClientStateiEXT, name); + GETPROC(glDisableClientStateiEXT, name); + GETPROC(glGetFloati_vEXT, name); + GETPROC(glGetDoublei_vEXT, name); + GETPROC(glGetPointeri_vEXT, name); + GETPROC(glNamedProgramStringEXT, name); + GETPROC(glNamedProgramLocalParameter4dEXT, name); + GETPROC(glNamedProgramLocalParameter4dvEXT, name); + GETPROC(glNamedProgramLocalParameter4fEXT, name); + GETPROC(glNamedProgramLocalParameter4fvEXT, name); + GETPROC(glGetNamedProgramLocalParameterdvEXT, name); + GETPROC(glGetNamedProgramLocalParameterfvEXT, name); + GETPROC(glGetNamedProgramivEXT, name); + GETPROC(glGetNamedProgramStringEXT, name); + GETPROC(glNamedRenderbufferStorageEXT, name); + GETPROC(glGetNamedRenderbufferParameterivEXT, name); + GETPROC(glNamedRenderbufferStorageMultisampleEXT, name); + GETPROC(glNamedRenderbufferStorageMultisampleCoverageEXT, name); + GETPROC(glCheckNamedFramebufferStatusEXT, name); + GETPROC(glNamedFramebufferTexture1DEXT, name); + GETPROC(glNamedFramebufferTexture2DEXT, name); + GETPROC(glNamedFramebufferTexture3DEXT, name); + GETPROC(glNamedFramebufferRenderbufferEXT, name); + GETPROC(glGetNamedFramebufferAttachmentParameterivEXT, name); + GETPROC(glGenerateTextureMipmapEXT, name); + GETPROC(glGenerateMultiTexMipmapEXT, name); + GETPROC(glFramebufferDrawBufferEXT, name); + GETPROC(glFramebufferDrawBuffersEXT, name); + GETPROC(glFramebufferReadBufferEXT, name); + GETPROC(glGetFramebufferParameterivEXT, name); + GETPROC(glNamedCopyBufferSubDataEXT, name); + GETPROC(glNamedFramebufferTextureEXT, name); + GETPROC(glNamedFramebufferTextureLayerEXT, name); + GETPROC(glNamedFramebufferTextureFaceEXT, name); + GETPROC(glTextureRenderbufferEXT, name); + GETPROC(glMultiTexRenderbufferEXT, name); + GETPROC(glVertexArrayVertexOffsetEXT, name); + GETPROC(glVertexArrayColorOffsetEXT, name); + GETPROC(glVertexArrayEdgeFlagOffsetEXT, name); + GETPROC(glVertexArrayIndexOffsetEXT, name); + GETPROC(glVertexArrayNormalOffsetEXT, name); + GETPROC(glVertexArrayTexCoordOffsetEXT, name); + GETPROC(glVertexArrayMultiTexCoordOffsetEXT, name); + GETPROC(glVertexArrayFogCoordOffsetEXT, name); + GETPROC(glVertexArraySecondaryColorOffsetEXT, name); + GETPROC(glVertexArrayVertexAttribOffsetEXT, name); + GETPROC(glVertexArrayVertexAttribIOffsetEXT, name); + GETPROC(glEnableVertexArrayEXT, name); + GETPROC(glDisableVertexArrayEXT, name); + GETPROC(glEnableVertexArrayAttribEXT, name); + GETPROC(glDisableVertexArrayAttribEXT, name); + GETPROC(glGetVertexArrayIntegervEXT, name); + GETPROC(glGetVertexArrayPointervEXT, name); + GETPROC(glGetVertexArrayIntegeri_vEXT, name); + GETPROC(glGetVertexArrayPointeri_vEXT, name); + GETPROC(glMapNamedBufferRangeEXT, name); + GETPROC(glFlushMappedNamedBufferRangeEXT, name); + GETPROC(glNamedBufferStorageEXT, name); + GETPROC(glClearNamedBufferDataEXT, name); + GETPROC(glClearNamedBufferSubDataEXT, name); + GETPROC(glNamedFramebufferParameteriEXT, name); + GETPROC(glGetNamedFramebufferParameterivEXT, name); + GETPROC(glProgramUniform1dEXT, name); + GETPROC(glProgramUniform2dEXT, name); + GETPROC(glProgramUniform3dEXT, name); + GETPROC(glProgramUniform4dEXT, name); + GETPROC(glProgramUniform1dvEXT, name); + GETPROC(glProgramUniform2dvEXT, name); + GETPROC(glProgramUniform3dvEXT, name); + GETPROC(glProgramUniform4dvEXT, name); + GETPROC(glProgramUniformMatrix2dvEXT, name); + GETPROC(glProgramUniformMatrix3dvEXT, name); + GETPROC(glProgramUniformMatrix4dvEXT, name); + GETPROC(glProgramUniformMatrix2x3dvEXT, name); + GETPROC(glProgramUniformMatrix2x4dvEXT, name); + GETPROC(glProgramUniformMatrix3x2dvEXT, name); + GETPROC(glProgramUniformMatrix3x4dvEXT, name); + GETPROC(glProgramUniformMatrix4x2dvEXT, name); + GETPROC(glProgramUniformMatrix4x3dvEXT, name); + GETPROC(glTextureBufferRangeEXT, name); + GETPROC(glTextureStorage1DEXT, name); + GETPROC(glTextureStorage2DEXT, name); + GETPROC(glTextureStorage3DEXT, name); + GETPROC(glTextureStorage2DMultisampleEXT, name); + GETPROC(glTextureStorage3DMultisampleEXT, name); + GETPROC(glVertexArrayBindVertexBufferEXT, name); + GETPROC(glVertexArrayVertexAttribFormatEXT, name); + GETPROC(glVertexArrayVertexAttribIFormatEXT, name); + GETPROC(glVertexArrayVertexAttribLFormatEXT, name); + GETPROC(glVertexArrayVertexAttribBindingEXT, name); + GETPROC(glVertexArrayVertexBindingDivisorEXT, name); + GETPROC(glVertexArrayVertexAttribLOffsetEXT, name); + GETPROC(glTexturePageCommitmentEXT, name); + GETPROC(glVertexArrayVertexAttribDivisorEXT, name); + GETPROC(glDrawArraysInstancedEXT, name); + GETPROC(glDrawElementsInstancedEXT, name); + // GETPROC(glGetFragmentShadingRatesEXT, name); + // GETPROC(glShadingRateEXT, name); + // GETPROC(glShadingRateCombinerOpsEXT, name); + // GETPROC(glFramebufferShadingRateEXT, name); + // GETPROC(glDrawMeshTasksEXT, name); + // GETPROC(glDrawMeshTasksIndirectEXT, name); + // GETPROC(glMultiDrawMeshTasksIndirectEXT, name); + // GETPROC(glMultiDrawMeshTasksIndirectCountEXT, name); + GETPROC(glPolygonOffsetClampEXT, name); + GETPROC(glRasterSamplesEXT, name); + GETPROC(glUseShaderProgramEXT, name); + GETPROC(glActiveProgramEXT, name); + GETPROC(glCreateShaderProgramEXT, name); + GETPROC(glFramebufferFetchBarrierEXT, name); + GETPROC(glTexStorage1DEXT, name); + GETPROC(glTexStorage2DEXT, name); + GETPROC(glTexStorage3DEXT, name); + GETPROC(glWindowRectanglesEXT, name); + GETPROC(glApplyFramebufferAttachmentCMAAINTEL, name); + GETPROC(glBeginPerfQueryINTEL, name); + GETPROC(glCreatePerfQueryINTEL, name); + GETPROC(glDeletePerfQueryINTEL, name); + GETPROC(glEndPerfQueryINTEL, name); + GETPROC(glGetFirstPerfQueryIdINTEL, name); + GETPROC(glGetNextPerfQueryIdINTEL, name); + GETPROC(glGetPerfCounterInfoINTEL, name); + GETPROC(glGetPerfQueryDataINTEL, name); + GETPROC(glGetPerfQueryIdByNameINTEL, name); + GETPROC(glGetPerfQueryInfoINTEL, name); + GETPROC(glFramebufferParameteriMESA, name); + GETPROC(glGetFramebufferParameterivMESA, name); + GETPROC(glMultiDrawArraysIndirectBindlessNV, name); + GETPROC(glMultiDrawElementsIndirectBindlessNV, name); + GETPROC(glMultiDrawArraysIndirectBindlessCountNV, name); + GETPROC(glMultiDrawElementsIndirectBindlessCountNV, name); + GETPROC(glGetTextureHandleNV, name); + GETPROC(glGetTextureSamplerHandleNV, name); + GETPROC(glMakeTextureHandleResidentNV, name); + GETPROC(glMakeTextureHandleNonResidentNV, name); + GETPROC(glGetImageHandleNV, name); + GETPROC(glMakeImageHandleResidentNV, name); + GETPROC(glMakeImageHandleNonResidentNV, name); + GETPROC(glUniformHandleui64NV, name); + GETPROC(glUniformHandleui64vNV, name); + GETPROC(glProgramUniformHandleui64NV, name); + GETPROC(glProgramUniformHandleui64vNV, name); + GETPROC(glIsTextureHandleResidentNV, name); + GETPROC(glIsImageHandleResidentNV, name); + GETPROC(glBlendParameteriNV, name); + GETPROC(glBlendBarrierNV, name); + GETPROC(glViewportPositionWScaleNV, name); + GETPROC(glCreateStatesNV, name); + GETPROC(glDeleteStatesNV, name); + GETPROC(glIsStateNV, name); + GETPROC(glStateCaptureNV, name); + GETPROC(glGetCommandHeaderNV, name); + GETPROC(glGetStageIndexNV, name); + GETPROC(glDrawCommandsNV, name); + GETPROC(glDrawCommandsAddressNV, name); + GETPROC(glDrawCommandsStatesNV, name); + GETPROC(glDrawCommandsStatesAddressNV, name); + GETPROC(glCreateCommandListsNV, name); + GETPROC(glDeleteCommandListsNV, name); + GETPROC(glIsCommandListNV, name); + GETPROC(glListDrawCommandsStatesClientNV, name); + GETPROC(glCommandListSegmentsNV, name); + GETPROC(glCompileCommandListNV, name); + GETPROC(glCallCommandListNV, name); + GETPROC(glBeginConditionalRenderNV, name); + GETPROC(glEndConditionalRenderNV, name); + GETPROC(glSubpixelPrecisionBiasNV, name); + GETPROC(glConservativeRasterParameterfNV, name); + GETPROC(glConservativeRasterParameteriNV, name); + GETPROC(glDepthRangedNV, name); + GETPROC(glClearDepthdNV, name); + GETPROC(glDepthBoundsdNV, name); + GETPROC(glDrawVkImageNV, name); + GETPROC(glGetVkProcAddrNV, name); + GETPROC(glWaitVkSemaphoreNV, name); + GETPROC(glSignalVkSemaphoreNV, name); + GETPROC(glSignalVkFenceNV, name); + GETPROC(glFragmentCoverageColorNV, name); + GETPROC(glCoverageModulationTableNV, name); + GETPROC(glGetCoverageModulationTableNV, name); + GETPROC(glCoverageModulationNV, name); + GETPROC(glRenderbufferStorageMultisampleCoverageNV, name); + GETPROC(glUniform1i64NV, name); + GETPROC(glUniform2i64NV, name); + GETPROC(glUniform3i64NV, name); + GETPROC(glUniform4i64NV, name); + GETPROC(glUniform1i64vNV, name); + GETPROC(glUniform2i64vNV, name); + GETPROC(glUniform3i64vNV, name); + GETPROC(glUniform4i64vNV, name); + GETPROC(glUniform1ui64NV, name); + GETPROC(glUniform2ui64NV, name); + GETPROC(glUniform3ui64NV, name); + GETPROC(glUniform4ui64NV, name); + GETPROC(glUniform1ui64vNV, name); + GETPROC(glUniform2ui64vNV, name); + GETPROC(glUniform3ui64vNV, name); + GETPROC(glUniform4ui64vNV, name); + GETPROC(glGetUniformi64vNV, name); + GETPROC(glProgramUniform1i64NV, name); + GETPROC(glProgramUniform2i64NV, name); + GETPROC(glProgramUniform3i64NV, name); + GETPROC(glProgramUniform4i64NV, name); + GETPROC(glProgramUniform1i64vNV, name); + GETPROC(glProgramUniform2i64vNV, name); + GETPROC(glProgramUniform3i64vNV, name); + GETPROC(glProgramUniform4i64vNV, name); + GETPROC(glProgramUniform1ui64NV, name); + GETPROC(glProgramUniform2ui64NV, name); + GETPROC(glProgramUniform3ui64NV, name); + GETPROC(glProgramUniform4ui64NV, name); + GETPROC(glProgramUniform1ui64vNV, name); + GETPROC(glProgramUniform2ui64vNV, name); + GETPROC(glProgramUniform3ui64vNV, name); + GETPROC(glProgramUniform4ui64vNV, name); + GETPROC(glGetInternalformatSampleivNV, name); + GETPROC(glGetMemoryObjectDetachedResourcesuivNV, name); + GETPROC(glResetMemoryObjectParameterNV, name); + GETPROC(glTexAttachMemoryNV, name); + GETPROC(glBufferAttachMemoryNV, name); + GETPROC(glTextureAttachMemoryNV, name); + GETPROC(glNamedBufferAttachMemoryNV, name); + GETPROC(glBufferPageCommitmentMemNV, name); + GETPROC(glTexPageCommitmentMemNV, name); + GETPROC(glNamedBufferPageCommitmentMemNV, name); + GETPROC(glTexturePageCommitmentMemNV, name); + GETPROC(glDrawMeshTasksNV, name); + GETPROC(glDrawMeshTasksIndirectNV, name); + GETPROC(glMultiDrawMeshTasksIndirectNV, name); + GETPROC(glMultiDrawMeshTasksIndirectCountNV, name); + GETPROC(glGenPathsNV, name); + GETPROC(glDeletePathsNV, name); + GETPROC(glIsPathNV, name); + GETPROC(glPathCommandsNV, name); + GETPROC(glPathCoordsNV, name); + GETPROC(glPathSubCommandsNV, name); + GETPROC(glPathSubCoordsNV, name); + GETPROC(glPathStringNV, name); + GETPROC(glPathGlyphsNV, name); + GETPROC(glPathGlyphRangeNV, name); + GETPROC(glWeightPathsNV, name); + GETPROC(glCopyPathNV, name); + GETPROC(glInterpolatePathsNV, name); + GETPROC(glTransformPathNV, name); + GETPROC(glPathParameterivNV, name); + GETPROC(glPathParameteriNV, name); + GETPROC(glPathParameterfvNV, name); + GETPROC(glPathParameterfNV, name); + GETPROC(glPathDashArrayNV, name); + GETPROC(glPathStencilFuncNV, name); + GETPROC(glPathStencilDepthOffsetNV, name); + GETPROC(glStencilFillPathNV, name); + GETPROC(glStencilStrokePathNV, name); + GETPROC(glStencilFillPathInstancedNV, name); + GETPROC(glStencilStrokePathInstancedNV, name); + GETPROC(glPathCoverDepthFuncNV, name); + GETPROC(glCoverFillPathNV, name); + GETPROC(glCoverStrokePathNV, name); + GETPROC(glCoverFillPathInstancedNV, name); + GETPROC(glCoverStrokePathInstancedNV, name); + GETPROC(glGetPathParameterivNV, name); + GETPROC(glGetPathParameterfvNV, name); + GETPROC(glGetPathCommandsNV, name); + GETPROC(glGetPathCoordsNV, name); + GETPROC(glGetPathDashArrayNV, name); + GETPROC(glGetPathMetricsNV, name); + GETPROC(glGetPathMetricRangeNV, name); + GETPROC(glGetPathSpacingNV, name); + GETPROC(glIsPointInFillPathNV, name); + GETPROC(glIsPointInStrokePathNV, name); + GETPROC(glGetPathLengthNV, name); + GETPROC(glPointAlongPathNV, name); + GETPROC(glMatrixLoad3x2fNV, name); + GETPROC(glMatrixLoad3x3fNV, name); + GETPROC(glMatrixLoadTranspose3x3fNV, name); + GETPROC(glMatrixMult3x2fNV, name); + GETPROC(glMatrixMult3x3fNV, name); + GETPROC(glMatrixMultTranspose3x3fNV, name); + GETPROC(glStencilThenCoverFillPathNV, name); + GETPROC(glStencilThenCoverStrokePathNV, name); + GETPROC(glStencilThenCoverFillPathInstancedNV, name); + GETPROC(glStencilThenCoverStrokePathInstancedNV, name); + GETPROC(glPathGlyphIndexRangeNV, name); + GETPROC(glPathGlyphIndexArrayNV, name); + GETPROC(glPathMemoryGlyphIndexArrayNV, name); + GETPROC(glProgramPathFragmentInputGenNV, name); + GETPROC(glGetProgramResourcefvNV, name); + GETPROC(glFramebufferSampleLocationsfvNV, name); + GETPROC(glNamedFramebufferSampleLocationsfvNV, name); + GETPROC(glResolveDepthValuesNV, name); + GETPROC(glScissorExclusiveNV, name); + GETPROC(glScissorExclusiveArrayvNV, name); + GETPROC(glMakeBufferResidentNV, name); + GETPROC(glMakeBufferNonResidentNV, name); + GETPROC(glIsBufferResidentNV, name); + GETPROC(glMakeNamedBufferResidentNV, name); + GETPROC(glMakeNamedBufferNonResidentNV, name); + GETPROC(glIsNamedBufferResidentNV, name); + GETPROC(glGetBufferParameterui64vNV, name); + GETPROC(glGetNamedBufferParameterui64vNV, name); + GETPROC(glGetIntegerui64vNV, name); + GETPROC(glUniformui64NV, name); + GETPROC(glUniformui64vNV, name); + GETPROC(glGetUniformui64vNV, name); + GETPROC(glProgramUniformui64NV, name); + GETPROC(glProgramUniformui64vNV, name); + GETPROC(glBindShadingRateImageNV, name); + GETPROC(glGetShadingRateImagePaletteNV, name); + GETPROC(glGetShadingRateSampleLocationivNV, name); + GETPROC(glShadingRateImageBarrierNV, name); + GETPROC(glShadingRateImagePaletteNV, name); + GETPROC(glShadingRateSampleOrderNV, name); + GETPROC(glShadingRateSampleOrderCustomNV, name); + GETPROC(glTextureBarrierNV, name); + GETPROC(glVertexAttribL1i64NV, name); + GETPROC(glVertexAttribL2i64NV, name); + GETPROC(glVertexAttribL3i64NV, name); + GETPROC(glVertexAttribL4i64NV, name); + GETPROC(glVertexAttribL1i64vNV, name); + GETPROC(glVertexAttribL2i64vNV, name); + GETPROC(glVertexAttribL3i64vNV, name); + GETPROC(glVertexAttribL4i64vNV, name); + GETPROC(glVertexAttribL1ui64NV, name); + GETPROC(glVertexAttribL2ui64NV, name); + GETPROC(glVertexAttribL3ui64NV, name); + GETPROC(glVertexAttribL4ui64NV, name); + GETPROC(glVertexAttribL1ui64vNV, name); + GETPROC(glVertexAttribL2ui64vNV, name); + GETPROC(glVertexAttribL3ui64vNV, name); + GETPROC(glVertexAttribL4ui64vNV, name); + GETPROC(glGetVertexAttribLi64vNV, name); + GETPROC(glGetVertexAttribLui64vNV, name); + GETPROC(glVertexAttribLFormatNV, name); + GETPROC(glBufferAddressRangeNV, name); + GETPROC(glVertexFormatNV, name); + GETPROC(glNormalFormatNV, name); + GETPROC(glColorFormatNV, name); + GETPROC(glIndexFormatNV, name); + GETPROC(glTexCoordFormatNV, name); + GETPROC(glEdgeFlagFormatNV, name); + GETPROC(glSecondaryColorFormatNV, name); + GETPROC(glFogCoordFormatNV, name); + GETPROC(glVertexAttribFormatNV, name); + GETPROC(glVertexAttribIFormatNV, name); + GETPROC(glGetIntegerui64i_vNV, name); + GETPROC(glViewportSwizzleNV, name); + GETPROC(glFramebufferTextureMultiviewOVR, name); + // GETPROC(glNamedFramebufferTextureMultiviewOVR, name); - MGLOG_W("GetProcAddress(%s) = nullptr!", name); - return nullptr; - } - } // namespace MG_Impl -} // namespace MobileGL \ No newline at end of file + MGLOG_W("GetProcAddress(%s) = nullptr!", name); + return nullptr; + } +} // namespace MobileGL::MG_Impl diff --git a/MobileGL/MG_Impl/GetProcAddress.h b/MobileGL/MG_Impl/GetProcAddress.h index 2b277af6..3c3a0ac2 100644 --- a/MobileGL/MG_Impl/GetProcAddress.h +++ b/MobileGL/MG_Impl/GetProcAddress.h @@ -9,8 +9,6 @@ #pragma once #include -namespace MobileGL { - namespace MG_Impl { - void* GetProcAddress(const char* name); - } // namespace MG_Impl -} // namespace MobileGL +namespace MobileGL::MG_Impl { + void* GetProcAddress(const char* name); +} // namespace MobileGL::MG_Impl diff --git a/MobileGL/MG_Impl/Init.cpp b/MobileGL/MG_Impl/Init.cpp index c7fbfeb4..a7b2ac61 100644 --- a/MobileGL/MG_Impl/Init.cpp +++ b/MobileGL/MG_Impl/Init.cpp @@ -18,10 +18,10 @@ namespace MobileGL::MG_Impl { void Init() { MGLOG_D("Initializing MobileGL Implementation..."); - GLImpl::TextureImpl::pProxyTextureManager = new GLImpl::TextureImpl::ProxyTextureManager(); + GLImpl::TextureImpl::pProxyTextureManager = MakeUnique(); // TODO: get real info in EGL - auto fbo0 = MG_State::pGLContext->CreateFramebufferObject(0); + auto& fbo0 = MG_State::pGLContext->CreateFramebufferObject(0); auto colorTex = MakeShared(0); colorTex->SetInternalFormat(TextureInternalFormat::RGBA8); colorTex->AllocateStorage(TextureUploadTarget::Texture2D, 0, {{512, 512, 1}, 0}); @@ -38,6 +38,6 @@ namespace MobileGL::MG_Impl { fbo0->AttachTexture(FramebufferAttachmentType::Depth, depthTex); fbo0->AttachTexture(FramebufferAttachmentType::Stencil, stencilTex); GLImpl::FramebufferImpl::pDefaultFramebufferInfo = - new GLImpl::FramebufferImpl::DefaultFramebufferInfo(fbo0, colorTex, depthTex, stencilTex); + MakeUnique(fbo0, colorTex, depthTex, stencilTex); } } // namespace MobileGL::MG_Impl diff --git a/MobileGL/MG_State/EGLState/Core.cpp b/MobileGL/MG_State/EGLState/Core.cpp index 6088ac5b..03bec17e 100644 --- a/MobileGL/MG_State/EGLState/Core.cpp +++ b/MobileGL/MG_State/EGLState/Core.cpp @@ -388,8 +388,6 @@ namespace MobileGL { *value = cfg->SurfaceType; return true; case EGL_RENDERABLE_TYPE: - *value = cfg->RenderableType; - return true; case EGL_CONFORMANT: *value = cfg->RenderableType; return true; @@ -878,8 +876,8 @@ namespace MobileGL { Bool EGLContext::MakeCurrent(EGLDisplayHandle display, EGLSurfaceHandle draw, EGLSurfaceHandle read, EGLContextHandle context) { const std::lock_guard lock(m_mutex); - const Bool releaseCurrentRequest = display == EGL_NO_DISPLAY && draw == EGL_NO_SURFACE && - read == EGL_NO_SURFACE && context == nullptr; + const Bool releaseCurrentRequest = + display == EGL_NO_DISPLAY && draw == EGL_NO_SURFACE && read == EGL_NO_SURFACE && context == nullptr; const auto threadKey = CurrentThreadKey(); if (releaseCurrentRequest) { ReleaseThreadUnlocked(threadKey); @@ -1130,6 +1128,6 @@ namespace MobileGL { } } // namespace EGLState - EGLState::EGLContext* pEGLContext; + UniquePtr pEGLContext; } // namespace MG_State } // namespace MobileGL diff --git a/MobileGL/MG_State/EGLState/Core.h b/MobileGL/MG_State/EGLState/Core.h index daf62493..1df2cd8c 100644 --- a/MobileGL/MG_State/EGLState/Core.h +++ b/MobileGL/MG_State/EGLState/Core.h @@ -253,6 +253,6 @@ namespace MobileGL { }; } // namespace EGLState - extern EGLState::EGLContext* pEGLContext; + extern UniquePtr pEGLContext; } // namespace MG_State } // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp b/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp index 6eb77b61..963ea427 100644 --- a/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp +++ b/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp @@ -7,210 +7,203 @@ // End of Source File Header #include "BufferObject.h" -#include "MG_Util/Types.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - BufferObject::BufferObject(Uint externalIndex) - : m_externalIndex(externalIndex), m_size(0), m_usage(BufferUsage::StaticDraw), m_isMapped(false), - m_mappingAccess(BufferMappingAccessBit::Null), - m_change(BufferChangeBits::DirtyBit | BufferChangeBits::PreferReallocationBit), m_mappedRange({0, 0}), - m_dataPtr(MakeShared()) { - m_change.DirtyRanges.reserve(BufferChange::DEFAULT_RESERVED_DIRTY_RANGES_COUNT); - } +namespace MobileGL::MG_State::GLState { + BufferObject::BufferObject(Uint externalIndex) + : m_externalIndex(externalIndex), m_size(0), m_usage(BufferUsage::StaticDraw), m_isMapped(false), + m_mappingAccess(BufferMappingAccessBit::Null), + m_change(BufferChangeBits::DirtyBit | BufferChangeBits::PreferReallocationBit), m_mappedRange({0, 0}), + m_dataPtr(MakeShared()), m_ownsStagingData{} { + m_change.DirtyRanges.reserve(BufferChange::DEFAULT_RESERVED_DIRTY_RANGES_COUNT); + } - void BufferObject::Resize(SizeT size) { - m_size = size; - m_dataPtr->reserve(std::bit_ceil(size)); // power-of-2 reserve - m_dataPtr->resize(size); + void BufferObject::Resize(SizeT size) { + m_size = size; + m_dataPtr->reserve(std::bit_ceil(size)); // power-of-2 reserve + m_dataPtr->resize(size); + m_change.Bits |= BufferChangeBits::DirtyBit; + m_change.Bits |= BufferChangeBits::PreferReallocationBit; + } + + void BufferObject::UploadData(DataPtr data, SizeT atOffset) { + MOBILEGL_ASSERT(atOffset + data.size <= m_size, + "UploadData out of bounds: atOffset (%zu) + data.size (%zu) > m_size (%zu)", atOffset, + data.size, m_size); + MOBILEGL_ASSERT(!m_isMapped, "Cannot upload data while buffer is mapped."); + Memcpy(m_dataPtr->data() + atOffset, data.data, data.size); + m_change.DirtyRanges.Add({atOffset, atOffset + data.size}); + m_change.Bits |= BufferChangeBits::DirtyBit; + m_change.Bits |= BufferChangeBits::ForbidInvalidationBit; + m_change.Bits |= BufferChangeBits::ForbidUnsynchronizationBit; + // This function may be called by `glBufferData`, but we still set the forbid bits above, + // because when `PreferReallocationBit` is set, those bits are ignored anyway. + // The bits can fit the `glBufferSubData` semantics + // (though `glBufferSubData` calls `UploadSubData` instead). + } + + void BufferObject::SetUsage(BufferUsage usage) { + m_usage = usage; + } + + void BufferObject::ReleaseMemory() { + if (!m_isMapped) return; + + if (m_mappingAccess & BufferMappingAccessBit::Write) { // if we wrote to the buffer + if (!(m_mappingAccess & BufferMappingAccessBit::FlushExplicit)) { // if we didn't flush explicitly + Memcpy(m_dataPtr->data() + m_mappedRange.start, m_stagingData.data(), + m_mappedRange.end - m_mappedRange.start); + m_change.DirtyRanges.Add({m_mappedRange.start, m_mappedRange.end}); m_change.Bits |= BufferChangeBits::DirtyBit; - m_change.Bits |= BufferChangeBits::PreferReallocationBit; } - void BufferObject::UploadData(DataPtr data, SizeT atOffset) { - MOBILEGL_ASSERT(atOffset + data.size <= m_size, - "UploadData out of bounds: atOffset (%zu) + data.size (%zu) > m_size (%zu)", atOffset, - data.size, m_size); - MOBILEGL_ASSERT(!m_isMapped, "Cannot upload data while buffer is mapped."); - Memcpy(m_dataPtr->data() + atOffset, data.data, data.size); - m_change.DirtyRanges.Add({atOffset, atOffset + data.size}); - m_change.Bits |= BufferChangeBits::DirtyBit; - m_change.Bits |= BufferChangeBits::ForbidInvalidationBit; - m_change.Bits |= BufferChangeBits::ForbidUnsynchronizationBit; - // This function may be called by `glBufferData`, but we still set the forbid bits above, - // because when `PreferReallocationBit` is set, those bits are ignored anyway. - // The bits can fit the `glBufferSubData` semantics - // (though `glBufferSubData` calls `UploadSubData` instead). - } + m_stagingData.clear(); + } - void BufferObject::SetUsage(BufferUsage usage) { - m_usage = usage; - } + m_isMapped = false; + m_mappingAccess = BufferMappingAccessBit::Null; + m_mappedRange = {0, 0}; + m_ownsStagingData = false; + } - void BufferObject::ReleaseMemory() { - if (!m_isMapped) return; + void BufferObject::FlushMemoryRange(SizeT offset, SizeT length) { + MOBILEGL_ASSERT(m_isMapped, "Buffer must be mapped to flush memory range."); + MOBILEGL_ASSERT((m_mappingAccess & BufferMappingAccessBit::FlushExplicit), + "Buffer must be mapped with FlushExplicit access to flush memory range."); + MOBILEGL_ASSERT((m_mappingAccess & BufferMappingAccessBit::Write), + "Buffer must be mapped with Write access to flush memory range."); - if (m_mappingAccess & BufferMappingAccessBit::Write) { // if we wrote to the buffer - if (!(m_mappingAccess & BufferMappingAccessBit::FlushExplicit)) { // if we didn't flush explicitly - Memcpy(m_dataPtr->data() + m_mappedRange.start, m_stagingData.data(), - m_mappedRange.end - m_mappedRange.start); - m_change.DirtyRanges.Add({m_mappedRange.start, m_mappedRange.end}); - m_change.Bits |= BufferChangeBits::DirtyBit; - } + SizeT start = m_mappedRange.start + offset; + SizeT end = start + length; + MOBILEGL_ASSERT(end <= m_mappedRange.end, "Flush range out of bounds: mappedRange.end (%zu) < end (%zu)", + m_mappedRange.end, end); - m_stagingData.clear(); + Memcpy(m_dataPtr->data() + start, m_stagingData.data() + offset, length); + m_change.DirtyRanges.Add({start, end}); + m_change.Bits |= BufferChangeBits::DirtyBit; + } + + void BufferObject::UploadSubData(DataPtr data, SizeT atOffset) { + MOBILEGL_ASSERT(!m_isMapped, "Cannot upload sub data while buffer is mapped."); + MOBILEGL_ASSERT(atOffset + data.size <= m_size, + "UploadSubData out of bounds: atOffset (%zu) + data.size (%zu) > m_size (%zu)", atOffset, + data.size, m_size); + + Memcpy(m_dataPtr->data() + atOffset, data.data, data.size); + m_change.DirtyRanges.Add({atOffset, atOffset + data.size}); + m_change.Bits |= BufferChangeBits::DirtyBit; + m_change.Bits |= BufferChangeBits::ForbidInvalidationBit; + m_change.Bits |= BufferChangeBits::ForbidUnsynchronizationBit; + } + + void BufferObject::CopyDataFrom(const SharedPtr& src, SizeT srcOffset, SizeT dstOffset, SizeT size) { + MOBILEGL_ASSERT(!m_isMapped, "Cannot copy data while buffer is mapped."); + MOBILEGL_ASSERT(!src->IsMapped(), "Cannot copy data from a buffer that is mapped."); + MOBILEGL_ASSERT(srcOffset + size <= src->GetSize(), + "Source buffer copy out of bounds: srcOffset (%zu) + size (%zu) > src->GetSize() (%zu)", + srcOffset, size, src->GetSize()); + MOBILEGL_ASSERT(dstOffset + size <= m_size, + "Destination buffer copy out of bounds: dstOffset (%zu) + size (%zu) > m_size (%zu)", dstOffset, + size, m_size); + + const Uint8* srcData = src->m_dataPtr->data() + srcOffset; + Memcpy(m_dataPtr->data() + dstOffset, srcData, size); + m_change.DirtyRanges.Add({dstOffset, dstOffset + size}); + m_change.Bits |= BufferChangeBits::DirtyBit; + } + + void* BufferObject::AcquireMemory(Bool markMapped, Bool read, Bool write) { + if (markMapped) { + m_isMapped = true; + auto a = BufferMappingAccessBit::Coherent | BufferMappingAccessBit::Read; + m_mappingAccess = (read ? BufferMappingAccessBit::Read : BufferMappingAccessBit::Null) | + (write ? BufferMappingAccessBit::Write : BufferMappingAccessBit::Null); + m_mappedRange = {0, m_size}; + + if (m_mappingAccess & BufferMappingAccessBit::Write) { + m_stagingData.resize(m_size); + m_ownsStagingData = true; + + if (!(m_mappingAccess & + (BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer))) { + Memcpy(m_stagingData.data(), m_dataPtr->data(), m_size); } - m_isMapped = false; - m_mappingAccess = BufferMappingAccessBit::Null; - m_mappedRange = {0, 0}; - m_ownsStagingData = false; + return m_stagingData.data(); + } + } + + return m_dataPtr->data(); + } + + void* BufferObject::AcquireMemoryRange(Range1D range, Flags access) { + MOBILEGL_ASSERT(range.end <= m_size && range.start <= range.end, + "AcquireMemoryRange out of bounds: range (%zu, %zu) exceeds m_size (%zu)", range.start, + range.end, m_size); + m_isMapped = true; + m_mappingAccess = access; + m_mappedRange = range; + + if (access & BufferMappingAccessBit::Write) { + m_stagingData.resize(range.end - range.start); + m_ownsStagingData = true; + + if (!(access & (BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer))) { + Memcpy(m_stagingData.data(), m_dataPtr->data() + range.start, m_stagingData.size()); } - void BufferObject::FlushMemoryRange(SizeT offset, SizeT length) { - MOBILEGL_ASSERT(m_isMapped, "Buffer must be mapped to flush memory range."); - MOBILEGL_ASSERT((m_mappingAccess & BufferMappingAccessBit::FlushExplicit), - "Buffer must be mapped with FlushExplicit access to flush memory range."); - MOBILEGL_ASSERT((m_mappingAccess & BufferMappingAccessBit::Write), - "Buffer must be mapped with Write access to flush memory range."); + return m_stagingData.data(); + } else { + m_ownsStagingData = false; + return m_dataPtr->data() + range.start; + } - SizeT start = m_mappedRange.start + offset; - SizeT end = start + length; - MOBILEGL_ASSERT(end <= m_mappedRange.end, - "Flush range out of bounds: mappedRange.end (%zu) < end (%zu)", m_mappedRange.end, end); + m_change.Bits |= + !(access & BufferMappingAccessBit::InvalidateBuffer || access & BufferMappingAccessBit::InvalidateRange) + ? BufferChangeBits::ForbidInvalidationBit + : BufferChangeBits::None; + m_change.Bits |= !(access & BufferMappingAccessBit::Unsynchronized) + ? BufferChangeBits::ForbidUnsynchronizationBit + : BufferChangeBits::None; + } - Memcpy(m_dataPtr->data() + start, m_stagingData.data() + offset, length); - m_change.DirtyRanges.Add({start, end}); - m_change.Bits |= BufferChangeBits::DirtyBit; - } + const SharedPtr& BufferObject::GetDataReadOnly() const { + return m_dataPtr; + } - void BufferObject::UploadSubData(DataPtr data, SizeT atOffset) { - MOBILEGL_ASSERT(!m_isMapped, "Cannot upload sub data while buffer is mapped."); - MOBILEGL_ASSERT(atOffset + data.size <= m_size, - "UploadSubData out of bounds: atOffset (%zu) + data.size (%zu) > m_size (%zu)", - atOffset, data.size, m_size); + void BufferObject::ClearDirty() { + m_change.DirtyRanges.clear(); + m_change.Bits = BufferChangeBits::None; + } - Memcpy(m_dataPtr->data() + atOffset, data.data, data.size); - m_change.DirtyRanges.Add({atOffset, atOffset + data.size}); - m_change.Bits |= BufferChangeBits::DirtyBit; - m_change.Bits |= BufferChangeBits::ForbidInvalidationBit; - m_change.Bits |= BufferChangeBits::ForbidUnsynchronizationBit; - } + SizeT BufferObject::GetSize() const { + return m_size; + } - void BufferObject::CopyDataFrom(const SharedPtr& src, SizeT srcOffset, SizeT dstOffset, - SizeT size) { - MOBILEGL_ASSERT(!m_isMapped, "Cannot copy data while buffer is mapped."); - MOBILEGL_ASSERT(!src->IsMapped(), "Cannot copy data from a buffer that is mapped."); - MOBILEGL_ASSERT(srcOffset + size <= src->GetSize(), - "Source buffer copy out of bounds: srcOffset (%zu) + size (%zu) > src->GetSize() (%zu)", - srcOffset, size, src->GetSize()); - MOBILEGL_ASSERT(dstOffset + size <= m_size, - "Destination buffer copy out of bounds: dstOffset (%zu) + size (%zu) > m_size (%zu)", - dstOffset, size, m_size); + BufferUsage BufferObject::GetUsage() const { + return m_usage; + } - const Uint8* srcData = src->m_dataPtr->data() + srcOffset; - Memcpy(m_dataPtr->data() + dstOffset, srcData, size); - m_change.DirtyRanges.Add({dstOffset, dstOffset + size}); - m_change.Bits |= BufferChangeBits::DirtyBit; - } + const VecRange1D& BufferObject::GetDirtyRanges() const { + return m_change.DirtyRanges; + } - void* BufferObject::AcquireMemory(Bool markMapped, Bool read, Bool write) { - if (markMapped) { - m_isMapped = true; - auto a = BufferMappingAccessBit::Coherent | BufferMappingAccessBit::Read; - m_mappingAccess = (read ? BufferMappingAccessBit::Read : BufferMappingAccessBit::Null) | - (write ? BufferMappingAccessBit::Write : BufferMappingAccessBit::Null); - m_mappedRange = {0, m_size}; + Flags BufferObject::GetChangeBits() const { + return m_change.Bits; + } - if (m_mappingAccess & BufferMappingAccessBit::Write) { - m_stagingData.resize(m_size); - m_ownsStagingData = true; + Bool BufferObject::IsMapped() const { + return m_isMapped; + } - if (!(m_mappingAccess & - (BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer))) { - Memcpy(m_stagingData.data(), m_dataPtr->data(), m_size); - } + Range1D BufferObject::GetMappedRange() const { + return m_isMapped ? m_mappedRange : Range1D{0, 0}; + } - return m_stagingData.data(); - } - } + Flags BufferObject::GetMappingAccess() const { + return m_isMapped ? m_mappingAccess : BufferMappingAccessBit::Null; + } - return m_dataPtr->data(); - } - - void* BufferObject::AcquireMemoryRange(Range1D range, Flags access) { - MOBILEGL_ASSERT(range.end <= m_size && range.start <= range.end, - "AcquireMemoryRange out of bounds: range (%zu, %zu) exceeds m_size (%zu)", range.start, - range.end, m_size); - m_isMapped = true; - m_mappingAccess = access; - m_mappedRange = range; - - if (access & BufferMappingAccessBit::Write) { - m_stagingData.resize(range.end - range.start); - m_ownsStagingData = true; - - if (!(access & - (BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer))) { - Memcpy(m_stagingData.data(), m_dataPtr->data() + range.start, m_stagingData.size()); - } - - return m_stagingData.data(); - } else { - m_ownsStagingData = false; - return m_dataPtr->data() + range.start; - } - - m_change.Bits |= !(access & BufferMappingAccessBit::InvalidateBuffer || - access & BufferMappingAccessBit::InvalidateRange) - ? BufferChangeBits::ForbidInvalidationBit - : BufferChangeBits::None; - m_change.Bits |= !(access & BufferMappingAccessBit::Unsynchronized) - ? BufferChangeBits::ForbidUnsynchronizationBit - : BufferChangeBits::None; - } - - const SharedPtr BufferObject::GetDataReadOnly() const { - return m_dataPtr; - } - - void BufferObject::ClearDirty() { - m_change.DirtyRanges.clear(); - m_change.Bits = BufferChangeBits::None; - } - - SizeT BufferObject::GetSize() const { - return m_size; - } - - BufferUsage BufferObject::GetUsage() const { - return m_usage; - } - - const VecRange1D& BufferObject::GetDirtyRanges() const { - return m_change.DirtyRanges; - } - - Flags BufferObject::GetChangeBits() const { - return m_change.Bits; - } - - Bool BufferObject::IsMapped() const { - return m_isMapped; - } - - Range1D BufferObject::GetMappedRange() const { - return m_isMapped ? m_mappedRange : Range1D{0, 0}; - } - - Flags BufferObject::GetMappingAccess() const { - return m_isMapped ? m_mappingAccess : BufferMappingAccessBit::Null; - } - - Uint BufferObject::GetExternalIndex() const { - return m_externalIndex; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + Uint BufferObject::GetExternalIndex() const { + return m_externalIndex; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/BufferState/BufferObject.h b/MobileGL/MG_State/GLState/BufferState/BufferObject.h index 99caf195..18899e88 100644 --- a/MobileGL/MG_State/GLState/BufferState/BufferObject.h +++ b/MobileGL/MG_State/GLState/BufferState/BufferObject.h @@ -7,7 +7,6 @@ // End of Source File Header #pragma once -#include "MG_Util/Types.h" #include #include @@ -73,47 +72,45 @@ namespace MobileGL { VecRange1D DirtyRanges; }; - namespace MG_State { - namespace GLState { - class BufferObject { - public: - using TargetEnum = BufferTarget; + namespace MG_State::GLState { + class BufferObject { + public: + using TargetEnum = BufferTarget; - BufferObject(Uint externalIndex); + BufferObject(Uint externalIndex); - void Resize(SizeT size); - void UploadData(DataPtr data, SizeT atOffset); - void SetUsage(BufferUsage usage); - void* AcquireMemory(Bool markMapped, Bool read, Bool write); - void* AcquireMemoryRange(Range1D range, Flags access); - void ReleaseMemory(); - void FlushMemoryRange(SizeT offset, SizeT length); - void UploadSubData(DataPtr data, SizeT atOffset); - void CopyDataFrom(const SharedPtr& src, SizeT srcOffset, SizeT dstOffset, SizeT size); - void ClearDirty(); + void Resize(SizeT size); + void UploadData(DataPtr data, SizeT atOffset); + void SetUsage(BufferUsage usage); + void* AcquireMemory(Bool markMapped, Bool read, Bool write); + void* AcquireMemoryRange(Range1D range, Flags access); + void ReleaseMemory(); + void FlushMemoryRange(SizeT offset, SizeT length); + void UploadSubData(DataPtr data, SizeT atOffset); + void CopyDataFrom(const SharedPtr& src, SizeT srcOffset, SizeT dstOffset, SizeT size); + void ClearDirty(); - Bool IsMapped() const; - SizeT GetSize() const; - BufferUsage GetUsage() const; - Range1D GetMappedRange() const; - const SharedPtr GetDataReadOnly() const; - Flags GetMappingAccess() const; - Uint GetExternalIndex() const; - const VecRange1D& GetDirtyRanges() const; - Flags GetChangeBits() const; + Bool IsMapped() const; + SizeT GetSize() const; + BufferUsage GetUsage() const; + Range1D GetMappedRange() const; + const SharedPtr& GetDataReadOnly() const; + Flags GetMappingAccess() const; + Uint GetExternalIndex() const; + const VecRange1D& GetDirtyRanges() const; + Flags GetChangeBits() const; - private: - const Uint m_externalIndex = 0; - SizeT m_size = 0; - BufferUsage m_usage = BufferUsage::StaticDraw; - SharedPtr m_dataPtr; - Bool m_isMapped; - Flags m_mappingAccess; - BufferChange m_change; - Range1D m_mappedRange; - Vector m_stagingData; - Bool m_ownsStagingData; - }; - } // namespace GLState - } // namespace MG_State + private: + const Uint m_externalIndex = 0; + SizeT m_size = 0; + BufferUsage m_usage = BufferUsage::StaticDraw; + SharedPtr m_dataPtr; + Bool m_isMapped; + Flags m_mappingAccess; + BufferChange m_change; + Range1D m_mappedRange; + Vector m_stagingData; + Bool m_ownsStagingData; + }; + } // namespace MG_State::GLState } // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/BufferState/BufferState.cpp b/MobileGL/MG_State/GLState/BufferState/BufferState.cpp index f090b101..d3b9d193 100644 --- a/MobileGL/MG_State/GLState/BufferState/BufferState.cpp +++ b/MobileGL/MG_State/GLState/BufferState/BufferState.cpp @@ -8,78 +8,75 @@ #include "BufferState.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - BufferState::BufferState() : m_indexGenerator(1024, 1) { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - m_bindingSlots[i] = BindingSlot(GlobalBufferTargets[i]); - } - } +namespace MobileGL::MG_State::GLState { + BufferState::BufferState() : m_indexGenerator(1024, 1) { + for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { + m_bindingSlots[i] = BindingSlot(GlobalBufferTargets[i]); + } + } - SharedPtr BufferState::GetBufferObject(Uint index) { - auto it = m_bufferObjects.find(index); - if (it != m_bufferObjects.end()) { - return it->second; - } - return nullptr; - } + const SharedPtr& BufferState::GetBufferObject(Uint index) { + auto it = m_bufferObjects.find(index); + if (it != m_bufferObjects.end()) { + return it->second; + } + static SharedPtr nullBufferObject = nullptr; + return nullBufferObject; + } - Vector BufferState::GenerateNames(Uint number) { - Vector buffers(number); - m_indexGenerator.Generate(number, buffers.data()); - return buffers; - } + void BufferState::GenerateNames(Uint number, Vector& buffers) { + buffers.resize(number); + m_indexGenerator.Generate(number, buffers.data()); + } - SharedPtr BufferState::CreateBufferObject(Uint index) { - auto bufferObject = MakeShared(index); - m_bufferObjects[index] = bufferObject; - return bufferObject; - } + const SharedPtr& BufferState::CreateBufferObject(Uint index) { + auto& bufferObj = m_bufferObjects[index]; + if (!bufferObj) { + bufferObj = MakeShared(index); + } + return bufferObj; + } - BindingSlot& BufferState::GetBindingSlot(BufferTarget target) { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - if (m_bindingSlots[i].GetTarget() == target) { - return m_bindingSlots[i]; + BindingSlot& BufferState::GetBindingSlot(BufferTarget target) { + for (auto& bindingSlot : m_bindingSlots) { + if (bindingSlot.GetTarget() == target) { + return bindingSlot; + } + } + MOBILEGL_ASSERT(false, "Invalid BufferTarget enum value: %d", static_cast(target)); + return m_bindingSlots[0]; + } + + void BufferState::MarkBufferObjectForDeletion(Uint index) { + if (m_indexGenerator.IsValid(index)) { + auto it = m_bufferObjects.find(index); + if (it != m_bufferObjects.end()) { + for (auto& bindingSlot : m_bindingSlots) { + if (bindingSlot.GetBoundObject() == it->second) { + bindingSlot.Bind(nullptr); } } - MOBILEGL_ASSERT(false, "Invalid BufferTarget enum value: %d", static_cast(target)); - return m_bindingSlots[0]; + m_bufferObjects.erase(it); } + m_indexGenerator.Delete(index); + } + } - void BufferState::MarkBufferObjectForDeletion(Uint index) { - if (m_indexGenerator.IsValid(index)) { - auto it = m_bufferObjects.find(index); - if (it != m_bufferObjects.end()) { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - if (m_bindingSlots[i].GetBoundObject() == it->second) { - m_bindingSlots[i].Bind(nullptr); - } - } - m_bufferObjects.erase(it); - } - m_indexGenerator.Delete(index); - } - } + Bool BufferState::ValidateName(Uint index) const { + return m_indexGenerator.IsValid(index); + } - Bool BufferState::ValidateName(Uint index) const { - return m_indexGenerator.IsValid(index); - } + Bool BufferState::ValidateBufferObject(Uint index) const { + return m_bufferObjects.find(index) != m_bufferObjects.end(); + } - Bool BufferState::ValidateBufferObject(Uint index) const { - return m_bufferObjects.find(index) != m_bufferObjects.end(); + BindingSlotRange1D& BufferState::GetBindingPoint(BufferTarget target, Uint index) { + for (SizeT i = 0; i < BufferBindPointTargets.size(); ++i) { + if (BufferBindPointTargets[i] == target) { + return m_bufferBindPointTargets[i][index]; } - - BindingSlotRange1D& BufferState::GetBindingPoint(BufferTarget target, Uint index) { - for (SizeT i = 0; i < BufferBindPointTargets.size(); ++i) { - if (BufferBindPointTargets[i] == target) { - return m_bufferBindPointTargets[i][index]; - } - } - MOBILEGL_ASSERT(false, "Invalid BufferTarget enum value for binding point: %d", - static_cast(target)); - return m_bufferBindPointTargets[0][index]; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + } + MOBILEGL_ASSERT(false, "Invalid BufferTarget enum value for binding point: %d", static_cast(target)); + return m_bufferBindPointTargets[0][index]; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/BufferState/BufferState.h b/MobileGL/MG_State/GLState/BufferState/BufferState.h index 760bfd96..fc2f447f 100644 --- a/MobileGL/MG_State/GLState/BufferState/BufferState.h +++ b/MobileGL/MG_State/GLState/BufferState/BufferState.h @@ -11,46 +11,40 @@ #include #include "BufferObject.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - constexpr const auto GlobalBufferTargets = - ToArray(BufferTarget::Vertex, BufferTarget::Uniform, BufferTarget::CopyRead, BufferTarget::CopyWrite, - BufferTarget::PixelPack, BufferTarget::PixelUnpack, BufferTarget::Query, BufferTarget::Texture, - BufferTarget::TransformFeedback, BufferTarget::AtomicCounter, BufferTarget::DispatchIndirect, - BufferTarget::DrawIndirect, BufferTarget::ShaderStorage); - constexpr const auto BufferBindPointTargets = - ToArray(BufferTarget::Uniform, BufferTarget::TransformFeedback, BufferTarget::AtomicCounter, - BufferTarget::ShaderStorage); +namespace MobileGL::MG_State::GLState { + constexpr const auto GlobalBufferTargets = + ToArray(BufferTarget::Vertex, BufferTarget::Uniform, BufferTarget::CopyRead, BufferTarget::CopyWrite, + BufferTarget::PixelPack, BufferTarget::PixelUnpack, BufferTarget::Query, BufferTarget::Texture, + BufferTarget::TransformFeedback, BufferTarget::AtomicCounter, BufferTarget::DispatchIndirect, + BufferTarget::DrawIndirect, BufferTarget::ShaderStorage); + constexpr const auto BufferBindPointTargets = ToArray(BufferTarget::Uniform, BufferTarget::TransformFeedback, + BufferTarget::AtomicCounter, BufferTarget::ShaderStorage); - class BufferState { - public: - BufferState(); + class BufferState { + public: + BufferState(); - SharedPtr GetBufferObject(Uint index); - Vector GenerateNames(Uint number); - SharedPtr CreateBufferObject(Uint index); - BindingSlot& GetBindingSlot(BufferTarget target); - // For glBindBufferBase / glBindBufferRange - BindingSlotRange1D& GetBindingPoint(BufferTarget target, Uint index); - constexpr SizeT GetBindingPointCount(const BufferTarget target) const { - auto it = std::find(BufferBindPointTargets.begin(), BufferBindPointTargets.end(), target); - auto index = std::distance(BufferBindPointTargets.begin(), it); - return m_bufferBindPointTargets[index].size(); - } - void MarkBufferObjectForDeletion(Uint index); - Bool ValidateName(Uint index) const; - Bool ValidateBufferObject(Uint index) const; + const SharedPtr& GetBufferObject(Uint index); + void GenerateNames(Uint number, Vector& buffers); + const SharedPtr& CreateBufferObject(Uint index); + BindingSlot& GetBindingSlot(BufferTarget target); + // For glBindBufferBase / glBindBufferRange + BindingSlotRange1D& GetBindingPoint(BufferTarget target, Uint index); + constexpr SizeT GetBindingPointCount(const BufferTarget target) const { + auto it = std::find(BufferBindPointTargets.begin(), BufferBindPointTargets.end(), target); + auto index = std::distance(BufferBindPointTargets.begin(), it); + return m_bufferBindPointTargets[index].size(); + } + void MarkBufferObjectForDeletion(Uint index); + Bool ValidateName(Uint index) const; + Bool ValidateBufferObject(Uint index) const; - private: - UnorderedMap> m_bufferObjects; - IndexGenerator m_indexGenerator; - Array, GlobalBufferTargets.size()> m_bindingSlots; - // TODO: query the count somewhere globally? - // For glBindBufferBase / glBindBufferRange - Array, 16>, BufferBindPointTargets.size()> - m_bufferBindPointTargets; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + private: + UnorderedMap> m_bufferObjects; + IndexGenerator m_indexGenerator; + Array, GlobalBufferTargets.size()> m_bindingSlots; + // TODO: query the count somewhere globally? + // For glBindBufferBase / glBindBufferRange + Array, 16>, BufferBindPointTargets.size()> m_bufferBindPointTargets; + }; +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/Core.cpp b/MobileGL/MG_State/GLState/Core.cpp index 1681c7eb..6123bbe2 100644 --- a/MobileGL/MG_State/GLState/Core.cpp +++ b/MobileGL/MG_State/GLState/Core.cpp @@ -10,436 +10,436 @@ #include "MG_State/GLState/RenderbufferState/RenderbufferObject.h" #include "MG_State/EGLState/Core.h" -namespace MobileGL { - namespace MG_State { - void Init() { - MGLOG_D("Initializing MobileGL State..."); - pGLContext = new MG_State::GLState::GLContext(); - pEGLContext = new MG_State::EGLState::EGLContext(); +namespace MobileGL::MG_State { + void Init() { + MGLOG_D("Initializing MobileGL State..."); + pGLContext = MakeUnique(); + pEGLContext = MakeUnique(); + } + + namespace GLState { + // Error + void GLContext::RecordError(ErrorCode code, UniquePtr info) { + m_errorState.RecordError(code, Move(info)); } - namespace GLState { - // Error - void GLContext::RecordError(ErrorCode code, SharedPtr info) { - m_errorState.RecordError(code, info); + Bool GLContext::HasGLError() const { + return m_errorState.HasGLError(); + } + + Optional GLContext::PeekGLError() const { + return m_errorState.PeekGLError(); + } + + Optional> GLContext::PopGLError() { + return Move(m_errorState.PopGLError()); + } + + Bool GLContext::HasNonGLError() const { + return m_errorState.HasNonGLError(); + } + + Optional GLContext::PeekNonGLError() const { + return m_errorState.PeekNonGLError(); + } + + Optional> GLContext::PopNonGLError() { + return Move(m_errorState.PopNonGLError()); + } + + void GLContext::ClearErrors() { + m_errorState.Clear(); + } + + // Buffer + void GLContext::GenBufferNames(Uint number, Vector& buffers) { + m_bufferState.GenerateNames(number, buffers); + } + + const SharedPtr& GLContext::GetBufferObject(Uint index) { + return m_bufferState.GetBufferObject(index); + } + + BindingSlot& GLContext::GetBufferBindingSlot(BufferTarget target) { + if (target == BufferTarget::Index) { + const auto& vao = m_vertexArrayState.GetBoundVertexArray(); + MOBILEGL_ASSERT(vao != nullptr, "No VAO is currently bound when accessing index buffer binding slot."); + return vao->GetIndexBufferBindingSlot(); } - Bool GLContext::HasGLError() const { - return m_errorState.HasGLError(); - } + return m_bufferState.GetBindingSlot(target); + } - Optional GLContext::PeekGLError() const { - return m_errorState.PeekGLError(); - } + BindingSlotRange1D& GLContext::GetBufferBindingPoint(BufferTarget target, Uint index) { + return m_bufferState.GetBindingPoint(target, index); + } - Optional GLContext::PopGLError() { - return m_errorState.PopGLError(); - } + const SharedPtr& GLContext::CreateBufferObject(Uint index) { + return m_bufferState.CreateBufferObject(index); + } - Bool GLContext::HasNonGLError() const { - return m_errorState.HasNonGLError(); - } + void GLContext::MarkBufferObjectForDeletion(Uint index) { + if (ValidateBufferObject(index)) { + auto bufferObject = m_bufferState.GetBufferObject(index); + auto& vaos = m_vertexArrayState.GetAllVertexArrays(); + for (auto& vao : vaos) { + if (vao == nullptr) continue; - Optional GLContext::PeekNonGLError() const { - return m_errorState.PeekNonGLError(); - } - - Optional GLContext::PopNonGLError() { - return m_errorState.PopNonGLError(); - } - - void GLContext::ClearErrors() { - m_errorState.Clear(); - } - - // Buffer - Vector GLContext::GenBufferNames(Uint number) { - return m_bufferState.GenerateNames(number); - } - - SharedPtr GLContext::GetBufferObject(Uint index) { - return m_bufferState.GetBufferObject(index); - } - - BindingSlot& GLContext::GetBufferBindingSlot(BufferTarget target) { - if (target == BufferTarget::Index) { - const auto& vao = m_vertexArrayState.GetBoundVertexArray(); - MOBILEGL_ASSERT(vao != nullptr, - "No VAO is currently bound when accessing index buffer binding slot."); - return vao->GetIndexBufferBindingSlot(); - } - - return m_bufferState.GetBindingSlot(target); - } - - BindingSlotRange1D& GLContext::GetBufferBindingPoint(BufferTarget target, Uint index) { - return m_bufferState.GetBindingPoint(target, index); - } - - SharedPtr GLContext::CreateBufferObject(Uint index) { - return m_bufferState.CreateBufferObject(index); - } - - void GLContext::MarkBufferObjectForDeletion(Uint index) { - if (ValidateBufferObject(index)) { - auto bufferObject = m_bufferState.GetBufferObject(index); - auto& vaos = m_vertexArrayState.GetAllVertexArrays(); - for (SizeT i = 0; i < vaos.size(); ++i) { - auto vao = vaos[i]; - if (vao == nullptr) continue; - - if (vao->GetIndexBufferBindingSlot().GetBoundObject() == bufferObject) { - vao->GetIndexBufferBindingSlot().Bind(nullptr); - } - for (SizeT j = 0; j < VertexArrayObject::MAX_VERTEX_ATTRIBS; ++j) { - if (vao->GetAttribute(j).Buffer == bufferObject) { - vao->BindAttributeBuffer(j, nullptr); - } + if (vao->GetIndexBufferBindingSlot().GetBoundObject() == bufferObject) { + vao->GetIndexBufferBindingSlot().Bind(nullptr); + } + for (SizeT j = 0; j < VertexArrayObject::MAX_VERTEX_ATTRIBS; ++j) { + if (vao->GetAttribute(j).Buffer == bufferObject) { + vao->BindAttributeBuffer(j, nullptr); } } } - - m_bufferState.MarkBufferObjectForDeletion(index); } - Bool GLContext::ValidateBufferName(Uint index) const { - return m_bufferState.ValidateName(index); - } + m_bufferState.MarkBufferObjectForDeletion(index); + } - Bool GLContext::ValidateBufferObject(Uint index) const { - return m_bufferState.ValidateBufferObject(index); - } + Bool GLContext::ValidateBufferName(Uint index) const { + return m_bufferState.ValidateName(index); + } - // VertexArray - Vector GLContext::GenVertexArrayNames(Uint number) { - return m_vertexArrayState.GenerateNames(number); - } + Bool GLContext::ValidateBufferObject(Uint index) const { + return m_bufferState.ValidateBufferObject(index); + } - SharedPtr GLContext::GetVertexArrayObject(Uint index) { - return m_vertexArrayState.GetVertexArrayObject(index); - } + // VertexArray + void GLContext::GenVertexArrayNames(Uint number, Vector& vertexArrays) { + m_vertexArrayState.GenerateNames(number, vertexArrays); + } - void GLContext::BindVertexArray(Uint index) { - m_vertexArrayState.Bind(index); - } + const SharedPtr& GLContext::GetVertexArrayObject(Uint index) { + return m_vertexArrayState.GetVertexArrayObject(index); + } - SharedPtr GLContext::CreateVertexArrayObject(Uint index) { - return m_vertexArrayState.CreateVertexArrayObject(index); - } + void GLContext::BindVertexArray(Uint index) { + m_vertexArrayState.Bind(index); + } - void GLContext::MarkVertexArrayForDeletion(Uint index) { - m_vertexArrayState.MarkVertexArrayForDeletion(index); - } + const SharedPtr& GLContext::CreateVertexArrayObject(Uint index) { + return m_vertexArrayState.CreateVertexArrayObject(index); + } - Bool GLContext::ValidateVertexArrayName(Uint index) const { - return m_vertexArrayState.ValidateName(index); - } + void GLContext::MarkVertexArrayForDeletion(Uint index) { + m_vertexArrayState.MarkVertexArrayForDeletion(index); + } - Bool GLContext::ValidateVertexArrayObject(Uint index) const { - return m_vertexArrayState.ValidateVertexArrayObject(index); - } + Bool GLContext::ValidateVertexArrayName(Uint index) const { + return m_vertexArrayState.ValidateName(index); + } - SharedPtr GLContext::GetBoundVertexArray() { - return m_vertexArrayState.GetBoundVertexArray(); - } + Bool GLContext::ValidateVertexArrayObject(Uint index) const { + return m_vertexArrayState.ValidateVertexArrayObject(index); + } - // Texture - Vector GLContext::GenTextureNames(Uint number) { - return m_textureState.GenerateNames(number); - } + const SharedPtr& GLContext::GetBoundVertexArray() { + return m_vertexArrayState.GetBoundVertexArray(); + } - SharedPtr GLContext::GetTextureObject(Uint index) { - return m_textureState.GetTextureObject(index); - } + // Texture + void GLContext::GenTextureNames(Uint number, Vector& textures) { + m_textureState.GenerateNames(number, textures); + } - SharedPtr GLContext::CreateTextureObject(Uint index, TextureTarget target) { - return m_textureState.CreateTextureObject(index, target); - } + const SharedPtr& GLContext::GetTextureObject(Uint index) { + return m_textureState.GetTextureObject(index); + } - void GLContext::MarkTextureObjectForDeletion(Uint index) { - m_textureState.MarkTextureObjectForDeletion(index); - } + const SharedPtr& GLContext::CreateTextureObject(Uint index, TextureTarget target) { + return m_textureState.CreateTextureObject(index, target); + } - TextureUnit& GLContext::GetTextureUnitObject(Int unit) { - return m_textureState.GetUnitObject(unit); - } + void GLContext::MarkTextureObjectForDeletion(Uint index) { + m_textureState.MarkTextureObjectForDeletion(index); + } - Bool GLContext::ValidateTextureName(Uint index) const { - return m_textureState.ValidateName(index); - } - - Bool GLContext::ValidateTextureObject(Uint index) const { - return m_textureState.ValidateTextureObject(index); - } - - Int GLContext::GetActiveTextureUnit() const { - return m_textureState.GetActiveTextureUnit(); - } + TextureUnit& GLContext::GetTextureUnitObject(Int unit) { + return m_textureState.GetUnitObject(unit); + } - void GLContext::SetActiveTextureUnit(Int unit) { - m_textureState.SetActiveTextureUnit(unit); - } + Bool GLContext::ValidateTextureName(Uint index) const { + return m_textureState.ValidateName(index); + } - // Program - Uint GLContext::CreateProgram() { - return m_programState.CreateProgram(); - } + Bool GLContext::ValidateTextureObject(Uint index) const { + return m_textureState.ValidateTextureObject(index); + } - Uint GLContext::CreateShader(const ShaderStage stage) { - return m_programState.CreateShader(stage); - } + Int GLContext::GetActiveTextureUnit() const { + return m_textureState.GetActiveTextureUnit(); + } - void GLContext::MarkProgramForDeletion(const Uint index) { - return m_programState.MarkProgramObjectForDeletion(index); - } - - void GLContext::MarkShaderForDeletion(const Uint index) { - return m_programState.MarkShaderObjectForDeletion(index); - } - - Bool GLContext::ValidateProgramName(const Uint index) const { - return m_programState.ValidateProgramObject(index); - } - - Bool GLContext::ValidateShaderName(const Uint index) const { - return m_programState.ValidateShaderObject(index); - } - - SharedPtr GLContext::GetProgramObject(const Uint index) { - return m_programState.GetProgramObject(index); - } - - SharedPtr GLContext::GetShaderObject(const Uint index) { - return m_programState.GetShaderObject(index); - } - - void GLContext::UseProgram(Uint program) { - return m_programState.UseProgram(program); - } - - SharedPtr GLContext::GetCurrentProgram() { - return m_programState.GetCurrentProgram(); - } - - // RenderState - Uint GLContext::GetRenderStateParametersVersion() const { - return m_renderState.GetVersion(); - } - - const RenderStateParameters& GLContext::GetRenderStateParameters() const { - return m_renderState.GetAllParameters(); - } - - void GLContext::SetViewport(IntVec4 viewport) { - m_renderState.SetViewport(viewport); - } - - const IntVec4& GLContext::GetViewport() const { - return m_renderState.GetViewport(); - } - - void GLContext::SetCapability(CapabilityInput cap, Bool enabled) { - m_renderState.SetCapability(cap, enabled); - } - - Bool GLContext::IsCapabilityEnabled(CapabilityInput cap) const { - return m_renderState.IsCapabilityEnabled(cap); - } - - void GLContext::SetCapabilityIndexed(CapabilityInput cap, Uint index, Bool enabled) { - m_renderState.SetCapabilityIndexed(cap, index, enabled); - } - - Bool GLContext::IsCapabilityEnabledIndexed(CapabilityInput cap, Uint index) const { - return m_renderState.IsCapabilityEnabledIndexed(cap, index); - } - - void GLContext::SetBlendFunc(BlendFactor srcRGB, BlendFactor dstRGB, BlendFactor srcAlpha, - BlendFactor dstAlpha) { - m_renderState.SetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); - } - - void GLContext::GetBlendFunc(BlendFactor& srcRGB, BlendFactor& dstRGB, BlendFactor& srcAlpha, - BlendFactor& dstAlpha) const { - m_renderState.GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); - } - - void GLContext::SetBlendFuncIndexed(Uint index, BlendFactor srcRGB, BlendFactor dstRGB, - BlendFactor srcAlpha, BlendFactor dstAlpha) { - m_renderState.SetBlendFuncIndexed(index, srcRGB, dstRGB, srcAlpha, dstAlpha); - } - - void GLContext::GetBlendFuncIndexed(Uint index, BlendFactor& srcRGB, BlendFactor& dstRGB, - BlendFactor& srcAlpha, BlendFactor& dstAlpha) const { - m_renderState.GetBlendFuncIndexed(index, srcRGB, dstRGB, srcAlpha, dstAlpha); - } - - void GLContext::SetDepthFunc(DepthTestFunc func) { - m_renderState.SetDepthFunc(func); - } - - DepthTestFunc GLContext::GetDepthFunc() const { - return m_renderState.GetDepthFunc(); - } - - void GLContext::SetDepthMask(Bool flag) { - m_renderState.SetDepthMask(flag); - } - - Bool GLContext::GetDepthMask() const { - return m_renderState.GetDepthMask(); - } - - void GLContext::SetColorMask(BoolVec4 mask) { - m_renderState.SetColorMask(mask); - } - - const BoolVec4 GLContext::GetColorMask() const { - return m_renderState.GetColorMask(); - } - - void GLContext::SetClearColor(FloatVec4 color) { - m_renderState.SetClearColor(color); - } - - const FloatVec4& GLContext::GetClearColor() const { - return m_renderState.GetClearColor(); - } - - void GLContext::SetClearDepth(Float depth) { - m_renderState.SetClearDepth(depth); - } - - Float GLContext::GetClearDepth() const { - return m_renderState.GetClearDepth(); - } - - void GLContext::SetClearStencil(Int stencil) { - m_renderState.SetClearStencil(stencil); - } - - Int GLContext::GetClearStencil() const { - return m_renderState.GetClearStencil(); - } - - void GLContext::SetPixelStoreParam(PixelStoreParam param, Int value) { - m_renderState.SetPixelStoreParam(param, value); - } - - Int GLContext::GetPixelStoreParam(PixelStoreParam param) const { - return m_renderState.GetPixelStoreParam(param); - } - - PixelStoreParameters GLContext::GetPixelStoreParameters(Bool isUnpack) const { - return m_renderState.GetPixelStoreParameters(isUnpack); - } - - void GLContext::SetCullFaceMode(CullFaceMode mode) { - m_renderState.SetCullFaceMode(mode); - } - - CullFaceMode GLContext::GetCullFaceMode() const { - return m_renderState.GetCullFaceMode(); - } - - void GLContext::SetScissorBox(IntVec4 box) { - m_renderState.SetScissorBox(box); - } - - const IntVec4& GLContext::GetScissorBox() const { - return m_renderState.GetScissorBox(); - } - - // Framebuffer - Vector GLContext::GenFramebufferNames(Uint number) { - return m_framebufferState.GenerateNames(number); - } - - SharedPtr GLContext::GetFramebufferObject(Uint index) { - return m_framebufferState.GetFramebufferObject(index); - } - - BindingSlot& GLContext::GetFramebufferBindingSlot(FramebufferTarget target) { - return m_framebufferState.GetBindingSlot(target); - } - - SharedPtr GLContext::CreateFramebufferObject(Uint index) { - return m_framebufferState.CreateFramebufferObject(index); - } - - void GLContext::MarkFramebufferObjectForDeletion(Uint index) { - m_framebufferState.MarkFramebufferObjectForDeletion(index); - } - - Bool GLContext::ValidateFramebufferName(Uint index) const { - return m_framebufferState.ValidateName(index); - } - - Bool GLContext::ValidateFramebufferObject(Uint index) const { - return m_framebufferState.ValidateFramebufferObject(index); - } - - // Sampler - Vector GLContext::GenSamplerNames(Uint number) { - return m_samplerState.GenerateNames(number); - } - - SharedPtr GLContext::GetSamplerObject(Uint index) { - return m_samplerState.GetSamplerObject(index); - } - - SharedPtr GLContext::CreateSamplerObject(Uint index) { - return m_samplerState.CreateSamplerObject(index); - } + void GLContext::SetActiveTextureUnit(Int unit) { + m_textureState.SetActiveTextureUnit(unit); + } - void GLContext::MarkSamplerObjectForDeletion(Uint index) { - // Unbind the sampler from all texture units - if (ValidateSamplerObject(index)) { - auto sampler = m_samplerState.GetSamplerObject(index); - for (Int unit = 0; unit < TextureState::MAX_TEXTURE_IMAGE_UNITS; ++unit) { - auto& textureUnit = m_textureState.GetUnitObject(unit); - if (textureUnit.GetSamplerObject() == sampler) { - textureUnit.SetSamplerObject(nullptr); - } + // Program + Uint GLContext::CreateProgram() { + return m_programState.CreateProgram(); + } + + Uint GLContext::CreateShader(const ShaderStage stage) { + return m_programState.CreateShader(stage); + } + + void GLContext::MarkProgramForDeletion(const Uint index) { + return m_programState.MarkProgramObjectForDeletion(index); + } + + void GLContext::MarkShaderForDeletion(const Uint index) { + return m_programState.MarkShaderObjectForDeletion(index); + } + + Bool GLContext::ValidateProgramName(const Uint index) const { + return m_programState.ValidateProgramObject(index); + } + + Bool GLContext::ValidateShaderName(const Uint index) const { + return m_programState.ValidateShaderObject(index); + } + + const SharedPtr& GLContext::GetProgramObject(const Uint index) { + return m_programState.GetProgramObject(index); + } + + const SharedPtr& GLContext::GetShaderObject(const Uint index) { + return m_programState.GetShaderObject(index); + } + + void GLContext::UseProgram(Uint program) { + return m_programState.UseProgram(program); + } + + const SharedPtr& GLContext::GetCurrentProgram() { + return m_programState.GetCurrentProgram(); + } + + // RenderState + Uint GLContext::GetRenderStateParametersVersion() const { + return m_renderState.GetVersion(); + } + + const RenderStateParameters& GLContext::GetRenderStateParameters() const { + return m_renderState.GetAllParameters(); + } + + void GLContext::SetViewport(IntVec4 viewport) { + m_renderState.SetViewport(viewport); + } + + const IntVec4& GLContext::GetViewport() const { + return m_renderState.GetViewport(); + } + + void GLContext::SetCapability(CapabilityInput cap, Bool enabled) { + m_renderState.SetCapability(cap, enabled); + } + + Bool GLContext::IsCapabilityEnabled(CapabilityInput cap) const { + return m_renderState.IsCapabilityEnabled(cap); + } + + void GLContext::SetCapabilityIndexed(CapabilityInput cap, Uint index, Bool enabled) { + m_renderState.SetCapabilityIndexed(cap, index, enabled); + } + + Bool GLContext::IsCapabilityEnabledIndexed(CapabilityInput cap, Uint index) const { + return m_renderState.IsCapabilityEnabledIndexed(cap, index); + } + + void GLContext::SetBlendFunc(BlendFactor srcRGB, BlendFactor dstRGB, BlendFactor srcAlpha, + BlendFactor dstAlpha) { + m_renderState.SetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + void GLContext::GetBlendFunc(BlendFactor& srcRGB, BlendFactor& dstRGB, BlendFactor& srcAlpha, + BlendFactor& dstAlpha) const { + m_renderState.GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + void GLContext::SetBlendFuncIndexed(Uint index, BlendFactor srcRGB, BlendFactor dstRGB, BlendFactor srcAlpha, + BlendFactor dstAlpha) { + m_renderState.SetBlendFuncIndexed(index, srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + void GLContext::GetBlendFuncIndexed(Uint index, BlendFactor& srcRGB, BlendFactor& dstRGB, BlendFactor& srcAlpha, + BlendFactor& dstAlpha) const { + m_renderState.GetBlendFuncIndexed(index, srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + void GLContext::SetDepthFunc(DepthTestFunc func) { + m_renderState.SetDepthFunc(func); + } + + DepthTestFunc GLContext::GetDepthFunc() const { + return m_renderState.GetDepthFunc(); + } + + void GLContext::SetDepthMask(Bool flag) { + m_renderState.SetDepthMask(flag); + } + + Bool GLContext::GetDepthMask() const { + return m_renderState.GetDepthMask(); + } + + void GLContext::SetColorMask(BoolVec4 mask) { + m_renderState.SetColorMask(mask); + } + + BoolVec4 GLContext::GetColorMask() const { + return m_renderState.GetColorMask(); + } + + void GLContext::SetClearColor(FloatVec4 color) { + m_renderState.SetClearColor(color); + } + + const FloatVec4& GLContext::GetClearColor() const { + return m_renderState.GetClearColor(); + } + + void GLContext::SetClearDepth(Float depth) { + m_renderState.SetClearDepth(depth); + } + + Float GLContext::GetClearDepth() const { + return m_renderState.GetClearDepth(); + } + + void GLContext::SetClearStencil(Int stencil) { + m_renderState.SetClearStencil(stencil); + } + + Int GLContext::GetClearStencil() const { + return m_renderState.GetClearStencil(); + } + + void GLContext::SetPixelStoreParam(PixelStoreParam param, Int value) { + m_renderState.SetPixelStoreParam(param, value); + } + + Int GLContext::GetPixelStoreParam(PixelStoreParam param) const { + return m_renderState.GetPixelStoreParam(param); + } + + PixelStoreParameters GLContext::GetPixelStoreParameters(Bool isUnpack) const { + return m_renderState.GetPixelStoreParameters(isUnpack); + } + + void GLContext::SetCullFaceMode(CullFaceMode mode) { + m_renderState.SetCullFaceMode(mode); + } + + CullFaceMode GLContext::GetCullFaceMode() const { + return m_renderState.GetCullFaceMode(); + } + + void GLContext::SetScissorBox(IntVec4 box) { + m_renderState.SetScissorBox(box); + } + + const IntVec4& GLContext::GetScissorBox() const { + return m_renderState.GetScissorBox(); + } + + // Framebuffer + void GLContext::GenFramebufferNames(Uint number, Vector& framebuffers) { + m_framebufferState.GenerateNames(number, framebuffers); + } + + const SharedPtr& GLContext::GetFramebufferObject(Uint index) { + return m_framebufferState.GetFramebufferObject(index); + } + + BindingSlot& GLContext::GetFramebufferBindingSlot(FramebufferTarget target) { + return m_framebufferState.GetBindingSlot(target); + } + + const SharedPtr& GLContext::CreateFramebufferObject(Uint index) { + return m_framebufferState.CreateFramebufferObject(index); + } + + void GLContext::MarkFramebufferObjectForDeletion(Uint index) { + m_framebufferState.MarkFramebufferObjectForDeletion(index); + } + + Bool GLContext::ValidateFramebufferName(Uint index) const { + return m_framebufferState.ValidateName(index); + } + + Bool GLContext::ValidateFramebufferObject(Uint index) const { + return m_framebufferState.ValidateFramebufferObject(index); + } + + // Sampler + void GLContext::GenSamplerNames(Uint number, Vector& samplers) { + m_samplerState.GenerateNames(number, samplers); + } + + const SharedPtr& GLContext::GetSamplerObject(Uint index) { + return m_samplerState.GetSamplerObject(index); + } + + const SharedPtr& GLContext::CreateSamplerObject(Uint index) { + return m_samplerState.CreateSamplerObject(index); + } + + void GLContext::MarkSamplerObjectForDeletion(Uint index) { + // Unbind the sampler from all texture units + if (ValidateSamplerObject(index)) { + auto sampler = m_samplerState.GetSamplerObject(index); + for (Int unit = 0; unit < TextureState::MAX_TEXTURE_IMAGE_UNITS; ++unit) { + auto& textureUnit = m_textureState.GetUnitObject(unit); + if (textureUnit.GetSamplerObject() == sampler) { + textureUnit.SetSamplerObject(nullptr); } } - m_samplerState.MarkSamplerObjectForDeletion(index); } + m_samplerState.MarkSamplerObjectForDeletion(index); + } - Bool GLContext::ValidateSamplerName(Uint index) const { - return m_samplerState.ValidateName(index); - } + Bool GLContext::ValidateSamplerName(Uint index) const { + return m_samplerState.ValidateName(index); + } - Bool GLContext::ValidateSamplerObject(Uint index) const { - return m_samplerState.ValidateSamplerObject(index); - } + Bool GLContext::ValidateSamplerObject(Uint index) const { + return m_samplerState.ValidateSamplerObject(index); + } - // Renderbuffer - Vector GLContext::GenRenderbufferNames(Uint number) { - return m_renderbufferState.GenerateNames(number); - } + // Renderbuffer + void GLContext::GenRenderbufferNames(Uint number, Vector& renderbuffers) { + m_renderbufferState.GenerateNames(number, renderbuffers); + } - SharedPtr GLContext::GetRenderbufferObject(Uint index) { - return m_renderbufferState.GetRenderbufferObject(index); - } + const SharedPtr& GLContext::GetRenderbufferObject(Uint index) { + return m_renderbufferState.GetRenderbufferObject(index); + } - BindingSlot& GLContext::GetRenderbufferBindingSlot(RenderbufferTarget target) { - return m_renderbufferState.GetBindingSlot(target); - } + BindingSlot& GLContext::GetRenderbufferBindingSlot(RenderbufferTarget target) { + return m_renderbufferState.GetBindingSlot(target); + } - SharedPtr GLContext::CreateRenderbufferObject(Uint index) { - return m_renderbufferState.CreateRenderbufferObject(index); - } + const SharedPtr& GLContext::CreateRenderbufferObject(Uint index) { + return m_renderbufferState.CreateRenderbufferObject(index); + } - void GLContext::MarkRenderbufferObjectForDeletion(Uint index) { - m_renderbufferState.MarkRenderbufferObjectForDeletion(index); - } + void GLContext::MarkRenderbufferObjectForDeletion(Uint index) { + m_renderbufferState.MarkRenderbufferObjectForDeletion(index); + } - Bool GLContext::ValidateRenderbufferName(Uint index) const { - return m_renderbufferState.ValidateName(index); - } - } // namespace GLState + Bool GLContext::ValidateRenderbufferName(Uint index) const { + return m_renderbufferState.ValidateName(index); + } - GLState::GLContext* pGLContext; - } // namespace MG_State -} // namespace MobileGL + Bool GLContext::ValidateRenderbufferObject(Uint index) const { + return m_renderbufferState.ValidateRenderbufferObject(index); + } + } // namespace GLState + + UniquePtr pGLContext; +} // namespace MobileGL::MG_State diff --git a/MobileGL/MG_State/GLState/Core.h b/MobileGL/MG_State/GLState/Core.h index 3bc61ea6..8c46eb46 100644 --- a/MobileGL/MG_State/GLState/Core.h +++ b/MobileGL/MG_State/GLState/Core.h @@ -30,42 +30,42 @@ namespace MobileGL { GLContext() = default; // Error - void RecordError(ErrorCode code, SharedPtr info = nullptr); + void RecordError(ErrorCode code, UniquePtr info); Bool HasGLError() const; - Optional PeekGLError() const; - Optional PopGLError(); + Optional PeekNonGLError() const; + Optional> PopNonGLError(); Bool HasNonGLError() const; - Optional PeekNonGLError() const; - Optional PopNonGLError(); + Optional PeekGLError() const; + Optional> PopGLError(); void ClearErrors(); // Buffer - Vector GenBufferNames(Uint number); - SharedPtr GetBufferObject(Uint index); + void GenBufferNames(Uint number, Vector& buffers); + const SharedPtr& GetBufferObject(Uint index); BindingSlot& GetBufferBindingSlot(BufferTarget target); BindingSlotRange1D& GetBufferBindingPoint(BufferTarget target, Uint index); constexpr SizeT GetBufferBindingPointCount(BufferTarget target) const { return m_bufferState.GetBindingPointCount(target); } - SharedPtr CreateBufferObject(Uint index); + const SharedPtr& CreateBufferObject(Uint index); void MarkBufferObjectForDeletion(Uint index); Bool ValidateBufferName(Uint index) const; Bool ValidateBufferObject(Uint index) const; // VertexArray - Vector GenVertexArrayNames(Uint number); - SharedPtr GetVertexArrayObject(Uint index); + void GenVertexArrayNames(Uint number, Vector& vertexArrays); + const SharedPtr& GetVertexArrayObject(Uint index); void BindVertexArray(Uint index); - SharedPtr CreateVertexArrayObject(Uint index); + const SharedPtr& CreateVertexArrayObject(Uint index); void MarkVertexArrayForDeletion(Uint index); Bool ValidateVertexArrayName(Uint index) const; Bool ValidateVertexArrayObject(Uint index) const; - SharedPtr GetBoundVertexArray(); + const SharedPtr& GetBoundVertexArray(); // Texture - Vector GenTextureNames(Uint number); - SharedPtr GetTextureObject(Uint index); - SharedPtr CreateTextureObject(Uint index, TextureTarget target); + void GenTextureNames(Uint number, Vector& textures); + const SharedPtr& GetTextureObject(Uint index); + const SharedPtr& CreateTextureObject(Uint index, TextureTarget target); void MarkTextureObjectForDeletion(Uint index); TextureUnit& GetTextureUnitObject(Int unit); Bool ValidateTextureName(Uint index) const; @@ -80,10 +80,10 @@ namespace MobileGL { void MarkShaderForDeletion(Uint index); Bool ValidateProgramName(Uint index) const; Bool ValidateShaderName(Uint index) const; - SharedPtr GetProgramObject(Uint index); - SharedPtr GetShaderObject(Uint index); + const SharedPtr& GetProgramObject(Uint index); + const SharedPtr& GetShaderObject(Uint index); void UseProgram(Uint program); - SharedPtr GetCurrentProgram(); + const SharedPtr& GetCurrentProgram(); // RenderState Uint GetRenderStateParametersVersion() const; @@ -106,7 +106,7 @@ namespace MobileGL { void SetDepthMask(Bool flag); Bool GetDepthMask() const; void SetColorMask(BoolVec4 mask); - const BoolVec4 GetColorMask() const; + BoolVec4 GetColorMask() const; void SetClearColor(FloatVec4 color); const FloatVec4& GetClearColor() const; void SetClearDepth(Float depth); @@ -122,27 +122,27 @@ namespace MobileGL { const IntVec4& GetScissorBox() const; // x, y, width, height // Framebuffer - Vector GenFramebufferNames(Uint number); - SharedPtr GetFramebufferObject(Uint index); + void GenFramebufferNames(Uint number, Vector& framebuffers); + const SharedPtr& GetFramebufferObject(Uint index); BindingSlot& GetFramebufferBindingSlot(FramebufferTarget target); - SharedPtr CreateFramebufferObject(Uint index); + const SharedPtr& CreateFramebufferObject(Uint index); void MarkFramebufferObjectForDeletion(Uint index); Bool ValidateFramebufferName(Uint index) const; Bool ValidateFramebufferObject(Uint index) const; // Sampler - Vector GenSamplerNames(Uint number); - SharedPtr GetSamplerObject(Uint index); - SharedPtr CreateSamplerObject(Uint index); + void GenSamplerNames(Uint number, Vector& samplers); + const SharedPtr& GetSamplerObject(Uint index); + const SharedPtr& CreateSamplerObject(Uint index); void MarkSamplerObjectForDeletion(Uint index); Bool ValidateSamplerName(Uint index) const; Bool ValidateSamplerObject(Uint index) const; // Renderbuffer - Vector GenRenderbufferNames(Uint number); - SharedPtr GetRenderbufferObject(Uint index); + void GenRenderbufferNames(Uint number, Vector& renderbuffers); + const SharedPtr& GetRenderbufferObject(Uint index); BindingSlot& GetRenderbufferBindingSlot(RenderbufferTarget target); - SharedPtr CreateRenderbufferObject(Uint index); + const SharedPtr& CreateRenderbufferObject(Uint index); void MarkRenderbufferObjectForDeletion(Uint index); Bool ValidateRenderbufferName(Uint index) const; Bool ValidateRenderbufferObject(Uint index) const; @@ -161,6 +161,6 @@ namespace MobileGL { }; } // namespace GLState - extern GLState::GLContext* pGLContext; + extern UniquePtr pGLContext; } // namespace MG_State } // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/ErrorState/Error.cpp b/MobileGL/MG_State/GLState/ErrorState/Error.cpp index d194e9c9..b42c02db 100644 --- a/MobileGL/MG_State/GLState/ErrorState/Error.cpp +++ b/MobileGL/MG_State/GLState/ErrorState/Error.cpp @@ -10,57 +10,53 @@ #include #include -namespace MobileGL { - namespace MG_State { - namespace GLState { - void ErrorState::RecordError(ErrorCode code, SharedPtr info) { - if (code == ErrorCode::NoError) { - MGLOG_E("Recording Non-OpenGL error:\n%s", info->ToString().c_str()); - m_nonGLErrors.push_back(Error{code, info}); - } else { - MGLOG_E("Recording OpenGL error (%s):\n%s", - MG_Util::ConvertGLEnumToString(MG_Util::ConvertErrorCodeToGLEnum(code)).c_str(), - info->ToString().c_str()); - m_errors.push_back(Error{code, info}); - } - } +namespace MobileGL::MG_State::GLState { + void ErrorState::RecordError(ErrorCode code, UniquePtr info) { + if (code == ErrorCode::NoError) { + MGLOG_E("Recording Non-OpenGL error:\n%s", info->toString().c_str()); + m_nonGLErrors.push_back(MakeUnique(code, Move(info))); + } else { + MGLOG_E("Recording OpenGL error (%s):\n%s", + MG_Util::ConvertGLEnumToString(MG_Util::ConvertErrorCodeToGLEnum(code)).c_str(), + info->toString().c_str()); + m_errors.push_back(MakeUnique(code, Move(info))); + } + } - Bool ErrorState::HasNonGLError() const { - return !m_nonGLErrors.empty(); - } + Bool ErrorState::HasNonGLError() const { + return !m_nonGLErrors.empty(); + } - Optional ErrorState::PeekNonGLError() const { - if (m_nonGLErrors.empty()) return Optional{}; - return Optional{m_nonGLErrors.front()}; - } + Optional ErrorState::PeekNonGLError() const { + if (m_nonGLErrors.empty()) return Nullopt; + return Optional{m_nonGLErrors.front().get()}; + } - Optional ErrorState::PopNonGLError() { - if (m_nonGLErrors.empty()) return Optional{}; - auto error = Move(m_nonGLErrors.front()); - m_nonGLErrors.erase(m_nonGLErrors.begin()); - return Optional{error}; - } + Optional> ErrorState::PopNonGLError() { + if (m_nonGLErrors.empty()) return Nullopt; + auto error = Move(m_nonGLErrors.front()); + m_nonGLErrors.erase(m_nonGLErrors.begin()); + return Move(error); + } - Bool ErrorState::HasGLError() const { - return !m_errors.empty(); - } + Bool ErrorState::HasGLError() const { + return !m_errors.empty(); + } - Optional ErrorState::PeekGLError() const { - if (m_errors.empty()) return Optional{}; - return Optional{m_errors.front()}; - } + Optional ErrorState::PeekGLError() const { + if (m_errors.empty()) return Optional{}; + return Optional{m_errors.front().get()}; + } - Optional ErrorState::PopGLError() { - if (m_errors.empty()) return Optional{}; - auto error = Move(m_errors.front()); - m_errors.erase(m_errors.begin()); - return Optional{error}; - } + Optional> ErrorState::PopGLError() { + if (m_errors.empty()) return Nullopt; + auto error = Move(m_errors.front()); + m_errors.erase(m_errors.begin()); + return Move(error); + } - void ErrorState::Clear() { - m_errors.clear(); - m_nonGLErrors.clear(); - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + void ErrorState::Clear() { + m_errors.clear(); + m_nonGLErrors.clear(); + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/ErrorState/Error.h b/MobileGL/MG_State/GLState/ErrorState/Error.h index 7746fa1b..2299f665 100644 --- a/MobileGL/MG_State/GLState/ErrorState/Error.h +++ b/MobileGL/MG_State/GLState/ErrorState/Error.h @@ -14,26 +14,24 @@ namespace MobileGL { struct Error { ErrorCode code; - SharedPtr info; + UniquePtr info; }; - namespace MG_State { - namespace GLState { - class ErrorState { - public: - void RecordError(ErrorCode code, SharedPtr info = nullptr); - Bool HasNonGLError() const; - Optional PeekNonGLError() const; - Optional PopNonGLError(); - Bool HasGLError() const; - Optional PeekGLError() const; - Optional PopGLError(); - void Clear(); + namespace MG_State::GLState { + class ErrorState { + public: + void RecordError(ErrorCode code, UniquePtr info); + Bool HasNonGLError() const; + Optional PeekNonGLError() const; + Optional> PopNonGLError(); + Bool HasGLError() const; + Optional PeekGLError() const; + Optional> PopGLError(); + void Clear(); - private: - Vector m_errors; - Vector m_nonGLErrors; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + private: + Vector> m_errors; + Vector> m_nonGLErrors; + }; + } // namespace MG_State::GLState +} // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/ErrorState/ErrorInfo.h b/MobileGL/MG_State/GLState/ErrorState/ErrorInfo.h index b2477b06..7970fab8 100644 --- a/MobileGL/MG_State/GLState/ErrorState/ErrorInfo.h +++ b/MobileGL/MG_State/GLState/ErrorState/ErrorInfo.h @@ -13,7 +13,7 @@ namespace MobileGL { class ErrorInfo { public: virtual ~ErrorInfo() = default; - virtual String ToString() const = 0; + virtual String toString() const = 0; }; class GenericErrorInfo : public ErrorInfo { @@ -24,7 +24,7 @@ namespace MobileGL { explicit GenericErrorInfo(String m_prefix, String m_prefix_2, String message) : m_message(Move(message)), m_prefix(Move(m_prefix)), m_prefix_2(Move(m_prefix_2)) {} - String ToString() const override { + String toString() const override { StringStream ss; if (m_prefix.has_value()) { ss << "[" << m_prefix.value() << "] "; diff --git a/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp b/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp index 719421e5..1fbf6765 100644 --- a/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp +++ b/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp @@ -9,157 +9,153 @@ #include "FramebufferObject.h" #include "MG_Util/Types.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - // FramebufferAttachmentObject - FramebufferAttachmentObject::FramebufferAttachmentObject( - SharedPtr texture, Int level) - : m_texture(texture), m_textureLevel(level) {} - FramebufferAttachmentObject::FramebufferAttachmentObject(SharedPtr renderbuffer) - : m_renderbuffer(renderbuffer) {} - FramebufferAttachmentObject::FramebufferAttachmentObject(Bool IsValid) - : m_texture(nullptr), m_renderbuffer(nullptr) { - m_isValid = IsValid; - } +namespace MobileGL::MG_State::GLState { + // FramebufferAttachmentObject + FramebufferAttachmentObject::FramebufferAttachmentObject( + const SharedPtr& texture, Int level) + : m_texture(texture), m_textureLevel(level) {} + FramebufferAttachmentObject::FramebufferAttachmentObject(const SharedPtr& renderbuffer) + : m_renderbuffer(renderbuffer) {} + FramebufferAttachmentObject::FramebufferAttachmentObject(Bool IsValid) + : m_texture(nullptr), m_renderbuffer(nullptr) { + m_isValid = IsValid; + } - Bool FramebufferAttachmentObject::IsTexture() const { - return m_texture != nullptr; - } + Bool FramebufferAttachmentObject::IsTexture() const { + return m_texture != nullptr; + } - Bool FramebufferAttachmentObject::IsRenderbuffer() const { - return m_renderbuffer != nullptr; - } + Bool FramebufferAttachmentObject::IsRenderbuffer() const { + return m_renderbuffer != nullptr; + } - Bool FramebufferAttachmentObject::IsEmpty() const { - return m_texture == nullptr && m_renderbuffer == nullptr; - } + Bool FramebufferAttachmentObject::IsEmpty() const { + return m_texture == nullptr && m_renderbuffer == nullptr; + } - SharedPtr FramebufferAttachmentObject::GetTexture() const { - return m_texture; - } + const SharedPtr& FramebufferAttachmentObject::GetTexture() const { + return m_texture; + } - SharedPtr FramebufferAttachmentObject::GetRenderbuffer() const { - return m_renderbuffer; - } + const SharedPtr& FramebufferAttachmentObject::GetRenderbuffer() const { + return m_renderbuffer; + } - Int FramebufferAttachmentObject::GetTextureLevel() const { - return m_textureLevel; - } + Int FramebufferAttachmentObject::GetTextureLevel() const { + return m_textureLevel; + } - Bool FramebufferAttachmentObject::IsComplete() const { - if (IsTexture()) { - Bool complete = m_texture->IsComplete(); - return complete; - } else if (IsRenderbuffer()) { - Bool complete = m_renderbuffer->IsAllocated(); - return complete; - } + Bool FramebufferAttachmentObject::IsComplete() const { + if (IsTexture()) { + Bool complete = m_texture->IsComplete(); + return complete; + } else if (IsRenderbuffer()) { + Bool complete = m_renderbuffer->IsAllocated(); + return complete; + } + return false; + } + + IntVec3 FramebufferAttachmentObject::GetSize() const { + if (IsTexture()) { + // TODO: get correct upload target + MOBILEGL_ASSERT(nullptr != dynamic_cast(m_texture.get()), + "Texture object here should always be an object with mipmap"); + auto textureMipmapObject = dynamic_cast(m_texture.get()); + return textureMipmapObject->GetMipmapTexelSize(TextureUploadTarget::Texture2D, m_textureLevel); + } else if (IsRenderbuffer()) { + return {m_renderbuffer->GetWidth(), m_renderbuffer->GetHeight(), 1}; + } + return {0, 0, 0}; + } + + Bool FramebufferAttachmentObject::IsValid() const { + return m_isValid; + } + + // FramebufferObject + FramebufferObject::FramebufferObject(Uint externalIndex) + : m_externalIndex(externalIndex), m_attachmentVersions{}, m_drawBuffers{} { + m_attachmentObjects.fill(FramebufferAttachmentObject(false)); + m_drawBuffers.fill(FramebufferAttachmentType::None); + m_drawBuffers[0] = FramebufferAttachmentType::Color0; + m_attachmentVersions.fill(0); + } + + void FramebufferObject::AttachTexture(FramebufferAttachmentType type, const SharedPtr& texture, + int level) { + m_attachmentObjects[static_cast(type)] = FramebufferAttachmentObject(texture, level); + BumpAttachmentVersion(type); + } + + void FramebufferObject::AttachRenderbuffer(FramebufferAttachmentType type, + const SharedPtr& renderbuffer) { + m_attachmentObjects[static_cast(type)] = FramebufferAttachmentObject(renderbuffer); + BumpAttachmentVersion(type); + } + + void FramebufferObject::Detach(FramebufferAttachmentType type) { + m_attachmentObjects[static_cast(type)] = FramebufferAttachmentObject(false); + BumpAttachmentVersion(type); + } + + const FramebufferAttachmentObject& FramebufferObject::GetAttachment(FramebufferAttachmentType type) const { + return m_attachmentObjects[static_cast(type)]; + } + + const FramebufferObject::FramebufferAttachmentObjectArray& FramebufferObject::GetAllAttachmentObjects() const { + return m_attachmentObjects; + } + + Bool FramebufferObject::CheckCompleteness() const { + if (m_attachmentObjects.empty()) { + return false; + } + + Int width = -1, height = -1; + Int validAttachmentCount = 0; + for (const auto& attachmentObject : m_attachmentObjects) { + if (!attachmentObject.IsValid()) continue; + + ++validAttachmentCount; + const auto& attachment = attachmentObject; + auto attachmentSize = attachment.GetSize(); + Int w = attachmentSize.x(); + Int h = attachmentSize.y(); + + if (width == -1) { + width = w; + height = h; + } else if (width != w || height != h) { return false; } - IntVec3 FramebufferAttachmentObject::GetSize() const { - if (IsTexture()) { - // TODO: get correct upload target - MOBILEGL_ASSERT(nullptr != dynamic_cast(m_texture.get()), - "Texture object here should always be an object with mipmap"); - auto textureMipmapObject = static_cast(m_texture.get()); - return textureMipmapObject->GetMipmapTexelSize(TextureUploadTarget::Texture2D, m_textureLevel); - } else if (IsRenderbuffer()) { - return IntVec3(m_renderbuffer->GetWidth(), m_renderbuffer->GetHeight(), 1); - } - return {0, 0, 0}; + if (!attachment.IsComplete()) { + return false; } + } - Bool FramebufferAttachmentObject::IsValid() const { - return m_isValid; - } + if (validAttachmentCount == 0) return false; + return true; + } - // FramebufferObject - FramebufferObject::FramebufferObject(Uint externalIndex) : m_externalIndex(externalIndex) { - m_attachmentObjects.fill(FramebufferAttachmentObject(false)); - m_drawBuffers.fill(FramebufferAttachmentType::None); - m_drawBuffers[0] = FramebufferAttachmentType::Color0; - m_attachmentVersions.fill(0); - } + void FramebufferObject::SetDrawBuffer(Uint index, FramebufferAttachmentType buffer) { + if (m_drawBuffers[index] == buffer) return; + m_drawBuffers[index] = buffer; + BumpAttachmentVersion(buffer); + } - void FramebufferObject::AttachTexture(FramebufferAttachmentType type, SharedPtr texture, - int level) { - m_attachmentObjects[static_cast(type)] = FramebufferAttachmentObject(std::move(texture), level); - BumpAttachmentVersion(type); - } + const FramebufferObject::FramebufferAttachmentArray& FramebufferObject::GetDrawBuffers() const { + return m_drawBuffers; + } - void FramebufferObject::AttachRenderbuffer(FramebufferAttachmentType type, - std::shared_ptr renderbuffer) { - m_attachmentObjects[static_cast(type)] = FramebufferAttachmentObject(renderbuffer); - BumpAttachmentVersion(type); - } + Uint FramebufferObject::GetExternalIndex() const { + return m_externalIndex; + } - void FramebufferObject::Detach(FramebufferAttachmentType type) { - m_attachmentObjects[static_cast(type)] = FramebufferAttachmentObject(false); - BumpAttachmentVersion(type); - } - - const FramebufferAttachmentObject& FramebufferObject::GetAttachment(FramebufferAttachmentType type) const { - return m_attachmentObjects[static_cast(type)]; - } - - const FramebufferObject::FramebufferAttachmentObjectArray& FramebufferObject::GetAllAttachmentObjects() - const { - return m_attachmentObjects; - } - - Bool FramebufferObject::CheckCompleteness() const { - if (m_attachmentObjects.empty()) { - return false; - } - - Int width = -1, height = -1; - Int validAttachmentCount = 0; - for (SizeT i = 0; i < m_attachmentObjects.size(); ++i) { - if (!m_attachmentObjects[i].IsValid()) continue; - - ++validAttachmentCount; - const auto& attachment = m_attachmentObjects[i]; - auto attachmentSize = attachment.GetSize(); - Int w = attachmentSize.x(); - Int h = attachmentSize.y(); - - if (width == -1) { - width = w; - height = h; - } else if (width != w || height != h) { - return false; - } - - if (!attachment.IsComplete()) { - return false; - } - } - - if (validAttachmentCount == 0) return false; - return true; - } - - void FramebufferObject::SetDrawBuffer(Uint index, FramebufferAttachmentType buffer) { - if (m_drawBuffers[index] == buffer) return; - m_drawBuffers[index] = buffer; - BumpAttachmentVersion(buffer); - } - - const FramebufferObject::FramebufferAttachmentArray& FramebufferObject::GetDrawBuffers() const { - return m_drawBuffers; - } - - Uint FramebufferObject::GetExternalIndex() const { - return m_externalIndex; - } - - void FramebufferObject::BumpAttachmentVersion(FramebufferAttachmentType type) { - ++m_attachmentVersions[static_cast(type)]; - ++m_objectVersion; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + void FramebufferObject::BumpAttachmentVersion(FramebufferAttachmentType type) { + ++m_attachmentVersions[static_cast(type)]; + ++m_objectVersion; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.h b/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.h index c0061971..2cf2bb7a 100644 --- a/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.h +++ b/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.h @@ -7,6 +7,7 @@ // End of Source File Header #pragma once +#include "MG_Util/Types.h" #include #include #include @@ -67,81 +68,78 @@ namespace MobileGL { Unknown = -1 }; - namespace MG_State { - namespace GLState { - class FramebufferAttachmentObject { - public: - explicit FramebufferAttachmentObject(SharedPtr texture, - Int level = 0); - explicit FramebufferAttachmentObject(SharedPtr renderbuffer); - explicit FramebufferAttachmentObject(Bool IsValid = true); + namespace MG_State::GLState { + class FramebufferAttachmentObject { + public: + explicit FramebufferAttachmentObject(const SharedPtr& texture, + Int level = 0); + explicit FramebufferAttachmentObject(const SharedPtr& renderbuffer); + explicit FramebufferAttachmentObject(Bool IsValid = true); - Bool IsTexture() const; - Bool IsRenderbuffer() const; - Bool IsEmpty() const; - SharedPtr GetTexture() const; - SharedPtr GetRenderbuffer() const; - Int GetTextureLevel() const; - Bool IsComplete() const; - IntVec3 GetSize() const; - Bool IsValid() const; + Bool IsTexture() const; + Bool IsRenderbuffer() const; + Bool IsEmpty() const; + const SharedPtr& GetTexture() const; + const SharedPtr& GetRenderbuffer() const; + Int GetTextureLevel() const; + Bool IsComplete() const; + IntVec3 GetSize() const; + Bool IsValid() const; - private: - SharedPtr m_texture = nullptr; - SharedPtr m_renderbuffer = nullptr; - Int m_textureLevel = 0; - Bool m_isValid = true; - }; + private: + SharedPtr m_texture = nullptr; + SharedPtr m_renderbuffer = nullptr; + Int m_textureLevel = 0; + Bool m_isValid = true; + }; - class FramebufferObject { - public: - static constexpr Uint MAX_DRAW_BUFFERS = 8; + class FramebufferObject { + public: + static constexpr Uint MAX_DRAW_BUFFERS = 8; - using TargetEnum = FramebufferTarget; - using FramebufferAttachmentObjectArray = - Array(FramebufferAttachmentType::FramebufferAttachmentTypeCount)>; - using FramebufferAttachmentArray = Array; - using FramebufferAttachmentVersionArray = - Array(FramebufferAttachmentType::FramebufferAttachmentTypeCount)>; + using TargetEnum = FramebufferTarget; + using FramebufferAttachmentObjectArray = + Array(FramebufferAttachmentType::FramebufferAttachmentTypeCount)>; + using FramebufferAttachmentArray = Array; + using FramebufferAttachmentVersionArray = + Array(FramebufferAttachmentType::FramebufferAttachmentTypeCount)>; - FramebufferObject(Uint externalIndex); + FramebufferObject(Uint externalIndex); - void AttachTexture(FramebufferAttachmentType type, SharedPtr texture, int level = 0); - void AttachRenderbuffer(FramebufferAttachmentType type, - std::shared_ptr renderbuffer); - void Detach(FramebufferAttachmentType type); - const FramebufferAttachmentObject& GetAttachment(FramebufferAttachmentType type) const; - const FramebufferAttachmentObjectArray& GetAllAttachmentObjects() const; - Bool CheckCompleteness() const; - // aka. `buffer` as in glDrawBuffers/glReadBuffers - void SetDrawBuffer(Uint index, FramebufferAttachmentType buffer); - const FramebufferAttachmentArray& GetDrawBuffers() const; - void SetReadBuffer(FramebufferAttachmentType buf) { m_readBuffer = buf; } - FramebufferAttachmentType GetReadBuffer() const { return m_readBuffer; } + void AttachTexture(FramebufferAttachmentType type, const SharedPtr& texture, int level = 0); + void AttachRenderbuffer(FramebufferAttachmentType type, const SharedPtr& renderbuffer); + void Detach(FramebufferAttachmentType type); + const FramebufferAttachmentObject& GetAttachment(FramebufferAttachmentType type) const; + const FramebufferAttachmentObjectArray& GetAllAttachmentObjects() const; + Bool CheckCompleteness() const; + // aka. `buffer` as in glDrawBuffers/glReadBuffers + void SetDrawBuffer(Uint index, FramebufferAttachmentType buffer); + const FramebufferAttachmentArray& GetDrawBuffers() const; + void SetReadBuffer(FramebufferAttachmentType buf) { m_readBuffer = buf; } + FramebufferAttachmentType GetReadBuffer() const { return m_readBuffer; } - const FramebufferAttachmentVersionArray GetAllFramebufferAttachmentVersions() const { - return m_attachmentVersions; - } + FramebufferAttachmentVersionArray GetAllFramebufferAttachmentVersions() const { + return m_attachmentVersions; + } - Uint16 GetObjectVersion() const { return m_objectVersion; } + Uint16 GetObjectVersion() const { return m_objectVersion; } - Uint GetExternalIndex() const; + Uint GetExternalIndex() const; - private: - void BumpAttachmentVersion(FramebufferAttachmentType type); + private: + void BumpAttachmentVersion(FramebufferAttachmentType type); - const Uint m_externalIndex = 0; - FramebufferAttachmentObjectArray m_attachmentObjects; - FramebufferAttachmentVersionArray m_attachmentVersions; + const Uint m_externalIndex = 0; + FramebufferAttachmentObjectArray m_attachmentObjects; + FramebufferAttachmentVersionArray m_attachmentVersions; - FramebufferAttachmentArray m_drawBuffers; // Probably no versioning needed for this, just check equality - FramebufferAttachmentType m_readBuffer = FramebufferAttachmentType::Color0; // ditto + FramebufferAttachmentArray m_drawBuffers; // Probably no versioning needed for this, just check equality + FramebufferAttachmentType m_readBuffer = FramebufferAttachmentType::Color0; // ditto - // This version will bump when draw/read buffer changes (by `glDrawBuffer(s)`/`glReadBuffer`) - Uint16 m_objectVersion = 0; - }; + // This version will bump when draw/read buffer changes (by `glDrawBuffer(s)`/`glReadBuffer`) + Uint16 m_objectVersion = 0; + }; - } // namespace GLState - } // namespace MG_State + } // namespace MG_State::GLState } // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/FramebufferState/FramebufferState.cpp b/MobileGL/MG_State/GLState/FramebufferState/FramebufferState.cpp index 8cb8bf2f..50a683e4 100644 --- a/MobileGL/MG_State/GLState/FramebufferState/FramebufferState.cpp +++ b/MobileGL/MG_State/GLState/FramebufferState/FramebufferState.cpp @@ -9,74 +9,73 @@ #include "FramebufferState.h" #include "MG_State/GLState/FramebufferState/FramebufferObject.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - FramebufferState::FramebufferState() { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - m_bindingSlots[i] = BindingSlot(static_cast(i)); - } - } +namespace MobileGL::MG_State::GLState { + FramebufferState::FramebufferState() { + for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { + m_bindingSlots[i] = BindingSlot(static_cast(i)); + } + } - SharedPtr FramebufferState::GetFramebufferObject(Uint index) { - auto it = m_framebufferObjects.find(index); - if (it != m_framebufferObjects.end()) { - return it->second; - } - return nullptr; - } + const SharedPtr& FramebufferState::GetFramebufferObject(Uint index) { + auto it = m_framebufferObjects.find(index); + if (it != m_framebufferObjects.end()) { + return it->second; + } + static SharedPtr nullFramebufferObject = nullptr; + return nullFramebufferObject; + } - Vector FramebufferState::GenerateNames(Uint number) { - Vector buffers(number); - m_indexGenerator.Generate(number, buffers.data()); - return buffers; - } + void FramebufferState::GenerateNames(Uint number, Vector& buffers) { + buffers.resize(number); + m_indexGenerator.Generate(number, buffers.data()); + } - SharedPtr FramebufferState::CreateFramebufferObject(Uint index) { - if (index == 0) { - if (!m_indexGenerator.IsValid(0)) { - m_indexGenerator.Insert(0); - } else { - return nullptr; + const SharedPtr& FramebufferState::CreateFramebufferObject(Uint index) { + if (index == 0) { + if (!m_indexGenerator.IsValid(0)) { + m_indexGenerator.Insert(0); + } else { + static SharedPtr nullFramebufferObject = nullptr; + return nullFramebufferObject; + } + } + auto& framebufferObject = m_framebufferObjects[index]; + if (!framebufferObject) { + framebufferObject = MakeShared(index); + } + return framebufferObject; + } + + BindingSlot& FramebufferState::GetBindingSlot(FramebufferTarget target) { + for (auto& bindingSlot : m_bindingSlots) { + if (bindingSlot.GetTarget() == target) { + return bindingSlot; + } + } + MOBILEGL_ASSERT(false, "Invalid FramebufferTarget enum value: %d", static_cast(target)); + return m_bindingSlots[0]; + } + + void FramebufferState::MarkFramebufferObjectForDeletion(Uint index) { + if (m_indexGenerator.IsValid(index)) { + auto it = m_framebufferObjects.find(index); + if (it != m_framebufferObjects.end()) { + for (auto& bindingSlot : m_bindingSlots) { + if (bindingSlot.GetBoundObject() == it->second) { + bindingSlot.Bind(nullptr); } } - auto bufferObject = MakeShared(index); - m_framebufferObjects[index] = bufferObject; - return bufferObject; + m_framebufferObjects.erase(it); } + m_indexGenerator.Delete(index); + } + } - BindingSlot& FramebufferState::GetBindingSlot(FramebufferTarget target) { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - if (m_bindingSlots[i].GetTarget() == target) { - return m_bindingSlots[i]; - } - } - MOBILEGL_ASSERT(false, "Invalid FramebufferTarget enum value: %d", static_cast(target)); - return m_bindingSlots[0]; - } + Bool FramebufferState::ValidateName(Uint index) const { + return m_indexGenerator.IsValid(index); + } - void FramebufferState::MarkFramebufferObjectForDeletion(Uint index) { - if (m_indexGenerator.IsValid(index)) { - auto it = m_framebufferObjects.find(index); - if (it != m_framebufferObjects.end()) { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - if (m_bindingSlots[i].GetBoundObject() == it->second) { - m_bindingSlots[i].Bind(nullptr); - } - } - m_framebufferObjects.erase(it); - } - m_indexGenerator.Delete(index); - } - } - - Bool FramebufferState::ValidateName(Uint index) const { - return m_indexGenerator.IsValid(index); - } - - Bool FramebufferState::ValidateFramebufferObject(Uint index) const { - return m_framebufferObjects.find(index) != m_framebufferObjects.end(); - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + Bool FramebufferState::ValidateFramebufferObject(Uint index) const { + return m_framebufferObjects.find(index) != m_framebufferObjects.end(); + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/FramebufferState/FramebufferState.h b/MobileGL/MG_State/GLState/FramebufferState/FramebufferState.h index 60cb97cd..3e822be7 100644 --- a/MobileGL/MG_State/GLState/FramebufferState/FramebufferState.h +++ b/MobileGL/MG_State/GLState/FramebufferState/FramebufferState.h @@ -11,28 +11,24 @@ #include #include "FramebufferObject.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - class FramebufferState { - public: - FramebufferState(); +namespace MobileGL::MG_State::GLState { + class FramebufferState { + public: + FramebufferState(); - // FBO 0 should be created by MG_Backend when initializing the context - SharedPtr GetFramebufferObject(Uint index); - Vector GenerateNames(Uint number); - SharedPtr CreateFramebufferObject(Uint index); - BindingSlot& GetBindingSlot(FramebufferTarget target); - void MarkFramebufferObjectForDeletion(Uint index); - Bool ValidateName(Uint index) const; - Bool ValidateFramebufferObject(Uint index) const; + // FBO 0 should be created by MG_Backend when initializing the context + const SharedPtr& GetFramebufferObject(Uint index); + void GenerateNames(Uint number, Vector& framebuffers); + const SharedPtr& CreateFramebufferObject(Uint index); + BindingSlot& GetBindingSlot(FramebufferTarget target); + void MarkFramebufferObjectForDeletion(Uint index); + Bool ValidateName(Uint index) const; + Bool ValidateFramebufferObject(Uint index) const; - private: - UnorderedMap> m_framebufferObjects; - IndexGenerator m_indexGenerator; - Array, static_cast(FramebufferTarget::FramebufferTargetCount)> - m_bindingSlots; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + private: + UnorderedMap> m_framebufferObjects; + IndexGenerator m_indexGenerator; + Array, static_cast(FramebufferTarget::FramebufferTargetCount)> + m_bindingSlots; + }; +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp index c3bac839..11e5ed62 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp @@ -7,8 +7,8 @@ // End of Source File Header #include "ProgramObject.h" -#include "MG_Util/Converters/GLToStr/GLEnumConverter.h" -#include "MG_Util/ShaderTranspiler/Types.h" +#include +#include #include #include #include @@ -18,544 +18,530 @@ layout(location = 0) out vec4 FragColor; void main() {} )"; -namespace MobileGL { - namespace MG_State { - namespace GLState { - bool ProgramObject::ShaderIsAttached(SharedPtr shader) { - MGLOG_D("ProgramObject %u: ShaderIsAttached check for shader %p", m_externalIndex, shader.get()); - auto it = std::find_if(m_shaders.begin(), m_shaders.end(), - [shader](const SharedPtr& s) { return s.get() == shader.get(); }); - bool attached = it != m_shaders.end(); - MGLOG_D("ProgramObject %u: ShaderIsAttached -> %s", m_externalIndex, attached ? "true" : "false"); - return attached; +namespace MobileGL::MG_State::GLState { + bool ProgramObject::ShaderIsAttached(const SharedPtr& shader) { + MGLOG_D("ProgramObject %u: ShaderIsAttached check for shader %p", m_externalIndex, shader.get()); + auto it = std::find_if(m_shaders.begin(), m_shaders.end(), + [shader](const SharedPtr& s) { return s.get() == shader.get(); }); + bool attached = it != m_shaders.end(); + MGLOG_D("ProgramObject %u: ShaderIsAttached -> %s", m_externalIndex, attached ? "true" : "false"); + return attached; + } + + bool ProgramObject::AttachShader(const SharedPtr& shader) { + MGLOG_D("ProgramObject %u: AttachShader called for shader %p", m_externalIndex, shader.get()); + if (ShaderIsAttached(shader)) { + MGLOG_D("ProgramObject %u: AttachShader - shader already attached, skipping", m_externalIndex); + return false; + } + m_shaders.emplace_back(shader); + MGLOG_D("ProgramObject %u: AttachShader - attached successfully, total shaders now %zu", m_externalIndex, + m_shaders.size()); + return true; + } + + SizeT ProgramObject::DetachShader(const SharedPtr& shader) { + MGLOG_D("DetachShader called for shader %p from ProgramObject %u", shader.get(), m_externalIndex); + if (!ShaderIsAttached(shader)) { + MGLOG_D("Shader %p is not attached to ProgramObject %u, cannot detach.", shader.get(), m_externalIndex); + return 0; + } + m_detachedShaders.push_back(shader); + MGLOG_D("Shader %p marked for detachment from ProgramObject %u", shader.get(), m_externalIndex); + return 1; + } + + SizeT ProgramObject::RemoveShader(const SharedPtr& shader) { + MGLOG_D("ProgramObject %u: RemoveShader called for shader %p", m_externalIndex, shader.get()); + auto count = + std::erase_if(m_shaders, [shader](const SharedPtr& s) { return s.get() == shader.get(); }); + + MGLOG_D("ProgramObject %u: RemoveShader - removed %zu shader(s), remaining %zu", m_externalIndex, count, + m_shaders.size()); + return count; + } + + void ProgramObject::AddDefaultFragmentShaderIfMissing() { + Bool needsDefaultFS = false; + for (const auto& shader : m_shaders) { + auto stage = shader->GetShaderStage(); + if (stage == ShaderStage::Vertex) { + needsDefaultFS = true; + continue; } - - bool ProgramObject::AttachShader(SharedPtr shader) { - MGLOG_D("ProgramObject %u: AttachShader called for shader %p", m_externalIndex, shader.get()); - if (ShaderIsAttached(shader)) { - MGLOG_D("ProgramObject %u: AttachShader - shader already attached, skipping", m_externalIndex); - return false; - } - m_shaders.emplace_back(shader); - MGLOG_D("ProgramObject %u: AttachShader - attached successfully, total shaders now %zu", - m_externalIndex, m_shaders.size()); - return true; + if (stage == ShaderStage::Fragment) { + needsDefaultFS = false; + return; } + } - SizeT ProgramObject::DetachShader(SharedPtr shader) { - MGLOG_D("DetachShader called for shader %p from ProgramObject %u", shader.get(), m_externalIndex); - if (!ShaderIsAttached(shader)) { - MGLOG_D("Shader %p is not attached to ProgramObject %u, cannot detach.", shader.get(), - m_externalIndex); - return 0; - } - m_detachedShaders.push_back(shader); - MGLOG_D("Shader %p marked for detachment from ProgramObject %u", shader.get(), m_externalIndex); - return 1; - } + if (!needsDefaultFS) return; - SizeT ProgramObject::RemoveShader(SharedPtr shader) { - MGLOG_D("ProgramObject %u: RemoveShader called for shader %p", m_externalIndex, shader.get()); - auto count = std::erase_if( - m_shaders, [shader](const SharedPtr& s) { return s.get() == shader.get(); }); + MGLOG_D("ProgramObject %u: No fragment shader attached, adding default fragment shader.", m_externalIndex); + SharedPtr defaultFS = MakeShared(ShaderStage::Fragment, 0); + defaultFS->SetShaderSource(kDefaultFragmentShaderSource); + defaultFS->Compile(); // TODO: use a global default FS object. + auto status = defaultFS->GetCompileStatus(); + if (!status) { + MGLOG_E("ProgramObject %u: Failed to compile default fragment shader. InfoLog:\n%s", m_externalIndex, + defaultFS->GetInfoLog().c_str()); + return; + } + m_shaders.push_back(defaultFS); + MGLOG_D("ProgramObject %u: Default fragment shader added.", m_externalIndex); + } - MGLOG_D("ProgramObject %u: RemoveShader - removed %zu shader(s), remaining %zu", m_externalIndex, count, - m_shaders.size()); - return count; - } + void ProgramObject::Link(Bool addDefaultFSIfMissingForRenderingPipelineProgram) { + MGLOG_D("ProgramObject %u: Link start, shaders to link: %zu", m_externalIndex, m_shaders.size()); + // Remove detached shaders first + for (const auto& detachedShader : m_detachedShaders) { + RemoveShader(detachedShader); + } + m_detachedShaders.clear(); - void ProgramObject::AddDefaultFragmentShaderIfMissing() { - Bool needsDefaultFS = false; - for (const auto& shader : m_shaders) { - auto stage = shader->GetShaderStage(); - if (stage == ShaderStage::Vertex) { - needsDefaultFS = true; - continue; - } - if (stage == ShaderStage::Fragment) { - needsDefaultFS = false; - return; - } - } + Vector shaderTypes(m_shaders.size()); + Vector> shaders(m_shaders.size()); - if (!needsDefaultFS) return; + if (addDefaultFSIfMissingForRenderingPipelineProgram) { + AddDefaultFragmentShaderIfMissing(); + } - MGLOG_D("ProgramObject %u: No fragment shader attached, adding default fragment shader.", - m_externalIndex); - SharedPtr defaultFS = MakeShared(ShaderStage::Fragment, 0); - defaultFS->SetShaderSource(kDefaultFragmentShaderSource); - defaultFS->Compile(); // TODO: use a global default FS object. - auto status = defaultFS->GetCompileStatus(); - if (!status) { - MGLOG_E("ProgramObject %u: Failed to compile default fragment shader. InfoLog:\n%s", - m_externalIndex, defaultFS->GetInfoLog().c_str()); - return; - } - m_shaders.push_back(defaultFS); - MGLOG_D("ProgramObject %u: Default fragment shader added.", m_externalIndex); - } + std::sort(m_shaders.begin(), m_shaders.end(), + [](const SharedPtr& a, const SharedPtr& b) { + return a->GetShaderStage() < b->GetShaderStage(); + }); - void ProgramObject::Link(Bool addDefaultFSIfMissingForRenderingPipelineProgram) { - MGLOG_D("ProgramObject %u: Link start, shaders to link: %zu", m_externalIndex, m_shaders.size()); - // Remove detached shaders first - for (const auto& detachedShader : m_detachedShaders) { - RemoveShader(detachedShader); - } - m_detachedShaders.clear(); + for (SizeT i = 0; i < m_shaders.size(); i++) { + shaderTypes[i] = MG_Util::ConvertShaderStageToGLEnum(m_shaders[i]->GetShaderStage()); + MGLOG_D("ProgramObject %u: Preparing shader[%zu] stage %s at %p", m_externalIndex, i, + MG_Util::ConvertGLEnumToString(shaderTypes[i]).c_str(), m_shaders[i].get()); - Vector shaderTypes(m_shaders.size()); - Vector> shaders(m_shaders.size()); - - if (addDefaultFSIfMissingForRenderingPipelineProgram) { - AddDefaultFragmentShaderIfMissing(); - } - - std::sort(m_shaders.begin(), m_shaders.end(), - [](SharedPtr& a, SharedPtr& b) { - return a->GetShaderStage() < b->GetShaderStage(); - }); - - for (SizeT i = 0; i < m_shaders.size(); i++) { - shaderTypes[i] = MG_Util::ConvertShaderStageToGLEnum(m_shaders[i]->GetShaderStage()); - MGLOG_D("ProgramObject %u: Preparing shader[%zu] stage %s at %p", m_externalIndex, i, - MG_Util::ConvertGLEnumToString(shaderTypes[i]).c_str(), m_shaders[i].get()); - - if (!m_shaders[i]->GetCompileStatus()) { - m_infoLog = - std::format("Linking a {} with compilation error, linking will now terminate. Shader error " + if (!m_shaders[i]->GetCompileStatus()) { + m_infoLog = std::format("Linking a {} with compilation error, linking will now terminate. Shader error " "log:\n{}\nShader src:\n{}", - MG_Util::ConvertGLEnumToString(shaderTypes[i]).c_str(), - m_shaders[i]->GetInfoLog().c_str(), m_shaders[i]->GetShaderSource().c_str()); - m_linkStatus = false; - MGLOG_E("ProgramObject %u: Link failed - shader[%zu] compile status false. InfoLog:\n%s", - m_externalIndex, i, m_infoLog.c_str()); - return; - } - shaders[i] = m_shaders[i]->GetCompiledShader(); - MGLOG_D("ProgramObject %u: shader[%zu] compiled shader ptr %p, src len %zu", m_externalIndex, i, - shaders[i].get(), m_shaders[i]->GetShaderSource().length()); - MGLOG_D("ProgramObject %u: shader[%zu] source:\n%s", m_externalIndex, i, - m_shaders[i]->GetShaderSource().c_str()); - } - - MG_Util::ShaderTranspiler::ProgramAttrib attrib{.shaders = Move(shaders), - .explicitVertexInLocations = m_explicitAttribLocations, - .explicitFragmentOutLocations = - m_explicitFragDataLocation}; - - MGLOG_D("ProgramObject %u: Calling ShaderCompiler::LinkProgram", m_externalIndex); - auto result = MG_Util::ShaderTranspiler::ShaderCompiler::LinkProgram(attrib); - if (result) { - m_linkStatus = true; - m_program = result.value(); - MGLOG_D("ProgramObject %u: LinkProgram succeeded, TProgram ptr %p", m_externalIndex, - m_program.get()); - } else { - m_linkStatus = false; - m_infoLog = result.error().log; - MGLOG_E("ProgramObject %u: LinkProgram failed. InfoLog:\n%s", m_externalIndex, m_infoLog.c_str()); - } - - MGLOG_D("ProgramObject %u: Starting reflection", m_externalIndex); - DoReflection(); - MGLOG_D("ProgramObject %u: Reflection done (linkStatus=%d)", m_externalIndex, (int)m_linkStatus); - - MGLOG_D("ProgramObject %u: Starting binary generation", m_externalIndex); - GenerateBinary(); - MGLOG_D("ProgramObject %u: Binary generation finished (generatedSpirv size=%zu)", m_externalIndex, - m_generatedSpirv.size()); + MG_Util::ConvertGLEnumToString(shaderTypes[i]), m_shaders[i]->GetInfoLog(), + m_shaders[i]->GetShaderSource()); + m_linkStatus = false; + MGLOG_E("ProgramObject %u: Link failed - shader[%zu] compile status false. InfoLog:\n%s", + m_externalIndex, i, m_infoLog.c_str()); + return; } + shaders[i] = m_shaders[i]->GetCompiledShader(); + MGLOG_D("ProgramObject %u: shader[%zu] compiled shader ptr %p, src len %zu", m_externalIndex, i, + shaders[i].get(), m_shaders[i]->GetShaderSource().length()); + MGLOG_D("ProgramObject %u: shader[%zu] source:\n%s", m_externalIndex, i, + m_shaders[i]->GetShaderSource().c_str()); + } - void ProgramObject::MarkAsDeleted() { - MGLOG_D("ProgramObject %u: MarkAsDeleted called (was %s)", m_externalIndex, - m_deleteStatus ? "deleted" : "not deleted"); - m_deleteStatus = true; - MGLOG_D("ProgramObject %u: MarkAsDeleted - now marked deleted", m_externalIndex); + MG_Util::ShaderTranspiler::ProgramAttrib attrib{.shaders = Move(shaders), + .explicitVertexInLocations = m_explicitAttribLocations, + .explicitFragmentOutLocations = m_explicitFragDataLocation}; + + MGLOG_D("ProgramObject %u: Calling ShaderCompiler::LinkProgram", m_externalIndex); + auto result = MG_Util::ShaderTranspiler::ShaderCompiler::LinkProgram(attrib); + if (result) { + m_linkStatus = true; + m_program = result.value(); + MGLOG_D("ProgramObject %u: LinkProgram succeeded, TProgram ptr %p", m_externalIndex, m_program.get()); + } else { + m_linkStatus = false; + m_infoLog = result.error().log; + MGLOG_E("ProgramObject %u: LinkProgram failed. InfoLog:\n%s", m_externalIndex, m_infoLog.c_str()); + } + + MGLOG_D("ProgramObject %u: Starting reflection", m_externalIndex); + DoReflection(); + MGLOG_D("ProgramObject %u: Reflection done (linkStatus=%d)", m_externalIndex, (int)m_linkStatus); + + MGLOG_D("ProgramObject %u: Starting binary generation", m_externalIndex); + GenerateBinary(); + MGLOG_D("ProgramObject %u: Binary generation finished (generatedSpirv size=%zu)", m_externalIndex, + m_generatedSpirv.size()); + } + + void ProgramObject::MarkAsDeleted() { + MGLOG_D("ProgramObject %u: MarkAsDeleted called (was %s)", m_externalIndex, + m_deleteStatus ? "deleted" : "not deleted"); + m_deleteStatus = true; + MGLOG_D("ProgramObject %u: MarkAsDeleted - now marked deleted", m_externalIndex); + } + + Vector>& ProgramObject::GetAttachedShaders() { + MGLOG_D("ProgramObject %u: GetAttachedShaders called, returning %zu shaders", m_externalIndex, + m_shaders.size()); + return m_shaders; + } + + const Vector>& ProgramObject::GetAttachedShaders() const { + return m_shaders; + } + + void ProgramObject::DoReflection() { + if (!m_program) { + MGLOG_E("ProgramObject %u: DoReflection called but m_program is null", m_externalIndex); + m_linkStatus = false; + m_infoLog = "DoReflection failed: no program."; + return; + } + + MGLOG_D("ProgramObject %u: DoReflection - building reflection", m_externalIndex); + if (!m_program->buildReflection()) { + m_linkStatus = false; + m_infoLog = "Build reflection failed."; + MGLOG_E("ProgramObject %u: DoReflection - buildReflection() returned false", m_externalIndex); + return; + } + + // ------------ Uniforms (GL Plain) ---------------- + // Allocate uniform locations + m_activeUniformCount = m_program->getNumUniformVariables(); + MGLOG_D("ProgramObject %u: Reflection - active uniform count = %d", m_externalIndex, m_activeUniformCount); + for (int i = 0; i < m_activeUniformCount; i++) { + auto& uniform = m_program->getUniform(i); + auto location = uniform.layoutLocation(); + if (location != glslang::TQualifier::layoutLocationEnd) { + m_maxUniformLocation = std::max(m_maxUniformLocation, location); } + m_uniformNameMaxLength = std::max(m_uniformNameMaxLength, (Int)uniform.name.length()); + m_uniformLocations[uniform.name] = location; + MGLOG_D("ProgramObject %u: Reflection - uniform[%d] name='%s' layoutLocation=%d", m_externalIndex, i, + uniform.name.c_str(), location); + } - Vector>& ProgramObject::GetAttachedShaders() { - MGLOG_D("ProgramObject %u: GetAttachedShaders called, returning %zu shaders", m_externalIndex, - m_shaders.size()); - return m_shaders; + MGLOG_D("ProgramObject %u: Reflection - computed m_maxUniformLocation=%u m_uniformNameMaxLength=%d", + m_externalIndex, m_maxUniformLocation, m_uniformNameMaxLength); + + if (m_maxUniformLocation + 1 < m_activeUniformCount) { + MGLOG_D("ProgramObject %u: Reflection - maxUniformLocation+1 (%u) < activeUniformCount (%d), " + "adjusting", + m_externalIndex, m_maxUniformLocation + 1, m_activeUniformCount); + // This means we have fewer than enough gaps to fit + // unallocated uniforms + m_maxUniformLocation = m_activeUniformCount; + } + + // i-th elements refers to uniform at layout(location = i, ...) + m_uniformIndexInTProgram.resize(m_maxUniformLocation + 1, glslang::TQualifier::layoutLocationEnd); + m_uniformSamplerOrImageUnitIndex.resize(m_maxUniformLocation + 1, -1); + + Vector unallocatedUniformIndex; + + // Populate vector with already allocated location + for (int i = 0; i < m_activeUniformCount; i++) { + auto& uniform = m_program->getUniform(i); + auto location = uniform.layoutLocation(); + if (m_uniformLocations[uniform.name] == glslang::TQualifier::layoutLocationEnd) { + unallocatedUniformIndex.emplace_back(i); + MGLOG_D("ProgramObject %u: Reflection - uniform '%s' is unallocated, will assign later", + m_externalIndex, uniform.name.c_str()); + continue; // will allocate unallocated uniforms later } + m_uniformIndexInTProgram[location] = i; + MGLOG_D("ProgramObject %u: Reflection - assigned uniform '%s' to location %d (indexInTProgram=%d)", + m_externalIndex, uniform.name.c_str(), location, i); + } - const Vector>& ProgramObject::GetAttachedShaders() const { - return m_shaders; + SizeT locNeedle = 0; + for (auto index : unallocatedUniformIndex) { + auto& uniform = m_program->getUniform(index); + for (; locNeedle <= m_maxUniformLocation; locNeedle++) { + if (m_uniformIndexInTProgram[locNeedle] != glslang::TQualifier::layoutLocationEnd) continue; + // Found a vacant location at locNeedle + m_uniformIndexInTProgram[locNeedle] = index; + m_uniformLocations[uniform.name] = locNeedle; + MGLOG_D("ProgramObject %u: Reflection - assigned unallocated uniform '%s' to location %zu " + "(index %d)", + m_externalIndex, uniform.name.c_str(), locNeedle, index); + locNeedle++; + break; } + } - void ProgramObject::DoReflection() { - if (!m_program) { - MGLOG_E("ProgramObject %u: DoReflection called but m_program is null", m_externalIndex); - m_linkStatus = false; - m_infoLog = "DoReflection failed: no program."; - return; - } + // ------------ attributes (vertex in) --------------- + Int inCount = m_program->getNumPipeInputs(); + MGLOG_D("ProgramObject %u: Reflection - pipe input count (attributes) = %d", m_externalIndex, inCount); - MGLOG_D("ProgramObject %u: DoReflection - building reflection", m_externalIndex); - if (!m_program->buildReflection()) { - m_linkStatus = false; - m_infoLog = "Build reflection failed."; - MGLOG_E("ProgramObject %u: DoReflection - buildReflection() returned false", m_externalIndex); - return; - } + Int maxLoc = -1; + for (int i = 0; i < inCount; ++i) { + Int loc = (Int)m_program->getPipeInput(i).layoutLocation(); + if (loc >= 0 && loc != glslang::TQualifier::layoutLocationEnd) maxLoc = std::max(maxLoc, loc); + MGLOG_D("ProgramObject %u: Reflection - pipe input[%d] name='%s' layoutLocation=%d glType=%u", + m_externalIndex, i, m_program->getPipeInput(i).name.c_str(), loc, + m_program->getPipeInput(i).glDefineType); + } - // ------------ Uniforms (GL Plain) ---------------- - // Allocate uniform locations - m_activeUniformCount = m_program->getNumUniformVariables(); - MGLOG_D("ProgramObject %u: Reflection - active uniform count = %d", m_externalIndex, - m_activeUniformCount); - for (int i = 0; i < m_activeUniformCount; i++) { - auto& uniform = m_program->getUniform(i); - auto location = uniform.layoutLocation(); - if (location != glslang::TQualifier::layoutLocationEnd) { - m_maxUniformLocation = std::max(m_maxUniformLocation, location); - } - m_uniformNameMaxLength = std::max(m_uniformNameMaxLength, (Int)uniform.name.length()); - m_uniformLocations[uniform.name] = location; - MGLOG_D("ProgramObject %u: Reflection - uniform[%d] name='%s' layoutLocation=%d", m_externalIndex, - i, uniform.name.c_str(), location); - } + if (maxLoc < 0) { + maxLoc = std::max(0, inCount - 1); + } - MGLOG_D("ProgramObject %u: Reflection - computed m_maxUniformLocation=%u m_uniformNameMaxLength=%d", - m_externalIndex, m_maxUniformLocation, m_uniformNameMaxLength); + GLint maxAttribs = 16; // TODO: get from backend + MGLOG_D("ProgramObject %u: Reflection - computed maxLoc=%d, using maxAttribs=%d", m_externalIndex, maxLoc, + maxAttribs); - if (m_maxUniformLocation + 1 < m_activeUniformCount) { - MGLOG_D("ProgramObject %u: Reflection - maxUniformLocation+1 (%u) < activeUniformCount (%d), " - "adjusting", - m_externalIndex, m_maxUniformLocation + 1, m_activeUniformCount); - // This means we have fewer than enough gaps to fit - // unallocated uniforms - m_maxUniformLocation = m_activeUniformCount; - } + if (maxLoc >= maxAttribs) { + MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - required attrib location %d >= " + "GL_MAX_VERTEX_ATTRIBS (%d). Clamping.", + m_externalIndex, maxLoc, maxAttribs); + maxLoc = maxAttribs - 1; + } - // i-th elements refers to uniform at layout(location = i, ...) - m_uniformIndexInTProgram.resize(m_maxUniformLocation + 1, glslang::TQualifier::layoutLocationEnd); - m_uniformSamplerOrImageUnitIndex.resize(m_maxUniformLocation + 1, -1); + m_attribs.resize(maxLoc + 1); + m_attribTypes.resize(maxLoc + 1); - Vector unallocatedUniformIndex; + for (int i = 0; i < inCount; ++i) { + auto& inVar = m_program->getPipeInput(i); + Int location = (Int)inVar.layoutLocation(); + m_attribInNameMaxLength = std::max(m_attribInNameMaxLength, (Int)inVar.name.length()); - // Populate vector with already allocated location - for (int i = 0; i < m_activeUniformCount; i++) { - auto& uniform = m_program->getUniform(i); - auto location = uniform.layoutLocation(); - if (m_uniformLocations[uniform.name] == glslang::TQualifier::layoutLocationEnd) { - unallocatedUniformIndex.emplace_back(i); - MGLOG_D("ProgramObject %u: Reflection - uniform '%s' is unallocated, will assign later", - m_externalIndex, uniform.name.c_str()); - continue; // will allocate unallocated uniforms later - } - m_uniformIndexInTProgram[location] = i; - MGLOG_D("ProgramObject %u: Reflection - assigned uniform '%s' to location %d (indexInTProgram=%d)", - m_externalIndex, uniform.name.c_str(), location, i); - } - - SizeT locNeedle = 0; - for (auto index : unallocatedUniformIndex) { - auto& uniform = m_program->getUniform(index); - for (; locNeedle <= m_maxUniformLocation; locNeedle++) { - if (m_uniformIndexInTProgram[locNeedle] != glslang::TQualifier::layoutLocationEnd) continue; - // Found a vacant location at locNeedle - m_uniformIndexInTProgram[locNeedle] = index; - m_uniformLocations[uniform.name] = locNeedle; - MGLOG_D("ProgramObject %u: Reflection - assigned unallocated uniform '%s' to location %zu " - "(index %d)", - m_externalIndex, uniform.name.c_str(), locNeedle, index); - locNeedle++; - break; - } - } - - // ------------ attributes (vertex in) --------------- - int inCount = m_program->getNumPipeInputs(); - MGLOG_D("ProgramObject %u: Reflection - pipe input count (attributes) = %d", m_externalIndex, inCount); - - int maxLoc = -1; - for (int i = 0; i < inCount; ++i) { - int loc = m_program->getPipeInput(i).layoutLocation(); - if (loc >= 0 && loc != glslang::TQualifier::layoutLocationEnd) maxLoc = std::max(maxLoc, loc); - MGLOG_D("ProgramObject %u: Reflection - pipe input[%d] name='%s' layoutLocation=%d glType=%u", - m_externalIndex, i, m_program->getPipeInput(i).name.c_str(), loc, - m_program->getPipeInput(i).glDefineType); - } - - if (maxLoc < 0) { - maxLoc = std::max(0, inCount - 1); - } - - GLint maxAttribs = 16; // TODO: get from backend - MGLOG_D("ProgramObject %u: Reflection - computed maxLoc=%d, using maxAttribs=%d", m_externalIndex, - maxLoc, maxAttribs); - - if (maxLoc >= maxAttribs) { - MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - required attrib location %d >= " - "GL_MAX_VERTEX_ATTRIBS (%d). Clamping.", - m_externalIndex, maxLoc, maxAttribs); - maxLoc = maxAttribs - 1; - } - - m_attribs.resize(maxLoc + 1); - m_attribTypes.resize(maxLoc + 1); - - for (int i = 0; i < inCount; ++i) { - auto& inVar = m_program->getPipeInput(i); - int location = inVar.layoutLocation(); - m_attribInNameMaxLength = std::max(m_attribInNameMaxLength, (Int)inVar.name.length()); - - if (location >= 0 && location < (int)m_attribs.size()) { - m_attribs[location] = inVar.name; - m_attribTypes[location] = inVar.glDefineType; - MGLOG_D("ProgramObject %u: Reflection - got attrib '%s' at explicit location %d", - m_externalIndex, inVar.name.c_str(), location); - } - // else if (location >= (int)m_attribs.size()) { - // MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - attrib location %d >= attribs.size() - // " - // "(%zu). Ignoring.", - // m_externalIndex, location, m_attribs.size()); - // continue; - // } - // else { - // bool placed = false; - // for (size_t idx = 0; idx < m_attribs.size(); ++idx) { - // if (m_attribs[idx].empty()) { - // m_attribs[idx] = inVar.name; - // m_attribTypes[idx] = inVar.glDefineType; - // placed = true; - // MGLOG_D("ProgramObject %u: Reflection - placed attrib '%s' into free slot %zu", - // m_externalIndex, inVar.name.c_str(), idx); - // break; - // } - // } - // if (!placed && (int)m_attribs.size() < maxAttribs) { - // m_attribs.push_back(inVar.name); - // m_attribTypes.push_back(inVar.glDefineType); - // placed = true; - // MGLOG_D("ProgramObject %u: Reflection - pushed attrib '%s' to new slot %zu", - // m_externalIndex, inVar.name.c_str(), m_attribs.size() - 1); - // } - // if (!placed) { - // MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - cannot place attrib '%s' (no - // free " - // "slot and at max capacity). Ignoring.", - // m_externalIndex, inVar.name.c_str()); - // } - // } - } - - // Implement glBindAttribLocation semantics (explicit locations set by user) - // for (auto& [name, location] : m_explicitAttribLocations) { - // MGLOG_D("ProgramObject %u: Reflection - explicit attrib location request: name='%s' location=%d", - // m_externalIndex, name.c_str(), location); - // if (location < 0) continue; - // if (location >= (int)m_attribs.size()) { - // if (location >= maxAttribs) { - // MGLOG_W("ProgramObject %u: SetExplicitVertexInLocation: requested location %d >= " - // "GL_MAX_VERTEX_ATTRIBS (%d). Ignored for attribute '%s'.", - // m_externalIndex, location, maxAttribs, name.c_str()); - // continue; - // } - // m_attribs.resize(location + 1); - // m_attribTypes.resize(location + 1); - // MGLOG_D("ProgramObject %u: Reflection - resized attrib arrays to %zu to accommodate explicit - // " - // "location %d", - // m_externalIndex, m_attribs.size(), location); - // } - // - // if (m_attribs[location] != name) { - // auto it = std::find(m_attribs.begin(), m_attribs.end(), name); - // if (it == m_attribs.end()) { - // MGLOG_D("ProgramObject %u: Reflection - explicit attrib '%s' not found in current list, " - // "skipping swap", - // m_externalIndex, name.c_str()); - // continue; - // } - // auto idx = std::distance(m_attribs.begin(), it); - // std::swap(m_attribs[location], m_attribs[idx]); - // std::swap(m_attribTypes[location], m_attribTypes[idx]); - // MGLOG_D("ProgramObject %u: Reflection - swapped attrib '%s' from idx %zu to explicit " - // "location %d", - // m_externalIndex, name.c_str(), idx, location); - // } - // - // for (SizeT idx = 0; idx < m_attribs.size(); ++idx) { - // m_attribLocation[m_attribs[idx]] = idx; - // MGLOG_D("ProgramObject %u: Reflection - attribLocation['%s'] = %zu", m_externalIndex, - // m_attribs[idx].c_str(), idx); - // } - // } - - // ---------- UBO ---------- - int uboCount = m_program->getNumUniformBlocks(); - MGLOG_D("ProgramObject %u: Reflection - uniform block count (UBO) = %d", m_externalIndex, uboCount); - m_uniformBlockBinding.resize(uboCount, -1); - for (int i = 0; i < uboCount; i++) { - auto& ubo = m_program->getUniformBlock(i); - m_uniformBlockNameMaxLength = std::max(m_uniformBlockNameMaxLength, (Int)ubo.name.length()); - m_uniformBlockIndexByName[ubo.name] = i; - // if there's binding defined in shader as layout(binding = ...), - // retrieve it here - m_uniformBlockBinding[i] = ubo.getBinding(); - MGLOG_D("ProgramObject %u: Reflection - UBO[%d] name='%s' size=%u binding=%d", m_externalIndex, i, - ubo.name.c_str(), ubo.size, ubo.getBinding()); - } + if (location >= 0 && location < (int)m_attribs.size()) { + m_attribs[location] = inVar.name; + m_attribTypes[location] = inVar.glDefineType; + MGLOG_D("ProgramObject %u: Reflection - got attrib '%s' at explicit location %d", m_externalIndex, + inVar.name.c_str(), location); } + // else if (location >= (int)m_attribs.size()) { + // MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - attrib location %d >= attribs.size() + // " + // "(%zu). Ignoring.", + // m_externalIndex, location, m_attribs.size()); + // continue; + // } + // else { + // bool placed = false; + // for (size_t idx = 0; idx < m_attribs.size(); ++idx) { + // if (m_attribs[idx].empty()) { + // m_attribs[idx] = inVar.name; + // m_attribTypes[idx] = inVar.glDefineType; + // placed = true; + // MGLOG_D("ProgramObject %u: Reflection - placed attrib '%s' into free slot %zu", + // m_externalIndex, inVar.name.c_str(), idx); + // break; + // } + // } + // if (!placed && (int)m_attribs.size() < maxAttribs) { + // m_attribs.push_back(inVar.name); + // m_attribTypes.push_back(inVar.glDefineType); + // placed = true; + // MGLOG_D("ProgramObject %u: Reflection - pushed attrib '%s' to new slot %zu", + // m_externalIndex, inVar.name.c_str(), m_attribs.size() - 1); + // } + // if (!placed) { + // MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - cannot place attrib '%s' (no + // free " + // "slot and at max capacity). Ignoring.", + // m_externalIndex, inVar.name.c_str()); + // } + // } + } - void ProgramObject::GenerateBinary() { - /* As we passed first stage compilation/linking, - * we'll assume all the operations here should - * pass. We may be able to employ some optimizations - * here without the burden of error reporting. - */ - using namespace MG_Util::ShaderTranspiler; - MGLOG_D("ProgramObject %u: GenerateBinary - start", m_externalIndex); - Vector> shaders(m_shaders.size()); - Vector shaderTypes(m_shaders.size()); - for (SizeT i = 0; i < m_shaders.size(); i++) { - auto shaderType = MG_Util::ConvertShaderStageToGLEnum(m_shaders[i]->GetShaderStage()); - shaderTypes[i] = shaderType; - ShaderAttrib attrib{.shaderType = shaderType, - .sourceStr = m_shaders[i]->GetShaderSource(), - .flags = 0}; // Will need patched glslang to work - MGLOG_D("ProgramObject %u: GenerateBinary - compiling shader[%zu] type %u", m_externalIndex, i, - shaderType); - auto res = ShaderCompiler::CompileShader(attrib); - if (!res) { - MGLOG_E("ProgramObject %u: GenerateBinary - CompileShader failed for shader[%zu], aborting " - "binary generation", - m_externalIndex, i); - MGLOG_E("ProgramObject %u: GenerateBinary - CompileShader return code %d, log:\n%s", - m_externalIndex, res.error().errc, res.error().log.c_str()); - MGLOG_E("ProgramObject %u: GenerateBinary - last compiled shader src: \n%s", m_externalIndex, - m_shaders[i]->GetShaderSource().c_str()); - } - MOBILEGL_ASSERT(res, "CompileShader failed during binary generation"); - shaders[i] = res.value(); - MGLOG_D("ProgramObject %u: GenerateBinary - compiled shader[%zu] -> TShader ptr %p", - m_externalIndex, i, shaders[i].get()); - } + // Implement glBindAttribLocation semantics (explicit locations set by user) + // for (auto& [name, location] : m_explicitAttribLocations) { + // MGLOG_D("ProgramObject %u: Reflection - explicit attrib location request: name='%s' location=%d", + // m_externalIndex, name.c_str(), location); + // if (location < 0) continue; + // if (location >= (int)m_attribs.size()) { + // if (location >= maxAttribs) { + // MGLOG_W("ProgramObject %u: SetExplicitVertexInLocation: requested location %d >= " + // "GL_MAX_VERTEX_ATTRIBS (%d). Ignored for attribute '%s'.", + // m_externalIndex, location, maxAttribs, name.c_str()); + // continue; + // } + // m_attribs.resize(location + 1); + // m_attribTypes.resize(location + 1); + // MGLOG_D("ProgramObject %u: Reflection - resized attrib arrays to %zu to accommodate explicit + // " + // "location %d", + // m_externalIndex, m_attribs.size(), location); + // } + // + // if (m_attribs[location] != name) { + // auto it = std::find(m_attribs.begin(), m_attribs.end(), name); + // if (it == m_attribs.end()) { + // MGLOG_D("ProgramObject %u: Reflection - explicit attrib '%s' not found in current list, " + // "skipping swap", + // m_externalIndex, name.c_str()); + // continue; + // } + // auto idx = std::distance(m_attribs.begin(), it); + // std::swap(m_attribs[location], m_attribs[idx]); + // std::swap(m_attribTypes[location], m_attribTypes[idx]); + // MGLOG_D("ProgramObject %u: Reflection - swapped attrib '%s' from idx %zu to explicit " + // "location %d", + // m_externalIndex, name.c_str(), idx, location); + // } + // + // for (SizeT idx = 0; idx < m_attribs.size(); ++idx) { + // m_attribLocation[m_attribs[idx]] = idx; + // MGLOG_D("ProgramObject %u: Reflection - attribLocation['%s'] = %zu", m_externalIndex, + // m_attribs[idx].c_str(), idx); + // } + // } - ProgramAttrib attrib{.shaders = Move(shaders), - .explicitVertexInLocations = m_explicitAttribLocations, - .explicitFragmentOutLocations = m_explicitFragDataLocation}; - MGLOG_D("ProgramObject %u: GenerateBinary - linking program for binary", m_externalIndex); - auto programResult = ShaderCompiler::LinkProgram(attrib); - if (!programResult) { - MGLOG_E("ProgramObject %u: GenerateBinary - LinkProgram failed during binary generation", - m_externalIndex); - } - MOBILEGL_ASSERT(programResult, "LinkProgram failed during binary generation"); - auto program = programResult.value(); - MGLOG_D("ProgramObject %u: GenerateBinary - got linked program object", m_externalIndex); + // ---------- UBO ---------- + Int uboCount = m_program->getNumUniformBlocks(); + MGLOG_D("ProgramObject %u: Reflection - uniform block count (UBO) = %d", m_externalIndex, uboCount); + m_uniformBlockBinding.resize(uboCount, -1); + for (int i = 0; i < uboCount; i++) { + auto& ubo = m_program->getUniformBlock(i); + m_uniformBlockNameMaxLength = std::max(m_uniformBlockNameMaxLength, (Int)ubo.name.length()); + m_uniformBlockIndexByName[ubo.name] = i; + // if there's binding defined in shader as layout(binding = ...), + // retrieve it here + m_uniformBlockBinding[i] = ubo.getBinding(); + MGLOG_D("ProgramObject %u: Reflection - UBO[%d] name='%s' size=%u binding=%d", m_externalIndex, i, + ubo.name.c_str(), ubo.size, ubo.getBinding()); + } + } - ProgramBinaryAttrib binaryAttrib{ - .shaderTypes = shaderTypes, - .program = *program, - }; - MGLOG_D("ProgramObject %u: GenerateBinary - requesting SPIR-V binary from program", m_externalIndex); - auto binaryResult = ShaderCompiler::GetSpirvBinaryFromProgram(binaryAttrib); - if (!binaryResult) { - MGLOG_E("ProgramObject %u: GenerateBinary - GetSpirvBinaryFromProgram failed", m_externalIndex); - } - MOBILEGL_ASSERT(binaryResult, "GetSpirvBinaryFromProgram failed"); - m_generatedSpirv = Move(binaryResult.value()); - MGLOG_D("ProgramObject %u: GenerateBinary - generated %zu SPIR-V modules", m_externalIndex, - m_generatedSpirv.size()); + void ProgramObject::GenerateBinary() { + /* As we passed first stage compilation/linking, + * we'll assume all the operations here should + * pass. We may be able to employ some optimizations + * here without the burden of error reporting. + */ + using namespace MG_Util::ShaderTranspiler; + MGLOG_D("ProgramObject %u: GenerateBinary - start", m_externalIndex); + Vector> shaders(m_shaders.size()); + Vector shaderTypes(m_shaders.size()); + for (SizeT i = 0; i < m_shaders.size(); i++) { + auto shaderType = MG_Util::ConvertShaderStageToGLEnum(m_shaders[i]->GetShaderStage()); + shaderTypes[i] = shaderType; + ShaderAttrib attrib{.shaderType = shaderType, + .sourceStr = m_shaders[i]->GetShaderSource(), + .flags = 0}; // Will need patched glslang to work + MGLOG_D("ProgramObject %u: GenerateBinary - compiling shader[%zu] type %u", m_externalIndex, i, shaderType); + auto res = ShaderCompiler::CompileShader(attrib); + if (!res) { + MGLOG_E("ProgramObject %u: GenerateBinary - CompileShader failed for shader[%zu], aborting " + "binary generation", + m_externalIndex, i); + MGLOG_E("ProgramObject %u: GenerateBinary - CompileShader return code %d, log:\n%s", m_externalIndex, + res.error().errc, res.error().log.c_str()); + MGLOG_E("ProgramObject %u: GenerateBinary - last compiled shader src: \n%s", m_externalIndex, + m_shaders[i]->GetShaderSource().c_str()); + } + MOBILEGL_ASSERT(res, "CompileShader failed during binary generation"); + shaders[i] = res.value(); + MGLOG_D("ProgramObject %u: GenerateBinary - compiled shader[%zu] -> TShader ptr %p", m_externalIndex, i, + shaders[i].get()); + } - for (auto& spv : m_generatedSpirv) { - auto success = ShaderCompiler::SanitizeAndOptimizeBinary(spv, spv); - MOBILEGL_ASSERT(success, "SanitizeBinary failed"); - } + ProgramAttrib attrib{.shaders = Move(shaders), + .explicitVertexInLocations = m_explicitAttribLocations, + .explicitFragmentOutLocations = m_explicitFragDataLocation}; + MGLOG_D("ProgramObject %u: GenerateBinary - linking program for binary", m_externalIndex); + auto programResult = ShaderCompiler::LinkProgram(attrib); + if (!programResult) { + MGLOG_E("ProgramObject %u: GenerateBinary - LinkProgram failed during binary generation", m_externalIndex); + } + MOBILEGL_ASSERT(programResult, "LinkProgram failed during binary generation"); + auto& program = programResult.value(); + MGLOG_D("ProgramObject %u: GenerateBinary - got linked program object", m_externalIndex); - for (SizeT i = 0; i < m_generatedSpirv.size(); i++) { - auto& spv = m_generatedSpirv[i]; + ProgramBinaryAttrib binaryAttrib{ + .shaderTypes = shaderTypes, + .program = *program, + }; + MGLOG_D("ProgramObject %u: GenerateBinary - requesting SPIR-V binary from program", m_externalIndex); + auto binaryResult = ShaderCompiler::GetSpirvBinaryFromProgram(binaryAttrib); + if (!binaryResult) { + MGLOG_E("ProgramObject %u: GenerateBinary - GetSpirvBinaryFromProgram failed", m_externalIndex); + } + MOBILEGL_ASSERT(binaryResult, "GetSpirvBinaryFromProgram failed"); + m_generatedSpirv = Move(binaryResult.value()); + MGLOG_D("ProgramObject %u: GenerateBinary - generated %zu SPIR-V modules", m_externalIndex, + m_generatedSpirv.size()); - auto shaderType = shaderTypes[i]; - MGLOG_D("ProgramObject %u: GenerateBinary - parsing SPIR-V meta data for module %zu " - "(shaderType=%u, wordCount=%zu)", - m_externalIndex, i, shaderType, spv.size()); - SpvcSession session(spv); - auto result = session.ParseMetaData(); - if (result < 0) { - MGLOG_D("ProgramObject %u: GenerateBinary - SpvcSession::ParseMetaData failed for module %zu, " - "err = %d%s", - m_externalIndex, i, result, - (result == SPVC_ERROR_INVALID_SPIRV ? ". Probably no global UBO?" : "")); - m_uniformSizesInBytes.clear(); - m_uniformOffsets.clear(); - m_uboScratch.clear(); - continue; + for (auto& spv : m_generatedSpirv) { + auto success = ShaderCompiler::SanitizeAndOptimizeBinary(spv, spv); + MOBILEGL_ASSERT(success, "SanitizeBinary failed"); + } + + for (SizeT i = 0; i < m_generatedSpirv.size(); i++) { + auto& spv = m_generatedSpirv[i]; + + auto shaderType = shaderTypes[i]; + MGLOG_D("ProgramObject %u: GenerateBinary - parsing SPIR-V meta data for module %zu " + "(shaderType=%u, wordCount=%zu)", + m_externalIndex, i, shaderType, spv.size()); + SpvcSession session(spv); + auto result = session.ParseMetaData(); + if (result < 0) { + MGLOG_D("ProgramObject %u: GenerateBinary - SpvcSession::ParseMetaData failed for module %zu, " + "err = %d%s", + m_externalIndex, i, result, + (result == SPVC_ERROR_INVALID_SPIRV ? ". Probably no global UBO?" : "")); + m_uniformSizesInBytes.clear(); + m_uniformOffsets.clear(); + m_uboScratch.clear(); + continue; + } else { + auto& meta = session.GetMetadata(); + auto size = meta.uboSize; + MGLOG_D("ProgramObject %u: GenerateBinary - SPIR-V meta: uboSize=%zu plainUniformCount=%zu " + "plainUniformOffsets=%zu", + m_externalIndex, meta.uboSize, meta.plainUniformMemberSizesInBytes.size(), + meta.plainUniformOffsetsInUBO.size()); + m_uboScratch.resize(size); + m_uniformOffsets.resize(m_maxUniformLocation + 1); + for (const auto& [name, offset] : meta.plainUniformOffsetsInUBO) { + if (m_uniformLocations.find(name) != m_uniformLocations.end()) { + m_uniformOffsets[m_uniformLocations[name]] = offset; + MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' offset=%u assigned to location %u", + m_externalIndex, name.c_str(), offset, m_uniformLocations[name]); } else { - auto& meta = session.GetMetadata(); - auto size = meta.uboSize; - MGLOG_D("ProgramObject %u: GenerateBinary - SPIR-V meta: uboSize=%zu plainUniformCount=%zu " - "plainUniformOffsets=%zu", - m_externalIndex, meta.uboSize, meta.plainUniformMemberSizesInBytes.size(), - meta.plainUniformOffsetsInUBO.size()); - m_uboScratch.resize(size); - m_uniformOffsets.resize(m_maxUniformLocation + 1); - for (const auto& [name, offset] : meta.plainUniformOffsetsInUBO) { - if (m_uniformLocations.find(name) != m_uniformLocations.end()) { - m_uniformOffsets[m_uniformLocations[name]] = offset; - MGLOG_D( - "ProgramObject %u: GenerateBinary - uniform '%s' offset=%u assigned to location %u", - m_externalIndex, name.c_str(), offset, m_uniformLocations[name]); - } else { - MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' offset=%u but not found in " - "m_uniformLocations", - m_externalIndex, name.c_str(), offset); - } - } - m_uniformSizesInBytes.resize(m_maxUniformLocation + 1); - for (const auto& [name, size] : meta.plainUniformMemberSizesInBytes) { - if (m_uniformLocations.find(name) != m_uniformLocations.end()) { - m_uniformSizesInBytes[m_uniformLocations[name]] = size; - MGLOG_D( - "ProgramObject %u: GenerateBinary - uniform '%s' size=%u assigned to location %u", - m_externalIndex, name.c_str(), size, m_uniformLocations[name]); - } else { - MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' size=%u but not found in " - "m_uniformLocations", - m_externalIndex, name.c_str(), size); - } - } - // Only parse first module that contains uniform metadata - MGLOG_D("ProgramObject %u: GenerateBinary - finished parsing module %zu; breaking after first " - "valid metadata", - m_externalIndex, i); + MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' offset=%u but not found in " + "m_uniformLocations", + m_externalIndex, name.c_str(), offset); } - break; } + m_uniformSizesInBytes.resize(m_maxUniformLocation + 1); + for (const auto& [name, size] : meta.plainUniformMemberSizesInBytes) { + if (m_uniformLocations.find(name) != m_uniformLocations.end()) { + m_uniformSizesInBytes[m_uniformLocations[name]] = size; + MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' size=%u assigned to location %u", + m_externalIndex, name.c_str(), size, m_uniformLocations[name]); + } else { + MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' size=%u but not found in " + "m_uniformLocations", + m_externalIndex, name.c_str(), size); + } + } + // Only parse first module that contains uniform metadata + MGLOG_D("ProgramObject %u: GenerateBinary - finished parsing module %zu; breaking after first " + "valid metadata", + m_externalIndex, i); } + break; + } + } - void ProgramObject::WaitUntilGenerationCompleted() { - MGLOG_D("ProgramObject %u: WaitUntilGenerationCompleted called (no-op)", m_externalIndex); - // currently no-op, but keep log for debugging - // will probably be useful when multi-threaded compilation - } + void ProgramObject::WaitUntilGenerationCompleted() const { + MGLOG_D("ProgramObject %u: WaitUntilGenerationCompleted called (no-op)", m_externalIndex); + // currently no-op, but keep log for debugging + // will probably be useful when multi-threaded compilation + } - void ProgramObject::SetExplicitVertexInLocation(Uint index, const char* name) { - MGLOG_D("ProgramObject %u: SetExplicitVertexInLocation called name='%s' index=%u", m_externalIndex, - name, index); - m_explicitAttribLocations[name] = index; - MGLOG_D("ProgramObject %u: SetExplicitVertexInLocation - stored explicit location for '%s' -> %u", - m_externalIndex, name, index); - } + void ProgramObject::SetExplicitVertexInLocation(Uint index, const char* name) { + MGLOG_D("ProgramObject %u: SetExplicitVertexInLocation called name='%s' index=%u", m_externalIndex, name, + index); + m_explicitAttribLocations[name] = index; + MGLOG_D("ProgramObject %u: SetExplicitVertexInLocation - stored explicit location for '%s' -> %u", + m_externalIndex, name, index); + } - void ProgramObject::SetExplicitFragmentOutLocation(Uint index, const char* name) { - MGLOG_D("ProgramObject %u: SetExplicitFragmentOutLocation called name='%s' index=%u", m_externalIndex, - name, index); - m_explicitFragDataLocation[name] = index; - MGLOG_D("ProgramObject %u: SetExplicitFragmentOutLocation - stored explicit location for '%s' -> %u", - m_externalIndex, name, index); - } + void ProgramObject::SetExplicitFragmentOutLocation(Uint index, const char* name) { + MGLOG_D("ProgramObject %u: SetExplicitFragmentOutLocation called name='%s' index=%u", m_externalIndex, name, + index); + m_explicitFragDataLocation[name] = index; + MGLOG_D("ProgramObject %u: SetExplicitFragmentOutLocation - stored explicit location for '%s' -> %u", + m_externalIndex, name, index); + } - Int ProgramObject::GetFragmentDataLocation(const char* name) { - // TODO: should retrieve "post-mortem" location from glslang instead - auto it = m_explicitFragDataLocation.find(name); - if (it == m_explicitFragDataLocation.end()) return -1; - return it->second; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + Int ProgramObject::GetFragmentDataLocation(const char* name) { + // TODO: should retrieve "post-mortem" location from glslang instead + auto it = m_explicitFragDataLocation.find(name); + if (it == m_explicitFragDataLocation.end()) return -1; + return (Int)it->second; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h index 7f64751d..2a97f653 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h @@ -9,180 +9,176 @@ #pragma once #include #include "ShaderObject.h" -#include "MG_Util/Metrics/BufferMetrics.h" -#include "MG_Util/ShaderTranspiler/SpvcSession.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - class ProgramObject { - public: - ProgramObject(Uint externalIndex) : m_externalIndex(externalIndex) {} - bool ShaderIsAttached(SharedPtr shader); - bool AttachShader(SharedPtr shader); - SizeT DetachShader(SharedPtr shader); - SizeT RemoveShader(SharedPtr shader); - void Link(Bool addDefaultFSIfMissingForRenderingPipelineProgram = false); - void MarkAsDeleted(); +#include +#include - void SetExplicitVertexInLocation(Uint index, const char* name); - void SetExplicitFragmentOutLocation(Uint index, const char* name); - Int GetFragmentDataLocation(const char* name); +namespace MobileGL::MG_State::GLState { + class ProgramObject { + public: + ProgramObject(Uint externalIndex) : m_externalIndex(externalIndex) {} + bool ShaderIsAttached(const SharedPtr& shader); + bool AttachShader(const SharedPtr& shader); + SizeT DetachShader(const SharedPtr& shader); + SizeT RemoveShader(const SharedPtr& shader); + void Link(Bool addDefaultFSIfMissingForRenderingPipelineProgram = false); + void MarkAsDeleted(); - Vector>& GetAttachedShaders(); - const Vector>& GetAttachedShaders() const; - const String& GetInfoLog() const { return m_infoLog; } - Int GetUniformMaxLength() const { return m_uniformNameMaxLength; } - Uint GetUniformCount() { return m_activeUniformCount; } - Uint GetMaxUniformLocation() const { return m_maxUniformLocation; } - Int GetUniformLocation(const String& name) const { - const auto it = m_uniformLocations.find(name); - if (it == m_uniformLocations.end()) return -1; - return (Int)it->second; - } + void SetExplicitVertexInLocation(Uint index, const char* name); + void SetExplicitFragmentOutLocation(Uint index, const char* name); + Int GetFragmentDataLocation(const char* name); - GLenum GetUniformType(Uint location) const { - auto& uniform = m_program->getUniform(m_uniformIndexInTProgram[location]); - return uniform.glDefineType; - } + Vector>& GetAttachedShaders(); + const Vector>& GetAttachedShaders() const; + const String& GetInfoLog() const { return m_infoLog; } + Int GetUniformMaxLength() const { return m_uniformNameMaxLength; } + Uint GetUniformCount() const { return m_activeUniformCount; } + Uint GetMaxUniformLocation() const { return m_maxUniformLocation; } + Int GetUniformLocation(const String& name) const { + const auto it = m_uniformLocations.find(name); + if (it == m_uniformLocations.end()) return -1; + return (Int)it->second; + } - const glslang::TType* GetUniformTType(Uint location) const { - auto& uniform = m_program->getUniform(m_uniformIndexInTProgram[location]); - return uniform.getType(); - } + GLenum GetUniformType(Uint location) const { + auto& uniform = m_program->getUniform(m_uniformIndexInTProgram[location]); + return uniform.glDefineType; + } - Bool IsUniformOpaqueAtLocation(Uint location) const { return GetUniformTType(location)->isOpaque(); } + const glslang::TType* GetUniformTType(Uint location) const { + auto& uniform = m_program->getUniform(m_uniformIndexInTProgram[location]); + return uniform.getType(); + } - const String& GetUniformName(Uint location) const { - auto& uniform = m_program->getUniform(m_uniformIndexInTProgram[location]); - return uniform.name; - } - Uint GetUniformOffset(Uint location) const { return m_uniformOffsets[location]; } - Uint GetUniformSizesInBytes(Uint location) const { - return MG_Util::GetGLTypeSize(GetUniformType(location)); - } + Bool IsUniformOpaqueAtLocation(Uint location) const { return GetUniformTType(location)->isOpaque(); } - Int GetAttributeLocation(const String& name) { - const auto it = std::find(m_attribs.begin(), m_attribs.end(), name); - return (it == m_attribs.end()) ? -1 : std::distance(m_attribs.begin(), it); - } - GLenum GetAttribType(Uint index) const { return m_attribTypes[index]; } - const String& GetAttribName(Uint index) const { return m_attribs[index]; } - void* MapUBO() { return m_uboScratch.data(); } - const void* GetUBOData() const { return m_uboScratch.data(); } - Uint GetUBOSize() const { return static_cast(m_uboScratch.size()); } + const String& GetUniformName(Uint location) const { + auto& uniform = m_program->getUniform(m_uniformIndexInTProgram[location]); + return uniform.name; + } + Uint GetUniformOffset(Uint location) const { return m_uniformOffsets[location]; } + Uint GetUniformSizesInBytes(Uint location) const { return MG_Util::GetGLTypeSize(GetUniformType(location)); } - void SetUniformSamplerOrImageUnitIndex(Uint location, Int unit) { - m_uniformSamplerOrImageUnitIndex[location] = unit; - } + Int GetAttributeLocation(const String& name) { + const auto it = std::find(m_attribs.begin(), m_attribs.end(), name); + return (it == m_attribs.end()) ? -1 : (Int)std::distance(m_attribs.begin(), it); + } + GLenum GetAttribType(Uint index) const { return m_attribTypes[index]; } + const String& GetAttribName(Uint index) const { return m_attribs[index]; } + void* MapUBO() { return m_uboScratch.data(); } + const void* GetUBOData() const { return m_uboScratch.data(); } + Uint GetUBOSize() const { return static_cast(m_uboScratch.size()); } - Int GetUniformSamplerOrImageUnitIndex(Uint location) const { - return m_uniformSamplerOrImageUnitIndex[location]; - } + void SetUniformSamplerOrImageUnitIndex(Uint location, Int unit) { + m_uniformSamplerOrImageUnitIndex[location] = unit; + } - Bool GetDeleteStatus() const { return m_deleteStatus; } - Bool GetLinkStatus() const { return m_linkStatus; } - Bool GetValidateStatus() const { return m_validateStatus; } - Int GetActiveAtomicCounterCount() const { return m_program->getNumAtomicCounters(); } - Int GetActiveAttributesCount() const { return m_program->getNumPipeInputs(); } - Int GetActiveUniformBlocksCount() const { return m_program->getNumUniformBlocks(); } - Int GetActiveAttributesMaxLength() const { return m_attribInNameMaxLength; } - Int GetActiveUniformBlocksMaxNameLength() const { return m_uniformBlockNameMaxLength; } - Uint GetUniformBlockIndex(const char* name) const { - auto it = m_uniformBlockIndexByName.find(name); - if (it != m_uniformBlockIndexByName.end()) return it->second; - return 0xFFFFFFFFu; // GL_INVALID_INDEX - } - Bool IsActiveUniformBlock(Uint index) const { - if (index >= GetActiveUniformBlocksCount()) return false; - return true; - } - Uint GetUBOSizeAt(Uint index) const { - if (!IsActiveUniformBlock(index)) return 0; - return m_program->getUniformBlock(index).size; - } + Int GetUniformSamplerOrImageUnitIndex(Uint location) const { + return m_uniformSamplerOrImageUnitIndex[location]; + } - const String& GetUniformBlockName(Uint index) const { - auto& ubo = m_program->getUniformBlock(index); - return ubo.name; - } + Bool GetDeleteStatus() const { return m_deleteStatus; } + Bool GetLinkStatus() const { return m_linkStatus; } + Bool GetValidateStatus() const { return m_validateStatus; } + Int GetActiveAtomicCounterCount() const { return m_program->getNumAtomicCounters(); } + Int GetActiveAttributesCount() const { return m_program->getNumPipeInputs(); } + Int GetActiveUniformBlocksCount() const { return m_program->getNumUniformBlocks(); } + Int GetActiveAttributesMaxLength() const { return m_attribInNameMaxLength; } + Int GetActiveUniformBlocksMaxNameLength() const { return m_uniformBlockNameMaxLength; } + Uint GetUniformBlockIndex(const char* name) const { + auto it = m_uniformBlockIndexByName.find(name); + if (it != m_uniformBlockIndexByName.end()) return it->second; + return 0xFFFFFFFFu; // GL_INVALID_INDEX + } + Bool IsActiveUniformBlock(Uint index) const { + if (index >= GetActiveUniformBlocksCount()) return false; + return true; + } + Uint GetUBOSizeAt(Uint index) const { + if (!IsActiveUniformBlock(index)) return 0; + return m_program->getUniformBlock((Int)index).size; + } - // Set by glUniformBlockBinding - void SetUniformBlockBinding(Uint index, Uint binding) { m_uniformBlockBinding[index] = binding; } + const String& GetUniformBlockName(Uint index) const { + auto& ubo = m_program->getUniformBlock((Int)index); + return ubo.name; + } - Uint GetUniformBlockBinding(Uint index) const { return m_uniformBlockBinding[index]; } + // Set by glUniformBlockBinding + void SetUniformBlockBinding(Uint index, Uint binding) { m_uniformBlockBinding[index] = (Int)binding; } - Vector>& GetGeneratedSpirv() { return m_generatedSpirv; } - const Vector>& GetGeneratedSpirv() const { return m_generatedSpirv; } + Uint GetUniformBlockBinding(Uint index) const { return m_uniformBlockBinding[index]; } - Int GetShaderIndexByStage(ShaderStage stage) const { - auto it = std::find_if(m_shaders.begin(), m_shaders.end(), - [stage](const SharedPtr& shader) { return shader->GetShaderStage() == stage; }); - return it == m_shaders.end() ? -1 : std::distance(m_shaders.begin(), it); - } + Vector>& GetGeneratedSpirv() { return m_generatedSpirv; } + const Vector>& GetGeneratedSpirv() const { return m_generatedSpirv; } - Uint GetExternalIndex() const { return m_externalIndex; } + Int GetShaderIndexByStage(ShaderStage stage) const { + auto it = std::find_if(m_shaders.begin(), m_shaders.end(), [stage](const SharedPtr& shader) { + return shader->GetShaderStage() == stage; + }); + return it == m_shaders.end() ? -1 : (Int)std::distance(m_shaders.begin(), it); + } - // const UnorderedMap& GetAttribLocationMap() const { return - // m_attribLocation; } + Uint GetExternalIndex() const { return m_externalIndex; } - private: - void DoReflection(); - void GenerateBinary(); - void WaitUntilGenerationCompleted(); - void AddDefaultFragmentShaderIfMissing(); + // const UnorderedMap& GetAttribLocationMap() const { return + // m_attribLocation; } - const Uint m_externalIndex = 0; - Vector> m_shaders; - Vector> m_detachedShaders; // Store detached shaders and remove on next link + private: + void DoReflection(); + void GenerateBinary(); + void WaitUntilGenerationCompleted() const; + void AddDefaultFragmentShaderIfMissing(); - SharedPtr m_program; + const Uint m_externalIndex = 0; + Vector> m_shaders; + Vector> m_detachedShaders; // Store detached shaders and remove on next link - Vector> m_generatedSpirv; + SharedPtr m_program; - // Attributes (Vertex in) - UnorderedMap m_explicitAttribLocations; - Vector m_attribs; - Vector m_attribTypes; - // For SpvcSession::SetVertexAttribLocation() - // UnorderedMap m_attribLocation; + Vector> m_generatedSpirv; - // FragData (Frag out) - UnorderedMap m_explicitFragDataLocation; + // Attributes (Vertex in) + UnorderedMap m_explicitAttribLocations; + Vector m_attribs; + Vector m_attribTypes; + // For SpvcSession::SetVertexAttribLocation() + // UnorderedMap m_attribLocation; - // Uniforms - UnorderedMap m_uniformLocations; - // Ordered by location, - // aka. m_uniformIndexInTProgram[loc] == "uniform index of TProgram at location `loc`" - Vector m_uniformIndexInTProgram; - // ditto. Will be set at glUniform1i - Vector m_uniformSamplerOrImageUnitIndex; + // FragData (Frag out) + UnorderedMap m_explicitFragDataLocation; - // Ordered by uniform block index - // index is DIFFERENT from binding!!! - // - // Let's define UniformBlockIndex == the order at glslang getUniformBlock() - // aka `i = glGetUniformBlockIndex(prog, "BlockName")` implies: - // `prog->getUniformBlock(i) == "BlockName"` - UnorderedMap m_uniformBlockIndexByName; - Vector m_uniformBlockBinding; + // Uniforms + UnorderedMap m_uniformLocations; + // Ordered by location, + // aka. m_uniformIndexInTProgram[loc] == "uniform index of TProgram at location `loc`" + Vector m_uniformIndexInTProgram; + // ditto. Will be set at glUniform1i + Vector m_uniformSamplerOrImageUnitIndex; - // Need to be reflected after linking of SPIR-V binary - Vector m_uniformOffsets; - Vector m_uniformSizesInBytes; - Vector m_uboScratch; + // Ordered by uniform block index + // index is DIFFERENT from binding!!! + // + // Let's define UniformBlockIndex == the order at glslang getUniformBlock() + // aka `i = glGetUniformBlockIndex(prog, "BlockName")` implies: + // `prog->getUniformBlock(i) == "BlockName"` + UnorderedMap m_uniformBlockIndexByName; + Vector m_uniformBlockBinding; - Uint m_activeUniformCount = 0; - Uint m_maxUniformLocation = 0; - Int m_uniformNameMaxLength = 0; - Int m_attribInNameMaxLength = 0; - Int m_uniformBlockNameMaxLength = 0; + // Need to be reflected after linking of SPIR-V binary + Vector m_uniformOffsets; + Vector m_uniformSizesInBytes; + Vector m_uboScratch; - String m_infoLog; - Bool m_deleteStatus = false; - Bool m_linkStatus = false; - Bool m_validateStatus = true; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + Uint m_activeUniformCount = 0; + Uint m_maxUniformLocation = 0; + Int m_uniformNameMaxLength = 0; + Int m_attribInNameMaxLength = 0; + Int m_uniformBlockNameMaxLength = 0; + + String m_infoLog; + Bool m_deleteStatus = false; + Bool m_linkStatus = false; + Bool m_validateStatus = true; + }; +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp b/MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp index 5b61e8db..53e19880 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp @@ -8,73 +8,71 @@ #include "ProgramState.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - Uint ProgramState::CreateProgram() { - Uint programId = 0; - m_programIndexGenerator.Generate(1, &programId); - EnsureIndexAvail(programId, m_programObjects); - auto programObject = MakeShared(programId); - if (programObject == nullptr) return 0; - m_programObjects[programId] = programObject; - return programId; - } +namespace MobileGL::MG_State::GLState { + Uint ProgramState::CreateProgram() { + Uint programId = 0; + m_programIndexGenerator.Generate(1, &programId); + EnsureIndexAvail(programId, m_programObjects); + auto programObject = MakeShared(programId); + if (programObject == nullptr) return 0; + m_programObjects[programId] = programObject; + return programId; + } - SharedPtr ProgramState::GetProgramObject(const Uint id) { - if (!CheckIndexAvail(id, m_programObjects)) return nullptr; // FIXME: add error reporting here - return m_programObjects[id]; - } + const SharedPtr& ProgramState::GetProgramObject(const Uint id) { + static SharedPtr nullProgramObject = nullptr; + if (!CheckIndexAvail(id, m_programObjects)) return nullProgramObject; // FIXME: add error reporting here + return m_programObjects[id]; + } - void ProgramState::MarkProgramObjectForDeletion(const Uint program) { - if (!CheckIndexAvail(program, m_programObjects)) return; // FIXME: add error reporting here - auto& programObject = m_programObjects[program]; - if (programObject != nullptr) { - programObject->MarkAsDeleted(); - programObject.reset(); - m_programIndexGenerator.Delete(program); - } - } + void ProgramState::MarkProgramObjectForDeletion(const Uint program) { + if (!CheckIndexAvail(program, m_programObjects)) return; // FIXME: add error reporting here + auto& programObject = m_programObjects[program]; + if (programObject != nullptr) { + programObject->MarkAsDeleted(); + programObject.reset(); + m_programIndexGenerator.Delete(program); + } + } - Bool ProgramState::ValidateProgramObject(const Uint program) const { - return CheckIndexAvail(program, m_programObjects) && m_programObjects[program] != nullptr; - } + Bool ProgramState::ValidateProgramObject(const Uint program) const { + return CheckIndexAvail(program, m_programObjects) && m_programObjects[program] != nullptr; + } - void ProgramState::UseProgram(Uint program) { - if (program == 0) m_currentProgram.reset(); + void ProgramState::UseProgram(Uint program) { + if (program == 0) m_currentProgram.reset(); - if (!CheckIndexAvail(program, m_programObjects)) return; - m_currentProgram = m_programObjects[program]; - } + if (!CheckIndexAvail(program, m_programObjects)) return; + m_currentProgram = m_programObjects[program]; + } - Uint ProgramState::CreateShader(ShaderStage stage) { - Uint shaderId = 0; - m_shaderIndexGenerator.Generate(1, &shaderId); - EnsureIndexAvail(shaderId, m_shaderObjects); - auto shaderObject = MakeShared(stage, shaderId); - if (shaderObject == nullptr) return 0; - m_shaderObjects[shaderId] = shaderObject; - return shaderId; - } + Uint ProgramState::CreateShader(ShaderStage stage) { + Uint shaderId = 0; + m_shaderIndexGenerator.Generate(1, &shaderId); + EnsureIndexAvail(shaderId, m_shaderObjects); + auto shaderObject = MakeShared(stage, shaderId); + if (shaderObject == nullptr) return 0; + m_shaderObjects[shaderId] = shaderObject; + return shaderId; + } - SharedPtr ProgramState::GetShaderObject(const Uint shader) { - if (!CheckIndexAvail(shader, m_shaderObjects)) return nullptr; - return m_shaderObjects[shader]; - } + const SharedPtr& ProgramState::GetShaderObject(const Uint shader) { + static SharedPtr nullShaderObject = nullptr; + if (!CheckIndexAvail(shader, m_shaderObjects)) return nullShaderObject; + return m_shaderObjects[shader]; + } - void ProgramState::MarkShaderObjectForDeletion(Uint shader) { - if (!CheckIndexAvail(shader, m_shaderObjects)) return; - auto& shaderObject = m_shaderObjects[shader]; - if (shaderObject != nullptr) { - m_shaderObjects[shader]->MarkAsDeleted(); - m_shaderObjects[shader].reset(); - m_shaderIndexGenerator.Delete(shader); - } - } + void ProgramState::MarkShaderObjectForDeletion(Uint shader) { + if (!CheckIndexAvail(shader, m_shaderObjects)) return; + auto& shaderObject = m_shaderObjects[shader]; + if (shaderObject != nullptr) { + m_shaderObjects[shader]->MarkAsDeleted(); + m_shaderObjects[shader].reset(); + m_shaderIndexGenerator.Delete(shader); + } + } - Bool ProgramState::ValidateShaderObject(Uint shader) const { - return CheckIndexAvail(shader, m_shaderObjects) && m_shaderObjects[shader] != nullptr; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + Bool ProgramState::ValidateShaderObject(Uint shader) const { + return CheckIndexAvail(shader, m_shaderObjects) && m_shaderObjects[shader] != nullptr; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramState.h b/MobileGL/MG_State/GLState/ProgramState/ProgramState.h index 085492b3..afdfe78f 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramState.h +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramState.h @@ -11,49 +11,45 @@ #include #include "ProgramObject.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - class ProgramState { - public: - // This function WILL actually create the program object. - // To retrieve created program object, use GetProgramObject() - Uint CreateProgram(); - SharedPtr GetProgramObject(Uint id); - void MarkProgramObjectForDeletion(Uint program); - Bool ValidateProgramObject(Uint program) const; +namespace MobileGL::MG_State::GLState { + class ProgramState { + public: + // This function WILL actually create the program object. + // To retrieve created program object, use GetProgramObject() + Uint CreateProgram(); + const SharedPtr& GetProgramObject(Uint id); + void MarkProgramObjectForDeletion(Uint program); + Bool ValidateProgramObject(Uint program) const; - void UseProgram(Uint program); + void UseProgram(Uint program); - Uint CreateShader(ShaderStage stage); - SharedPtr GetShaderObject(Uint shader); - void MarkShaderObjectForDeletion(Uint shader); - Bool ValidateShaderObject(Uint shader) const; + Uint CreateShader(ShaderStage stage); + const SharedPtr& GetShaderObject(Uint shader); + void MarkShaderObjectForDeletion(Uint shader); + Bool ValidateShaderObject(Uint shader) const; - SharedPtr GetCurrentProgram() const { return m_currentProgram; } + const SharedPtr& GetCurrentProgram() const { return m_currentProgram; } - private: - template - static Bool CheckIndexAvail(const SizeT idx, const Vector& vec) { - return idx < vec.size(); - } + private: + template + static Bool CheckIndexAvail(const SizeT idx, const Vector& vec) { + return idx < vec.size(); + } - template - static void EnsureIndexAvail(const SizeT idx, Vector& vec) { - if (CheckIndexAvail(idx, vec)) return; + template + static void EnsureIndexAvail(const SizeT idx, Vector& vec) { + if (CheckIndexAvail(idx, vec)) return; - vec.reserve(std::bit_ceil(idx)); - vec.resize(idx + 1); - } + vec.reserve(std::bit_ceil(idx)); + vec.resize(idx + 1); + } - IndexGenerator m_programIndexGenerator; - Vector> m_programObjects; + IndexGenerator m_programIndexGenerator; + Vector> m_programObjects; - IndexGenerator m_shaderIndexGenerator; - Vector> m_shaderObjects; + IndexGenerator m_shaderIndexGenerator; + Vector> m_shaderObjects; - SharedPtr m_currentProgram; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + SharedPtr m_currentProgram; + }; +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp index 0bce81e2..d855799f 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp @@ -13,43 +13,40 @@ #include #include -namespace MobileGL { - namespace MG_State { - namespace GLState { - void ShaderObject::SetShaderSource(const String& source) { - m_source = source; - } +namespace MobileGL::MG_State::GLState { + void ShaderObject::SetShaderSource(const String& source) { + m_source = source; + } - void ShaderObject::SetShaderSource(String&& source) { - m_source = Move(source); - } + void ShaderObject::SetShaderSource(String&& source) { + m_source = Move(source); + } - void ShaderObject::Compile() { - using namespace MG_Util::ShaderTranspiler; - MG_Util::ShaderTranspiler::PreprocessShaderSource(m_stage, m_source); + void ShaderObject::Compile() { + using namespace MG_Util::ShaderTranspiler; + MG_Util::ShaderTranspiler::PreprocessShaderSource(m_stage, m_source); - // Compile for OpenGL here, so that we can do validation and link - // like a real OpenGL driver at linking stage - // Will compile for other backends later. - ShaderAttrib attrib{ - .shaderType = MG_Util::ConvertShaderStageToGLEnum(m_stage), .sourceStr = m_source, .flags = ShaderCompileBits::CompileForOpenGL}; + // Compile for OpenGL here, so that we can do validation and link + // like a real OpenGL driver at linking stage + // Will compile for other backends later. + ShaderAttrib attrib{.shaderType = MG_Util::ConvertShaderStageToGLEnum(m_stage), + .sourceStr = m_source, + .flags = ShaderCompileBits::CompileForOpenGL}; - auto result = ShaderCompiler::CompileShader(attrib); - if (result) { - m_compileStatus = true; - m_shader = result.value(); - } else { - m_compileStatus = false; - m_infoLog = result.error().log; - MGLOG_D("ShaderObject::Compile: Shader %d compilation failed.\nSource:\n%s\nInfoLog:\n%s\nSetting " - "m_compileStatus = false as a result.", - m_externalIndex, m_source.c_str(), m_infoLog.c_str()); - } - } + auto result = ShaderCompiler::CompileShader(attrib); + if (result) { + m_compileStatus = true; + m_shader = result.value(); + } else { + m_compileStatus = false; + m_infoLog = result.error().log; + MGLOG_D("ShaderObject::Compile: Shader %d compilation failed.\nSource:\n%s\nInfoLog:\n%s\nSetting " + "m_compileStatus = false as a result.", + m_externalIndex, m_source.c_str(), m_infoLog.c_str()); + } + } - void ShaderObject::MarkAsDeleted() { - m_deleteStatus = true; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + void ShaderObject::MarkAsDeleted() { + m_deleteStatus = true; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h index 29d69743..c4a93e62 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h @@ -21,37 +21,35 @@ namespace MobileGL { Unknown = -1 }; - namespace MG_State { - namespace GLState { - class ShaderObject { - public: - ShaderObject(const ShaderStage stage, Uint externalIndex) - : m_stage(stage), m_externalIndex(externalIndex) {} - void SetShaderSource(const String& source); - void SetShaderSource(String&& source); - void Compile(); - void MarkAsDeleted(); + namespace MG_State::GLState { + class ShaderObject { + public: + ShaderObject(const ShaderStage stage, Uint externalIndex) + : m_stage(stage), m_externalIndex(externalIndex) {} + void SetShaderSource(const String& source); + void SetShaderSource(String&& source); + void Compile(); + void MarkAsDeleted(); - Uint GetExternalIndex() const { return m_externalIndex; } - ShaderStage GetShaderStage() const { return m_stage; } - const String& GetShaderSource() const { return m_source; } - SharedPtr GetCompiledShader() const { return m_shader; } - const String& GetInfoLog() const { return m_infoLog; } - const UnorderedMap& GetUniformLocations() const { return m_uniforms; } - Bool GetCompileStatus() const { return m_compileStatus; } - Bool GetDeleteStatus() const { return m_deleteStatus; } + Uint GetExternalIndex() const { return m_externalIndex; } + ShaderStage GetShaderStage() const { return m_stage; } + const String& GetShaderSource() const { return m_source; } + const SharedPtr& GetCompiledShader() const { return m_shader; } + const String& GetInfoLog() const { return m_infoLog; } + const UnorderedMap& GetUniformLocations() const { return m_uniforms; } + Bool GetCompileStatus() const { return m_compileStatus; } + Bool GetDeleteStatus() const { return m_deleteStatus; } - private: - const Uint m_externalIndex = 0; - const ShaderStage m_stage; - String m_source; - SharedPtr m_shader; - UnorderedMap m_uniforms; + private: + const Uint m_externalIndex = 0; + const ShaderStage m_stage; + String m_source; + SharedPtr m_shader; + UnorderedMap m_uniforms; - String m_infoLog; - Bool m_deleteStatus = false; - Bool m_compileStatus = false; - }; - } // namespace GLState - } // namespace MG_State + String m_infoLog; + Bool m_deleteStatus = false; + Bool m_compileStatus = false; + }; + } // namespace MG_State::GLState } // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/RenderState/RenderState.cpp b/MobileGL/MG_State/GLState/RenderState/RenderState.cpp index 434af714..157ab661 100644 --- a/MobileGL/MG_State/GLState/RenderState/RenderState.cpp +++ b/MobileGL/MG_State/GLState/RenderState/RenderState.cpp @@ -38,8 +38,8 @@ namespace MobileGL { void RenderState::SetCapability(CapabilityInput cap, Bool enabled) { #define SET_CAPABILITY(capability, flag) \ case CapabilityInput::capability: \ - if (m_parameters.capability##Enabled == flag) break; \ - m_parameters.capability##Enabled = flag; \ + if (m_parameters.capability##Enabled == (flag)) break; \ + m_parameters.capability##Enabled = (flag); \ ++m_version; \ break; @@ -195,7 +195,7 @@ namespace MobileGL { ++m_version; } - const BoolVec4 RenderState::GetColorMask() const { + BoolVec4 RenderState::GetColorMask() const { return m_parameters.ColorMask; } @@ -237,8 +237,8 @@ namespace MobileGL { void RenderState::SetPixelStoreParam(PixelStoreParam param, Int value) { #define SET_PIXEL_STORE_PARAM(paramNameHead, paramNameTail, val) \ case PixelStoreParam::paramNameHead##paramNameTail: \ - if (m_pixelStore##paramNameHead##Parameters.paramNameTail == val) break; \ - m_pixelStore##paramNameHead##Parameters.paramNameTail = val; \ + if (m_pixelStore##paramNameHead##Parameters.paramNameTail == (val)) break; \ + m_pixelStore##paramNameHead##Parameters.paramNameTail = (val); \ break; switch (param) { diff --git a/MobileGL/MG_State/GLState/RenderState/RenderState.h b/MobileGL/MG_State/GLState/RenderState/RenderState.h index 6f7b4096..805c4509 100644 --- a/MobileGL/MG_State/GLState/RenderState/RenderState.h +++ b/MobileGL/MG_State/GLState/RenderState/RenderState.h @@ -201,7 +201,7 @@ namespace MobileGL { // Color Mask void SetColorMask(BoolVec4 mask); - const BoolVec4 GetColorMask() const; + BoolVec4 GetColorMask() const; // Clear State void SetClearColor(FloatVec4 color); diff --git a/MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.cpp b/MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.cpp index b576ed77..b2b30d9a 100644 --- a/MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.cpp +++ b/MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.cpp @@ -7,68 +7,67 @@ // End of Source File Header #include "RenderbufferState.h" +#include "MG_Util/Types.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - RenderbufferState::RenderbufferState() : m_indexGenerator(1024, 1) { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - m_bindingSlots[i] = BindingSlot(static_cast(i)); - } +namespace MobileGL::MG_State::GLState { + RenderbufferState::RenderbufferState() : m_indexGenerator(1024, 1) { + for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { + m_bindingSlots[i] = BindingSlot(static_cast(i)); + } + } + + const SharedPtr& RenderbufferState::GetRenderbufferObject(Uint index) { + auto it = m_renderbufferObjects.find(index); + if (it != m_renderbufferObjects.end()) { + return it->second; + } + static SharedPtr nullRenderbufferObject = nullptr; + return nullRenderbufferObject; + } + + void RenderbufferState::GenerateNames(Uint number, Vector& renderbuffers) { + renderbuffers.resize(number); + m_indexGenerator.Generate(number, renderbuffers.data()); + } + + const SharedPtr& RenderbufferState::CreateRenderbufferObject(Uint index) { + auto& bufferObject = m_renderbufferObjects[index]; + if (!bufferObject) { + bufferObject = MakeShared(index); + } + return bufferObject; + } + + BindingSlot& RenderbufferState::GetBindingSlot(RenderbufferTarget target) { + for (auto& bindingSlot : m_bindingSlots) { + if (bindingSlot.GetTarget() == target) { + return bindingSlot; } + } + MOBILEGL_ASSERT(false, "Invalid RenderbufferTarget enum value: %d", static_cast(target)); + return m_bindingSlots[0]; + } - SharedPtr RenderbufferState::GetRenderbufferObject(Uint index) { - auto it = m_renderbufferObjects.find(index); - if (it != m_renderbufferObjects.end()) { - return it->second; - } - return nullptr; - } - - Vector RenderbufferState::GenerateNames(Uint number) { - Vector buffers(number); - m_indexGenerator.Generate(number, buffers.data()); - return buffers; - } - - SharedPtr RenderbufferState::CreateRenderbufferObject(Uint index) { - auto bufferObject = MakeShared(index); - m_renderbufferObjects[index] = bufferObject; - return bufferObject; - } - - BindingSlot& RenderbufferState::GetBindingSlot(RenderbufferTarget target) { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - if (m_bindingSlots[i].GetTarget() == target) { - return m_bindingSlots[i]; + void RenderbufferState::MarkRenderbufferObjectForDeletion(Uint index) { + if (m_indexGenerator.IsValid(index)) { + auto it = m_renderbufferObjects.find(index); + if (it != m_renderbufferObjects.end()) { + for (auto& bindingSlot : m_bindingSlots) { + if (bindingSlot.GetBoundObject() == it->second) { + bindingSlot.Bind(nullptr); } } - MOBILEGL_ASSERT(false, "Invalid RenderbufferTarget enum value: %d", static_cast(target)); - return m_bindingSlots[0]; + m_renderbufferObjects.erase(it); } + m_indexGenerator.Delete(index); + } + } - void RenderbufferState::MarkRenderbufferObjectForDeletion(Uint index) { - if (m_indexGenerator.IsValid(index)) { - auto it = m_renderbufferObjects.find(index); - if (it != m_renderbufferObjects.end()) { - for (SizeT i = 0; i < m_bindingSlots.size(); ++i) { - if (m_bindingSlots[i].GetBoundObject() == it->second) { - m_bindingSlots[i].Bind(nullptr); - } - } - m_renderbufferObjects.erase(it); - } - m_indexGenerator.Delete(index); - } - } + Bool RenderbufferState::ValidateName(Uint index) const { + return m_indexGenerator.IsValid(index); + } - Bool RenderbufferState::ValidateName(Uint index) const { - return m_indexGenerator.IsValid(index); - } - - Bool RenderbufferState::ValidateRenderbufferObject(Uint index) const { - return m_renderbufferObjects.find(index) != m_renderbufferObjects.end(); - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + Bool RenderbufferState::ValidateRenderbufferObject(Uint index) const { + return m_renderbufferObjects.find(index) != m_renderbufferObjects.end(); + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.h b/MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.h index fea5bc85..76376303 100644 --- a/MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.h +++ b/MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.h @@ -11,27 +11,23 @@ #include #include "RenderbufferObject.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - class RenderbufferState { - public: - RenderbufferState(); +namespace MobileGL::MG_State::GLState { + class RenderbufferState { + public: + RenderbufferState(); - SharedPtr GetRenderbufferObject(Uint index); - Vector GenerateNames(Uint number); - SharedPtr CreateRenderbufferObject(Uint index); - BindingSlot& GetBindingSlot(RenderbufferTarget target); - void MarkRenderbufferObjectForDeletion(Uint index); - Bool ValidateName(Uint index) const; - Bool ValidateRenderbufferObject(Uint index) const; + const SharedPtr& GetRenderbufferObject(Uint index); + void GenerateNames(Uint number, Vector& renderbuffers); + const SharedPtr& CreateRenderbufferObject(Uint index); + BindingSlot& GetBindingSlot(RenderbufferTarget target); + void MarkRenderbufferObjectForDeletion(Uint index); + Bool ValidateName(Uint index) const; + Bool ValidateRenderbufferObject(Uint index) const; - private: - UnorderedMap> m_renderbufferObjects; - IndexGenerator m_indexGenerator; - Array, static_cast(RenderbufferTarget::RenderbufferTargetCount)> - m_bindingSlots; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + private: + UnorderedMap> m_renderbufferObjects; + IndexGenerator m_indexGenerator; + Array, static_cast(RenderbufferTarget::RenderbufferTargetCount)> + m_bindingSlots; + }; +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/SamplerState/SamplerState.cpp b/MobileGL/MG_State/GLState/SamplerState/SamplerState.cpp index 82b950d3..f0252744 100644 --- a/MobileGL/MG_State/GLState/SamplerState/SamplerState.cpp +++ b/MobileGL/MG_State/GLState/SamplerState/SamplerState.cpp @@ -8,42 +8,38 @@ #include "SamplerState.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - SamplerState::SamplerState() : m_indexGenerator(1024, 1) {} +namespace MobileGL::MG_State::GLState { + SamplerState::SamplerState() : m_indexGenerator(1024, 1) {} - Vector SamplerState::GenerateNames(Uint number) { - Vector names(number); - m_indexGenerator.Generate(number, names.data()); - return names; - } + void SamplerState::GenerateNames(Uint number, Vector& samplers) { + samplers.resize(number); + m_indexGenerator.Generate(number, samplers.data()); + } - SharedPtr SamplerState::GetSamplerObject(Uint index) { - auto it = m_samplerObjects.find(index); - return it != m_samplerObjects.end() ? it->second : nullptr; - } + const SharedPtr& SamplerState::GetSamplerObject(Uint index) { + auto it = m_samplerObjects.find(index); + static SharedPtr nullSamplerObject = nullptr; + return it != m_samplerObjects.end() ? it->second : nullSamplerObject; + } - SharedPtr SamplerState::CreateSamplerObject(Uint index) { - auto sampler = MakeShared(index); - m_samplerObjects[index] = sampler; - return sampler; - } + const SharedPtr& SamplerState::CreateSamplerObject(Uint index) { + auto& sampler = m_samplerObjects[index]; + sampler = MakeShared(index); + return sampler; + } - void SamplerState::MarkSamplerObjectForDeletion(Uint index) { - if (m_indexGenerator.IsValid(index)) { - m_samplerObjects.erase(index); - m_indexGenerator.Delete(index); - } - } + void SamplerState::MarkSamplerObjectForDeletion(Uint index) { + if (m_indexGenerator.IsValid(index)) { + m_samplerObjects.erase(index); + m_indexGenerator.Delete(index); + } + } - Bool SamplerState::ValidateName(Uint index) const { - return m_indexGenerator.IsValid(index); - } + Bool SamplerState::ValidateName(Uint index) const { + return m_indexGenerator.IsValid(index); + } - Bool SamplerState::ValidateSamplerObject(Uint index) const { - return m_samplerObjects.find(index) != m_samplerObjects.end(); - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + Bool SamplerState::ValidateSamplerObject(Uint index) const { + return m_samplerObjects.find(index) != m_samplerObjects.end(); + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/SamplerState/SamplerState.h b/MobileGL/MG_State/GLState/SamplerState/SamplerState.h index 74b1596c..0892a658 100644 --- a/MobileGL/MG_State/GLState/SamplerState/SamplerState.h +++ b/MobileGL/MG_State/GLState/SamplerState/SamplerState.h @@ -18,9 +18,9 @@ namespace MobileGL { public: SamplerState(); - Vector GenerateNames(Uint number); - SharedPtr GetSamplerObject(Uint index); - SharedPtr CreateSamplerObject(Uint index); + void GenerateNames(Uint number, Vector& samplers); + const SharedPtr& GetSamplerObject(Uint index); + const SharedPtr& CreateSamplerObject(Uint index); void MarkSamplerObjectForDeletion(Uint index); Bool ValidateName(Uint index) const; Bool ValidateSamplerObject(Uint index) const; diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp b/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp index aaac2c01..076d7647 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp @@ -31,7 +31,7 @@ namespace MobileGL { return {0, 0, 0}; } - SharedPtr TextureObjectBase::GetSamplerObject() const { + const SharedPtr& TextureObjectBase::GetSamplerObject() const { return m_sampler; } diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject.h b/MobileGL/MG_State/GLState/TextureState/TextureObject.h index 5f111641..bdda99dc 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject.h @@ -14,113 +14,107 @@ #include #include -namespace MobileGL { - namespace MG_State { - namespace GLState { - class ITextureObject { - public: - using TargetEnum = TextureTarget; - virtual ~ITextureObject() = default; +namespace MobileGL::MG_State::GLState { + class ITextureObject { + public: + using TargetEnum = TextureTarget; + virtual ~ITextureObject() = default; - virtual TextureStorageType GetStorageType() const = 0; + virtual TextureStorageType GetStorageType() const = 0; - virtual TextureInternalFormat GetFormat() const = 0; - virtual TextureTarget GetTarget() const = 0; - virtual const Vector& GetUploadTargets() const = 0; - virtual IntVec3 GetBaseSize() const = 0; - virtual SharedPtr GetSamplerObject() const = 0; - virtual void SetInternalFormat(TextureInternalFormat format) = 0; - virtual Bool IsComplete() const = 0; - virtual Uint GetExternalIndex() const = 0; - virtual const FloatVec4& GetBorderColor() const = 0; - virtual void SetBorderColor(const FloatVec4& color) = 0; - virtual TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const = 0; - virtual void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) = 0; - virtual void SetSwizzleParamRGBA(const Vec4& values) = 0; - virtual const Vec4& GetAllSwizzleParams() const = 0; - virtual const UintVec2& GetLevelRange() const = 0; - virtual void SetBaseLevel(Uint baseLevel) = 0; - virtual void SetMaxLevel(Uint maxLevel) = 0; - virtual Uint16 GetTextureParamsVersion() const = 0; + virtual TextureInternalFormat GetFormat() const = 0; + virtual TextureTarget GetTarget() const = 0; + virtual const Vector& GetUploadTargets() const = 0; + virtual IntVec3 GetBaseSize() const = 0; + virtual const SharedPtr& GetSamplerObject() const = 0; + virtual void SetInternalFormat(TextureInternalFormat format) = 0; + virtual Bool IsComplete() const = 0; + virtual Uint GetExternalIndex() const = 0; + virtual const FloatVec4& GetBorderColor() const = 0; + virtual void SetBorderColor(const FloatVec4& color) = 0; + virtual TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const = 0; + virtual void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) = 0; + virtual void SetSwizzleParamRGBA(const Vec4& values) = 0; + virtual const Vec4& GetAllSwizzleParams() const = 0; + virtual const UintVec2& GetLevelRange() const = 0; + virtual void SetBaseLevel(Uint baseLevel) = 0; + virtual void SetMaxLevel(Uint maxLevel) = 0; + virtual Uint16 GetTextureParamsVersion() const = 0; - protected: - virtual Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const = 0; - }; + protected: + virtual Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const = 0; + }; - class TextureObjectBase : public ITextureObject { - public: - TextureObjectBase(TextureTarget target, Uint externalIndex); - virtual ~TextureObjectBase() = default; + class TextureObjectBase : public ITextureObject { + public: + TextureObjectBase(TextureTarget target, Uint externalIndex); + virtual ~TextureObjectBase() = default; - TextureInternalFormat GetFormat() const override; - TextureTarget GetTarget() const override; - IntVec3 GetBaseSize() const override; - SharedPtr GetSamplerObject() const override; - void SetInternalFormat(TextureInternalFormat format) override; - Bool IsComplete() const override; - Uint GetExternalIndex() const override; - const FloatVec4& GetBorderColor() const override; - void SetBorderColor(const FloatVec4& color) override; - TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const override; - const Vec4& GetAllSwizzleParams() const override; - void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) override; - void SetSwizzleParamRGBA(const Vec4& values) override; - const UintVec2& GetLevelRange() const override; - void SetBaseLevel(Uint baseLevel) override; - void SetMaxLevel(Uint maxLevel) override; - Uint16 GetTextureParamsVersion() const override; + TextureInternalFormat GetFormat() const override; + TextureTarget GetTarget() const override; + IntVec3 GetBaseSize() const override; + const SharedPtr& GetSamplerObject() const override; + void SetInternalFormat(TextureInternalFormat format) override; + Bool IsComplete() const override; + Uint GetExternalIndex() const override; + const FloatVec4& GetBorderColor() const override; + void SetBorderColor(const FloatVec4& color) override; + TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const override; + const Vec4& GetAllSwizzleParams() const override; + void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) override; + void SetSwizzleParamRGBA(const Vec4& values) override; + const UintVec2& GetLevelRange() const override; + void SetBaseLevel(Uint baseLevel) override; + void SetMaxLevel(Uint maxLevel) override; + Uint16 GetTextureParamsVersion() const override; - protected: - const Uint m_externalIndex; - const TextureTarget m_target = TextureTarget::Unknown; - TextureInternalFormat m_internalFormat = TextureInternalFormat::Unknown; - SharedPtr m_sampler = nullptr; - FloatVec4 m_borderColor = {0.0f, 0.0f, 0.0f, 0.0f}; - Vec4 m_swizzleParams = {TextureSwizzleParam::Red, TextureSwizzleParam::Green, - TextureSwizzleParam::Blue, TextureSwizzleParam::Alpha}; - UintVec2 m_levelRange = {0, 1000}; - Uint16 m_textureParamsVersion = 0; - }; + protected: + const Uint m_externalIndex; + const TextureTarget m_target = TextureTarget::Unknown; + TextureInternalFormat m_internalFormat = TextureInternalFormat::Unknown; + SharedPtr m_sampler = nullptr; + FloatVec4 m_borderColor = {0.0f, 0.0f, 0.0f, 0.0f}; + Vec4 m_swizzleParams = {TextureSwizzleParam::Red, TextureSwizzleParam::Green, + TextureSwizzleParam::Blue, TextureSwizzleParam::Alpha}; + UintVec2 m_levelRange = {0, 1000}; + Uint16 m_textureParamsVersion = 0; + }; - class TextureObjectMipmap : public TextureObjectBase { - public: - TextureObjectMipmap(TextureTarget target, Uint externalIndex) - : TextureObjectBase(target, externalIndex) {} + class TextureObjectMipmap : public TextureObjectBase { + public: + TextureObjectMipmap(TextureTarget target, Uint externalIndex) : TextureObjectBase(target, externalIndex) {} - TextureStorageType GetStorageType() const override { return TextureStorageType::Mipmap; } + TextureStorageType GetStorageType() const override { return TextureStorageType::Mipmap; } - virtual Uint GetMipmapLevelCount() const = 0; - virtual const IntVec3 GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const = 0; - virtual const SizeT GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const = 0; - virtual void AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, MipmapInput input) = 0; - virtual void UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, DataPtr input) = 0; - virtual void* MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) = 0; - virtual void MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, - Bool dirty = true) = 0; - virtual Bool IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const = 0; - }; + virtual Uint GetMipmapLevelCount() const = 0; + virtual const IntVec3 GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const = 0; + virtual const SizeT GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const = 0; + virtual void AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, MipmapInput input) = 0; + virtual void UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, DataPtr input) = 0; + virtual void* MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) = 0; + virtual void MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, Bool dirty = true) = 0; + virtual Bool IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const = 0; + }; - class TextureObjectWithOneMipmap : public TextureObjectMipmap { - public: - TextureObjectWithOneMipmap(TextureTarget target, Uint externalIndex) - : TextureObjectMipmap(target, externalIndex) {} - virtual ~TextureObjectWithOneMipmap() = default; + class TextureObjectWithOneMipmap : public TextureObjectMipmap { + public: + TextureObjectWithOneMipmap(TextureTarget target, Uint externalIndex) + : TextureObjectMipmap(target, externalIndex) {} + virtual ~TextureObjectWithOneMipmap() = default; - Uint GetMipmapLevelCount() const override; - const IntVec3 GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const override; - const SizeT GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const override; - void AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, MipmapInput input) override; - void UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, DataPtr input) override; - void* MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) override; - void MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, Bool dirty) override; - bool IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const override; + Uint GetMipmapLevelCount() const override; + const IntVec3 GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const override; + const SizeT GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const override; + void AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, MipmapInput input) override; + void UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, DataPtr input) override; + void* MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) override; + void MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, Bool dirty) override; + bool IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const override; - IntVec3 GetBaseSize() const override; - Bool IsComplete() const override; + IntVec3 GetBaseSize() const override; + Bool IsComplete() const override; - protected: - MipmapUploadTargetArray<1> m_textureStorage; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + protected: + MipmapUploadTargetArray<1> m_textureStorage; + }; +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObjectBuffer.h b/MobileGL/MG_State/GLState/TextureState/TextureObjectBuffer.h index f5d7928e..a2108c6a 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObjectBuffer.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureObjectBuffer.h @@ -8,7 +8,7 @@ #pragma once #include "TextureObject.h" -#include "MG_State/GLState/BufferState/BufferObject.h" +#include namespace MobileGL { namespace MG_State { diff --git a/MobileGL/MG_State/GLState/TextureState/TextureState.cpp b/MobileGL/MG_State/GLState/TextureState/TextureState.cpp index e0b88904..ffb0007f 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureState.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureState.cpp @@ -17,115 +17,111 @@ #include "TextureObjectBuffer.h" #include "TextureObjectStubs.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - TextureState::TextureState() : m_indexGenerator(1024, 1) { - for (int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i) { - m_textureUnits[i] = TextureUnit(); - } - } +namespace MobileGL::MG_State::GLState { + TextureState::TextureState() : m_indexGenerator(1024, 1) { + for (int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i) { + m_textureUnits[i] = TextureUnit(); + } + } - SharedPtr TextureState::GetTextureObject(Uint index) { - auto it = m_textureObjects.find(index); - if (it != m_textureObjects.end()) { - return it->second; - } - return nullptr; - } + const SharedPtr& TextureState::GetTextureObject(Uint index) { + auto it = m_textureObjects.find(index); + if (it != m_textureObjects.end()) { + return it->second; + } + static SharedPtr nullTextureObject = nullptr; + return nullTextureObject; + } - Vector TextureState::GenerateNames(Uint number) { - Vector textures(number); - m_indexGenerator.Generate(number, textures.data()); - return textures; - } + void TextureState::GenerateNames(Uint number, Vector& textures) { + textures.resize(number); + m_indexGenerator.Generate(number, textures.data()); + } - SharedPtr TextureState::CreateTextureObject(Uint index, TextureTarget target) { - SharedPtr textureObject = nullptr; - switch (target) { - case TextureTarget::Texture1D: - textureObject = MakeShared(index); - break; - case TextureTarget::TextureCubeMap: - textureObject = MakeShared(index); - break; - case TextureTarget::Texture2D: - textureObject = MakeShared(index); - break; - case TextureTarget::Texture3D: - textureObject = MakeShared(index); - break; - case TextureTarget::TextureBuffer: - textureObject = MakeShared(index); - break; + const SharedPtr& TextureState::CreateTextureObject(Uint index, TextureTarget target) { + auto& textureObject = m_textureObjects[index]; + switch (target) { + case TextureTarget::Texture1D: + textureObject = MakeShared(index); + break; + case TextureTarget::TextureCubeMap: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture2D: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture3D: + textureObject = MakeShared(index); + break; + case TextureTarget::TextureBuffer: + textureObject = MakeShared(index); + break; - // These texture types are stubbed: - case TextureTarget::TextureRectangle: - textureObject = MakeShared(index); - break; - case TextureTarget::Texture2DMultisample: - textureObject = MakeShared(index); - break; - case TextureTarget::Texture1DArray: - textureObject = MakeShared(index); - break; - case TextureTarget::Texture2DArray: - textureObject = MakeShared(index); - break; - case TextureTarget::TextureCubeMapArray: - textureObject = MakeShared(index); - break; - case TextureTarget::Texture2DMultisampleArray: - textureObject = MakeShared(index); - break; - default: - MOBILEGL_ASSERT(false, "Unimplemented texture type when creating texture object!: %d", (int)target); - return nullptr; - } + // These texture types are stubbed: + case TextureTarget::TextureRectangle: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture2DMultisample: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture1DArray: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture2DArray: + textureObject = MakeShared(index); + break; + case TextureTarget::TextureCubeMapArray: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture2DMultisampleArray: + textureObject = MakeShared(index); + break; + default: + MOBILEGL_ASSERT(false, "Unimplemented texture type when creating texture object!: %d", (int)target); + static SharedPtr nullTextureObject = nullptr; + return nullTextureObject; + } - m_textureObjects[index] = textureObject; - return textureObject; - } + return textureObject; + } - void TextureState::MarkTextureObjectForDeletion(Uint index) { - if (m_indexGenerator.IsValid(index)) { - auto it = m_textureObjects.find(index); - if (it != m_textureObjects.end()) { - for (auto& unit : m_textureUnits) { - auto& bindingSlots = unit.GetAllBindingSlots(); - for (SizeT i = 0; i < bindingSlots.size(); ++i) { - if (bindingSlots[i].GetBoundObject() == it->second) { - bindingSlots[i].Bind(nullptr); - } - } + void TextureState::MarkTextureObjectForDeletion(Uint index) { + if (m_indexGenerator.IsValid(index)) { + auto it = m_textureObjects.find(index); + if (it != m_textureObjects.end()) { + for (auto& unit : m_textureUnits) { + auto& bindingSlots = unit.GetAllBindingSlots(); + for (auto& bindingSlot : bindingSlots) { + if (bindingSlot.GetBoundObject() == it->second) { + bindingSlot.Bind(nullptr); } - m_textureObjects.erase(it); } - m_indexGenerator.Delete(index); } + m_textureObjects.erase(it); } + m_indexGenerator.Delete(index); + } + } - TextureUnit& TextureState::GetUnitObject(Int unit) { - MOBILEGL_ASSERT(unit >= 0 && unit < MAX_TEXTURE_IMAGE_UNITS, "Texture unit is out of range: %d > %d", - unit, MAX_TEXTURE_IMAGE_UNITS - 1); - return m_textureUnits[unit]; - } + TextureUnit& TextureState::GetUnitObject(Int unit) { + MOBILEGL_ASSERT(unit >= 0 && unit < MAX_TEXTURE_IMAGE_UNITS, "Texture unit is out of range: %d > %d", unit, + MAX_TEXTURE_IMAGE_UNITS - 1); + return m_textureUnits[unit]; + } - Int TextureState::GetActiveTextureUnit() const { - return m_activeTextureUnit; - } + Int TextureState::GetActiveTextureUnit() const { + return m_activeTextureUnit; + } - void TextureState::SetActiveTextureUnit(Int unit) { - m_activeTextureUnit = unit; - } + void TextureState::SetActiveTextureUnit(Int unit) { + m_activeTextureUnit = unit; + } - Bool TextureState::ValidateName(Uint index) const { - return m_indexGenerator.IsValid(index); - } + Bool TextureState::ValidateName(Uint index) const { + return m_indexGenerator.IsValid(index); + } - Bool TextureState::ValidateTextureObject(Uint index) const { - return m_textureObjects.find(index) != m_textureObjects.end(); - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + Bool TextureState::ValidateTextureObject(Uint index) const { + return m_textureObjects.find(index) != m_textureObjects.end(); + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/TextureState/TextureState.h b/MobileGL/MG_State/GLState/TextureState/TextureState.h index 29410b09..fe4fce28 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureState.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureState.h @@ -13,30 +13,26 @@ #include "MG_Util/Types.h" #include "TextureUnit.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - class TextureState { - public: - static constexpr int MAX_TEXTURE_IMAGE_UNITS = 32; +namespace MobileGL::MG_State::GLState { + class TextureState { + public: + static constexpr int MAX_TEXTURE_IMAGE_UNITS = 32; - TextureState(); - Vector GenerateNames(Uint number); - SharedPtr CreateTextureObject(Uint index, TextureTarget target); - SharedPtr GetTextureObject(Uint index); - TextureUnit& GetUnitObject(Int unit); - Int GetActiveTextureUnit() const; - void SetActiveTextureUnit(Int unit); - void MarkTextureObjectForDeletion(Uint index); - Bool ValidateName(Uint index) const; - Bool ValidateTextureObject(Uint index) const; + TextureState(); + void GenerateNames(Uint number, Vector& textures); + const SharedPtr& CreateTextureObject(Uint index, TextureTarget target); + const SharedPtr& GetTextureObject(Uint index); + TextureUnit& GetUnitObject(Int unit); + Int GetActiveTextureUnit() const; + void SetActiveTextureUnit(Int unit); + void MarkTextureObjectForDeletion(Uint index); + Bool ValidateName(Uint index) const; + Bool ValidateTextureObject(Uint index) const; - private: - Int m_activeTextureUnit = 0; - Array m_textureUnits; - IndexGenerator m_indexGenerator; - UnorderedMap> m_textureObjects; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + private: + Int m_activeTextureUnit = 0; + Array m_textureUnits; + IndexGenerator m_indexGenerator; + UnorderedMap> m_textureObjects; + }; +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp b/MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp index c4fa3d7a..b65e1900 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp @@ -8,31 +8,26 @@ #include "TextureUnit.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - TextureUnit::TextureUnit() : m_sampler(nullptr) { - for (int i = 0; i < (int)TextureTarget::TextureTargetCount; ++i) { - m_slots[i] = BindingSlot(static_cast(i)); - } - } +namespace MobileGL::MG_State::GLState { + TextureUnit::TextureUnit() : m_sampler(nullptr) { + for (int i = 0; i < (int)TextureTarget::TextureTargetCount; ++i) { + m_slots[i] = BindingSlot(static_cast(i)); + } + } - BindingSlot& TextureUnit::GetBindingSlot(TextureTarget target) { - return m_slots[(int)target]; - } + BindingSlot& TextureUnit::GetBindingSlot(TextureTarget target) { + return m_slots[(int)target]; + } - Array, (int)TextureTarget::TextureTargetCount>& TextureUnit:: - GetAllBindingSlots() { - return m_slots; - } + Array, (int)TextureTarget::TextureTargetCount>& TextureUnit::GetAllBindingSlots() { + return m_slots; + } - void TextureUnit::SetSamplerObject(SharedPtr sampler) { - m_sampler = sampler; - } + void TextureUnit::SetSamplerObject(const SharedPtr& sampler) { + m_sampler = sampler; + } - SharedPtr TextureUnit::GetSamplerObject() const { - return m_sampler; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + const SharedPtr& TextureUnit::GetSamplerObject() const { + return m_sampler; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/TextureState/TextureUnit.h b/MobileGL/MG_State/GLState/TextureState/TextureUnit.h index a52d1791..80f02682 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureUnit.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureUnit.h @@ -11,21 +11,17 @@ #include #include "TextureObject.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - class TextureUnit { - public: - TextureUnit(); - BindingSlot& GetBindingSlot(TextureTarget target); - SharedPtr GetSamplerObject() const; - Array, (int)TextureTarget::TextureTargetCount>& GetAllBindingSlots(); - void SetSamplerObject(SharedPtr sampler); +namespace MobileGL::MG_State::GLState { + class TextureUnit { + public: + TextureUnit(); + BindingSlot& GetBindingSlot(TextureTarget target); + const SharedPtr& GetSamplerObject() const; + Array, (int)TextureTarget::TextureTargetCount>& GetAllBindingSlots(); + void SetSamplerObject(const SharedPtr& sampler); - private: - Array, (int)TextureTarget::TextureTargetCount> m_slots; - SharedPtr m_sampler; - }; - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL \ No newline at end of file + private: + Array, (int)TextureTarget::TextureTargetCount> m_slots; + SharedPtr m_sampler; + }; +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayObject.cpp b/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayObject.cpp index d6e8c8c7..f5aad6dd 100644 --- a/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayObject.cpp +++ b/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayObject.cpp @@ -8,137 +8,132 @@ #include "VertexArrayObject.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - VertexArrayObject::VertexArrayObject(Uint externIndex) : m_externalIndex(externIndex) { - for (int index = 0; index < MAX_VERTEX_ATTRIBS; ++index) { - auto& attr = m_attributes[index]; - attr.Enabled = false; - attr.Size = 4; - attr.Type = DataType::Float32; - attr.Normalized = false; - attr.Stride = 0; - attr.Offset = 0; - attr.Buffer = nullptr; +namespace MobileGL::MG_State::GLState { + VertexArrayObject::VertexArrayObject(Uint externIndex) : m_externalIndex(externIndex) { + for (int index = 0; index < MAX_VERTEX_ATTRIBS; ++index) { + auto& attr = m_attributes[index]; + attr.Enabled = false; + attr.Size = 4; + attr.Type = DataType::Float32; + attr.Normalized = false; + attr.Stride = 0; + attr.Offset = 0; + attr.Buffer = nullptr; - BumpAttributeFormatVersion(index); - } - } + BumpAttributeFormatVersion(index); + } + } - void VertexArrayObject::EnableAttribute(Uint index) { - if (index >= MAX_VERTEX_ATTRIBS) return; + void VertexArrayObject::EnableAttribute(Uint index) { + if (index >= MAX_VERTEX_ATTRIBS) return; - if (m_attributes[index].Enabled) return; + if (m_attributes[index].Enabled) return; - m_attributes[index].Enabled = true; - BumpAttributeSwitchVersion(index); - } + m_attributes[index].Enabled = true; + BumpAttributeSwitchVersion(index); + } - void VertexArrayObject::DisableAttribute(Uint index) { - if (index >= MAX_VERTEX_ATTRIBS) return; + void VertexArrayObject::DisableAttribute(Uint index) { + if (index >= MAX_VERTEX_ATTRIBS) return; - if (!m_attributes[index].Enabled) return; + if (!m_attributes[index].Enabled) return; - m_attributes[index].Enabled = false; - BumpAttributeSwitchVersion(index); - } + m_attributes[index].Enabled = false; + BumpAttributeSwitchVersion(index); + } - Bool VertexArrayObject::IsAttributeEnabled(Uint index) const { - if (index >= MAX_VERTEX_ATTRIBS) return false; - return m_attributes[index].Enabled; - } + Bool VertexArrayObject::IsAttributeEnabled(Uint index) const { + if (index >= MAX_VERTEX_ATTRIBS) return false; + return m_attributes[index].Enabled; + } - void VertexArrayObject::SetAttributeFormat(Uint index, int size, DataType type, Bool normalized, int stride, - SizeT offset, Bool isInteger) { - if (index >= MAX_VERTEX_ATTRIBS) return; + void VertexArrayObject::SetAttributeFormat(Uint index, int size, DataType type, Bool normalized, int stride, + SizeT offset, Bool isInteger) { + if (index >= MAX_VERTEX_ATTRIBS) return; - if (m_attributes[index].Size == size && m_attributes[index].Type == type && - m_attributes[index].Normalized == normalized && m_attributes[index].Stride == stride && - m_attributes[index].Offset == offset && m_attributes[index].IsInteger == isInteger) { - return; - } + if (m_attributes[index].Size == size && m_attributes[index].Type == type && + m_attributes[index].Normalized == normalized && m_attributes[index].Stride == stride && + m_attributes[index].Offset == offset && m_attributes[index].IsInteger == isInteger) { + return; + } - if (size < 1 || size > 4) { - return; - } + if (size < 1 || size > 4) { + return; + } - auto& attr = m_attributes[index]; - attr.Size = size; - attr.Type = type; - attr.Normalized = normalized; - attr.Stride = stride; - attr.Offset = offset; - attr.IsInteger = isInteger; + auto& attr = m_attributes[index]; + attr.Size = size; + attr.Type = type; + attr.Normalized = normalized; + attr.Stride = stride; + attr.Offset = offset; + attr.IsInteger = isInteger; - BumpAttributeFormatVersion(index); - } + BumpAttributeFormatVersion(index); + } - void VertexArrayObject::BindAttributeBuffer(Uint index, const SharedPtr& buffer) { - if (index >= MAX_VERTEX_ATTRIBS) return; + void VertexArrayObject::BindAttributeBuffer(Uint index, const SharedPtr& buffer) { + if (index >= MAX_VERTEX_ATTRIBS) return; - if (m_attributes[index].Buffer == buffer) return; + if (m_attributes[index].Buffer == buffer) return; - m_attributes[index].Buffer = buffer; - BumpAttributeBufferVersion(index); - } + m_attributes[index].Buffer = buffer; + BumpAttributeBufferVersion(index); + } - BindingSlot& VertexArrayObject::GetIndexBufferBindingSlot() { - return m_indexBufferBindingSlot; - } + BindingSlot& VertexArrayObject::GetIndexBufferBindingSlot() { + return m_indexBufferBindingSlot; + } - const VertexAttribute& VertexArrayObject::GetAttribute(Uint index) const { - static VertexAttribute emptyAttr; - if (index >= MAX_VERTEX_ATTRIBS) return emptyAttr; - return m_attributes[index]; - } + const VertexAttribute& VertexArrayObject::GetAttribute(Uint index) const { + static VertexAttribute emptyAttr; + if (index >= MAX_VERTEX_ATTRIBS) return emptyAttr; + return m_attributes[index]; + } - const Array& VertexArrayObject::GetAllAttributes() - const { - return m_attributes; - } + const Array& VertexArrayObject::GetAllAttributes() const { + return m_attributes; + } - Uint VertexArrayObject::GetExternalIndex() const { - return m_externalIndex; - } + Uint VertexArrayObject::GetExternalIndex() const { + return m_externalIndex; + } - void VertexArrayObject::SetAttributeDivisor(Uint index, Uint divisor) { - if (index >= MAX_VERTEX_ATTRIBS) return; - if (m_attributes[index].Divisor == divisor) return; - m_attributes[index].Divisor = divisor; - BumpAttributeFormatVersion(index); - } + void VertexArrayObject::SetAttributeDivisor(Uint index, Uint divisor) { + if (index >= MAX_VERTEX_ATTRIBS) return; + if (m_attributes[index].Divisor == divisor) return; + m_attributes[index].Divisor = divisor; + BumpAttributeFormatVersion(index); + } - Uint VertexArrayObject::GetAttributeDivisor(Uint index) const { - if (index >= MAX_VERTEX_ATTRIBS) return 0; - return m_attributes[index].Divisor; - } + Uint VertexArrayObject::GetAttributeDivisor(Uint index) const { + if (index >= MAX_VERTEX_ATTRIBS) return 0; + return m_attributes[index].Divisor; + } - void VertexArrayObject::BumpAttributeFormatVersion(Uint index) { - if (index >= MAX_VERTEX_ATTRIBS) return; - ++m_attributeVersions[index].FormatVersion; - } + void VertexArrayObject::BumpAttributeFormatVersion(Uint index) { + if (index >= MAX_VERTEX_ATTRIBS) return; + ++m_attributeVersions[index].FormatVersion; + } - void VertexArrayObject::BumpAttributeBufferVersion(Uint index) { - if (index >= MAX_VERTEX_ATTRIBS) return; - ++m_attributeVersions[index].BufferVersion; - } + void VertexArrayObject::BumpAttributeBufferVersion(Uint index) { + if (index >= MAX_VERTEX_ATTRIBS) return; + ++m_attributeVersions[index].BufferVersion; + } - void VertexArrayObject::BumpAttributeSwitchVersion(Uint index) { - if (index >= MAX_VERTEX_ATTRIBS) return; - ++m_attributeVersions[index].SwitchVersion; - } + void VertexArrayObject::BumpAttributeSwitchVersion(Uint index) { + if (index >= MAX_VERTEX_ATTRIBS) return; + ++m_attributeVersions[index].SwitchVersion; + } - const VertexAttributeVersion& VertexArrayObject::GetAttributeVersion(Uint index) const { - static VertexAttributeVersion emptyVersion; - if (index >= MAX_VERTEX_ATTRIBS) return emptyVersion; - return m_attributeVersions[index]; - } + const VertexAttributeVersion& VertexArrayObject::GetAttributeVersion(Uint index) const { + static VertexAttributeVersion emptyVersion; + if (index >= MAX_VERTEX_ATTRIBS) return emptyVersion; + return m_attributeVersions[index]; + } - const Array& VertexArrayObject:: - GetAllAttributeVersions() const { - return m_attributeVersions; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + const Array& VertexArrayObject:: + GetAllAttributeVersions() const { + return m_attributeVersions; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.cpp b/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.cpp index 5831817f..c90cf6e2 100644 --- a/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.cpp +++ b/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.cpp @@ -8,76 +8,74 @@ #include "VertexArrayState.h" -namespace MobileGL { - namespace MG_State { - namespace GLState { - VertexArrayState::VertexArrayState() : m_indexGenerator(1024, 1) { - // Generate default VAO at index 0, which is not valid in core profile, but still remains for - // compatibility reasons. - m_indexGenerator.Insert(0); - auto defaultVAO = MakeShared(0); - m_vertexArrays.push_back(defaultVAO); - m_boundVertexArray = defaultVAO; +namespace MobileGL::MG_State::GLState { + VertexArrayState::VertexArrayState() : m_indexGenerator(1024, 1) { + // Generate default VAO at index 0, which is not valid in core profile, but still remains for + // compatibility reasons. + m_indexGenerator.Insert(0); + auto defaultVAO = MakeShared(0); + m_vertexArrays.push_back(defaultVAO); + m_boundVertexArray = defaultVAO; + } + + const SharedPtr& VertexArrayState::GetVertexArrayObject(Uint index) { + if (index >= m_vertexArrays.size()) { + // FIXME: report a GL error here + static SharedPtr nullVertexArrayObject = nullptr; + return nullVertexArrayObject; + } + + return m_vertexArrays[index]; + } + + void VertexArrayState::GenerateNames(Uint number, Vector& arrays) { + arrays.resize(number); + m_indexGenerator.Generate(number, arrays.data()); + } + + void VertexArrayState::Bind(Uint index) { + m_boundVertexArray = GetVertexArrayObject(index); + } + + const SharedPtr& VertexArrayState::CreateVertexArrayObject(Uint index) { + if (index >= m_vertexArrays.size()) { + // power-of-2 reallocation + m_vertexArrays.reserve(std::bit_ceil(index + 1)); + m_vertexArrays.resize(index + 1, nullptr); + } + auto& vao = m_vertexArrays[index]; + vao = MakeShared(index); + return vao; + } + + void VertexArrayState::MarkVertexArrayForDeletion(Uint index) { + if (m_indexGenerator.IsValid(index)) { + if (m_boundVertexArray) { + m_boundVertexArray = nullptr; } - SharedPtr VertexArrayState::GetVertexArrayObject(Uint index) { - if (index >= m_vertexArrays.size()) - // FIXME: report a GL error here - return nullptr; - - return m_vertexArrays[index]; + if (ValidateVertexArrayObject(index)) { + m_vertexArrays[index] = nullptr; } - Vector VertexArrayState::GenerateNames(Uint number) { - Vector arrays(number); - m_indexGenerator.Generate(number, arrays.data()); - return arrays; - } + m_indexGenerator.Delete(index); + } + // FIXME: report GL error here? + } - void VertexArrayState::Bind(Uint index) { - m_boundVertexArray = GetVertexArrayObject(index); - } + Bool VertexArrayState::ValidateName(Uint index) const { + return m_indexGenerator.IsValid(index); + } - SharedPtr VertexArrayState::CreateVertexArrayObject(Uint index) { - if (index >= m_vertexArrays.size()) { - // power-of-2 reallocation - m_vertexArrays.reserve(std::bit_ceil(index + 1)); - m_vertexArrays.resize(index + 1, nullptr); - } - auto vao = m_vertexArrays[index] = MakeShared(index); - return vao; - } + Bool VertexArrayState::ValidateVertexArrayObject(Uint index) const { + return index < m_vertexArrays.size() && m_vertexArrays[index] != nullptr; + } - void VertexArrayState::MarkVertexArrayForDeletion(Uint index) { - if (m_indexGenerator.IsValid(index)) { - if (m_boundVertexArray) { - m_boundVertexArray = nullptr; - } + const SharedPtr& VertexArrayState::GetBoundVertexArray() { + return m_boundVertexArray; + } - if (ValidateVertexArrayObject(index)) { - m_vertexArrays[index] = nullptr; - } - - m_indexGenerator.Delete(index); - } - // FIXME: report GL error here? - } - - Bool VertexArrayState::ValidateName(Uint index) const { - return m_indexGenerator.IsValid(index); - } - - Bool VertexArrayState::ValidateVertexArrayObject(Uint index) const { - return index < m_vertexArrays.size() && m_vertexArrays[index] != nullptr; - } - - SharedPtr VertexArrayState::GetBoundVertexArray() { - return m_boundVertexArray; - } - - Vector>& VertexArrayState::GetAllVertexArrays() { - return m_vertexArrays; - } - } // namespace GLState - } // namespace MG_State -} // namespace MobileGL + Vector>& VertexArrayState::GetAllVertexArrays() { + return m_vertexArrays; + } +} // namespace MobileGL::MG_State::GLState diff --git a/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.h b/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.h index 8cb0a1c0..a79b7cba 100644 --- a/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.h +++ b/MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.h @@ -18,14 +18,14 @@ namespace MobileGL { public: VertexArrayState(); - SharedPtr GetVertexArrayObject(Uint index); - Vector GenerateNames(Uint number); + const SharedPtr& GetVertexArrayObject(Uint index); + void GenerateNames(Uint number, Vector& arrays); void Bind(Uint index); - SharedPtr CreateVertexArrayObject(Uint index); + const SharedPtr& CreateVertexArrayObject(Uint index); void MarkVertexArrayForDeletion(Uint index); Bool ValidateName(Uint index) const; Bool ValidateVertexArrayObject(Uint index) const; - SharedPtr GetBoundVertexArray(); + const SharedPtr& GetBoundVertexArray(); Vector>& GetAllVertexArrays(); private: diff --git a/MobileGL/MG_Util/Types.h b/MobileGL/MG_Util/Types.h index 9ba2fc86..d1a122d8 100644 --- a/MobileGL/MG_Util/Types.h +++ b/MobileGL/MG_Util/Types.h @@ -148,15 +148,15 @@ namespace MobileGL { public: using TargetEnum = typename ObjectType::TargetEnum; - BindingSlot() : m_target((TargetEnum)0), m_boundObject(nullptr) {} - explicit BindingSlot(TargetEnum target) : m_target(target), m_boundObject(nullptr) {} + BindingSlot() : m_target((TargetEnum)0) {} + explicit BindingSlot(TargetEnum target) : m_target(target) {} void Bind(SharedPtr object) { if (m_boundObject == object) return; - m_boundObject = object; + m_boundObject = Move(object); ++m_version; } - SharedPtr GetBoundObject() const { return m_boundObject; } + SharedPtr const& GetBoundObject() const noexcept { return m_boundObject; } TargetEnum GetTarget() const { return m_target; } Uint16 GetVersion() const { return m_version; }