mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08:30 +09:00
Merge branch 'dev' into Feat/Backend-Direct-Vulkan
This commit is contained in:
@@ -14,7 +14,6 @@ bugprone-forwarding-reference-overload,
|
|||||||
bugprone-inaccurate-erase,
|
bugprone-inaccurate-erase,
|
||||||
bugprone-incorrect-roundings,
|
bugprone-incorrect-roundings,
|
||||||
bugprone-integer-division,
|
bugprone-integer-division,
|
||||||
bugprone-lambda-function-name,
|
|
||||||
bugprone-macro-parentheses,
|
bugprone-macro-parentheses,
|
||||||
bugprone-macro-repeated-side-effects,
|
bugprone-macro-repeated-side-effects,
|
||||||
bugprone-misplaced-operator-in-strlen-in-alloc,
|
bugprone-misplaced-operator-in-strlen-in-alloc,
|
||||||
@@ -63,7 +62,6 @@ cert-str34-c,
|
|||||||
cppcoreguidelines-interfaces-global-init,
|
cppcoreguidelines-interfaces-global-init,
|
||||||
cppcoreguidelines-narrowing-conversions,
|
cppcoreguidelines-narrowing-conversions,
|
||||||
cppcoreguidelines-pro-type-member-init,
|
cppcoreguidelines-pro-type-member-init,
|
||||||
cppcoreguidelines-pro-type-static-cast-downcast,
|
|
||||||
cppcoreguidelines-slicing,
|
cppcoreguidelines-slicing,
|
||||||
google-default-arguments,
|
google-default-arguments,
|
||||||
google-runtime-operator,
|
google-runtime-operator,
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ set(SOURCE_FILES
|
|||||||
MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp
|
||||||
|
|
||||||
MobileGL/MG_State/GLState/Core.cpp
|
MobileGL/MG_State/GLState/Core.cpp
|
||||||
|
MobileGL/MG_State/EGLState/Core.cpp
|
||||||
MobileGL/MG_State/GLState/ErrorState/Error.cpp
|
MobileGL/MG_State/GLState/ErrorState/Error.cpp
|
||||||
MobileGL/MG_State/GLState/BufferState/BufferState.cpp
|
MobileGL/MG_State/GLState/BufferState/BufferState.cpp
|
||||||
MobileGL/MG_State/GLState/BufferState/BufferObject.cpp
|
MobileGL/MG_State/GLState/BufferState/BufferObject.cpp
|
||||||
|
|||||||
+5
-3
@@ -10,6 +10,7 @@
|
|||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include <MG_Backend/BackendObjects.h>
|
#include <MG_Backend/BackendObjects.h>
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
|
#include <MG_State/EGLState/Core.h>
|
||||||
#include <MG_Impl/GLImpl/Texture/ProxyTexture.h>
|
#include <MG_Impl/GLImpl/Texture/ProxyTexture.h>
|
||||||
#include <MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.h>
|
#include <MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.h>
|
||||||
|
|
||||||
@@ -33,9 +34,10 @@ namespace MobileGL {
|
|||||||
void Destroy() {
|
void Destroy() {
|
||||||
MGLOG_I("MobileGL closing...");
|
MGLOG_I("MobileGL closing...");
|
||||||
glslang::FinalizeProcess();
|
glslang::FinalizeProcess();
|
||||||
delete MG_State::pGLContext;
|
MG_State::pGLContext.reset();
|
||||||
delete MG_Impl::GLImpl::TextureImpl::pProxyTextureManager;
|
MG_State::pEGLContext.reset();
|
||||||
delete MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo;
|
MG_Impl::GLImpl::TextureImpl::pProxyTextureManager.reset();
|
||||||
|
MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo.reset();
|
||||||
MG_Util::Debug::Close();
|
MG_Util::Debug::Close();
|
||||||
|
|
||||||
// TODO: add and use Destroy functions for other subsystems
|
// TODO: add and use Destroy functions for other subsystems
|
||||||
|
|||||||
@@ -9,7 +9,133 @@
|
|||||||
#include "BackendObject.h"
|
#include "BackendObject.h"
|
||||||
|
|
||||||
namespace MobileGL::MG_Backend {
|
namespace MobileGL::MG_Backend {
|
||||||
|
namespace {
|
||||||
|
Bool IsReleaseCurrentRequest(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
|
||||||
|
return dpy == EGL_NO_DISPLAY && draw == EGL_NO_SURFACE && read == EGL_NO_SURFACE && ctx == EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::thread::id CurrentThreadKey() {
|
||||||
|
return std::this_thread::get_id();
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
Bool BackendObject::InitializeEGLDisplay(EGLDisplay dpy, EGLint* major, EGLint* minor) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
if (dpy == EGL_NO_DISPLAY) {
|
||||||
|
MGLOG_E("InitializeEGLDisplay failed: invalid EGLDisplay");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_eglDisplayInitialized && m_eglDisplay != dpy) {
|
||||||
|
MGLOG_E("InitializeEGLDisplay failed: backend already bound to a different EGLDisplay");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_eglDisplay = dpy;
|
||||||
|
m_eglDisplayInitialized = true;
|
||||||
|
if (major) {
|
||||||
|
*major = 1;
|
||||||
|
}
|
||||||
|
if (minor) {
|
||||||
|
*minor = 5;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject::CreateEGLWindowSurface(const WindowHandle& handle) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
if (!m_eglDisplayInitialized) {
|
||||||
|
MGLOG_E("CreateEGLWindowSurface failed: EGL display is not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (handle.Backend == WindowBackend::Unknown || !handle.Handle) {
|
||||||
|
MGLOG_E("CreateEGLWindowSurface failed: invalid native window handle");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_eglWindowSurfaceInitialized && m_windowHandle.Backend == handle.Backend && m_windowHandle.Handle == handle.Handle) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetWindowHandle(handle);
|
||||||
|
if (!InitWindowSurface()) {
|
||||||
|
MGLOG_E("CreateEGLWindowSurface failed: backend InitWindowSurface failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_eglWindowSurfaceInitialized = true;
|
||||||
|
m_eglCurrentThreads.clear();
|
||||||
|
m_backendCapabilitiesInitialized = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject::MakeEGLCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
const auto threadKey = CurrentThreadKey();
|
||||||
|
if (IsReleaseCurrentRequest(dpy, draw, read, ctx)) {
|
||||||
|
m_eglCurrentThreads.erase(threadKey);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_eglDisplayInitialized || m_eglDisplay != dpy) {
|
||||||
|
MGLOG_E("MakeEGLCurrent failed: EGL display mismatch or not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!m_eglWindowSurfaceInitialized) {
|
||||||
|
MGLOG_E("MakeEGLCurrent failed: EGL window surface is not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (draw == EGL_NO_SURFACE || read == EGL_NO_SURFACE || ctx == EGL_NO_CONTEXT) {
|
||||||
|
MGLOG_E("MakeEGLCurrent failed: draw/read/context is invalid");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_backendCapabilitiesInitialized) {
|
||||||
|
if (!InitCapabilities()) {
|
||||||
|
MGLOG_E("MakeEGLCurrent failed: InitCapabilities failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
m_backendCapabilitiesInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_eglCurrentThreads[threadKey] = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackendObject::ResetEGLRuntimeState() {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
m_eglWindowSurfaceInitialized = false;
|
||||||
|
m_backendCapabilitiesInitialized = false;
|
||||||
|
m_eglCurrentThreads.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject::SwapEGLBuffers(EGLDisplay dpy, EGLSurface draw) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
if (!m_eglDisplayInitialized || m_eglDisplay != dpy) {
|
||||||
|
MGLOG_E("SwapEGLBuffers failed: EGL display mismatch or not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_eglCurrentThreads.find(CurrentThreadKey()) == m_eglCurrentThreads.end()) {
|
||||||
|
MGLOG_E("SwapEGLBuffers failed: no current context attached");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!m_eglWindowSurfaceInitialized || draw == EGL_NO_SURFACE) {
|
||||||
|
MGLOG_E("SwapEGLBuffers failed: invalid draw surface");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& backendFunctions = GetBackendFunctions();
|
||||||
|
if (!backendFunctions.Present) {
|
||||||
|
MGLOG_E("SwapEGLBuffers failed: backend Present function is null");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
backendFunctions.Present();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void BackendObject::SetWindowHandle(const WindowHandle& handle) {
|
void BackendObject::SetWindowHandle(const WindowHandle& handle) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
m_windowHandle = handle;
|
m_windowHandle = handle;
|
||||||
}
|
}
|
||||||
} // namespace MobileGL::MG_Backend
|
} // namespace MobileGL::MG_Backend
|
||||||
|
|||||||
@@ -91,8 +91,13 @@ namespace MobileGL {
|
|||||||
virtual ~BackendObject() = default;
|
virtual ~BackendObject() = default;
|
||||||
|
|
||||||
virtual void Initialize() = 0;
|
virtual void Initialize() = 0;
|
||||||
virtual void InitCapabilities() = 0;
|
virtual Bool InitCapabilities() = 0;
|
||||||
virtual void InitWindowSurface() = 0;
|
virtual Bool InitWindowSurface() = 0;
|
||||||
|
|
||||||
|
virtual Bool InitializeEGLDisplay(EGLDisplay dpy, EGLint* major, EGLint* minor);
|
||||||
|
virtual Bool CreateEGLWindowSurface(const WindowHandle& handle);
|
||||||
|
virtual Bool MakeEGLCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||||
|
virtual Bool SwapEGLBuffers(EGLDisplay dpy, EGLSurface draw);
|
||||||
|
|
||||||
void SetWindowHandle(const WindowHandle& handle);
|
void SetWindowHandle(const WindowHandle& handle);
|
||||||
|
|
||||||
@@ -103,7 +108,15 @@ namespace MobileGL {
|
|||||||
virtual BackendType GetBackendType() const = 0;
|
virtual BackendType GetBackendType() const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void ResetEGLRuntimeState();
|
||||||
|
|
||||||
|
mutable std::recursive_mutex m_eglStateMutex;
|
||||||
WindowHandle m_windowHandle;
|
WindowHandle m_windowHandle;
|
||||||
|
EGLDisplay m_eglDisplay = EGL_NO_DISPLAY;
|
||||||
|
Bool m_eglDisplayInitialized = false;
|
||||||
|
Bool m_eglWindowSurfaceInitialized = false;
|
||||||
|
Bool m_backendCapabilitiesInitialized = false;
|
||||||
|
UnorderedMap<std::thread::id, Bool> m_eglCurrentThreads;
|
||||||
};
|
};
|
||||||
} // namespace MG_Backend
|
} // namespace MG_Backend
|
||||||
} // namespace MobileGL
|
} // namespace MobileGL
|
||||||
|
|||||||
@@ -13,16 +13,24 @@
|
|||||||
#include <format>
|
#include <format>
|
||||||
|
|
||||||
namespace MobileGL::MG_Backend::DirectGLES {
|
namespace MobileGL::MG_Backend::DirectGLES {
|
||||||
|
namespace {
|
||||||
|
Bool IsReleaseCurrentRequest(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
|
||||||
|
return dpy == EGL_NO_DISPLAY && draw == EGL_NO_SURFACE && read == EGL_NO_SURFACE && ctx == EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
BackendObject_DirectGLES::~BackendObject_DirectGLES() {
|
BackendObject_DirectGLES::~BackendObject_DirectGLES() {
|
||||||
DestroyEGLContext();
|
DestroyEGLContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendObject_DirectGLES::InitWindowSurface() {
|
Bool BackendObject_DirectGLES::InitWindowSurface() {
|
||||||
// Only use EGL for now
|
// Only use EGL for now
|
||||||
auto nativeWindow = reinterpret_cast<NativeWindowType>(m_windowHandle.Handle);
|
auto nativeWindow = reinterpret_cast<NativeWindowType>(m_windowHandle.Handle);
|
||||||
if (!DirectGLES::InitWindowSurface(nativeWindow)) {
|
if (!DirectGLES::InitWindowSurface(nativeWindow)) {
|
||||||
MGLOG_E("Failed to initialize window surface for DirectGLES backend");
|
MGLOG_E("Failed to initialize window surface for DirectGLES backend");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendObject_DirectGLES::Initialize() {
|
void BackendObject_DirectGLES::Initialize() {
|
||||||
@@ -40,18 +48,65 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
DirectGLES::SetGLESFuncsTable(m_GLESFunctions);
|
DirectGLES::SetGLESFuncsTable(m_GLESFunctions);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendObject_DirectGLES::InitCapabilities() {
|
Bool BackendObject_DirectGLES::InitCapabilities() {
|
||||||
if (!m_initialized) {
|
if (!m_initialized) {
|
||||||
MGLOG_E("DirectGLES backend not initialized");
|
MGLOG_E("DirectGLES backend not initialized");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MG_Util::BackendLoader::FillInGLESCapabilities(m_GLESCapabilities, m_GLESFunctions)) {
|
if (!MG_Util::BackendLoader::FillInGLESCapabilities(m_GLESCapabilities, m_GLESFunctions)) {
|
||||||
MGLOG_E("Failed to fill in GLES capabilities for DirectGLES backend");
|
MGLOG_E("Failed to fill in GLES capabilities for DirectGLES backend");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
DirectGLES::SetGLESCapabilities(m_GLESCapabilities);
|
DirectGLES::SetGLESCapabilities(m_GLESCapabilities);
|
||||||
UpdateDynamicBackendParameters();
|
UpdateDynamicBackendParameters();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject_DirectGLES::InitializeEGLDisplay(EGLDisplay dpy, EGLint* major, EGLint* minor) {
|
||||||
|
if (!m_initialized) {
|
||||||
|
MGLOG_E("DirectGLES backend not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return BackendObject::InitializeEGLDisplay(dpy, major, minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject_DirectGLES::CreateEGLWindowSurface(const WindowHandle& handle) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
if (!m_initialized) {
|
||||||
|
MGLOG_E("DirectGLES backend not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handle.Backend != WindowBackend::Android || !handle.Handle) {
|
||||||
|
MGLOG_E("DirectGLES backend only supports Android native windows");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Bool sameHandle =
|
||||||
|
m_eglWindowSurfaceInitialized && m_windowHandle.Backend == handle.Backend && m_windowHandle.Handle == handle.Handle;
|
||||||
|
if (sameHandle) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_eglWindowSurfaceInitialized) {
|
||||||
|
DestroyEGLContext();
|
||||||
|
ResetEGLRuntimeState();
|
||||||
|
}
|
||||||
|
|
||||||
|
return BackendObject::CreateEGLWindowSurface(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject_DirectGLES::MakeEGLCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
|
||||||
|
if (IsReleaseCurrentRequest(dpy, draw, read, ctx)) {
|
||||||
|
return BackendObject::MakeEGLCurrent(dpy, draw, read, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return BackendObject::MakeEGLCurrent(dpy, draw, read, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject_DirectGLES::SwapEGLBuffers(EGLDisplay dpy, EGLSurface draw) {
|
||||||
|
return BackendObject::SwapEGLBuffers(dpy, draw);
|
||||||
}
|
}
|
||||||
|
|
||||||
const RendererInfo& BackendObject_DirectGLES::GetRendererInfo() const {
|
const RendererInfo& BackendObject_DirectGLES::GetRendererInfo() const {
|
||||||
|
|||||||
@@ -17,8 +17,12 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
~BackendObject_DirectGLES() override;
|
~BackendObject_DirectGLES() override;
|
||||||
|
|
||||||
void Initialize() override;
|
void Initialize() override;
|
||||||
void InitCapabilities() override;
|
Bool InitCapabilities() override;
|
||||||
void InitWindowSurface() override;
|
Bool InitWindowSurface() override;
|
||||||
|
Bool InitializeEGLDisplay(EGLDisplay dpy, EGLint* major, EGLint* minor) override;
|
||||||
|
Bool CreateEGLWindowSurface(const WindowHandle& handle) override;
|
||||||
|
Bool MakeEGLCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) override;
|
||||||
|
Bool SwapEGLBuffers(EGLDisplay dpy, EGLSurface draw) override;
|
||||||
|
|
||||||
const RendererInfo& GetRendererInfo() const override;
|
const RendererInfo& GetRendererInfo() const override;
|
||||||
String GetBackendAPIVersionString() const override;
|
String GetBackendAPIVersionString() const override;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "DirectGLES.h"
|
#include "DirectGLES.h"
|
||||||
#include "EGL/egl.h"
|
#include "EGL/egl.h"
|
||||||
|
#include "MG_Util/Types.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "Managers.h"
|
#include "Managers.h"
|
||||||
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
||||||
@@ -45,7 +46,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
namespace DebugImpl {
|
namespace DebugImpl {
|
||||||
#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG
|
#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG
|
||||||
void ErrorLopper::Loop(std::function<void(GLenum)> func) {
|
void ErrorLopper::Loop(const std::function<void(GLenum)>& func) {
|
||||||
GLenum err = g_GLESFuncs.glGetError();
|
GLenum err = g_GLESFuncs.glGetError();
|
||||||
while (err != GL_NO_ERROR) {
|
while (err != GL_NO_ERROR) {
|
||||||
func(err);
|
func(err);
|
||||||
@@ -68,14 +69,14 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void ErrorLopper::Loop(std::function<void(GLenum)> func) {}
|
void ErrorLopper::Loop(const std::function<void(GLenum)>& func) {}
|
||||||
void ErrorLopper::Clear() {}
|
void ErrorLopper::Clear() {}
|
||||||
ErrorLopper::ErrorLopper() {}
|
ErrorLopper::ErrorLopper() = default;
|
||||||
ErrorLopper::~ErrorLopper() {}
|
ErrorLopper::~ErrorLopper() = default;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG
|
#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());
|
g_GLESFuncs.glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, scopeName.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +84,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glPopDebugGroup();
|
g_GLESFuncs.glPopDebugGroup();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
OpenGLScopeMarker::OpenGLScopeMarker(String scopeName) {}
|
OpenGLScopeMarker::OpenGLScopeMarker(const String& scopeName) {}
|
||||||
|
|
||||||
OpenGLScopeMarker::~OpenGLScopeMarker() {}
|
OpenGLScopeMarker::~OpenGLScopeMarker() {}
|
||||||
#endif
|
#endif
|
||||||
@@ -92,31 +93,28 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
// TODO: deletion for deleted objects
|
// TODO: deletion for deleted objects
|
||||||
|
|
||||||
namespace BufferImpl {
|
namespace BufferImpl {
|
||||||
void CreateAndSyncBufferObject(SharedPtr<MG_State::GLState::BufferObject>& bufferObject) {
|
void CreateAndSyncBufferObject(const SharedPtr<MG_State::GLState::BufferObject>& bufferObject) {
|
||||||
if (!(bufferObject->GetChangeBits() & BufferChangeBits::DirtyBit)) return;
|
if (!(bufferObject->GetChangeBits() & BufferChangeBits::DirtyBit)) return;
|
||||||
|
|
||||||
const auto& backendBufferIt = g_backendBufferObjects.find(bufferObject);
|
const auto& backendBufferIt = g_backendBufferObjects.find(bufferObject.get());
|
||||||
SharedPtr<BackendBufferObject> backendBufferObject;
|
Bool exist = (backendBufferIt != g_backendBufferObjects.end());
|
||||||
if (backendBufferIt == g_backendBufferObjects.end()) {
|
auto& backendObj = exist ? backendBufferIt->second : g_backendBufferObjects.GetOrCreate(bufferObject);
|
||||||
backendBufferObject = MakeShared<BackendBufferObject>();
|
if (!exist) {
|
||||||
g_backendBufferObjects[bufferObject] = backendBufferObject;
|
backendObj = MakeShared<BackendBufferObject>();
|
||||||
} else {
|
|
||||||
backendBufferObject = backendBufferIt->second;
|
|
||||||
}
|
}
|
||||||
backendBufferObject->SyncToBackend(bufferObject);
|
backendObj->SyncToBackend(bufferObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncNeccessaryBuffers(Bool includeIBO = false, Bool includeIndirectBuffer = false) {
|
void SyncNeccessaryBuffers(Bool includeIBO = false, Bool includeIndirectBuffer = false) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
|
g_backendBufferObjects.CollectGarbageIfNeeded();
|
||||||
|
|
||||||
// All buffers we need are:
|
// All buffers we need are:
|
||||||
// 1.VBO 2.IBO (if needed) 3.UBO 4.IndirectBuffer (if needed) 5.SSBO (TODO)
|
// 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
|
// PBO is not needed since it should be handled in frontend
|
||||||
|
|
||||||
// static Vector<SharedPtr<MG_State::GLState::BufferObject>> buffersToSync;
|
|
||||||
// buffersToSync.clear();
|
|
||||||
|
|
||||||
const auto& currentVAOObject = MG_State::pGLContext->GetBoundVertexArray();
|
const auto& currentVAOObject = MG_State::pGLContext->GetBoundVertexArray();
|
||||||
if (!currentVAOObject) {
|
if (!currentVAOObject) {
|
||||||
MGLOG_E("No VAO is currently bound, cannot sync necessary buffers.");
|
MGLOG_E("No VAO is currently bound, cannot sync necessary buffers.");
|
||||||
@@ -126,7 +124,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
// VBO
|
// VBO
|
||||||
for (const auto& attrib : currentVAOObject->GetAllAttributes()) {
|
for (const auto& attrib : currentVAOObject->GetAllAttributes()) {
|
||||||
if (!attrib.Enabled) continue;
|
if (!attrib.Enabled) continue;
|
||||||
auto bufferObject = attrib.Buffer;
|
auto& bufferObject = attrib.Buffer;
|
||||||
if (bufferObject) {
|
if (bufferObject) {
|
||||||
CreateAndSyncBufferObject(bufferObject);
|
CreateAndSyncBufferObject(bufferObject);
|
||||||
}
|
}
|
||||||
@@ -134,7 +132,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
// IBO
|
// IBO
|
||||||
if (includeIBO) {
|
if (includeIBO) {
|
||||||
auto possibleIBO = currentVAOObject->GetIndexBufferBindingSlot().GetBoundObject();
|
auto& possibleIBO = currentVAOObject->GetIndexBufferBindingSlot().GetBoundObject();
|
||||||
if (possibleIBO) {
|
if (possibleIBO) {
|
||||||
CreateAndSyncBufferObject(possibleIBO);
|
CreateAndSyncBufferObject(possibleIBO);
|
||||||
}
|
}
|
||||||
@@ -142,7 +140,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
// Indirect Buffer Object
|
// Indirect Buffer Object
|
||||||
if (includeIndirectBuffer) {
|
if (includeIndirectBuffer) {
|
||||||
auto possibleIndirectBuffer =
|
auto& possibleIndirectBuffer =
|
||||||
MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::DrawIndirect).GetBoundObject();
|
MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::DrawIndirect).GetBoundObject();
|
||||||
if (possibleIndirectBuffer) {
|
if (possibleIndirectBuffer) {
|
||||||
CreateAndSyncBufferObject(possibleIndirectBuffer);
|
CreateAndSyncBufferObject(possibleIndirectBuffer);
|
||||||
@@ -153,7 +151,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
auto uboBindingPointCnt = MG_State::pGLContext->GetBufferBindingPointCount(BufferTarget::Uniform);
|
auto uboBindingPointCnt = MG_State::pGLContext->GetBufferBindingPointCount(BufferTarget::Uniform);
|
||||||
for (SizeT i = 0; i < uboBindingPointCnt; ++i) {
|
for (SizeT i = 0; i < uboBindingPointCnt; ++i) {
|
||||||
auto& point = MG_State::pGLContext->GetBufferBindingPoint(BufferTarget::Uniform, i);
|
auto& point = MG_State::pGLContext->GetBufferBindingPoint(BufferTarget::Uniform, i);
|
||||||
auto obj = point.GetBoundObject();
|
auto& obj = point.GetBoundObject();
|
||||||
if (obj) {
|
if (obj) {
|
||||||
CreateAndSyncBufferObject(obj);
|
CreateAndSyncBufferObject(obj);
|
||||||
}
|
}
|
||||||
@@ -166,48 +164,49 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
auto currentVAOObject = MG_State::pGLContext->GetBoundVertexArray();
|
g_backendVertexArrayObjects.CollectGarbageIfNeeded();
|
||||||
|
|
||||||
|
auto& currentVAOObject = MG_State::pGLContext->GetBoundVertexArray();
|
||||||
if (!currentVAOObject) {
|
if (!currentVAOObject) {
|
||||||
MGLOG_E("No VAO is currently bound, cannot sync current VAO.");
|
MGLOG_E("No VAO is currently bound, cannot sync current VAO.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& backendVAOIt = g_backendVertexArrayObjects.find(currentVAOObject);
|
const auto& backendVAOIt = g_backendVertexArrayObjects.find(currentVAOObject.get());
|
||||||
SharedPtr<VertexArrayImpl::BackendVertexArrayObject> backendVAOObject;
|
Bool exist = (backendVAOIt != g_backendVertexArrayObjects.end());
|
||||||
if (backendVAOIt == g_backendVertexArrayObjects.end()) {
|
auto& backendObj = exist ? backendVAOIt->second : g_backendVertexArrayObjects.GetOrCreate(currentVAOObject);
|
||||||
backendVAOObject = MakeShared<VertexArrayImpl::BackendVertexArrayObject>();
|
if (!exist) {
|
||||||
g_backendVertexArrayObjects[currentVAOObject] = backendVAOObject;
|
backendObj = MakeShared<VertexArrayImpl::BackendVertexArrayObject>();
|
||||||
} else {
|
|
||||||
backendVAOObject = backendVAOIt->second;
|
|
||||||
}
|
}
|
||||||
backendVAOObject->SyncToBackend(currentVAOObject);
|
backendObj->SyncToBackend(currentVAOObject);
|
||||||
}
|
}
|
||||||
} // namespace VertexArrayImpl
|
} // namespace VertexArrayImpl
|
||||||
|
|
||||||
namespace TextureImpl {
|
namespace TextureImpl {
|
||||||
SharedPtr<BackendTextureObject> SyncTextureObjectToBackend(
|
SharedPtr<BackendTextureObject>& SyncTextureObjectToBackend(
|
||||||
SharedPtr<MG_State::GLState::ITextureObject>& textureObject) {
|
const SharedPtr<MG_State::GLState::ITextureObject>& textureObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
const auto& backendTextureIt = g_backendTextureObjects.find(textureObject);
|
const auto& backendTextureIt = g_backendTextureObjects.find(textureObject.get());
|
||||||
SharedPtr<BackendTextureObject> backendTextureObject;
|
Bool exist = (backendTextureIt != g_backendTextureObjects.end());
|
||||||
if (backendTextureIt == g_backendTextureObjects.end()) {
|
auto& backendObj = exist ? backendTextureIt->second : g_backendTextureObjects.GetOrCreate(textureObject);
|
||||||
backendTextureObject = MakeShared<BackendTextureObject>();
|
if (!exist) {
|
||||||
g_backendTextureObjects[textureObject] = backendTextureObject;
|
backendObj = MakeShared<BackendTextureObject>();
|
||||||
} else {
|
|
||||||
backendTextureObject = backendTextureIt->second;
|
|
||||||
}
|
}
|
||||||
backendTextureObject->SyncTextureParamsToBackend(textureObject);
|
backendObj->SyncTextureParamsToBackend(textureObject);
|
||||||
backendTextureObject->SyncBuiltinSamplerToBackend(textureObject);
|
backendObj->SyncBuiltinSamplerToBackend(textureObject);
|
||||||
backendTextureObject->SyncMipmapsToBackend(textureObject);
|
backendObj->SyncMipmapsToBackend(textureObject);
|
||||||
return backendTextureObject;
|
|
||||||
|
return backendObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncNeccessaryTextures() {
|
void SyncNeccessaryTextures() {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
|
g_backendTextureObjects.CollectGarbageIfNeeded();
|
||||||
|
|
||||||
// All textures we need are:
|
// All textures we need are:
|
||||||
// 1. textures bound to texture units (TODO: only sync ones that are used in current program)
|
// 1. textures bound to texture units (TODO: only sync ones that are used in current program)
|
||||||
// 2. textures used in current FBO
|
// 2. textures used in current FBO
|
||||||
@@ -216,7 +215,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
for (int index = 0; index < MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS; ++index) {
|
for (int index = 0; index < MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS; ++index) {
|
||||||
auto& unit = MG_State::pGLContext->GetTextureUnitObject(index);
|
auto& unit = MG_State::pGLContext->GetTextureUnitObject(index);
|
||||||
for (const auto& bindingSlot : unit.GetAllBindingSlots()) {
|
for (const auto& bindingSlot : unit.GetAllBindingSlots()) {
|
||||||
auto textureObject = bindingSlot.GetBoundObject();
|
auto& textureObject = bindingSlot.GetBoundObject();
|
||||||
if (textureObject) {
|
if (textureObject) {
|
||||||
SyncTextureObjectToBackend(textureObject);
|
SyncTextureObjectToBackend(textureObject);
|
||||||
}
|
}
|
||||||
@@ -228,7 +227,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
if (currentFBO) {
|
if (currentFBO) {
|
||||||
for (const auto& attachment : currentFBO->GetAllAttachmentObjects()) {
|
for (const auto& attachment : currentFBO->GetAllAttachmentObjects()) {
|
||||||
if (!attachment.IsTexture()) continue;
|
if (!attachment.IsTexture()) continue;
|
||||||
auto textureObject = attachment.GetTexture();
|
auto& textureObject = attachment.GetTexture();
|
||||||
if (textureObject) {
|
if (textureObject) {
|
||||||
SyncTextureObjectToBackend(textureObject);
|
SyncTextureObjectToBackend(textureObject);
|
||||||
}
|
}
|
||||||
@@ -242,16 +241,20 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
|
g_backendFramebufferObjects.CollectGarbageIfNeeded();
|
||||||
|
TextureImpl::g_backendTextureObjects.CollectGarbageIfNeeded();
|
||||||
|
RenderbufferImpl::g_backendRenderbufferObjects.CollectGarbageIfNeeded();
|
||||||
|
|
||||||
const FramebufferTarget fboTargets[] = {FramebufferTarget::Draw, FramebufferTarget::Read};
|
const FramebufferTarget fboTargets[] = {FramebufferTarget::Draw, FramebufferTarget::Read};
|
||||||
|
|
||||||
MG_State::GLState::FramebufferObject* lastUpdatedFBO = nullptr;
|
MG_State::GLState::FramebufferObject* lastUpdatedFBO = nullptr;
|
||||||
|
|
||||||
for (auto target : fboTargets) {
|
for (auto& target : fboTargets) {
|
||||||
auto slot = MG_State::pGLContext->GetFramebufferBindingSlot(target);
|
auto& slot = MG_State::pGLContext->GetFramebufferBindingSlot(target);
|
||||||
auto version = slot.GetVersion();
|
auto version = slot.GetVersion();
|
||||||
if (version == g_fboBindVersions[SizeT(target)]) continue;
|
if (version == g_fboBindVersions[SizeT(target)]) continue;
|
||||||
|
|
||||||
auto currentFBO = slot.GetBoundObject();
|
auto& currentFBO = slot.GetBoundObject();
|
||||||
|
|
||||||
if (!currentFBO) {
|
if (!currentFBO) {
|
||||||
MGLOG_E("No FBO is currently bound, cannot sync current FBO.");
|
MGLOG_E("No FBO is currently bound, cannot sync current FBO.");
|
||||||
@@ -263,21 +266,19 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& backendFBOIt = g_backendFramebufferObjects.find(currentFBO);
|
|
||||||
SharedPtr<BackendFramebufferObject> backendFBOObject;
|
|
||||||
if (backendFBOIt == g_backendFramebufferObjects.end()) {
|
|
||||||
backendFBOObject = MakeShared<BackendFramebufferObject>();
|
|
||||||
g_backendFramebufferObjects[currentFBO] = backendFBOObject;
|
|
||||||
} else {
|
|
||||||
backendFBOObject = backendFBOIt->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentFBO.get() == lastUpdatedFBO) {
|
if (currentFBO.get() == lastUpdatedFBO) {
|
||||||
MGLOG_D("Draw FBO and read FBO are the same, skipping sync.");
|
MGLOG_D("Draw FBO and read FBO are the same, skipping sync.");
|
||||||
} else {
|
continue;
|
||||||
backendFBOObject->SyncToBackend(currentFBO, target);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto& backendFBOIt = g_backendFramebufferObjects.find(currentFBO.get());
|
||||||
|
Bool exist = (backendFBOIt != g_backendFramebufferObjects.end());
|
||||||
|
auto& backendObj = exist ? backendFBOIt->second : g_backendFramebufferObjects.GetOrCreate(currentFBO);
|
||||||
|
if (!exist) {
|
||||||
|
backendObj = MakeShared<BackendFramebufferObject>();
|
||||||
|
}
|
||||||
|
backendObj->SyncToBackend(currentFBO, target);
|
||||||
|
|
||||||
lastUpdatedFBO = currentFBO.get();
|
lastUpdatedFBO = currentFBO.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -466,21 +467,23 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
auto currentProgram = MG_State::pGLContext->GetCurrentProgram();
|
g_backendProgramObjects.CollectGarbageIfNeeded();
|
||||||
|
SamplerImpl::g_backendSamplerObjects.CollectGarbageIfNeeded();
|
||||||
|
|
||||||
|
auto& currentProgram = MG_State::pGLContext->GetCurrentProgram();
|
||||||
if (!currentProgram || !currentProgram->GetLinkStatus()) {
|
if (!currentProgram || !currentProgram->GetLinkStatus()) {
|
||||||
g_GLESFuncs.glUseProgram(0);
|
g_GLESFuncs.glUseProgram(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto& backendProgramIt = g_backendProgramObjects.find(currentProgram);
|
const auto& backendProgramIt = g_backendProgramObjects.find(currentProgram.get());
|
||||||
SharedPtr<BackendProgramObjectImpl> backendProgram;
|
Bool exist = (backendProgramIt != g_backendProgramObjects.end());
|
||||||
if (backendProgramIt == g_backendProgramObjects.end()) {
|
auto& backendObj = exist ? backendProgramIt->second : g_backendProgramObjects.GetOrCreate(currentProgram);
|
||||||
backendProgram = MakeShared<BackendProgramObjectImpl>();
|
if (!exist) {
|
||||||
g_backendProgramObjects[currentProgram] = backendProgram;
|
backendObj = MakeShared<BackendProgramObjectImpl>();
|
||||||
backendProgram->SyncToBackend(currentProgram);
|
backendObj->SyncToBackend(currentProgram);
|
||||||
} else {
|
} else {
|
||||||
backendProgram = backendProgramIt->second;
|
if (!backendObj->GetBackendProgramId()) {
|
||||||
if (!backendProgram->GetBackendProgramId()) {
|
backendObj->SyncToBackend(currentProgram);
|
||||||
backendProgram->SyncToBackend(currentProgram);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -495,7 +498,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
const auto& currentFBO = slot.GetBoundObject();
|
const auto& currentFBO = slot.GetBoundObject();
|
||||||
if (currentFBO && currentFBO != MG_Impl::GLImpl::FramebufferImpl::pDefaultFramebufferInfo->defaultFBO) {
|
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()) {
|
if (backendFBOIt != FramebufferImpl::g_backendFramebufferObjects.end()) {
|
||||||
backendFBOIt->second->Bind(target);
|
backendFBOIt->second->Bind(target);
|
||||||
} else {
|
} else {
|
||||||
@@ -528,7 +531,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
#endif
|
#endif
|
||||||
const auto& currentVAO = MG_State::pGLContext->GetBoundVertexArray();
|
const auto& currentVAO = MG_State::pGLContext->GetBoundVertexArray();
|
||||||
if (currentVAO) {
|
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()) {
|
if (backendVAOIt != VertexArrayImpl::g_backendVertexArrayObjects.end()) {
|
||||||
backendVAOIt->second->Bind();
|
backendVAOIt->second->Bind();
|
||||||
}
|
}
|
||||||
@@ -556,7 +559,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MG_Util::ConvertTextureTargetToString(target).c_str());
|
MG_Util::ConvertTextureTargetToString(target).c_str());
|
||||||
continue;
|
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;
|
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) continue;
|
||||||
|
|
||||||
GLenum targetGL = MG_Util::ConvertTextureTargetToGLEnum(target);
|
GLenum targetGL = MG_Util::ConvertTextureTargetToGLEnum(target);
|
||||||
@@ -566,7 +569,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
// Bind sampler object if necessary
|
// Bind sampler object if necessary
|
||||||
const auto& samplerObject = textureUnit.GetSamplerObject();
|
const auto& samplerObject = textureUnit.GetSamplerObject();
|
||||||
if (samplerObject) {
|
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()) {
|
if (backendSamplerIt != SamplerImpl::g_backendSamplerObjects.end()) {
|
||||||
backendSamplerIt->second->Bind(unit);
|
backendSamplerIt->second->Bind(unit);
|
||||||
}
|
}
|
||||||
@@ -581,7 +584,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedNC("BindCurrentProgram", TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedNC("BindCurrentProgram", TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
const auto& backendProgramIt = PrgramImpl::g_backendProgramObjects.find(currentProgram);
|
const auto& backendProgramIt = PrgramImpl::g_backendProgramObjects.find(currentProgram.get());
|
||||||
if (backendProgramIt != PrgramImpl::g_backendProgramObjects.end()) {
|
if (backendProgramIt != PrgramImpl::g_backendProgramObjects.end()) {
|
||||||
backendProgramIt->second->Use();
|
backendProgramIt->second->Use();
|
||||||
auto backendProgramId = backendProgramIt->second->GetBackendProgramId();
|
auto backendProgramId = backendProgramIt->second->GetBackendProgramId();
|
||||||
@@ -623,11 +626,11 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
// Connect buffer to backend binding point
|
// Connect buffer to backend binding point
|
||||||
auto& point = MG_State::pGLContext->GetBufferBindingPoint(BufferTarget::Uniform, binding);
|
auto& point = MG_State::pGLContext->GetBufferBindingPoint(BufferTarget::Uniform, binding);
|
||||||
auto bufferObj = point.GetBoundObject();
|
auto& bufferObj = point.GetBoundObject();
|
||||||
auto range = point.GetRange();
|
auto range = point.GetRange();
|
||||||
|
|
||||||
if (bufferObj) {
|
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()) {
|
if (backendBufferIt != BufferImpl::g_backendBufferObjects.end()) {
|
||||||
const auto& backendBufferObject = backendBufferIt->second;
|
const auto& backendBufferObject = backendBufferIt->second;
|
||||||
backendBufferObject->Bind(GL_UNIFORM_BUFFER);
|
backendBufferObject->Bind(GL_UNIFORM_BUFFER);
|
||||||
@@ -635,9 +638,9 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glBindBufferBase(GL_UNIFORM_BUFFER, lastUBOBinding,
|
g_GLESFuncs.glBindBufferBase(GL_UNIFORM_BUFFER, lastUBOBinding,
|
||||||
backendBufferObject->GetBackendBufferId());
|
backendBufferObject->GetBackendBufferId());
|
||||||
} else {
|
} else {
|
||||||
g_GLESFuncs.glBindBufferRange(GL_UNIFORM_BUFFER, lastUBOBinding,
|
g_GLESFuncs.glBindBufferRange(
|
||||||
backendBufferObject->GetBackendBufferId(),
|
GL_UNIFORM_BUFFER, lastUBOBinding, backendBufferObject->GetBackendBufferId(),
|
||||||
range.start, range.end - range.start);
|
(GLintptr)range.start, (GLintptr)(range.end - range.start));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
MGLOG_E("No backend buffer found for UBO binding, cannot bind UBO.");
|
MGLOG_E("No backend buffer found for UBO binding, cannot bind UBO.");
|
||||||
@@ -660,18 +663,18 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
backendProgramIt->second->GetBackendProgramId(), name.c_str());
|
backendProgramIt->second->GetBackendProgramId(), name.c_str());
|
||||||
g_GLESFuncs.glUniform1i(locAtBackend, unit);
|
g_GLESFuncs.glUniform1i(locAtBackend, unit);
|
||||||
|
|
||||||
auto samplerObject = MG_State::pGLContext->GetTextureUnitObject(unit).GetSamplerObject();
|
auto& samplerObject = MG_State::pGLContext->GetTextureUnitObject(unit).GetSamplerObject();
|
||||||
|
|
||||||
if (samplerObject) {
|
if (samplerObject) {
|
||||||
const auto& backendSamplerIt = SamplerImpl::g_backendSamplerObjects.find(samplerObject);
|
const auto& backendSamplerIt =
|
||||||
SharedPtr<SamplerImpl::BackendSamplerObject> backendSamplerObject;
|
SamplerImpl::g_backendSamplerObjects.find(samplerObject.get());
|
||||||
if (backendSamplerIt == SamplerImpl::g_backendSamplerObjects.end()) {
|
Bool exist = (backendSamplerIt != SamplerImpl::g_backendSamplerObjects.end());
|
||||||
backendSamplerObject = MakeShared<SamplerImpl::BackendSamplerObject>();
|
auto& backendObj = exist ? backendSamplerIt->second
|
||||||
SamplerImpl::g_backendSamplerObjects[samplerObject] = backendSamplerObject;
|
: SamplerImpl::g_backendSamplerObjects.GetOrCreate(samplerObject);
|
||||||
} else {
|
if (!exist) {
|
||||||
backendSamplerObject = backendSamplerIt->second;
|
backendObj = MakeShared<SamplerImpl::BackendSamplerObject>();
|
||||||
}
|
}
|
||||||
backendSamplerObject->SyncToBackend(samplerObject);
|
backendObj->SyncToBackend(samplerObject);
|
||||||
} else {
|
} else {
|
||||||
SamplerImpl::UnbindSampler(unit);
|
SamplerImpl::UnbindSampler(unit);
|
||||||
}
|
}
|
||||||
@@ -845,30 +848,29 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG && MOBILEGL_ENABLE_SCOPE_MARKER
|
#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG && MOBILEGL_ENABLE_SCOPE_MARKER
|
||||||
DebugImpl::OpenGLScopeMarker marker(__func__);
|
DebugImpl::OpenGLScopeMarker marker(__func__);
|
||||||
#endif
|
#endif
|
||||||
DebugImpl::ErrorLopper errorLopper;
|
|
||||||
|
|
||||||
TextureImpl::SyncNeccessaryTextures();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
FramebufferImpl::SyncCurrentFBO();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
RenderStateImpl::SyncRenderState();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
BindCurrentFBO(FramebufferTarget::Draw);
|
BindCurrentFBO(FramebufferTarget::Draw);
|
||||||
BindCurrentFBO(FramebufferTarget::Read);
|
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 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,
|
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());
|
dstX1, dstY1, mask, MG_Util::ConvertGLEnumToString(filter).c_str());
|
||||||
g_GLESFuncs.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -895,15 +897,14 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MG_Util::ConvertTextureTargetToString(textureTarget).c_str());
|
MG_Util::ConvertTextureTargetToString(textureTarget).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject);
|
const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get());
|
||||||
SharedPtr<TextureImpl::BackendTextureObject> backendTextureObject;
|
Bool exist = (backendTextureIt != TextureImpl::g_backendTextureObjects.end());
|
||||||
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) {
|
auto& backendObj =
|
||||||
backendTextureObject = MakeShared<TextureImpl::BackendTextureObject>();
|
exist ? backendTextureIt->second : TextureImpl::g_backendTextureObjects.GetOrCreate(textureObject);
|
||||||
TextureImpl::g_backendTextureObjects[textureObject] = backendTextureObject;
|
if (!exist) {
|
||||||
} else {
|
backendObj = MakeShared<TextureImpl::BackendTextureObject>();
|
||||||
backendTextureObject = backendTextureIt->second;
|
|
||||||
}
|
}
|
||||||
backendTextureObject->Bind(target, unit);
|
backendObj->Bind(target, unit);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -953,15 +954,15 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
DebugImpl::ErrorLopper errorLopper;
|
DebugImpl::ErrorLopper errorLopper;
|
||||||
MGLOG_D("%s: Backend", __func__);
|
MGLOG_D("%s: Backend", __func__);
|
||||||
TextureImpl::SyncNeccessaryTextures();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
FramebufferImpl::SyncCurrentFBO();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
RenderStateImpl::SyncRenderState();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
if (!UpdateTextureBindingAtTarget(target)) return;
|
if (!UpdateTextureBindingAtTarget(target)) return;
|
||||||
@@ -969,10 +970,10 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
// Bind necessary FBO and texture
|
// Bind necessary FBO and texture
|
||||||
BindCurrentFBO(FramebufferTarget::Read);
|
BindCurrentFBO(FramebufferTarget::Read);
|
||||||
Uint activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit();
|
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))
|
.GetBindingSlot(MG_Util::ConvertGLEnumToTextureTarget(target))
|
||||||
.GetBoundObject();
|
.GetBoundObject();
|
||||||
const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject);
|
const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get());
|
||||||
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) {
|
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) {
|
||||||
MGLOG_E("CopyTexSubImage2D: No backend texture found for texture %u.",
|
MGLOG_E("CopyTexSubImage2D: No backend texture found for texture %u.",
|
||||||
textureObject ? textureObject->GetExternalIndex() : 0);
|
textureObject ? textureObject->GetExternalIndex() : 0);
|
||||||
@@ -998,19 +999,19 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
if (!isDepthFormat) {
|
if (!isDepthFormat) {
|
||||||
g_GLESFuncs.glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
MGLOG_D("%s: Backend depth", __func__);
|
MGLOG_D("%s: Backend depth", __func__);
|
||||||
g_GLESFuncs.glTexImage2D(target, level, (GLint)internalformat, width, height, border, format, type,
|
g_GLESFuncs.glTexImage2D(target, level, (GLint)internalformat, width, height, border, format, type,
|
||||||
nullptr);
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
GLint currentTex = backendTextureIt->second->GetBackendTextureId();
|
auto currentTex = (GLint)backendTextureIt->second->GetBackendTextureId();
|
||||||
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 error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1026,7 +1027,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glBlitFramebuffer(x, y, x + width, y + height, 0, 0, width, height,
|
g_GLESFuncs.glBlitFramebuffer(x, y, x + width, y + height, 0, 0, width, height,
|
||||||
GL_DEPTH_BUFFER_BIT | (isStencilFormat ? GL_STENCIL_BUFFER_BIT : 0),
|
GL_DEPTH_BUFFER_BIT | (isStencilFormat ? GL_STENCIL_BUFFER_BIT : 0),
|
||||||
GL_NEAREST);
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1041,15 +1042,15 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
MGLOG_D("%s: Backend", __func__);
|
MGLOG_D("%s: Backend", __func__);
|
||||||
TextureImpl::SyncNeccessaryTextures();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
FramebufferImpl::SyncCurrentFBO();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
RenderStateImpl::SyncRenderState();
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1057,11 +1058,11 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
// Bind necessary FBO and texture
|
// Bind necessary FBO and texture
|
||||||
BindCurrentFBO(FramebufferTarget::Read);
|
BindCurrentFBO(FramebufferTarget::Read);
|
||||||
Uint activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit();
|
auto activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit();
|
||||||
const auto& textureObject = MG_State::pGLContext->GetTextureUnitObject(activeTextureUnit)
|
const auto& textureObject = MG_State::pGLContext->GetTextureUnitObject(activeTextureUnit)
|
||||||
.GetBindingSlot(MG_Util::ConvertGLEnumToTextureTarget(target))
|
.GetBindingSlot(MG_Util::ConvertGLEnumToTextureTarget(target))
|
||||||
.GetBoundObject();
|
.GetBoundObject();
|
||||||
const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject);
|
const auto& backendTextureIt = TextureImpl::g_backendTextureObjects.find(textureObject.get());
|
||||||
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) {
|
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) {
|
||||||
MGLOG_E("CopyTexSubImage2D: No backend texture found for texture %u.",
|
MGLOG_E("CopyTexSubImage2D: No backend texture found for texture %u.",
|
||||||
textureObject ? textureObject->GetExternalIndex() : 0);
|
textureObject ? textureObject->GetExternalIndex() : 0);
|
||||||
@@ -1069,12 +1070,12 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
backendTextureIt->second->Bind(target, activeTextureUnit);
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
GLenum internalFormat;
|
GLenum internalFormat;
|
||||||
g_GLESFuncs.glGetTexLevelParameteriv(target, level, GL_TEXTURE_INTERNAL_FORMAT, (GLint*)&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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
auto mgInternalFormat = MG_Util::ConvertGLEnumToTextureInternalFormat(internalFormat);
|
auto mgInternalFormat = MG_Util::ConvertGLEnumToTextureInternalFormat(internalFormat);
|
||||||
@@ -1084,19 +1085,19 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
if (!isDepthFormat) {
|
if (!isDepthFormat) {
|
||||||
g_GLESFuncs.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
MGLOG_D("%s: Backend depth", __func__);
|
MGLOG_D("%s: Backend depth", __func__);
|
||||||
GLint currentTex = backendTextureIt->second->GetBackendTextureId();
|
auto currentTex = backendTextureIt->second->GetBackendTextureId();
|
||||||
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 error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
GLenum attachment = isStencilFormat ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT;
|
GLenum attachment = isStencilFormat ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT;
|
||||||
TempFBOBinder tempFBOBinder(false);
|
TempFBOBinder tempFBOBinder(false);
|
||||||
g_GLESFuncs.glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, target, currentTex, level);
|
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());
|
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) {
|
if (g_GLESFuncs.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
||||||
@@ -1107,7 +1108,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glBlitFramebuffer(
|
g_GLESFuncs.glBlitFramebuffer(
|
||||||
x, y, x + width, y + height, xoffset, yoffset, xoffset + width, yoffset + height,
|
x, y, x + width, y + height, xoffset, yoffset, xoffset + width, yoffset + height,
|
||||||
GL_DEPTH_BUFFER_BIT | (isStencilFormat ? GL_STENCIL_BUFFER_BIT : 0), GL_NEAREST);
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1120,8 +1121,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
auto unitIndex = MG_State::pGLContext->GetActiveTextureUnit();
|
auto unitIndex = MG_State::pGLContext->GetActiveTextureUnit();
|
||||||
auto& unit = MG_State::pGLContext->GetTextureUnitObject(unitIndex);
|
auto& unit = MG_State::pGLContext->GetTextureUnitObject(unitIndex);
|
||||||
auto& slot = unit.GetBindingSlot(MG_Util::ConvertGLEnumToTextureTarget(target));
|
auto& slot = unit.GetBindingSlot(MG_Util::ConvertGLEnumToTextureTarget(target));
|
||||||
auto texture = slot.GetBoundObject();
|
auto& texture = slot.GetBoundObject();
|
||||||
auto backendTexture = TextureImpl::SyncTextureObjectToBackend(texture);
|
auto& backendTexture = TextureImpl::SyncTextureObjectToBackend(texture);
|
||||||
|
|
||||||
backendTexture->Bind(target, unitIndex);
|
backendTexture->Bind(target, unitIndex);
|
||||||
g_GLESFuncs.glGenerateMipmap(target);
|
g_GLESFuncs.glGenerateMipmap(target);
|
||||||
@@ -1184,7 +1185,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
PixelStoreParameters m_prevParams;
|
PixelStoreParameters m_prevParams;
|
||||||
|
|
||||||
PixelStoreParameters QueryCurrentGLPixelStoreParams(Bool isUnpack) {
|
static PixelStoreParameters QueryCurrentGLPixelStoreParams(Bool isUnpack) {
|
||||||
PixelStoreParameters p;
|
PixelStoreParameters p;
|
||||||
if (!isUnpack) {
|
if (!isUnpack) {
|
||||||
g_GLESFuncs.glGetIntegerv(GL_PACK_ALIGNMENT, (GLint*)&p.Alignment);
|
g_GLESFuncs.glGetIntegerv(GL_PACK_ALIGNMENT, (GLint*)&p.Alignment);
|
||||||
@@ -1214,7 +1215,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sync(Bool isUnpack, const PixelStoreParameters& params) {
|
static void Sync(Bool isUnpack, const PixelStoreParameters& params) {
|
||||||
if (!isUnpack) {
|
if (!isUnpack) {
|
||||||
g_GLESFuncs.glPixelStorei(GL_PACK_ALIGNMENT, params.Alignment);
|
g_GLESFuncs.glPixelStorei(GL_PACK_ALIGNMENT, params.Alignment);
|
||||||
g_GLESFuncs.glPixelStorei(GL_PACK_ROW_LENGTH, params.RowLength);
|
g_GLESFuncs.glPixelStorei(GL_PACK_ROW_LENGTH, params.RowLength);
|
||||||
@@ -1271,7 +1272,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handle PBO
|
// Handle PBO
|
||||||
auto pixelPackBufferObject =
|
auto& pixelPackBufferObject =
|
||||||
MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::PixelPack).GetBoundObject();
|
MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::PixelPack).GetBoundObject();
|
||||||
Bool usePBO;
|
Bool usePBO;
|
||||||
GLuint prevPixelPackBuffer = 0;
|
GLuint prevPixelPackBuffer = 0;
|
||||||
@@ -1279,7 +1280,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
BufferImpl::CreateAndSyncBufferObject(pixelPackBufferObject);
|
BufferImpl::CreateAndSyncBufferObject(pixelPackBufferObject);
|
||||||
MGLOG_D("ReadPixels: Using PBO %u", pixelPackBufferObject->GetExternalIndex());
|
MGLOG_D("ReadPixels: Using PBO %u", pixelPackBufferObject->GetExternalIndex());
|
||||||
usePBO = true;
|
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()) {
|
if (backendBufferIt == BufferImpl::g_backendBufferObjects.end()) {
|
||||||
MGLOG_E("ReadPixels: No backend buffer found for PBO %u.",
|
MGLOG_E("ReadPixels: No backend buffer found for PBO %u.",
|
||||||
@@ -1299,8 +1300,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
if (usePBO) {
|
if (usePBO) {
|
||||||
// pull back to client memory if PBO is used
|
// pull back to client memory if PBO is used
|
||||||
MGLOG_D("ReadPixels: PBO used, mapping buffer to client memory");
|
MGLOG_D("ReadPixels: PBO used, mapping buffer to client memory");
|
||||||
GLvoid* pboMappedPtr = g_GLESFuncs.glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0,
|
GLvoid* pboMappedPtr = g_GLESFuncs.glMapBufferRange(
|
||||||
pixelPackBufferObject->GetSize(), GL_MAP_READ_BIT);
|
GL_PIXEL_PACK_BUFFER, 0, (GLsizeiptr)pixelPackBufferObject->GetSize(), GL_MAP_READ_BIT);
|
||||||
if (pboMappedPtr) {
|
if (pboMappedPtr) {
|
||||||
MGLOG_D("ReadPixels: Copying data from PBO to client memory");
|
MGLOG_D("ReadPixels: Copying data from PBO to client memory");
|
||||||
SizeT size = pixelPackBufferObject->GetSize();
|
SizeT size = pixelPackBufferObject->GetSize();
|
||||||
@@ -1345,7 +1346,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MGLOG_D("GetTexImage: SyncCurrentFBO()");
|
MGLOG_D("GetTexImage: SyncCurrentFBO()");
|
||||||
FramebufferImpl::SyncCurrentFBO();
|
FramebufferImpl::SyncCurrentFBO();
|
||||||
|
|
||||||
Uint activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit();
|
auto activeTextureUnit = MG_State::pGLContext->GetActiveTextureUnit();
|
||||||
MGLOG_D("GetTexImage: active texture unit = %u", activeTextureUnit);
|
MGLOG_D("GetTexImage: active texture unit = %u", activeTextureUnit);
|
||||||
|
|
||||||
const auto& textureObject = MG_State::pGLContext->GetTextureUnitObject(activeTextureUnit)
|
const auto& textureObject = MG_State::pGLContext->GetTextureUnitObject(activeTextureUnit)
|
||||||
@@ -1355,7 +1356,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MGLOG_D("GetTexImage: bound texture object = %p (name=%u)", textureObject.get(),
|
MGLOG_D("GetTexImage: bound texture object = %p (name=%u)", textureObject.get(),
|
||||||
textureObject ? textureObject->GetExternalIndex() : 0);
|
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()) {
|
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) {
|
||||||
MGLOG_E("GetTexImage: No backend texture found for texture %u.",
|
MGLOG_E("GetTexImage: No backend texture found for texture %u.",
|
||||||
@@ -1383,14 +1384,14 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
return;
|
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("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
MGLOG_D("GetTexImage: Applying TempPixelStoreParameterSync (PACK)");
|
MGLOG_D("GetTexImage: Applying TempPixelStoreParameterSync (PACK)");
|
||||||
TempPixelStoreParameterSync tempPackParamsSync(false);
|
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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1404,7 +1405,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
auto* textureMipmapObject = static_cast<MG_State::GLState::TextureObjectMipmap*>(textureObject.get());
|
auto* textureMipmapObject = static_cast<MG_State::GLState::TextureObjectMipmap*>(textureObject.get());
|
||||||
|
|
||||||
auto levelRange = textureMipmapObject->GetLevelRange();
|
auto& levelRange = textureMipmapObject->GetLevelRange();
|
||||||
MGLOG_D("GetTexImage: mipmap level range = [%d, %d)", levelRange.x(), levelRange.y());
|
MGLOG_D("GetTexImage: mipmap level range = [%d, %d)", levelRange.x(), levelRange.y());
|
||||||
|
|
||||||
if (level < levelRange.x() || level >= levelRange.y()) {
|
if (level < levelRange.x() || level >= levelRange.y()) {
|
||||||
@@ -1421,7 +1422,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MGLOG_D("GetTexImage: mip level %d size = %dx%d", level, size.x(), size.y());
|
MGLOG_D("GetTexImage: mip level %d size = %dx%d", level, size.x(), size.y());
|
||||||
|
|
||||||
// Handle PBO
|
// Handle PBO
|
||||||
auto pixelPackBufferObject =
|
auto& pixelPackBufferObject =
|
||||||
MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::PixelPack).GetBoundObject();
|
MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::PixelPack).GetBoundObject();
|
||||||
Bool usePBO;
|
Bool usePBO;
|
||||||
GLuint prevPixelPackBuffer = 0;
|
GLuint prevPixelPackBuffer = 0;
|
||||||
@@ -1429,7 +1430,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
BufferImpl::CreateAndSyncBufferObject(pixelPackBufferObject);
|
BufferImpl::CreateAndSyncBufferObject(pixelPackBufferObject);
|
||||||
MGLOG_D("GetTexImage: Using PBO %u", pixelPackBufferObject->GetExternalIndex());
|
MGLOG_D("GetTexImage: Using PBO %u", pixelPackBufferObject->GetExternalIndex());
|
||||||
usePBO = true;
|
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()) {
|
if (backendBufferIt == BufferImpl::g_backendBufferObjects.end()) {
|
||||||
MGLOG_E("GetTexImage: No backend buffer found for PBO %u.",
|
MGLOG_E("GetTexImage: No backend buffer found for PBO %u.",
|
||||||
pixelPackBufferObject ? pixelPackBufferObject->GetExternalIndex() : 0);
|
pixelPackBufferObject ? pixelPackBufferObject->GetExternalIndex() : 0);
|
||||||
@@ -1443,7 +1444,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MGLOG_D("GetTexImage: Not using PBO");
|
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("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(),
|
MGLOG_D("GetTexImage: glReadPixels(0, 0, %d, %d, %s, %s, %p)", size.x(), size.y(),
|
||||||
@@ -1451,14 +1452,14 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
pixels);
|
pixels);
|
||||||
g_GLESFuncs.glReadPixels(0, 0, size.x(), size.y(), esFormat, esType, 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());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
if (usePBO) {
|
if (usePBO) {
|
||||||
// pull back to client memory if PBO is used
|
// pull back to client memory if PBO is used
|
||||||
MGLOG_D("ReadPixels: PBO used, mapping buffer to client memory");
|
MGLOG_D("ReadPixels: PBO used, mapping buffer to client memory");
|
||||||
GLvoid* pboMappedPtr = g_GLESFuncs.glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0,
|
GLvoid* pboMappedPtr = g_GLESFuncs.glMapBufferRange(
|
||||||
pixelPackBufferObject->GetSize(), GL_MAP_READ_BIT);
|
GL_PIXEL_PACK_BUFFER, 0, (GLsizeiptr)pixelPackBufferObject->GetSize(), GL_MAP_READ_BIT);
|
||||||
if (pboMappedPtr) {
|
if (pboMappedPtr) {
|
||||||
MGLOG_D("ReadPixels: Copying data from PBO to client memory");
|
MGLOG_D("ReadPixels: Copying data from PBO to client memory");
|
||||||
SizeT size = pixelPackBufferObject->GetSize();
|
SizeT size = pixelPackBufferObject->GetSize();
|
||||||
@@ -1479,7 +1480,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("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
MGLOG_D("GetTexImage: finished");
|
MGLOG_D("GetTexImage: finished");
|
||||||
|
|||||||
@@ -7,10 +7,6 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#include "Managers.h"
|
#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 "Utils.h"
|
||||||
#include "DirectGLES.h"
|
#include "DirectGLES.h"
|
||||||
|
|
||||||
@@ -18,6 +14,7 @@
|
|||||||
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/DataTypeConverter.h>
|
#include <MG_Util/Converters/MGToGL/DataTypeConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/BufferEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/BufferEnumConverter.h>
|
||||||
|
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/ProgramEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/ProgramEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/TextureEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/TextureEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToStr/TextureEnumConverter.h>
|
#include <MG_Util/Converters/MGToStr/TextureEnumConverter.h>
|
||||||
@@ -44,7 +41,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendBufferObject::SyncToBackend(SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject) {
|
void BackendBufferObject::SyncToBackend(const SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -105,7 +102,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BackendBufferObject::SyncToBackend_glBufferData(
|
void BackendBufferObject::SyncToBackend_glBufferData(
|
||||||
SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject) {
|
const SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -117,11 +114,11 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
GLenum usage = MG_Util::ConvertBufferUsageToGLEnum(stateBufferObject->GetUsage());
|
GLenum usage = MG_Util::ConvertBufferUsageToGLEnum(stateBufferObject->GetUsage());
|
||||||
|
|
||||||
Bind();
|
Bind();
|
||||||
g_GLESFuncs.glBufferData(TempBufferTarget, size, data, usage);
|
g_GLESFuncs.glBufferData(TempBufferTarget, (GLsizeiptr)size, data, usage);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendBufferObject::SyncToBackend_glBufferSubData(
|
void BackendBufferObject::SyncToBackend_glBufferSubData(
|
||||||
SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject) {
|
const SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -130,7 +127,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
const void* data = stateBufferObject->GetDataReadOnly()->data();
|
const void* data = stateBufferObject->GetDataReadOnly()->data();
|
||||||
// dirty range: [range.start, range.end)
|
// dirty range: [range.start, range.end)
|
||||||
auto ranges = stateBufferObject->GetDirtyRanges();
|
auto& ranges = stateBufferObject->GetDirtyRanges();
|
||||||
if (ranges.empty()) {
|
if (ranges.empty()) {
|
||||||
MGLOG_D("No dirty range to sync for buffer with ID: %u", m_backendBufferId);
|
MGLOG_D("No dirty range to sync for buffer with ID: %u", m_backendBufferId);
|
||||||
return;
|
return;
|
||||||
@@ -138,20 +135,21 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
for (const auto& range : ranges) {
|
for (const auto& range : ranges) {
|
||||||
Bind();
|
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<const char*>(data) + range.start);
|
reinterpret_cast<const char*>(data) + range.start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendBufferObject::SyncToBackend_glMapBufferRange(
|
void BackendBufferObject::SyncToBackend_glMapBufferRange(
|
||||||
SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject, Bool invalidate, Bool unsynchronized) {
|
const SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject, Bool invalidate, Bool unsynchronized) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MGLOG_D("Syncing buffer map (glMapBuffer) for object with ID : %u", m_backendBufferId);
|
MGLOG_D("Syncing buffer map (glMapBuffer) for object with ID : %u", m_backendBufferId);
|
||||||
MGLOG_D("Mapping buffer 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()) {
|
if (ranges.empty()) {
|
||||||
MGLOG_D("No dirty range to sync for buffer with ID: %u", m_backendBufferId);
|
MGLOG_D("No dirty range to sync for buffer with ID: %u", m_backendBufferId);
|
||||||
return;
|
return;
|
||||||
@@ -159,9 +157,9 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
SizeT minStart = ranges.GetOverallMinStart();
|
SizeT minStart = ranges.GetOverallMinStart();
|
||||||
SizeT maxEnd = ranges.GetOverallMaxEnd();
|
SizeT maxEnd = ranges.GetOverallMaxEnd();
|
||||||
Bind();
|
Bind();
|
||||||
void* mappedData = g_GLESFuncs.glMapBufferRange(TempBufferTarget, minStart, maxEnd - minStart,
|
void* mappedData = g_GLESFuncs.glMapBufferRange(
|
||||||
(invalidate ? GL_MAP_INVALIDATE_RANGE_BIT : 0) |
|
TempBufferTarget, (GLintptr)minStart, (GLintptr)(maxEnd - minStart),
|
||||||
(unsynchronized ? GL_MAP_UNSYNCHRONIZED_BIT : 0) |
|
(invalidate ? GL_MAP_INVALIDATE_RANGE_BIT : 0) | (unsynchronized ? GL_MAP_UNSYNCHRONIZED_BIT : 0) |
|
||||||
GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
|
GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
|
||||||
const void* data = stateBufferObject->GetDataReadOnly()->data();
|
const void* data = stateBufferObject->GetDataReadOnly()->data();
|
||||||
if (mappedData) {
|
if (mappedData) {
|
||||||
@@ -169,8 +167,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
Memcpy(mappedData, reinterpret_cast<const char*>(data) + minStart, maxEnd - minStart);
|
Memcpy(mappedData, reinterpret_cast<const char*>(data) + minStart, maxEnd - minStart);
|
||||||
// Explicitly flush the dirty ranges
|
// Explicitly flush the dirty ranges
|
||||||
for (const auto& range : ranges) {
|
for (const auto& range : ranges) {
|
||||||
g_GLESFuncs.glFlushMappedBufferRange(TempBufferTarget, range.start - minStart,
|
g_GLESFuncs.glFlushMappedBufferRange(TempBufferTarget, (GLintptr)(range.start - minStart),
|
||||||
range.end - range.start);
|
(GLintptr)(range.end - range.start));
|
||||||
}
|
}
|
||||||
g_GLESFuncs.glUnmapBuffer(TempBufferTarget);
|
g_GLESFuncs.glUnmapBuffer(TempBufferTarget);
|
||||||
} else {
|
} else {
|
||||||
@@ -191,7 +189,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glBindBuffer(target, m_backendBufferId);
|
g_GLESFuncs.glBindBuffer(target, m_backendBufferId);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnorderedMap<SharedPtr<MG_State::GLState::BufferObject>, SharedPtr<BackendBufferObject>> g_backendBufferObjects;
|
StateBackendObjectRegistry<MG_State::GLState::BufferObject, BackendBufferObject> g_backendBufferObjects;
|
||||||
BackendBufferObject* g_boundVertexBufferObject = nullptr;
|
BackendBufferObject* g_boundVertexBufferObject = nullptr;
|
||||||
} // namespace BufferImpl
|
} // namespace BufferImpl
|
||||||
|
|
||||||
@@ -209,22 +207,21 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendVertexArrayObject::Bind() {
|
void BackendVertexArrayObject::Bind() const {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
g_GLESFuncs.glBindVertexArray(m_backendVAOId);
|
g_GLESFuncs.glBindVertexArray(m_backendVAOId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendVertexArrayObject::BindAttributeBuffer(Uint index,
|
inline void BindAttributeBuffer(const MG_State::GLState::VertexAttribute& attrib) {
|
||||||
const MG_State::GLState::VertexAttribute& attrib) {
|
|
||||||
const auto& bufferObject = attrib.Buffer;
|
const auto& bufferObject = attrib.Buffer;
|
||||||
if (!bufferObject) {
|
if (!bufferObject) {
|
||||||
MGLOG_W("Attribute has no bound buffer, skipping.");
|
MGLOG_W("Attribute has no bound buffer, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(bufferObject);
|
const auto& backendBufferIt = BufferImpl::g_backendBufferObjects.find(bufferObject.get());
|
||||||
if (backendBufferIt == BufferImpl::g_backendBufferObjects.end()) {
|
if (backendBufferIt == BufferImpl::g_backendBufferObjects.end()) {
|
||||||
MGLOG_E("No backend buffer found for attribute's buffer, cannot bind attribute.");
|
MGLOG_E("No backend buffer found for attribute's buffer, cannot bind attribute.");
|
||||||
return;
|
return;
|
||||||
@@ -234,7 +231,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
backendBufferObject->Bind(GL_ARRAY_BUFFER);
|
backendBufferObject->Bind(GL_ARRAY_BUFFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendVertexArrayObject::SyncToBackend(SharedPtr<MG_State::GLState::VertexArrayObject>& stateVAOObject) {
|
void BackendVertexArrayObject::SyncToBackend(
|
||||||
|
const SharedPtr<MG_State::GLState::VertexArrayObject>& stateVAOObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -268,7 +266,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
m_syncedAttributeVersions[attribIndex].BufferVersion;
|
m_syncedAttributeVersions[attribIndex].BufferVersion;
|
||||||
if (!needsSyncFormat && !needsSyncBuffer) continue;
|
if (!needsSyncFormat && !needsSyncBuffer) continue;
|
||||||
|
|
||||||
BindAttributeBuffer(attribIndex, attrib);
|
BindAttributeBuffer(attrib);
|
||||||
|
|
||||||
if (!attrib.IsInteger) {
|
if (!attrib.IsInteger) {
|
||||||
g_GLESFuncs.glVertexAttribPointer(
|
g_GLESFuncs.glVertexAttribPointer(
|
||||||
@@ -289,7 +287,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
if (currentIndexBufferVersion != m_syncedIndexBufferVersion) {
|
if (currentIndexBufferVersion != m_syncedIndexBufferVersion) {
|
||||||
const auto& indexBufferBinding = stateVAOObject->GetIndexBufferBindingSlot().GetBoundObject();
|
const auto& indexBufferBinding = stateVAOObject->GetIndexBufferBindingSlot().GetBoundObject();
|
||||||
if (indexBufferBinding) {
|
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()) {
|
if (backendBufferIt != BufferImpl::g_backendBufferObjects.end()) {
|
||||||
const auto& backendBufferObject = backendBufferIt->second;
|
const auto& backendBufferObject = backendBufferIt->second;
|
||||||
backendBufferObject->Bind(GL_ELEMENT_ARRAY_BUFFER);
|
backendBufferObject->Bind(GL_ELEMENT_ARRAY_BUFFER);
|
||||||
@@ -303,7 +301,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
m_syncedAttributeVersions = allAttributeVersions;
|
m_syncedAttributeVersions = allAttributeVersions;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnorderedMap<SharedPtr<MG_State::GLState::VertexArrayObject>, SharedPtr<BackendVertexArrayObject>>
|
StateBackendObjectRegistry<MG_State::GLState::VertexArrayObject, BackendVertexArrayObject>
|
||||||
g_backendVertexArrayObjects;
|
g_backendVertexArrayObjects;
|
||||||
} // namespace VertexArrayImpl
|
} // namespace VertexArrayImpl
|
||||||
|
|
||||||
@@ -336,7 +334,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_boundTexturesCache[unit][targetN] = this;
|
g_boundTexturesCache[unit][targetN] = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Uint BackendTextureObject::GetBackendTextureId() {
|
Uint BackendTextureObject::GetBackendTextureId() const {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -344,7 +342,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BackendTextureObject::SyncMipmapsToBackend(
|
void BackendTextureObject::SyncMipmapsToBackend(
|
||||||
SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject) {
|
const SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject) {
|
||||||
if (!stateTextureObject) {
|
if (!stateTextureObject) {
|
||||||
MGLOG_E("State texture object is null, cannot sync to backend.");
|
MGLOG_E("State texture object is null, cannot sync to backend.");
|
||||||
return;
|
return;
|
||||||
@@ -353,7 +351,6 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
DebugImpl::ErrorLopper errorLopper;
|
|
||||||
|
|
||||||
MGLOG_D("Syncing texture mipmaps with backend ID %u to backend for state ID %u", m_backendTextureId,
|
MGLOG_D("Syncing texture mipmaps with backend ID %u to backend for state ID %u", m_backendTextureId,
|
||||||
stateTextureObject->GetExternalIndex());
|
stateTextureObject->GetExternalIndex());
|
||||||
@@ -381,7 +378,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Bind(target);
|
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());
|
MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
const auto baseSize = stateTextureObject->GetBaseSize();
|
const auto baseSize = stateTextureObject->GetBaseSize();
|
||||||
@@ -414,7 +411,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
&glFormat, &glType);
|
&glFormat, &glType);
|
||||||
|
|
||||||
const auto& uploadTargets = textureMipmapObject->GetUploadTargets();
|
const auto& uploadTargets = textureMipmapObject->GetUploadTargets();
|
||||||
for (auto uploadTarget : uploadTargets) {
|
for (auto& uploadTarget : uploadTargets) {
|
||||||
for (SizeT level = 0; level < mipmapCount; ++level) {
|
for (SizeT level = 0; level < mipmapCount; ++level) {
|
||||||
auto levelTexelSize = textureMipmapObject->GetMipmapTexelSize(uploadTarget, level);
|
auto levelTexelSize = textureMipmapObject->GetMipmapTexelSize(uploadTarget, level);
|
||||||
auto levelByteSize = textureMipmapObject->GetMipmapByteSize(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,
|
levelTexelSize.x(), levelTexelSize.y(), levelTexelSize.z(), levelByteSize, pData,
|
||||||
levelDirty ? "true" : "false");
|
levelDirty ? "true" : "false");
|
||||||
|
|
||||||
errorLopper.Clear();
|
DebugImpl::ErrorLopper::Clear();
|
||||||
g_GLESFuncs.glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
g_GLESFuncs.glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||||
auto textureTarget = stateTextureObject->GetTarget();
|
auto textureTarget = stateTextureObject->GetTarget();
|
||||||
// TODO: handle more texture types
|
// TODO: handle more texture types
|
||||||
switch (textureTarget) {
|
switch (textureTarget) {
|
||||||
case TextureTarget::Texture2D:
|
case TextureTarget::Texture2D:
|
||||||
case TextureTarget::TextureCubeMap: {
|
case TextureTarget::TextureCubeMap: {
|
||||||
g_GLESFuncs.glTexImage2D(glUploadTarget, static_cast<GLint>(level), glInternalFormat,
|
g_GLESFuncs.glTexImage2D(
|
||||||
static_cast<GLsizei>(levelTexelSize.x()),
|
glUploadTarget, static_cast<GLint>(level), (GLint)glInternalFormat,
|
||||||
static_cast<GLsizei>(levelTexelSize.y()), 0, glFormat, glType,
|
static_cast<GLsizei>(levelTexelSize.x()), static_cast<GLsizei>(levelTexelSize.y()),
|
||||||
pData);
|
0, glFormat, glType, pData);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TextureTarget::Texture3D: {
|
case TextureTarget::Texture3D: {
|
||||||
g_GLESFuncs.glTexImage3D(
|
g_GLESFuncs.glTexImage3D(
|
||||||
glUploadTarget, static_cast<GLint>(level), glInternalFormat,
|
glUploadTarget, static_cast<GLint>(level), (GLint)glInternalFormat,
|
||||||
static_cast<GLsizei>(levelTexelSize.x()), static_cast<GLsizei>(levelTexelSize.y()),
|
static_cast<GLsizei>(levelTexelSize.x()), static_cast<GLsizei>(levelTexelSize.y()),
|
||||||
static_cast<GLsizei>(levelTexelSize.z()), 0, glFormat, glType, pData);
|
static_cast<GLsizei>(levelTexelSize.z()), 0, glFormat, glType, pData);
|
||||||
break;
|
break;
|
||||||
@@ -454,8 +451,9 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MG_Util::ConvertTextureTargetToString(textureTarget).c_str());
|
MG_Util::ConvertTextureTargetToString(textureTarget).c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__, glUploadTarget,
|
DebugImpl::ErrorLopper::Loop([file = __FILE__, line = __LINE__, func = __func__,
|
||||||
glInternalFormat, glFormat, glType, pData](GLenum err) {
|
glUploadTarget, glInternalFormat, glFormat, glType,
|
||||||
|
pData](GLenum err) {
|
||||||
MGLOG_D("%s(%s:%d) ES error: %s. glTexImage*: target=%s, internalformat=%s, format=%s, "
|
MGLOG_D("%s(%s:%d) ES error: %s. glTexImage*: target=%s, internalformat=%s, format=%s, "
|
||||||
"type=%s, pixels=%p",
|
"type=%s, pixels=%p",
|
||||||
func, file, line, MG_Util::ConvertGLEnumToString(err).c_str(),
|
func, file, line, MG_Util::ConvertGLEnumToString(err).c_str(),
|
||||||
@@ -478,7 +476,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
TextureImpl::GenerateTextureFormatInfo(textureMipmapObject->GetFormat(), &glInternalFormat,
|
TextureImpl::GenerateTextureFormatInfo(textureMipmapObject->GetFormat(), &glInternalFormat,
|
||||||
&glFormat, &glType);
|
&glFormat, &glType);
|
||||||
const auto& uploadTargets = textureMipmapObject->GetUploadTargets();
|
const auto& uploadTargets = textureMipmapObject->GetUploadTargets();
|
||||||
for (auto uploadTarget : uploadTargets) {
|
for (auto& uploadTarget : uploadTargets) {
|
||||||
for (SizeT level = 0; level < mipmapCount; ++level) {
|
for (SizeT level = 0; level < mipmapCount; ++level) {
|
||||||
if (!textureMipmapObject->IsStorageDirty(uploadTarget, level)) {
|
if (!textureMipmapObject->IsStorageDirty(uploadTarget, level)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -499,7 +497,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
auto glUploadTarget = MG_Util::ConvertTextureUploadTargetToGLEnum(uploadTarget);
|
auto glUploadTarget = MG_Util::ConvertTextureUploadTargetToGLEnum(uploadTarget);
|
||||||
g_GLESFuncs.glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
g_GLESFuncs.glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||||
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,
|
MGLOG_D("%s(%s:%d) ES error: %s", func, file, line,
|
||||||
MG_Util::ConvertGLEnumToString(err).c_str());
|
MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
@@ -518,7 +517,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
auto* textureBufferObject =
|
auto* textureBufferObject =
|
||||||
static_cast<MG_State::GLState::TextureObjectBuffer*>(stateTextureObject.get());
|
static_cast<MG_State::GLState::TextureObjectBuffer*>(stateTextureObject.get());
|
||||||
auto& slot = textureBufferObject->GetBufferBindingSlot();
|
auto& slot = textureBufferObject->GetBufferBindingSlot();
|
||||||
auto buffer = slot.GetBoundObject();
|
auto& buffer = slot.GetBoundObject();
|
||||||
auto bufferIndex = buffer->GetExternalIndex();
|
auto bufferIndex = buffer->GetExternalIndex();
|
||||||
currentTextureInfo.bufferExternalIndex = bufferIndex;
|
currentTextureInfo.bufferExternalIndex = bufferIndex;
|
||||||
|
|
||||||
@@ -530,10 +529,13 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
// Need to sync texture buffer if not synced yet
|
// Need to sync texture buffer if not synced yet
|
||||||
auto& backendBuffers = BufferImpl::g_backendBufferObjects;
|
auto& backendBuffers = BufferImpl::g_backendBufferObjects;
|
||||||
SharedPtr<BufferImpl::BackendBufferObject> backendBufferObject;
|
SharedPtr<BufferImpl::BackendBufferObject> backendBufferObject;
|
||||||
const auto& backendBufferIt = backendBuffers.find(buffer);
|
const auto& backendBufferIt = backendBuffers.find(buffer.get());
|
||||||
if (backendBufferIt == backendBuffers.end()) {
|
if (backendBufferIt == backendBuffers.end()) {
|
||||||
backendBufferObject = MakeShared<BufferImpl::BackendBufferObject>();
|
auto& backendBufferSlot = backendBuffers.GetOrCreate(buffer);
|
||||||
backendBuffers[buffer] = backendBufferObject;
|
if (!backendBufferSlot) {
|
||||||
|
backendBufferSlot = MakeShared<BufferImpl::BackendBufferObject>();
|
||||||
|
}
|
||||||
|
backendBufferObject = backendBufferSlot;
|
||||||
} else {
|
} else {
|
||||||
backendBufferObject = backendBufferIt->second;
|
backendBufferObject = backendBufferIt->second;
|
||||||
}
|
}
|
||||||
@@ -553,7 +555,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
THROW_UNIMPL_EXCEPTION;
|
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());
|
MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -561,11 +563,11 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BackendTextureObject::SyncBuiltinSamplerToBackend(
|
void BackendTextureObject::SyncBuiltinSamplerToBackend(
|
||||||
SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject) {
|
const SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
DebugImpl::ErrorLopper errorLopper;
|
|
||||||
if (!stateTextureObject) {
|
if (!stateTextureObject) {
|
||||||
MGLOG_E("State texture object is null, cannot sync to backend.");
|
MGLOG_E("State texture object is null, cannot sync to backend.");
|
||||||
return;
|
return;
|
||||||
@@ -594,7 +596,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Bind(target);
|
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());
|
MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -607,7 +609,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glTexParameteri(target, glName, \
|
g_GLESFuncs.glTexParameteri(target, glName, \
|
||||||
MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)); \
|
MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)); \
|
||||||
m_cacheSamplerParameters.internalName = samplerParams.internalName; \
|
m_cacheSamplerParameters.internalName = samplerParams.internalName; \
|
||||||
errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__, \
|
DebugImpl::ErrorLopper::Loop( \
|
||||||
|
[file = __FILE__, line = __LINE__, func = __func__, \
|
||||||
t = MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)](GLenum err) { \
|
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, \
|
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()); \
|
MG_Util::ConvertGLEnumToString(err).c_str(), MG_Util::ConvertGLEnumToString(t).c_str()); \
|
||||||
@@ -616,19 +619,19 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter ||
|
if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter ||
|
||||||
m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) {
|
m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) {
|
||||||
g_GLESFuncs.glTexParameteri(
|
g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER,
|
||||||
target, GL_TEXTURE_MIN_FILTER,
|
(GLint)MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter,
|
||||||
MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter, samplerParams.mipmapMode));
|
samplerParams.mipmapMode));
|
||||||
m_cacheSamplerParameters.minFilter = samplerParams.minFilter;
|
m_cacheSamplerParameters.minFilter = samplerParams.minFilter;
|
||||||
m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode;
|
m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode;
|
||||||
}
|
}
|
||||||
if (m_cacheSamplerParameters.magFilter != samplerParams.magFilter) {
|
if (m_cacheSamplerParameters.magFilter != samplerParams.magFilter) {
|
||||||
g_GLESFuncs.glTexParameteri(
|
g_GLESFuncs.glTexParameteri(
|
||||||
target, GL_TEXTURE_MAG_FILTER,
|
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;
|
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());
|
MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -645,18 +648,18 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glTexParameterf(target, GL_TEXTURE_MAX_LOD, samplerParams.maxLod);
|
g_GLESFuncs.glTexParameterf(target, GL_TEXTURE_MAX_LOD, samplerParams.maxLod);
|
||||||
m_cacheSamplerParameters.maxLod = 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());
|
MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
#undef SYNC_TEX_SAMPLER_PARAM_IF_CHANGED
|
#undef SYNC_TEX_SAMPLER_PARAM_IF_CHANGED
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendTextureObject::SyncTextureParamsToBackend(
|
void BackendTextureObject::SyncTextureParamsToBackend(
|
||||||
SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject) {
|
const SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
DebugImpl::ErrorLopper errorLopper;
|
|
||||||
if (!stateTextureObject) {
|
if (!stateTextureObject) {
|
||||||
MGLOG_E("State texture object is null, cannot sync to backend.");
|
MGLOG_E("State texture object is null, cannot sync to backend.");
|
||||||
return;
|
return;
|
||||||
@@ -683,7 +686,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Bind(target);
|
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());
|
MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -696,14 +699,14 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, static_cast<GLint>(levelRange.x()));
|
g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, static_cast<GLint>(levelRange.x()));
|
||||||
m_cacheLodRange.x() = 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());
|
MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
if (m_cacheLodRange.y() != levelRange.y()) {
|
if (m_cacheLodRange.y() != levelRange.y()) {
|
||||||
g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, static_cast<GLint>(levelRange.y()));
|
g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, static_cast<GLint>(levelRange.y()));
|
||||||
m_cacheLodRange.y() = 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());
|
MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -720,7 +723,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
SYNC_TEX_SWIZZLE_PARAM_IF_CHANGED(a(), GL_TEXTURE_SWIZZLE_A);
|
SYNC_TEX_SWIZZLE_PARAM_IF_CHANGED(a(), GL_TEXTURE_SWIZZLE_A);
|
||||||
#undef SYNC_TEX_SWIZZLE_PARAM_IF_CHANGED
|
#undef SYNC_TEX_SWIZZLE_PARAM_IF_CHANGED
|
||||||
m_cacheSwizzleParams = swizzleParams;
|
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());
|
MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -730,7 +733,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
GLfloat borderColorArray[4] = {borderColor.x(), borderColor.y(), borderColor.z(), borderColor.w()};
|
GLfloat borderColorArray[4] = {borderColor.x(), borderColor.y(), borderColor.z(), borderColor.w()};
|
||||||
g_GLESFuncs.glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, borderColorArray);
|
g_GLESFuncs.glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, borderColorArray);
|
||||||
m_cacheBorderColor = borderColor;
|
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());
|
MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -760,8 +763,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
Array<Array<BackendTextureObject*, (SizeT)TextureTarget::TextureTargetCount>,
|
Array<Array<BackendTextureObject*, (SizeT)TextureTarget::TextureTargetCount>,
|
||||||
MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS>
|
MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS>
|
||||||
g_boundTexturesCache;
|
g_boundTexturesCache;
|
||||||
UnorderedMap<SharedPtr<MG_State::GLState::ITextureObject>, SharedPtr<BackendTextureObject>>
|
StateBackendObjectRegistry<MG_State::GLState::ITextureObject, BackendTextureObject> g_backendTextureObjects;
|
||||||
g_backendTextureObjects;
|
|
||||||
} // namespace TextureImpl
|
} // namespace TextureImpl
|
||||||
|
|
||||||
namespace FramebufferImpl {
|
namespace FramebufferImpl {
|
||||||
@@ -778,7 +780,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendFramebufferObject::Bind(FramebufferTarget target) {
|
void BackendFramebufferObject::Bind(FramebufferTarget target) const {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -788,12 +790,12 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_GLESFuncs.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_backendFBOId);
|
g_GLESFuncs.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_backendFBOId);
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool BackendFramebufferObject::SyncAttachmentObject(
|
static Bool SyncAttachmentObject(GLenum glFBOTarget,
|
||||||
GLenum glFBOTarget, const MG_State::GLState::FramebufferAttachmentObject& attachmentObject,
|
const MG_State::GLState::FramebufferAttachmentObject& attachmentObject,
|
||||||
GLenum glBackendAttachment) {
|
GLenum glBackendAttachment) {
|
||||||
if (attachmentObject.IsTexture()) {
|
if (attachmentObject.IsTexture()) {
|
||||||
const auto& textureObject = attachmentObject.GetTexture();
|
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()) {
|
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) {
|
||||||
MGLOG_E("%s: No backend texture found for FBO attachment, cannot bind texture.", __func__);
|
MGLOG_E("%s: No backend texture found for FBO attachment, cannot bind texture.", __func__);
|
||||||
return false;
|
return false;
|
||||||
@@ -807,11 +809,15 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
} else if (attachmentObject.IsRenderbuffer()) {
|
} else if (attachmentObject.IsRenderbuffer()) {
|
||||||
const auto& renderbufferObject = attachmentObject.GetRenderbuffer();
|
const auto& renderbufferObject = attachmentObject.GetRenderbuffer();
|
||||||
const auto& backendRenderbufferIt =
|
const auto& backendRenderbufferIt =
|
||||||
RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject);
|
RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject.get());
|
||||||
SharedPtr<RenderbufferImpl::BackendRenderbufferObject> backendRenderbufferObject;
|
SharedPtr<RenderbufferImpl::BackendRenderbufferObject> backendRenderbufferObject;
|
||||||
if (backendRenderbufferIt == RenderbufferImpl::g_backendRenderbufferObjects.end()) {
|
if (backendRenderbufferIt == RenderbufferImpl::g_backendRenderbufferObjects.end()) {
|
||||||
backendRenderbufferObject = MakeShared<RenderbufferImpl::BackendRenderbufferObject>();
|
auto& backendRenderbufferSlot =
|
||||||
RenderbufferImpl::g_backendRenderbufferObjects[renderbufferObject] = backendRenderbufferObject;
|
RenderbufferImpl::g_backendRenderbufferObjects.GetOrCreate(renderbufferObject);
|
||||||
|
if (!backendRenderbufferSlot) {
|
||||||
|
backendRenderbufferSlot = MakeShared<RenderbufferImpl::BackendRenderbufferObject>();
|
||||||
|
}
|
||||||
|
backendRenderbufferObject = backendRenderbufferSlot;
|
||||||
} else {
|
} else {
|
||||||
backendRenderbufferObject = backendRenderbufferIt->second;
|
backendRenderbufferObject = backendRenderbufferIt->second;
|
||||||
}
|
}
|
||||||
@@ -824,8 +830,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendFramebufferObject::SyncToBackend(SharedPtr<MG_State::GLState::FramebufferObject>& stateFBOObject,
|
void BackendFramebufferObject::SyncToBackend(
|
||||||
FramebufferTarget asTarget) {
|
const SharedPtr<MG_State::GLState::FramebufferObject>& stateFBOObject, FramebufferTarget asTarget) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -853,7 +859,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
std::fill(m_backendDrawBuffers, m_backendDrawBuffers + FramebufferObject::MAX_DRAW_BUFFERS, GL_NONE);
|
std::fill(m_backendDrawBuffers, m_backendDrawBuffers + FramebufferObject::MAX_DRAW_BUFFERS, GL_NONE);
|
||||||
int nEffectiveBuffers = 0;
|
int nEffectiveBuffers = 0;
|
||||||
for (GLint i = 0; i < FramebufferObject::MAX_DRAW_BUFFERS; ++i) {
|
for (GLint i = 0; i < FramebufferObject::MAX_DRAW_BUFFERS; ++i) {
|
||||||
auto frontendBuf = stateDrawBuffers[i];
|
auto& frontendBuf = stateDrawBuffers[i];
|
||||||
if (frontendBuf == FramebufferAttachmentType::None) {
|
if (frontendBuf == FramebufferAttachmentType::None) {
|
||||||
m_backendDrawBuffers[i] = GL_NONE;
|
m_backendDrawBuffers[i] = GL_NONE;
|
||||||
continue;
|
continue;
|
||||||
@@ -892,7 +898,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
const auto& attachmentVersions = stateFBOObject->GetAllFramebufferAttachmentVersions();
|
const auto& attachmentVersions = stateFBOObject->GetAllFramebufferAttachmentVersions();
|
||||||
for (SizeT i = 0; i < attachments.size(); ++i) {
|
for (SizeT i = 0; i < attachments.size(); ++i) {
|
||||||
const auto& attachmentObject = attachments[i];
|
const auto& attachmentObject = attachments[i];
|
||||||
FramebufferAttachmentType frontendType = static_cast<FramebufferAttachmentType>(i);
|
auto frontendType = static_cast<FramebufferAttachmentType>(i);
|
||||||
GLenum glBackendAttachment = GL_NONE;
|
GLenum glBackendAttachment = GL_NONE;
|
||||||
if (frontendType >= FramebufferAttachmentType::Color0 &&
|
if (frontendType >= FramebufferAttachmentType::Color0 &&
|
||||||
frontendType <= FramebufferAttachmentType::Color31)
|
frontendType <= FramebufferAttachmentType::Color31)
|
||||||
@@ -928,7 +934,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
// Verify that the backend object's name and parameters match the frontend attachment state
|
// Verify that the backend object's name and parameters match the frontend attachment state
|
||||||
if (attachmentObject.IsTexture()) {
|
if (attachmentObject.IsTexture()) {
|
||||||
const auto& textureObject = attachmentObject.GetTexture();
|
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(),
|
MOBILEGL_ASSERT(backendTextureIt != TextureImpl::g_backendTextureObjects.end(),
|
||||||
"No backend texture found while framebuffer reports texture attachment.");
|
"No backend texture found while framebuffer reports texture attachment.");
|
||||||
GLuint backendTexId = backendTextureIt->second->GetBackendTextureId();
|
GLuint backendTexId = backendTextureIt->second->GetBackendTextureId();
|
||||||
@@ -944,7 +950,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
"Attachment texture level mismatch between GLES and state object.");
|
"Attachment texture level mismatch between GLES and state object.");
|
||||||
} else if (attachmentObject.IsRenderbuffer()) {
|
} else if (attachmentObject.IsRenderbuffer()) {
|
||||||
const auto& renderbufferObject = attachmentObject.GetRenderbuffer();
|
const auto& renderbufferObject = attachmentObject.GetRenderbuffer();
|
||||||
auto backendRboIt = RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject);
|
auto backendRboIt =
|
||||||
|
RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject.get());
|
||||||
MOBILEGL_ASSERT(
|
MOBILEGL_ASSERT(
|
||||||
backendRboIt != RenderbufferImpl::g_backendRenderbufferObjects.end(),
|
backendRboIt != RenderbufferImpl::g_backendRenderbufferObjects.end(),
|
||||||
"No backend renderbuffer found while framebuffer reports renderbuffer attachment.");
|
"No backend renderbuffer found while framebuffer reports renderbuffer attachment.");
|
||||||
@@ -975,14 +982,13 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
return glBackendReadBuffer;
|
return glBackendReadBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnorderedMap<SharedPtr<MG_State::GLState::FramebufferObject>, SharedPtr<BackendFramebufferObject>>
|
StateBackendObjectRegistry<MG_State::GLState::FramebufferObject, BackendFramebufferObject>
|
||||||
g_backendFramebufferObjects;
|
g_backendFramebufferObjects;
|
||||||
Array<Uint16, SizeT(FramebufferTarget::FramebufferTargetCount)> g_fboBindVersions = {0};
|
Array<Uint16, SizeT(FramebufferTarget::FramebufferTargetCount)> g_fboBindVersions = {0};
|
||||||
} // namespace FramebufferImpl
|
} // namespace FramebufferImpl
|
||||||
|
|
||||||
namespace PrgramImpl {
|
namespace PrgramImpl {
|
||||||
UnorderedMap<SharedPtr<MG_State::GLState::ProgramObject>, SharedPtr<BackendProgramObjectImpl>>
|
StateBackendObjectRegistry<MG_State::GLState::ProgramObject, BackendProgramObjectImpl> g_backendProgramObjects;
|
||||||
g_backendProgramObjects;
|
|
||||||
|
|
||||||
BackendProgramObjectImpl::BackendProgramObjectImpl() {
|
BackendProgramObjectImpl::BackendProgramObjectImpl() {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
@@ -1008,7 +1014,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendProgramObjectImpl::SyncToBackend(SharedPtr<MG_State::GLState::ProgramObject>& stateProgramObject) {
|
void BackendProgramObjectImpl::SyncToBackend(
|
||||||
|
const SharedPtr<MG_State::GLState::ProgramObject>& stateProgramObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -1161,7 +1168,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MGLOG_D("Program sync completed. backend ID %u", m_backendProgramId);
|
MGLOG_D("Program sync completed. backend ID %u", m_backendProgramId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendProgramObjectImpl::Use() {
|
void BackendProgramObjectImpl::Use() const {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -1184,7 +1191,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendSamplerObject::SyncToBackend(SharedPtr<MG_State::GLState::SamplerObject>& stateSamplerObject) {
|
void BackendSamplerObject::SyncToBackend(
|
||||||
|
const SharedPtr<MG_State::GLState::SamplerObject>& stateSamplerObject) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -1210,22 +1218,22 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
#define SYNC_SAMPLER_PARAM_IF_CHANGED(internalName, glName, type) \
|
#define SYNC_SAMPLER_PARAM_IF_CHANGED(internalName, glName, type) \
|
||||||
if (m_cacheSamplerParameters.internalName != samplerParams.internalName) { \
|
if (m_cacheSamplerParameters.internalName != samplerParams.internalName) { \
|
||||||
g_GLESFuncs.glSamplerParameteri(m_backendSamplerId, glName, \
|
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; \
|
m_cacheSamplerParameters.internalName = samplerParams.internalName; \
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter ||
|
if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter ||
|
||||||
m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) {
|
m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) {
|
||||||
g_GLESFuncs.glSamplerParameteri(
|
g_GLESFuncs.glSamplerParameteri(m_backendSamplerId, GL_TEXTURE_MIN_FILTER,
|
||||||
m_backendSamplerId, GL_TEXTURE_MIN_FILTER,
|
(GLint)MG_Util::ConvertSamplerFilterModeToGLEnum(
|
||||||
MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter, samplerParams.mipmapMode));
|
samplerParams.minFilter, samplerParams.mipmapMode));
|
||||||
m_cacheSamplerParameters.minFilter = samplerParams.minFilter;
|
m_cacheSamplerParameters.minFilter = samplerParams.minFilter;
|
||||||
m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode;
|
m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode;
|
||||||
}
|
}
|
||||||
if (m_cacheSamplerParameters.magFilter != samplerParams.magFilter) {
|
if (m_cacheSamplerParameters.magFilter != samplerParams.magFilter) {
|
||||||
g_GLESFuncs.glSamplerParameteri(
|
g_GLESFuncs.glSamplerParameteri(
|
||||||
m_backendSamplerId, GL_TEXTURE_MAG_FILTER,
|
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;
|
m_cacheSamplerParameters.magFilter = samplerParams.magFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1256,7 +1264,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_boundSamplersCache[unit] = this;
|
g_boundSamplersCache[unit] = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Uint BackendSamplerObject::GetBackendSamplerId() {
|
Uint BackendSamplerObject::GetBackendSamplerId() const {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -1271,8 +1279,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Array<BackendSamplerObject*, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS> g_boundSamplersCache;
|
Array<BackendSamplerObject*, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS> g_boundSamplersCache;
|
||||||
UnorderedMap<SharedPtr<MG_State::GLState::SamplerObject>, SharedPtr<BackendSamplerObject>>
|
StateBackendObjectRegistry<MG_State::GLState::SamplerObject, BackendSamplerObject> g_backendSamplerObjects;
|
||||||
g_backendSamplerObjects;
|
|
||||||
} // namespace SamplerImpl
|
} // namespace SamplerImpl
|
||||||
|
|
||||||
namespace RenderbufferImpl {
|
namespace RenderbufferImpl {
|
||||||
@@ -1287,7 +1294,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendRenderbufferObject::Bind() {
|
void BackendRenderbufferObject::Bind() const {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
@@ -1334,9 +1341,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MGLOG_D("RBO %u sync completed. backend ID %u", stateRBOObject->GetExternalIndex(), m_backendRBOId);
|
MGLOG_D("RBO %u sync completed. backend ID %u", stateRBOObject->GetExternalIndex(), m_backendRBOId);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnorderedMap<SharedPtr<MG_State::GLState::RenderbufferObject>, SharedPtr<BackendRenderbufferObject>>
|
StateBackendObjectRegistry<MG_State::GLState::RenderbufferObject, BackendRenderbufferObject>
|
||||||
g_backendRenderbufferObjects;
|
g_backendRenderbufferObjects;
|
||||||
} // namespace RenderbufferImpl
|
} // namespace RenderbufferImpl
|
||||||
|
|
||||||
namespace Utils {} // namespace Utils
|
|
||||||
} // namespace MobileGL::MG_Backend::DirectGLES
|
} // namespace MobileGL::MG_Backend::DirectGLES
|
||||||
|
|||||||
@@ -15,19 +15,113 @@
|
|||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Backend::DirectGLES {
|
namespace MobileGL::MG_Backend::DirectGLES {
|
||||||
|
template <typename StateObject, typename BackendObject>
|
||||||
|
class StateBackendObjectRegistry {
|
||||||
|
public:
|
||||||
|
using StatePtr = SharedPtr<StateObject>;
|
||||||
|
using StateWeakPtr = std::weak_ptr<StateObject>;
|
||||||
|
using BackendPtr = SharedPtr<BackendObject>;
|
||||||
|
using BackendMap = UnorderedMap<StateObject*, BackendPtr>;
|
||||||
|
using StateRefMap = UnorderedMap<StateObject*, StateWeakPtr>;
|
||||||
|
using iterator = typename BackendMap::iterator;
|
||||||
|
using const_iterator = typename BackendMap::const_iterator;
|
||||||
|
|
||||||
|
BackendPtr& GetOrCreate(const StatePtr& stateObj) {
|
||||||
|
MOBILEGL_ASSERT(stateObj != nullptr, "State object must not be null");
|
||||||
|
|
||||||
|
auto* key = stateObj.get();
|
||||||
|
auto trackedStateIt = m_stateRefs.find(key);
|
||||||
|
if (trackedStateIt != m_stateRefs.end() && trackedStateIt->second.expired()) {
|
||||||
|
EraseByKey(key);
|
||||||
|
}
|
||||||
|
m_stateRefs[key] = stateObj;
|
||||||
|
return m_backendObjects[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator find(StateObject* stateObj) {
|
||||||
|
if (!IsAlive(stateObj)) {
|
||||||
|
EraseByKey(stateObj);
|
||||||
|
return m_backendObjects.end();
|
||||||
|
}
|
||||||
|
return m_backendObjects.find(stateObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
const_iterator find(StateObject* stateObj) const {
|
||||||
|
return const_cast<StateBackendObjectRegistry*>(this)->find(stateObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator end() { return m_backendObjects.end(); }
|
||||||
|
const_iterator end() const { return m_backendObjects.end(); }
|
||||||
|
|
||||||
|
void CollectGarbageIfNeeded() {
|
||||||
|
++m_gcTick;
|
||||||
|
if (m_gcTick < kGCInterval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CollectGarbage();
|
||||||
|
m_gcTick = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CollectGarbageNow() { CollectGarbage(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool IsAlive(StateObject* stateObj) const {
|
||||||
|
const auto trackedStateIt = m_stateRefs.find(stateObj);
|
||||||
|
if (trackedStateIt == m_stateRefs.end()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return !trackedStateIt->second.expired();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EraseByKey(StateObject* stateObj) {
|
||||||
|
m_stateRefs.erase(stateObj);
|
||||||
|
m_backendObjects.erase(stateObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CollectGarbage() {
|
||||||
|
if (m_isCollecting) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_isCollecting = true;
|
||||||
|
|
||||||
|
Vector<StateObject*> staleKeys;
|
||||||
|
staleKeys.reserve(m_stateRefs.size());
|
||||||
|
for (const auto& [stateKey, stateWeakRef] : m_stateRefs) {
|
||||||
|
if (stateWeakRef.expired()) {
|
||||||
|
staleKeys.push_back(stateKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto* stateKey : staleKeys) {
|
||||||
|
m_stateRefs.erase(stateKey);
|
||||||
|
m_backendObjects.erase(stateKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_isCollecting = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr Uint32 kGCInterval = 1024;
|
||||||
|
StateRefMap m_stateRefs;
|
||||||
|
BackendMap m_backendObjects;
|
||||||
|
Uint32 m_gcTick = 0;
|
||||||
|
Bool m_isCollecting = false;
|
||||||
|
};
|
||||||
|
|
||||||
namespace BufferImpl {
|
namespace BufferImpl {
|
||||||
const GLenum TempBufferTarget = GL_ARRAY_BUFFER;
|
const GLenum TempBufferTarget = GL_ARRAY_BUFFER;
|
||||||
class BackendBufferObject {
|
class BackendBufferObject {
|
||||||
public:
|
public:
|
||||||
BackendBufferObject();
|
BackendBufferObject();
|
||||||
void SyncToBackend(SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject);
|
void SyncToBackend(const SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject);
|
||||||
Uint GetBackendBufferId() { return m_backendBufferId; }
|
Uint GetBackendBufferId() const { return m_backendBufferId; }
|
||||||
void Bind(GLenum target = TempBufferTarget);
|
void Bind(GLenum target = TempBufferTarget);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void SyncToBackend_glBufferData(SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject);
|
void SyncToBackend_glBufferData(const SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject);
|
||||||
void SyncToBackend_glBufferSubData(SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject);
|
void SyncToBackend_glBufferSubData(const SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject);
|
||||||
void SyncToBackend_glMapBufferRange(SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject,
|
void SyncToBackend_glMapBufferRange(const SharedPtr<MG_State::GLState::BufferObject>& stateBufferObject,
|
||||||
Bool invalidate = true, Bool unsynchronized = true);
|
Bool invalidate = true, Bool unsynchronized = true);
|
||||||
|
|
||||||
Uint m_backendBufferId = 0;
|
Uint m_backendBufferId = 0;
|
||||||
@@ -36,21 +130,18 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern BackendBufferObject* g_boundVertexBufferObject;
|
extern BackendBufferObject* g_boundVertexBufferObject;
|
||||||
extern UnorderedMap<SharedPtr<MG_State::GLState::BufferObject>, SharedPtr<BackendBufferObject>>
|
extern StateBackendObjectRegistry<MG_State::GLState::BufferObject, BackendBufferObject> g_backendBufferObjects;
|
||||||
g_backendBufferObjects;
|
|
||||||
} // namespace BufferImpl
|
} // namespace BufferImpl
|
||||||
|
|
||||||
namespace VertexArrayImpl {
|
namespace VertexArrayImpl {
|
||||||
class BackendVertexArrayObject {
|
class BackendVertexArrayObject {
|
||||||
public:
|
public:
|
||||||
BackendVertexArrayObject();
|
BackendVertexArrayObject();
|
||||||
void SyncToBackend(SharedPtr<MG_State::GLState::VertexArrayObject>& stateVAOObject);
|
void SyncToBackend(const SharedPtr<MG_State::GLState::VertexArrayObject>& stateVAOObject);
|
||||||
Uint GetBackendVertexArrayId() { return m_backendVAOId; }
|
Uint GetBackendVertexArrayId() const { return m_backendVAOId; }
|
||||||
void Bind();
|
void Bind() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void BindAttributeBuffer(Uint index, const MG_State::GLState::VertexAttribute& attrib);
|
|
||||||
|
|
||||||
Uint m_backendVAOId = 0;
|
Uint m_backendVAOId = 0;
|
||||||
Bool m_isInitialized = false;
|
Bool m_isInitialized = false;
|
||||||
Uint16 m_syncedIndexBufferVersion = 0;
|
Uint16 m_syncedIndexBufferVersion = 0;
|
||||||
@@ -58,7 +149,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
m_syncedAttributeVersions;
|
m_syncedAttributeVersions;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern UnorderedMap<SharedPtr<MG_State::GLState::VertexArrayObject>, SharedPtr<BackendVertexArrayObject>>
|
extern StateBackendObjectRegistry<MG_State::GLState::VertexArrayObject, BackendVertexArrayObject>
|
||||||
g_backendVertexArrayObjects;
|
g_backendVertexArrayObjects;
|
||||||
} // namespace VertexArrayImpl
|
} // namespace VertexArrayImpl
|
||||||
|
|
||||||
@@ -92,11 +183,11 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
class BackendTextureObject {
|
class BackendTextureObject {
|
||||||
public:
|
public:
|
||||||
BackendTextureObject();
|
BackendTextureObject();
|
||||||
void SyncMipmapsToBackend(SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject);
|
void SyncMipmapsToBackend(const SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject);
|
||||||
void SyncBuiltinSamplerToBackend(SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject);
|
void SyncBuiltinSamplerToBackend(const SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject);
|
||||||
void SyncTextureParamsToBackend(SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject);
|
void SyncTextureParamsToBackend(const SharedPtr<MG_State::GLState::ITextureObject>& stateTextureObject);
|
||||||
void Bind(GLenum target, Uint unit = TempTextureUnit);
|
void Bind(GLenum target, Uint unit = TempTextureUnit);
|
||||||
Uint GetBackendTextureId();
|
Uint GetBackendTextureId() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Uint m_backendTextureId = 0;
|
Uint m_backendTextureId = 0;
|
||||||
@@ -113,7 +204,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
void ActivateTextureUnit(Uint unit);
|
void ActivateTextureUnit(Uint unit);
|
||||||
void UnbindTexture(Uint unit, GLenum target);
|
void UnbindTexture(Uint unit, GLenum target);
|
||||||
extern UnorderedMap<SharedPtr<MG_State::GLState::ITextureObject>, SharedPtr<BackendTextureObject>>
|
extern StateBackendObjectRegistry<MG_State::GLState::ITextureObject, BackendTextureObject>
|
||||||
g_backendTextureObjects;
|
g_backendTextureObjects;
|
||||||
extern Array<Array<BackendTextureObject*, (SizeT)TextureTarget::TextureTargetCount>,
|
extern Array<Array<BackendTextureObject*, (SizeT)TextureTarget::TextureTargetCount>,
|
||||||
MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS>
|
MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS>
|
||||||
@@ -125,13 +216,10 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
class BackendFramebufferObject {
|
class BackendFramebufferObject {
|
||||||
public:
|
public:
|
||||||
BackendFramebufferObject();
|
BackendFramebufferObject();
|
||||||
void SyncToBackend(SharedPtr<MG_State::GLState::FramebufferObject>& stateFBOObject,
|
void SyncToBackend(const SharedPtr<MG_State::GLState::FramebufferObject>& stateFBOObject,
|
||||||
FramebufferTarget asTarget);
|
FramebufferTarget asTarget);
|
||||||
Uint GetBackendFramebufferId() { return m_backendFBOId; }
|
Uint GetBackendFramebufferId() const { return m_backendFBOId; }
|
||||||
void Bind(FramebufferTarget target);
|
void Bind(FramebufferTarget target) const;
|
||||||
bool SyncAttachmentObject(GLenum glFBOTarget,
|
|
||||||
const MG_State::GLState::FramebufferAttachmentObject& attachmentObject,
|
|
||||||
GLenum glBackendAttachment);
|
|
||||||
// FramebufferAttachmentType GetCompactedAttachmentTypeAtDrawBufferIndex(Int index);
|
// FramebufferAttachmentType GetCompactedAttachmentTypeAtDrawBufferIndex(Int index);
|
||||||
GLenum GetBackendAttachmentType(FramebufferAttachmentType frontendAtt) const;
|
GLenum GetBackendAttachmentType(FramebufferAttachmentType frontendAtt) const;
|
||||||
|
|
||||||
@@ -159,7 +247,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
FramebufferObject::FramebufferAttachmentVersionArray m_syncedFrontendAttachmentVersions = {0};
|
FramebufferObject::FramebufferAttachmentVersionArray m_syncedFrontendAttachmentVersions = {0};
|
||||||
};
|
};
|
||||||
|
|
||||||
extern UnorderedMap<SharedPtr<MG_State::GLState::FramebufferObject>, SharedPtr<BackendFramebufferObject>>
|
extern StateBackendObjectRegistry<MG_State::GLState::FramebufferObject, BackendFramebufferObject>
|
||||||
g_backendFramebufferObjects;
|
g_backendFramebufferObjects;
|
||||||
extern Array<Uint16, SizeT(FramebufferTarget::FramebufferTargetCount)> g_fboBindVersions;
|
extern Array<Uint16, SizeT(FramebufferTarget::FramebufferTargetCount)> g_fboBindVersions;
|
||||||
} // namespace FramebufferImpl
|
} // namespace FramebufferImpl
|
||||||
@@ -169,8 +257,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
public:
|
public:
|
||||||
BackendProgramObjectImpl();
|
BackendProgramObjectImpl();
|
||||||
~BackendProgramObjectImpl();
|
~BackendProgramObjectImpl();
|
||||||
void SyncToBackend(SharedPtr<MG_State::GLState::ProgramObject>& stateProgramObject);
|
void SyncToBackend(const SharedPtr<MG_State::GLState::ProgramObject>& stateProgramObject);
|
||||||
void Use();
|
void Use() const;
|
||||||
Uint GetBackendProgramId() const { return m_backendProgramId; }
|
Uint GetBackendProgramId() const { return m_backendProgramId; }
|
||||||
Uint GetBackendGlobalUBOId() const { return m_backendGlobalUBOId; }
|
Uint GetBackendGlobalUBOId() const { return m_backendGlobalUBOId; }
|
||||||
|
|
||||||
@@ -180,7 +268,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
Bool m_isInitialized = false;
|
Bool m_isInitialized = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern UnorderedMap<SharedPtr<MG_State::GLState::ProgramObject>, SharedPtr<BackendProgramObjectImpl>>
|
extern StateBackendObjectRegistry<MG_State::GLState::ProgramObject, BackendProgramObjectImpl>
|
||||||
g_backendProgramObjects;
|
g_backendProgramObjects;
|
||||||
} // namespace PrgramImpl
|
} // namespace PrgramImpl
|
||||||
|
|
||||||
@@ -188,9 +276,9 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
class BackendSamplerObject {
|
class BackendSamplerObject {
|
||||||
public:
|
public:
|
||||||
BackendSamplerObject();
|
BackendSamplerObject();
|
||||||
void SyncToBackend(SharedPtr<MG_State::GLState::SamplerObject>& stateSamplerObject);
|
void SyncToBackend(const SharedPtr<MG_State::GLState::SamplerObject>& stateSamplerObject);
|
||||||
void Bind(Uint unit);
|
void Bind(Uint unit);
|
||||||
Uint GetBackendSamplerId();
|
Uint GetBackendSamplerId() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Uint m_backendSamplerId = 0;
|
Uint m_backendSamplerId = 0;
|
||||||
@@ -203,7 +291,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
extern Array<BackendSamplerObject*, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS>
|
extern Array<BackendSamplerObject*, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS>
|
||||||
g_boundSamplersCache;
|
g_boundSamplersCache;
|
||||||
extern UnorderedMap<SharedPtr<MG_State::GLState::SamplerObject>, SharedPtr<BackendSamplerObject>>
|
extern StateBackendObjectRegistry<MG_State::GLState::SamplerObject, BackendSamplerObject>
|
||||||
g_backendSamplerObjects;
|
g_backendSamplerObjects;
|
||||||
} // namespace SamplerImpl
|
} // namespace SamplerImpl
|
||||||
|
|
||||||
@@ -212,8 +300,8 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
public:
|
public:
|
||||||
BackendRenderbufferObject();
|
BackendRenderbufferObject();
|
||||||
void SyncToBackend(const SharedPtr<MG_State::GLState::RenderbufferObject>& stateRBOObject);
|
void SyncToBackend(const SharedPtr<MG_State::GLState::RenderbufferObject>& stateRBOObject);
|
||||||
Uint GetBackendRenderbufferId() { return m_backendRBOId; }
|
Uint GetBackendRenderbufferId() const { return m_backendRBOId; }
|
||||||
void Bind();
|
void Bind() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Uint m_backendRBOId = 0;
|
Uint m_backendRBOId = 0;
|
||||||
@@ -223,7 +311,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
Int m_cacheHeight = 0;
|
Int m_cacheHeight = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern UnorderedMap<SharedPtr<MG_State::GLState::RenderbufferObject>, SharedPtr<BackendRenderbufferObject>>
|
extern StateBackendObjectRegistry<MG_State::GLState::RenderbufferObject, BackendRenderbufferObject>
|
||||||
g_backendRenderbufferObjects;
|
g_backendRenderbufferObjects;
|
||||||
} // namespace RenderbufferImpl
|
} // namespace RenderbufferImpl
|
||||||
} // namespace MobileGL::MG_Backend::DirectGLES
|
} // namespace MobileGL::MG_Backend::DirectGLES
|
||||||
|
|||||||
@@ -19,10 +19,6 @@
|
|||||||
#include <MG_Util/Converters/MGToGL/FramebufferEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/FramebufferEnumConverter.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Backend::DirectGLES {
|
namespace MobileGL::MG_Backend::DirectGLES {
|
||||||
namespace BufferImpl {} // namespace BufferImpl
|
|
||||||
|
|
||||||
namespace VertexArrayImpl {} // namespace VertexArrayImpl
|
|
||||||
|
|
||||||
namespace TextureImpl {
|
namespace TextureImpl {
|
||||||
void GenerateTextureFormatInfo(TextureInternalFormat internalFormat, GLenum* outInternalFormat,
|
void GenerateTextureFormatInfo(TextureInternalFormat internalFormat, GLenum* outInternalFormat,
|
||||||
GLenum* outFormat, GLenum* outType) {
|
GLenum* outFormat, GLenum* outType) {
|
||||||
@@ -36,9 +32,6 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
outInternalFormat, outFormat, outType);
|
outInternalFormat, outFormat, outType);
|
||||||
}
|
}
|
||||||
} // namespace TextureImpl
|
} // namespace TextureImpl
|
||||||
|
|
||||||
namespace FramebufferImpl {} // namespace FramebufferImpl
|
|
||||||
|
|
||||||
namespace PrgramImpl {
|
namespace PrgramImpl {
|
||||||
String ProcessOutColorLocations(const String& glslCode) {
|
String ProcessOutColorLocations(const String& glslCode) {
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
@@ -166,7 +159,6 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
return GL_UNIFORM_BUFFER_BINDING;
|
return GL_UNIFORM_BUFFER_BINDING;
|
||||||
|
|
||||||
case GL_FRAMEBUFFER:
|
case GL_FRAMEBUFFER:
|
||||||
return GL_FRAMEBUFFER_BINDING;
|
|
||||||
case GL_DRAW_FRAMEBUFFER:
|
case GL_DRAW_FRAMEBUFFER:
|
||||||
return GL_DRAW_FRAMEBUFFER_BINDING;
|
return GL_DRAW_FRAMEBUFFER_BINDING;
|
||||||
case GL_READ_FRAMEBUFFER:
|
case GL_READ_FRAMEBUFFER:
|
||||||
@@ -176,7 +168,6 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
return GL_RENDERBUFFER_BINDING;
|
return GL_RENDERBUFFER_BINDING;
|
||||||
|
|
||||||
case GL_VERTEX_ARRAY:
|
case GL_VERTEX_ARRAY:
|
||||||
return GL_VERTEX_ARRAY_BINDING;
|
|
||||||
case GL_VERTEX_ARRAY_BINDING:
|
case GL_VERTEX_ARRAY_BINDING:
|
||||||
return GL_VERTEX_ARRAY_BINDING;
|
return GL_VERTEX_ARRAY_BINDING;
|
||||||
|
|
||||||
|
|||||||
@@ -14,15 +14,15 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
namespace DebugImpl {
|
namespace DebugImpl {
|
||||||
class ErrorLopper {
|
class ErrorLopper {
|
||||||
public:
|
public:
|
||||||
void Loop(std::function<void(GLenum)>);
|
static void Loop(const std::function<void(GLenum)>&);
|
||||||
void Clear();
|
static void Clear();
|
||||||
ErrorLopper();
|
ErrorLopper();
|
||||||
~ErrorLopper();
|
~ErrorLopper();
|
||||||
};
|
};
|
||||||
|
|
||||||
class OpenGLScopeMarker {
|
class OpenGLScopeMarker {
|
||||||
public:
|
public:
|
||||||
explicit OpenGLScopeMarker(String scopeName);
|
explicit OpenGLScopeMarker(const String& scopeName);
|
||||||
~OpenGLScopeMarker();
|
~OpenGLScopeMarker();
|
||||||
};
|
};
|
||||||
} // namespace DebugImpl
|
} // namespace DebugImpl
|
||||||
|
|||||||
@@ -11,28 +11,99 @@
|
|||||||
#include "DirectVulkan.h"
|
#include "DirectVulkan.h"
|
||||||
|
|
||||||
namespace MobileGL::MG_Backend::DirectVulkan {
|
namespace MobileGL::MG_Backend::DirectVulkan {
|
||||||
|
namespace {
|
||||||
|
Bool IsReleaseCurrentRequest(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
|
||||||
|
return dpy == EGL_NO_DISPLAY && draw == EGL_NO_SURFACE && read == EGL_NO_SURFACE && ctx == EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
BackendObject_DirectVulkan::~BackendObject_DirectVulkan() = default;
|
BackendObject_DirectVulkan::~BackendObject_DirectVulkan() = default;
|
||||||
|
|
||||||
void BackendObject_DirectVulkan::InitWindowSurface() {
|
Bool BackendObject_DirectVulkan::InitWindowSurface() {
|
||||||
|
if (!m_windowHandle.Handle) {
|
||||||
|
MGLOG_E("Cannot initialize DirectVulkan window surface: native window handle is null");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
auto nativeWindow = reinterpret_cast<NativeWindowType>(m_windowHandle.Handle);
|
auto nativeWindow = reinterpret_cast<NativeWindowType>(m_windowHandle.Handle);
|
||||||
|
|
||||||
pVulkanRenderer = MakeUnique<MG_Backend::DirectVulkan::VulkanRenderer>(nativeWindow);
|
pVulkanRenderer = MakeUnique<MG_Backend::DirectVulkan::VulkanRenderer>(nativeWindow);
|
||||||
MOBILEGL_ASSERT(pVulkanRenderer != nullptr, "InitWindowSurface: VulkanRenderer creation failed");
|
MOBILEGL_ASSERT(pVulkanRenderer != nullptr, "InitWindowSurface: VulkanRenderer creation failed");
|
||||||
pVulkanRenderer->Initialize();
|
pVulkanRenderer->Initialize();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendObject_DirectVulkan::Initialize() {
|
void BackendObject_DirectVulkan::Initialize() {
|
||||||
m_initialized = true;
|
m_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackendObject_DirectVulkan::InitCapabilities() {
|
Bool BackendObject_DirectVulkan::InitCapabilities() {
|
||||||
if (!m_initialized) {
|
if (!m_initialized) {
|
||||||
MGLOG_E("Cannot initialize capabilities before backend is initialized");
|
MGLOG_E("Cannot initialize capabilities before backend is initialized");
|
||||||
return;
|
return false;
|
||||||
|
}
|
||||||
|
if (!pVulkanRenderer) {
|
||||||
|
MGLOG_E("Cannot initialize capabilities: Vulkan renderer has not been created");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
MG_Util::BackendLoader::FillInVulkanCapabilities(m_vulkanCaps, pVulkanRenderer->GetPhysicalDevice().properties);
|
MG_Util::BackendLoader::FillInVulkanCapabilities(m_vulkanCaps, pVulkanRenderer->GetPhysicalDevice().properties);
|
||||||
UpdateDynamicBackendParameters();
|
UpdateDynamicBackendParameters();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject_DirectVulkan::InitializeEGLDisplay(EGLDisplay dpy, EGLint* major, EGLint* minor) {
|
||||||
|
if (!m_initialized) {
|
||||||
|
MGLOG_E("DirectVulkan backend not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return BackendObject::InitializeEGLDisplay(dpy, major, minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject_DirectVulkan::CreateEGLWindowSurface(const WindowHandle& handle) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
if (!m_initialized) {
|
||||||
|
MGLOG_E("DirectVulkan backend not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (handle.Backend != WindowBackend::Android || !handle.Handle) {
|
||||||
|
MGLOG_E("DirectVulkan backend only supports Android native windows");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Bool sameHandle =
|
||||||
|
m_eglWindowSurfaceInitialized && m_windowHandle.Backend == handle.Backend && m_windowHandle.Handle == handle.Handle;
|
||||||
|
if (sameHandle) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_eglWindowSurfaceInitialized || pVulkanRenderer) {
|
||||||
|
pVulkanRenderer.reset();
|
||||||
|
ResetEGLRuntimeState();
|
||||||
|
}
|
||||||
|
|
||||||
|
return BackendObject::CreateEGLWindowSurface(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject_DirectVulkan::MakeEGLCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
if (IsReleaseCurrentRequest(dpy, draw, read, ctx)) {
|
||||||
|
return BackendObject::MakeEGLCurrent(dpy, draw, read, ctx);
|
||||||
|
}
|
||||||
|
if (!pVulkanRenderer) {
|
||||||
|
MGLOG_E("DirectVulkan renderer is not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return BackendObject::MakeEGLCurrent(dpy, draw, read, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool BackendObject_DirectVulkan::SwapEGLBuffers(EGLDisplay dpy, EGLSurface draw) {
|
||||||
|
const std::lock_guard<std::recursive_mutex> lock(m_eglStateMutex);
|
||||||
|
if (!pVulkanRenderer) {
|
||||||
|
MGLOG_E("DirectVulkan renderer is not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return BackendObject::SwapEGLBuffers(dpy, draw);
|
||||||
}
|
}
|
||||||
|
|
||||||
const RendererInfo& BackendObject_DirectVulkan::GetRendererInfo() const {
|
const RendererInfo& BackendObject_DirectVulkan::GetRendererInfo() const {
|
||||||
|
|||||||
@@ -17,8 +17,12 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
~BackendObject_DirectVulkan() override;
|
~BackendObject_DirectVulkan() override;
|
||||||
|
|
||||||
void Initialize() override;
|
void Initialize() override;
|
||||||
void InitWindowSurface() override;
|
Bool InitWindowSurface() override;
|
||||||
void InitCapabilities() override;
|
Bool InitCapabilities() override;
|
||||||
|
Bool InitializeEGLDisplay(EGLDisplay dpy, EGLint* major, EGLint* minor) override;
|
||||||
|
Bool CreateEGLWindowSurface(const WindowHandle& handle) override;
|
||||||
|
Bool MakeEGLCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) override;
|
||||||
|
Bool SwapEGLBuffers(EGLDisplay dpy, EGLSurface draw) override;
|
||||||
|
|
||||||
const RendererInfo& GetRendererInfo() const override;
|
const RendererInfo& GetRendererInfo() const override;
|
||||||
String GetBackendAPIVersionString() const override;
|
String GetBackendAPIVersionString() const override;
|
||||||
|
|||||||
@@ -1764,12 +1764,8 @@ void main() {
|
|||||||
|
|
||||||
Bool VulkanRenderer::IsExtensionAlreadyEnabled(const Vector<const char*>& enabledExtensions,
|
Bool VulkanRenderer::IsExtensionAlreadyEnabled(const Vector<const char*>& enabledExtensions,
|
||||||
const char* extensionName) {
|
const char* extensionName) {
|
||||||
for (const char* enabledExtensionName : enabledExtensions) {
|
return std::any_of(enabledExtensions.begin(), enabledExtensions.end(),
|
||||||
if (strcmp(enabledExtensionName, extensionName) == 0) {
|
[&extensionName](const String& name) { return name == extensionName; });
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool VulkanRenderer::EnableOptionalDeviceExtension(const Vector<VkExtensionProperties>& availableExtensions,
|
Bool VulkanRenderer::EnableOptionalDeviceExtension(const Vector<VkExtensionProperties>& availableExtensions,
|
||||||
|
|||||||
@@ -9,177 +9,451 @@
|
|||||||
#include "EGLImpl.h"
|
#include "EGLImpl.h"
|
||||||
#include "../GetProcAddress.h"
|
#include "../GetProcAddress.h"
|
||||||
#include <MG_Backend/BackendObjects.h>
|
#include <MG_Backend/BackendObjects.h>
|
||||||
|
#include <MG_State/EGLState/Core.h>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::EGLImpl {
|
namespace MobileGL::MG_Impl::EGLImpl {
|
||||||
|
namespace {
|
||||||
|
using EGLStateContext = MG_State::EGLState::EGLContext;
|
||||||
|
|
||||||
|
EGLStateContext* GetState() {
|
||||||
|
if (!MG_State::pEGLContext) {
|
||||||
|
MGLOG_E("pEGLContext is null. MG_State may not be initialized.");
|
||||||
|
}
|
||||||
|
return MG_State::pEGLContext.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
MG_Backend::BackendObject* GetBackendObject(EGLStateContext* state) {
|
||||||
|
auto* backendObject = MG_Backend::pActiveBackendObject.get();
|
||||||
|
if (!backendObject && state) {
|
||||||
|
state->SetError(EGL_NOT_INITIALIZED);
|
||||||
|
}
|
||||||
|
return backendObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
MG_Backend::WindowBackend DetectWindowBackend() {
|
||||||
|
#if defined(ANDROID) || defined(__ANDROID__)
|
||||||
|
return MG_Backend::WindowBackend::Android;
|
||||||
|
#else
|
||||||
|
return MG_Backend::WindowBackend::Unknown;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename NativeType>
|
||||||
|
Bool IsNullNativeHandle(NativeType nativeHandle) {
|
||||||
|
if constexpr (std::is_pointer_v<NativeType>) {
|
||||||
|
return nativeHandle == nullptr;
|
||||||
|
} else {
|
||||||
|
return nativeHandle == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename NativeType>
|
||||||
|
void* ToVoidHandle(NativeType nativeHandle) {
|
||||||
|
if constexpr (std::is_pointer_v<NativeType>) {
|
||||||
|
return reinterpret_cast<void*>(nativeHandle);
|
||||||
|
} else {
|
||||||
|
return reinterpret_cast<void*>(static_cast<SizeT>(nativeHandle));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, NativeWindowType window,
|
EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, NativeWindowType window,
|
||||||
const EGLint* attrib_list) {
|
const EGLint* attrib_list) {
|
||||||
MGLOG_D("EGLImpl::CreateWindowSurface called with window=%p", window);
|
auto* state = GetState();
|
||||||
const auto& activeBackendObject = MG_Backend::pActiveBackendObject;
|
if (!state) {
|
||||||
if (!activeBackendObject) {
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
if (!state->IsDisplayInitialized(dpy)) {
|
||||||
|
state->SetError(EGL_NOT_INITIALIZED);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
if (!state->ValidateConfigOnDisplay(dpy, config)) {
|
||||||
|
state->SetError(EGL_BAD_CONFIG);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
if (IsNullNativeHandle(window)) {
|
||||||
|
state->SetError(EGL_BAD_NATIVE_WINDOW);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* backendObject = GetBackendObject(state);
|
||||||
|
if (!backendObject) {
|
||||||
MGLOG_E("activeBackendObject not initialized!");
|
MGLOG_E("activeBackendObject not initialized!");
|
||||||
return EGL_NO_SURFACE;
|
return EGL_NO_SURFACE;
|
||||||
}
|
}
|
||||||
activeBackendObject->SetWindowHandle({MG_Backend::WindowBackend::Android, reinterpret_cast<void*>(window)});
|
|
||||||
activeBackendObject->InitWindowSurface();
|
const MG_Backend::WindowHandle windowHandle = {
|
||||||
return (EGLSurface)1;
|
.Backend = DetectWindowBackend(),
|
||||||
|
.Handle = ToVoidHandle(window),
|
||||||
|
};
|
||||||
|
if (!backendObject->CreateEGLWindowSurface(windowHandle)) {
|
||||||
|
state->SetError(EGL_BAD_NATIVE_WINDOW);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return state->CreateWindowSurface(dpy, config, window, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface draw) {
|
EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface draw) {
|
||||||
MGLOG_D("EGLImpl::SwapBuffers called with dpy=%p", dpy);
|
auto* state = GetState();
|
||||||
if (!MG_Backend::gBackendFunctionsTable.Present) {
|
if (!state) {
|
||||||
MGLOG_E("MG_Backend::gBackendFunctionsTable.Present not initialized!");
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!state->ValidateSurfaceOnDisplay(dpy, draw)) {
|
||||||
|
state->SetError(EGL_BAD_SURFACE);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* backendObject = GetBackendObject(state);
|
||||||
|
if (!backendObject) {
|
||||||
|
MGLOG_E("activeBackendObject not initialized!");
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!backendObject->SwapEGLBuffers(dpy, draw)) {
|
||||||
|
state->SetError(EGL_BAD_SURFACE);
|
||||||
return EGL_FALSE;
|
return EGL_FALSE;
|
||||||
}
|
}
|
||||||
MG_Backend::gBackendFunctionsTable.Present();
|
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, EGLint config_size,
|
EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, EGLint config_size,
|
||||||
EGLint* num_config) {
|
EGLint* num_config) {
|
||||||
*num_config = 1;
|
auto* state = GetState();
|
||||||
return EGL_TRUE;
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->ChooseConfig(dpy, attrib_list, configs, config_size, num_config) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext shareCtx, const EGLint* attrib_list) {
|
EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext shareCtx, const EGLint* attrib_list) {
|
||||||
return (EGLContext)1;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
return state->CreateContext(dpy, config, shareCtx, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean Initialize(EGLDisplay dpy, EGLint* major, EGLint* minor) {
|
EGLBoolean Initialize(EGLDisplay dpy, EGLint* major, EGLint* minor) {
|
||||||
if (major) *major = 1;
|
auto* state = GetState();
|
||||||
if (minor) *minor = 5;
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!state->InitializeDisplay(dpy, major, minor)) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* backendObject = GetBackendObject(state);
|
||||||
|
if (!backendObject) {
|
||||||
|
MGLOG_E("activeBackendObject not initialized!");
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!backendObject->InitializeEGLDisplay(dpy, major, minor)) {
|
||||||
|
state->SetError(EGL_NOT_INITIALIZED);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLDisplay GetDisplay(NativeDisplayType display) {
|
EGLDisplay GetDisplay(NativeDisplayType display) {
|
||||||
return (EGLDisplay)1;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_DISPLAY;
|
||||||
|
}
|
||||||
|
return state->GetDisplay(display);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLint GetError() {
|
EGLint GetError() {
|
||||||
return EGL_SUCCESS;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NOT_INITIALIZED;
|
||||||
|
}
|
||||||
|
return state->ConsumeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
|
EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
|
||||||
const auto& activeBackendObject = MG_Backend::pActiveBackendObject;
|
auto* state = GetState();
|
||||||
if (!activeBackendObject) {
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto oldDisplay = state->GetCurrentDisplay();
|
||||||
|
const auto oldDraw = state->GetCurrentSurface(EGL_DRAW);
|
||||||
|
const auto oldRead = state->GetCurrentSurface(EGL_READ);
|
||||||
|
const auto oldContext = state->GetCurrentContext();
|
||||||
|
|
||||||
|
if (!state->MakeCurrent(dpy, draw, read, ctx)) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Bool releaseCurrentRequest =
|
||||||
|
dpy == EGL_NO_DISPLAY && draw == EGL_NO_SURFACE && read == EGL_NO_SURFACE && ctx == EGL_NO_CONTEXT;
|
||||||
|
if (releaseCurrentRequest) {
|
||||||
|
if (auto* backendObject = MG_Backend::pActiveBackendObject.get()) {
|
||||||
|
(void)backendObject->MakeEGLCurrent(dpy, draw, read, ctx);
|
||||||
|
}
|
||||||
|
return EGL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* backendObject = GetBackendObject(state);
|
||||||
|
if (!backendObject) {
|
||||||
MGLOG_E("activeBackendObject not initialized!");
|
MGLOG_E("activeBackendObject not initialized!");
|
||||||
|
state->MakeCurrent(oldDisplay, oldDraw, oldRead, oldContext);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!backendObject->MakeEGLCurrent(dpy, draw, read, ctx)) {
|
||||||
|
state->SetError(EGL_BAD_ACCESS);
|
||||||
|
state->MakeCurrent(oldDisplay, oldDraw, oldRead, oldContext);
|
||||||
return EGL_FALSE;
|
return EGL_FALSE;
|
||||||
}
|
}
|
||||||
activeBackendObject->InitCapabilities();
|
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx) {
|
EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx) {
|
||||||
return EGL_TRUE;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->DestroyContext(dpy, ctx) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface) {
|
EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface) {
|
||||||
return EGL_TRUE;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->DestroySurface(dpy, surface) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean Terminate(EGLDisplay dpy) {
|
EGLBoolean Terminate(EGLDisplay dpy) {
|
||||||
return EGL_TRUE;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->TerminateDisplay(dpy) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean ReleaseThread() {
|
EGLBoolean ReleaseThread() {
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
state->ReleaseThread();
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLContext GetCurrentContext() {
|
EGLContext GetCurrentContext() {
|
||||||
return (EGLContext)1;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
return state->GetCurrentContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value) {
|
EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value) {
|
||||||
if (attribute == EGL_NATIVE_VISUAL_ID) {
|
auto* state = GetState();
|
||||||
#if defined(ANDROID)
|
if (!state) {
|
||||||
*value = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
|
|
||||||
return EGL_TRUE;
|
|
||||||
#elif defined(__linux__)
|
|
||||||
*value = 0;
|
|
||||||
return EGL_TRUE;
|
|
||||||
#elif defined(_WIN32)
|
|
||||||
*value = 0;
|
|
||||||
return EGL_TRUE;
|
|
||||||
#else
|
|
||||||
*value = 0;
|
|
||||||
return EGL_FALSE;
|
return EGL_FALSE;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return EGL_TRUE;
|
return state->GetConfigAttrib(dpy, config, attribute, value) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean BindAPI(EGLenum api) {
|
EGLBoolean BindAPI(EGLenum api) {
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
switch (api) {
|
||||||
|
case EGL_OPENGL_API:
|
||||||
|
case EGL_OPENGL_ES_API:
|
||||||
|
case EGL_OPENVG_API:
|
||||||
|
state->SetBoundAPI(api);
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
|
default:
|
||||||
|
state->SetError(EGL_BAD_PARAMETER);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSurface GetCurrentSurface(EGLint readdraw) {
|
EGLSurface GetCurrentSurface(EGLint readdraw) {
|
||||||
return (EGLSurface)1;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
return state->GetCurrentSurface(readdraw);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean QuerySurface(EGLDisplay display, EGLSurface surface, EGLint attribute, EGLint* value) {
|
EGLBoolean QuerySurface(EGLDisplay display, EGLSurface surface, EGLint attribute, EGLint* value) {
|
||||||
return EGL_TRUE;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->QuerySurface(display, surface, attribute, value) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
char const* QueryString(EGLDisplay display, EGLint name) {
|
char const* QueryString(EGLDisplay display, EGLint name) {
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display != EGL_NO_DISPLAY && !state->ValidateDisplay(display)) {
|
||||||
|
state->SetError(EGL_BAD_DISPLAY);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (name) {
|
||||||
|
case EGL_VENDOR:
|
||||||
|
return "MobileGL";
|
||||||
|
case EGL_VERSION:
|
||||||
|
return "1.5 MobileGL";
|
||||||
|
case EGL_CLIENT_APIS:
|
||||||
|
return "OpenGL OpenGL_ES";
|
||||||
|
case EGL_EXTENSIONS:
|
||||||
return "";
|
return "";
|
||||||
|
default:
|
||||||
|
state->SetError(EGL_BAD_PARAMETER);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval) {
|
EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval) {
|
||||||
return EGL_TRUE;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->SwapInterval(dpy, interval) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list) {
|
EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list) {
|
||||||
return (EGLSurface)1;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
return state->CreatePbufferSurface(dpy, config, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
|
EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!state->ValidateSurfaceOnDisplay(dpy, surface)) {
|
||||||
|
state->SetError(EGL_BAD_SURFACE);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (buffer != EGL_BACK_BUFFER) {
|
||||||
|
state->SetError(EGL_BAD_PARAMETER);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
|
EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!state->ValidateSurfaceOnDisplay(dpy, surface)) {
|
||||||
|
state->SetError(EGL_BAD_SURFACE);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (buffer != EGL_BACK_BUFFER) {
|
||||||
|
state->SetError(EGL_BAD_PARAMETER);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) {
|
EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) {
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!state->ValidateSurfaceOnDisplay(dpy, surface)) {
|
||||||
|
state->SetError(EGL_BAD_SURFACE);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (IsNullNativeHandle(target)) {
|
||||||
|
state->SetError(EGL_BAD_NATIVE_PIXMAP);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSurface CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config,
|
EGLSurface CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config,
|
||||||
const EGLint* attrib_list) {
|
const EGLint* attrib_list) {
|
||||||
return (EGLSurface)1;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
return state->CreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap,
|
EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap,
|
||||||
const EGLint* attrib_list) {
|
const EGLint* attrib_list) {
|
||||||
return (EGLSurface)1;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
return state->CreatePixmapSurface(dpy, config, pixmap, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig* configs, EGLint config_size, EGLint* num_config) {
|
EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig* configs, EGLint config_size, EGLint* num_config) {
|
||||||
if (num_config) {
|
auto* state = GetState();
|
||||||
*num_config = 1;
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
}
|
}
|
||||||
if (configs && config_size > 0) {
|
return state->GetConfigs(dpy, configs, config_size, num_config) ? EGL_TRUE : EGL_FALSE;
|
||||||
configs[0] = (EGLConfig)1;
|
|
||||||
}
|
|
||||||
return EGL_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLDisplay GetCurrentDisplay() {
|
EGLDisplay GetCurrentDisplay() {
|
||||||
return (EGLDisplay)1;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_DISPLAY;
|
||||||
|
}
|
||||||
|
return state->GetCurrentDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLenum QueryAPI() {
|
EGLenum QueryAPI() {
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
return EGL_OPENGL_API;
|
return EGL_OPENGL_API;
|
||||||
}
|
}
|
||||||
|
return state->GetBoundAPI();
|
||||||
|
}
|
||||||
|
|
||||||
EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint* value) {
|
EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint* value) {
|
||||||
if (value) {
|
auto* state = GetState();
|
||||||
*value = 1;
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
}
|
}
|
||||||
return EGL_TRUE;
|
return state->QueryContext(dpy, ctx, attribute, value) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) {
|
EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) {
|
||||||
|
(void)value;
|
||||||
|
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
if (!state->ValidateSurfaceOnDisplay(dpy, surface)) {
|
||||||
|
state->SetError(EGL_BAD_SURFACE);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (attribute) {
|
||||||
|
case EGL_MIPMAP_LEVEL:
|
||||||
|
case EGL_SWAP_BEHAVIOR:
|
||||||
|
case EGL_TEXTURE_FORMAT:
|
||||||
|
case EGL_TEXTURE_TARGET:
|
||||||
|
case EGL_MIPMAP_TEXTURE:
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
|
default:
|
||||||
|
state->SetError(EGL_BAD_ATTRIBUTE);
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean WaitClient() {
|
EGLBoolean WaitClient() {
|
||||||
@@ -191,60 +465,132 @@ namespace MobileGL::MG_Impl::EGLImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean WaitNative(EGLint engine) {
|
EGLBoolean WaitNative(EGLint engine) {
|
||||||
|
(void)engine;
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSync CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib* attrib_list) {
|
EGLSync CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib* attrib_list) {
|
||||||
return reinterpret_cast<EGLSync>(0x1);
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_SYNC;
|
||||||
|
}
|
||||||
|
return state->CreateSync(dpy, type, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean DestroySync(void* dpy, void* sync) {
|
EGLBoolean DestroySync(EGLDisplay dpy, EGLSync sync) {
|
||||||
return EGL_TRUE;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->DestroySync(dpy, sync) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLint ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout) {
|
EGLint ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout) {
|
||||||
return EGL_CONDITION_SATISFIED;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->ClientWaitSync(dpy, sync, flags, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean GetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib* value) {
|
EGLBoolean GetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib* value) {
|
||||||
if (value) {
|
auto* state = GetState();
|
||||||
*value = 1;
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
}
|
}
|
||||||
return EGL_TRUE;
|
return state->GetSyncAttrib(dpy, sync, attribute, value) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLImage CreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer,
|
EGLImage CreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer,
|
||||||
const EGLAttrib* attrib_list) {
|
const EGLAttrib* attrib_list) {
|
||||||
return reinterpret_cast<EGLImage>(0x1);
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_IMAGE;
|
||||||
|
}
|
||||||
|
return state->CreateImage(dpy, ctx, target, buffer, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean DestroyImage(EGLDisplay dpy, EGLImage image) {
|
EGLBoolean DestroyImage(EGLDisplay dpy, EGLImage image) {
|
||||||
return EGL_TRUE;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->DestroyImage(dpy, image) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLDisplay GetPlatformDisplay(EGLenum platform, void* native_display, const EGLAttrib* attrib_list) {
|
EGLDisplay GetPlatformDisplay(EGLenum platform, void* native_display, const EGLAttrib* attrib_list) {
|
||||||
return reinterpret_cast<EGLDisplay>(0x1);
|
(void)attrib_list;
|
||||||
|
|
||||||
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_DISPLAY;
|
||||||
|
}
|
||||||
|
return state->GetPlatformDisplay(platform, native_display);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSurface CreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void* native_window,
|
EGLSurface CreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void* native_window,
|
||||||
const EGLAttrib* attrib_list) {
|
const EGLAttrib* attrib_list) {
|
||||||
return reinterpret_cast<EGLSurface>(0x1);
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
if (native_window == nullptr) {
|
||||||
|
state->SetError(EGL_BAD_NATIVE_WINDOW);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
if (!state->IsDisplayInitialized(dpy)) {
|
||||||
|
state->SetError(EGL_NOT_INITIALIZED);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
if (!state->ValidateConfigOnDisplay(dpy, config)) {
|
||||||
|
state->SetError(EGL_BAD_CONFIG);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* backendObject = GetBackendObject(state);
|
||||||
|
if (!backendObject) {
|
||||||
|
MGLOG_E("activeBackendObject not initialized!");
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MG_Backend::WindowHandle windowHandle = {
|
||||||
|
.Backend = DetectWindowBackend(),
|
||||||
|
.Handle = native_window,
|
||||||
|
};
|
||||||
|
if (!backendObject->CreateEGLWindowSurface(windowHandle)) {
|
||||||
|
state->SetError(EGL_BAD_NATIVE_WINDOW);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return state->CreatePlatformWindowSurface(dpy, config, native_window, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSurface CreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void* native_pixmap,
|
EGLSurface CreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void* native_pixmap,
|
||||||
const EGLAttrib* attrib_list) {
|
const EGLAttrib* attrib_list) {
|
||||||
return reinterpret_cast<EGLSurface>(0x1);
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
return state->CreatePlatformPixmapSurface(dpy, config, native_pixmap, attrib_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLBoolean WaitSync(void* dpy, void* sync, int flags) {
|
EGLBoolean WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags) {
|
||||||
return EGL_TRUE;
|
auto* state = GetState();
|
||||||
|
if (!state) {
|
||||||
|
return EGL_FALSE;
|
||||||
|
}
|
||||||
|
return state->WaitSync(dpy, sync, flags) ? EGL_TRUE : EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
__eglMustCastToProperFunctionPointerType GetProcAddress(const char* name) {
|
__eglMustCastToProperFunctionPointerType GetProcAddress(const char* name) {
|
||||||
|
if (!name) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
MGLOG_D("eglGetProcAddress(%s)", name);
|
MGLOG_D("eglGetProcAddress(%s)", name);
|
||||||
void* proc = MG_Impl::GetProcAddress(name);
|
void* proc = MG_Impl::GetProcAddress(name);
|
||||||
if (!proc) {
|
if (!proc) {
|
||||||
MGLOG_W("Failed to get function: %s", (const char*)name);
|
MGLOG_W("Failed to get function: %s", name);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return (__eglMustCastToProperFunctionPointerType)proc;
|
return (__eglMustCastToProperFunctionPointerType)proc;
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ namespace MobileGL::MG_Impl::EGLImpl {
|
|||||||
EGLBoolean WaitGL();
|
EGLBoolean WaitGL();
|
||||||
EGLBoolean WaitNative(EGLint engine);
|
EGLBoolean WaitNative(EGLint engine);
|
||||||
EGLSync CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib* attrib_list);
|
EGLSync CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib* attrib_list);
|
||||||
EGLBoolean DestroySync(void* dpy, void* sync);
|
EGLBoolean DestroySync(EGLDisplay dpy, EGLSync sync);
|
||||||
EGLint ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
|
EGLint ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
|
||||||
EGLBoolean GetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib* value);
|
EGLBoolean GetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib* value);
|
||||||
EGLImage CreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer,
|
EGLImage CreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer,
|
||||||
@@ -59,6 +59,6 @@ namespace MobileGL::MG_Impl::EGLImpl {
|
|||||||
const EGLAttrib* attrib_list);
|
const EGLAttrib* attrib_list);
|
||||||
EGLSurface CreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void* native_pixmap,
|
EGLSurface CreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void* native_pixmap,
|
||||||
const EGLAttrib* attrib_list);
|
const EGLAttrib* attrib_list);
|
||||||
EGLBoolean WaitSync(void* dpy, void* sync, int flags);
|
EGLBoolean WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags);
|
||||||
__eglMustCastToProperFunctionPointerType GetProcAddress(const char* name);
|
__eglMustCastToProperFunctionPointerType GetProcAddress(const char* name);
|
||||||
} // namespace MobileGL::MG_Impl::EGLImpl
|
} // namespace MobileGL::MG_Impl::EGLImpl
|
||||||
|
|||||||
@@ -8,19 +8,17 @@
|
|||||||
|
|
||||||
#include "GL_Buffer.h"
|
#include "GL_Buffer.h"
|
||||||
#include "Validators.h"
|
#include "Validators.h"
|
||||||
#include "MG_Util/Converters/GLToStr/GLEnumConverter.h"
|
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
#include <MG_State/GLState/ErrorState/Error.h>
|
#include <MG_State/GLState/ErrorState/Error.h>
|
||||||
|
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
||||||
#include <MG_Util/Converters/GLToMG/BufferEnumConverter.h>
|
#include <MG_Util/Converters/GLToMG/BufferEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/BufferEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/BufferEnumConverter.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
void GetBufferParameteriv_State(GLenum target, GLenum pname, GLint* params) {
|
void GetBufferParameteriv_State(GLenum target, GLenum pname, GLint* params) {
|
||||||
if (!params) {
|
if (!params) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GetBufferParameteriv_State",
|
||||||
"GetBufferParameteriv_State",
|
|
||||||
"Params pointer cannot be null."));
|
"Params pointer cannot be null."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -30,11 +28,11 @@ namespace MobileGL {
|
|||||||
|
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
||||||
|
|
||||||
auto bufferObject = bindingSlot.GetBoundObject();
|
auto& bufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!bufferObject) {
|
if (!bufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GetBufferParameteriv_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GetBufferParameteriv_State",
|
||||||
"Buffer target is bound to no buffer object."));
|
"Buffer target is bound to no buffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -44,7 +42,7 @@ namespace MobileGL {
|
|||||||
*params = static_cast<GLint>(bufferObject->GetSize());
|
*params = static_cast<GLint>(bufferObject->GetSize());
|
||||||
break;
|
break;
|
||||||
case GL_BUFFER_USAGE:
|
case GL_BUFFER_USAGE:
|
||||||
*params = MG_Util::ConvertBufferUsageToGLEnum(bufferObject->GetUsage());
|
*params = (GLint)MG_Util::ConvertBufferUsageToGLEnum(bufferObject->GetUsage());
|
||||||
break;
|
break;
|
||||||
case GL_BUFFER_ACCESS:
|
case GL_BUFFER_ACCESS:
|
||||||
if (bufferObject->IsMapped()) {
|
if (bufferObject->IsMapped()) {
|
||||||
@@ -65,6 +63,11 @@ namespace MobileGL {
|
|||||||
case GL_BUFFER_MAPPED:
|
case GL_BUFFER_MAPPED:
|
||||||
*params = bufferObject->IsMapped() ? GL_TRUE : GL_FALSE;
|
*params = bufferObject->IsMapped() ? GL_TRUE : GL_FALSE;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GetBufferParameteriv_State",
|
||||||
|
std::format("Invalid pname enum: 0x{:X}", pname)));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,13 +75,13 @@ namespace MobileGL {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteBuffers_State", "n must be non-negative."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteBuffers_State", "n must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!buffers) {
|
if (!buffers) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteBuffers_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteBuffers_State",
|
||||||
"Buffer names array cannot be null."));
|
"Buffer names array cannot be null."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -94,8 +97,7 @@ namespace MobileGL {
|
|||||||
void FlushMappedBufferRange_State(GLenum target, GLintptr offset, GLsizeiptr length) {
|
void FlushMappedBufferRange_State(GLenum target, GLintptr offset, GLsizeiptr length) {
|
||||||
if (length < 0 || offset < 0) {
|
if (length < 0 || offset < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
|
||||||
"Offset and length must be non-negative."));
|
"Offset and length must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -105,11 +107,11 @@ namespace MobileGL {
|
|||||||
|
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
||||||
|
|
||||||
auto bufferObject = bindingSlot.GetBoundObject();
|
auto& bufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!bufferObject) {
|
if (!bufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
||||||
"Buffer target is bound to no buffer object."));
|
"Buffer target is bound to no buffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -117,15 +119,14 @@ namespace MobileGL {
|
|||||||
if (!bufferObject->IsMapped()) {
|
if (!bufferObject->IsMapped()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
||||||
"Cannot flush a buffer object that is not mapped."));
|
"Cannot flush a buffer object that is not mapped."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset + length > bufferObject->GetSize()) {
|
if (offset + length > bufferObject->GetSize()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
|
||||||
"Offset and length exceed buffer size."));
|
"Offset and length exceed buffer size."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -134,7 +135,7 @@ namespace MobileGL {
|
|||||||
if (!(mappingAccess & BufferMappingAccessBit::FlushExplicit)) {
|
if (!(mappingAccess & BufferMappingAccessBit::FlushExplicit)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
"MG_Impl/GLImpl", "FlushMappedBufferRange_State",
|
||||||
"Cannot flush a buffer object that is not mapped with GL_MAP_FLUSH_EXPLICIT_BIT."));
|
"Cannot flush a buffer object that is not mapped with GL_MAP_FLUSH_EXPLICIT_BIT."));
|
||||||
return;
|
return;
|
||||||
@@ -149,11 +150,11 @@ namespace MobileGL {
|
|||||||
|
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
||||||
|
|
||||||
auto bufferObject = bindingSlot.GetBoundObject();
|
auto& bufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!bufferObject) {
|
if (!bufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "UnmapBuffer_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "UnmapBuffer_State",
|
||||||
"Buffer target is bound to no buffer object."));
|
"Buffer target is bound to no buffer object."));
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -161,7 +162,7 @@ namespace MobileGL {
|
|||||||
if (!bufferObject->IsMapped()) {
|
if (!bufferObject->IsMapped()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "UnmapBuffer_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "UnmapBuffer_State",
|
||||||
"Cannot unmap a buffer object that is not mapped."));
|
"Cannot unmap a buffer object that is not mapped."));
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -172,15 +173,15 @@ namespace MobileGL {
|
|||||||
|
|
||||||
void* MapBufferRange_State(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) {
|
void* MapBufferRange_State(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) {
|
||||||
if (length < 0 || offset < 0) {
|
if (length < 0 || offset < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"Offset and length must be non-negative."));
|
"Offset and length must be non-negative."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length == 0) {
|
if (length == 0) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"Length must be greater than zero."));
|
"Length must be greater than zero."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -189,18 +190,18 @@ namespace MobileGL {
|
|||||||
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return nullptr;
|
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return nullptr;
|
||||||
|
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
||||||
auto bufferObject = bindingSlot.GetBoundObject();
|
auto& bufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!bufferObject) {
|
if (!bufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"Buffer target is bound to no buffer object."));
|
"Buffer target is bound to no buffer object."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset + length > bufferObject->GetSize()) {
|
if (offset + length > bufferObject->GetSize()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"Offset and length exceed buffer size."));
|
"Offset and length exceed buffer size."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -211,20 +212,19 @@ namespace MobileGL {
|
|||||||
if (!(accessBits & (BufferMappingAccessBit::Read | BufferMappingAccessBit::Write))) {
|
if (!(accessBits & (BufferMappingAccessBit::Read | BufferMappingAccessBit::Write))) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"At least one of GL_MAP_READ_BIT or GL_MAP_WRITE_BIT must be set."));
|
"At least one of GL_MAP_READ_BIT or GL_MAP_WRITE_BIT must be set."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (accessBits & BufferMappingAccessBit::Read) {
|
if (accessBits & BufferMappingAccessBit::Read) {
|
||||||
const auto invalidFlags = BufferMappingAccessBit::InvalidateRange |
|
const auto invalidFlags = BufferMappingAccessBit::InvalidateRange |
|
||||||
BufferMappingAccessBit::InvalidateBuffer |
|
BufferMappingAccessBit::InvalidateBuffer | BufferMappingAccessBit::Unsynchronized;
|
||||||
BufferMappingAccessBit::Unsynchronized;
|
|
||||||
|
|
||||||
if (accessBits & invalidFlags) {
|
if (accessBits & invalidFlags) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", "MapBufferRange_State",
|
"MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"GL_MAP_READ_BIT cannot be combined with invalidation or unsynchronized flags."));
|
"GL_MAP_READ_BIT cannot be combined with invalidation or unsynchronized flags."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@@ -235,7 +235,7 @@ namespace MobileGL {
|
|||||||
if (!(accessBits & BufferMappingAccessBit::Write)) {
|
if (!(accessBits & BufferMappingAccessBit::Write)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"GL_MAP_FLUSH_EXPLICIT_BIT requires GL_MAP_WRITE_BIT."));
|
"GL_MAP_FLUSH_EXPLICIT_BIT requires GL_MAP_WRITE_BIT."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -248,7 +248,7 @@ namespace MobileGL {
|
|||||||
// implementation
|
// implementation
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"Access flags require matching storage flags in buffer."));
|
"Access flags require matching storage flags in buffer."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -260,7 +260,7 @@ namespace MobileGL {
|
|||||||
if (!(accessBits & invalidateFlags)) {
|
if (!(accessBits & invalidateFlags)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"Cannot map a buffer object that is already mapped."));
|
"Cannot map a buffer object that is already mapped."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -271,7 +271,7 @@ namespace MobileGL {
|
|||||||
if (!result) {
|
if (!result) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::OutOfMemory,
|
ErrorCode::OutOfMemory,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBufferRange_State",
|
||||||
"Failed to map buffer due to insufficient memory."));
|
"Failed to map buffer due to insufficient memory."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -284,8 +284,7 @@ namespace MobileGL {
|
|||||||
if (access != GL_READ_ONLY && 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(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBuffer_State",
|
||||||
"MG_Impl/GLImpl", "MapBuffer_State",
|
|
||||||
"Access must be one of GL_READ_ONLY, GL_WRITE_ONLY, or GL_READ_WRITE."));
|
"Access must be one of GL_READ_ONLY, GL_WRITE_ONLY, or GL_READ_WRITE."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -294,11 +293,11 @@ namespace MobileGL {
|
|||||||
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return nullptr;
|
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return nullptr;
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
||||||
|
|
||||||
auto bufferObject = bindingSlot.GetBoundObject();
|
auto& bufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!bufferObject) {
|
if (!bufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBuffer_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBuffer_State",
|
||||||
"Buffer target is bound to no buffer object."));
|
"Buffer target is bound to no buffer object."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -306,7 +305,7 @@ namespace MobileGL {
|
|||||||
if (bufferObject->IsMapped()) {
|
if (bufferObject->IsMapped()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBuffer_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBuffer_State",
|
||||||
"Cannot map a buffer object that is already mapped."));
|
"Cannot map a buffer object that is already mapped."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -315,7 +314,7 @@ namespace MobileGL {
|
|||||||
if (!result) {
|
if (!result) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::OutOfMemory,
|
ErrorCode::OutOfMemory,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "MapBuffer_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "MapBuffer_State",
|
||||||
"Failed to map buffer due to insufficient memory."));
|
"Failed to map buffer due to insufficient memory."));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -325,27 +324,26 @@ namespace MobileGL {
|
|||||||
void CopyBufferSubData_State(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset,
|
void CopyBufferSubData_State(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset,
|
||||||
GLsizeiptr size) {
|
GLsizeiptr size) {
|
||||||
if (size < 0 || readOffset < 0 || writeOffset < 0) {
|
if (size < 0 || readOffset < 0 || writeOffset < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
||||||
"Offset and size must be non-negative."));
|
"Offset and size must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferTarget readBufferTarget = MG_Util::ConvertGLEnumToBufferTarget(readTarget);
|
BufferTarget readBufferTarget = MG_Util::ConvertGLEnumToBufferTarget(readTarget);
|
||||||
BufferTarget writeBufferTarget = MG_Util::ConvertGLEnumToBufferTarget(writeTarget);
|
BufferTarget writeBufferTarget = MG_Util::ConvertGLEnumToBufferTarget(writeTarget);
|
||||||
if (!BufferImpl::ValidateBufferTarget(readBufferTarget) ||
|
if (!BufferImpl::ValidateBufferTarget(readBufferTarget) || !BufferImpl::ValidateBufferTarget(writeBufferTarget))
|
||||||
!BufferImpl::ValidateBufferTarget(writeBufferTarget))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto& readBindingSlot = MG_State::pGLContext->GetBufferBindingSlot(readBufferTarget);
|
auto& readBindingSlot = MG_State::pGLContext->GetBufferBindingSlot(readBufferTarget);
|
||||||
auto& writeBindingSlot = MG_State::pGLContext->GetBufferBindingSlot(writeBufferTarget);
|
auto& writeBindingSlot = MG_State::pGLContext->GetBufferBindingSlot(writeBufferTarget);
|
||||||
auto readBufferObject = readBindingSlot.GetBoundObject();
|
auto& readBufferObject = readBindingSlot.GetBoundObject();
|
||||||
auto writeBufferObject = writeBindingSlot.GetBoundObject();
|
auto& writeBufferObject = writeBindingSlot.GetBoundObject();
|
||||||
|
|
||||||
if (!readBufferObject || !writeBufferObject) {
|
if (!readBufferObject || !writeBufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
||||||
"One of the buffer targets is bound to no buffer object."));
|
"One of the buffer targets is bound to no buffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -353,7 +351,7 @@ namespace MobileGL {
|
|||||||
if (readOffset + size > readBufferObject->GetSize() || writeOffset + size > writeBufferObject->GetSize()) {
|
if (readOffset + size > readBufferObject->GetSize() || writeOffset + size > writeBufferObject->GetSize()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
||||||
"Offset and size must be within the bounds of the buffer objects."));
|
"Offset and size must be within the bounds of the buffer objects."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -363,8 +361,7 @@ namespace MobileGL {
|
|||||||
(writeOffset <= readOffset && writeOffset + size > readOffset)) {
|
(writeOffset <= readOffset && writeOffset + size > readOffset)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
||||||
"MG_Impl/GLImpl", "CopyBufferSubData_State",
|
|
||||||
"Source and destination buffers overlap in the specified ranges."));
|
"Source and destination buffers overlap in the specified ranges."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -376,7 +373,7 @@ namespace MobileGL {
|
|||||||
if (isIllegallyMapped(readBufferObject) || isIllegallyMapped(writeBufferObject)) {
|
if (isIllegallyMapped(readBufferObject) || isIllegallyMapped(writeBufferObject)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "CopyBufferSubData_State",
|
||||||
"Cannot copy data from/to a mapped buffer object unless it was mapped "
|
"Cannot copy data from/to a mapped buffer object unless it was mapped "
|
||||||
"with GL_MAP_PERSISTENT_BIT."));
|
"with GL_MAP_PERSISTENT_BIT."));
|
||||||
return;
|
return;
|
||||||
@@ -391,14 +388,13 @@ namespace MobileGL {
|
|||||||
if (!data) {
|
if (!data) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::NoError, // somehow OpenGL does not generate an error for this
|
ErrorCode::NoError, // somehow OpenGL does not generate an error for this
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BufferSubData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BufferSubData_State", "Data pointer cannot be null."));
|
||||||
"Data pointer cannot be null."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size < 0 || offset < 0) {
|
if (size < 0 || offset < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BufferSubData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BufferSubData_State",
|
||||||
"Offset and size must be non-negative."));
|
"Offset and size must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -407,11 +403,11 @@ namespace MobileGL {
|
|||||||
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return;
|
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return;
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
||||||
|
|
||||||
auto bufferObject = bindingSlot.GetBoundObject();
|
auto& bufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!bufferObject) {
|
if (!bufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BufferSubData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BufferSubData_State",
|
||||||
"Buffer target is bound to no buffer object."));
|
"Buffer target is bound to no buffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -421,7 +417,7 @@ namespace MobileGL {
|
|||||||
if ((offset < mappedRange.end) && (offset + size > mappedRange.start)) {
|
if ((offset < mappedRange.end) && (offset + size > mappedRange.start)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", "BufferSubData_State",
|
"MG_Impl/GLImpl", "BufferSubData_State",
|
||||||
"Offset and size must not overlap with the mapped range of the buffer object."));
|
"Offset and size must not overlap with the mapped range of the buffer object."));
|
||||||
return;
|
return;
|
||||||
@@ -433,7 +429,7 @@ namespace MobileGL {
|
|||||||
if (offset + size >= mappedRange.start) {
|
if (offset + size >= mappedRange.start) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BufferSubData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BufferSubData_State",
|
||||||
"Cannot modify a mapped buffer object unless it was "
|
"Cannot modify a mapped buffer object unless it was "
|
||||||
"mapped with GL_MAP_PERSISTENT_BIT."));
|
"mapped with GL_MAP_PERSISTENT_BIT."));
|
||||||
return;
|
return;
|
||||||
@@ -444,13 +440,12 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BufferData_State(GLenum target, GLsizeiptr size, const void* data, GLenum usage) {
|
void BufferData_State(GLenum target, GLsizeiptr size, const void* data, GLenum usage) {
|
||||||
MGLOG_D("%s: %s, size = %d, data = %p, usage = %s", __func__,
|
MGLOG_D("%s: %s, size = %d, data = %p, usage = %s", __func__, MG_Util::ConvertGLEnumToString(target).c_str(),
|
||||||
MG_Util::ConvertGLEnumToString(target).c_str(), size, data,
|
size, data, MG_Util::ConvertGLEnumToString(usage).c_str());
|
||||||
MG_Util::ConvertGLEnumToString(usage).c_str());
|
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BufferData_State", "Size must be non-negative."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BufferData_State", "Size must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,11 +456,11 @@ namespace MobileGL {
|
|||||||
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return;
|
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return;
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
||||||
|
|
||||||
auto bufferObject = bindingSlot.GetBoundObject();
|
auto& bufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!bufferObject) {
|
if (!bufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BufferData_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BufferData_State",
|
||||||
"Buffer target is bound to no buffer object."));
|
"Buffer target is bound to no buffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -482,11 +477,11 @@ namespace MobileGL {
|
|||||||
BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target);
|
BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target);
|
||||||
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return;
|
if (!BufferImpl::ValidateBufferTarget(bufferTarget)) return;
|
||||||
|
|
||||||
auto bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
Bool doesBufferObjectCreated = MG_State::pGLContext->ValidateBufferObject(buffer);
|
||||||
if (!bufferObject) {
|
if (!doesBufferObjectCreated) {
|
||||||
MG_State::pGLContext->CreateBufferObject(buffer);
|
MG_State::pGLContext->CreateBufferObject(buffer);
|
||||||
bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
|
||||||
}
|
}
|
||||||
|
auto& bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
||||||
|
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetBufferBindingSlot(bufferTarget);
|
||||||
bindingSlot.Bind(bufferObject);
|
bindingSlot.Bind(bufferObject);
|
||||||
@@ -498,11 +493,12 @@ namespace MobileGL {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GenBuffers_State", "n must be non-negative"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GenBuffers_State", "n must be non-negative"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto bufferNames = MG_State::pGLContext->GenBufferNames(n);
|
static thread_local Vector<GLuint> bufferNames;
|
||||||
Copy(bufferNames.data(), buffers, bufferNames.size());
|
MG_State::pGLContext->GenBufferNames(n, bufferNames);
|
||||||
|
Memcpy(buffers, bufferNames.data(), n * sizeof(GLuint));
|
||||||
}
|
}
|
||||||
|
|
||||||
GLboolean IsBuffer_State(GLuint buffer) {
|
GLboolean IsBuffer_State(GLuint buffer) {
|
||||||
@@ -516,11 +512,11 @@ namespace MobileGL {
|
|||||||
BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target);
|
BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target);
|
||||||
if (!BufferImpl::ValidateBufferBindingPointTarget(bufferTarget)) return;
|
if (!BufferImpl::ValidateBufferBindingPointTarget(bufferTarget)) return;
|
||||||
|
|
||||||
auto bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
Bool doesBufferObjectCreated = MG_State::pGLContext->ValidateBufferObject(buffer);
|
||||||
if (!bufferObject) {
|
if (!doesBufferObjectCreated) {
|
||||||
MG_State::pGLContext->CreateBufferObject(buffer);
|
MG_State::pGLContext->CreateBufferObject(buffer);
|
||||||
bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
|
||||||
}
|
}
|
||||||
|
auto& bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
||||||
|
|
||||||
auto& point = MG_State::pGLContext->GetBufferBindingPoint(bufferTarget, pointIndex);
|
auto& point = MG_State::pGLContext->GetBufferBindingPoint(bufferTarget, pointIndex);
|
||||||
point.Bind(bufferObject);
|
point.Bind(bufferObject);
|
||||||
@@ -534,11 +530,11 @@ namespace MobileGL {
|
|||||||
BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target);
|
BufferTarget bufferTarget = MG_Util::ConvertGLEnumToBufferTarget(target);
|
||||||
if (!BufferImpl::ValidateBufferBindingPointTarget(bufferTarget)) return;
|
if (!BufferImpl::ValidateBufferBindingPointTarget(bufferTarget)) return;
|
||||||
|
|
||||||
auto bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
Bool doesBufferObjectCreated = MG_State::pGLContext->ValidateBufferObject(buffer);
|
||||||
if (!bufferObject) {
|
if (!doesBufferObjectCreated) {
|
||||||
MG_State::pGLContext->CreateBufferObject(buffer);
|
MG_State::pGLContext->CreateBufferObject(buffer);
|
||||||
bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
|
||||||
}
|
}
|
||||||
|
auto& bufferObject = MG_State::pGLContext->GetBufferObject(buffer);
|
||||||
|
|
||||||
auto& point = MG_State::pGLContext->GetBufferBindingPoint(bufferTarget, index);
|
auto& point = MG_State::pGLContext->GetBufferBindingPoint(bufferTarget, index);
|
||||||
point.Bind(bufferObject);
|
point.Bind(bufferObject);
|
||||||
@@ -603,5 +599,4 @@ namespace MobileGL {
|
|||||||
void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {
|
void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {
|
||||||
BindBufferRange_State(target, index, buffer, offset, size);
|
BindBufferRange_State(target, index, buffer, offset, size);
|
||||||
}
|
}
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
||||||
void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
|
void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
|
||||||
GLboolean IsBuffer(GLuint buffer);
|
GLboolean IsBuffer(GLuint buffer);
|
||||||
@@ -28,5 +27,4 @@ namespace MobileGL {
|
|||||||
void BindBufferBase(GLenum target, GLuint index, GLuint buffer);
|
void BindBufferBase(GLenum target, GLuint index, GLuint buffer);
|
||||||
void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
|
void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
|
||||||
|
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -13,16 +13,14 @@
|
|||||||
#include <MG_Util/Converters/MGToGL/BufferEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/BufferEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToStr/BufferEnumConverter.h>
|
#include <MG_Util/Converters/MGToStr/BufferEnumConverter.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::BufferImpl {
|
||||||
namespace BufferImpl {
|
|
||||||
Bool ValidateBufferTarget(BufferTarget target) {
|
Bool ValidateBufferTarget(BufferTarget target) {
|
||||||
if (target == BufferTarget::Unknown) {
|
if (target == BufferTarget::Unknown) {
|
||||||
using namespace MG_Util;
|
using namespace MG_Util;
|
||||||
String bufferTargetStr = ConvertBufferTargetToString(target);
|
String bufferTargetStr = ConvertBufferTargetToString(target);
|
||||||
String glTargetStr = ConvertGLEnumToString(ConvertBufferTargetToGLEnum(target));
|
String glTargetStr = ConvertGLEnumToString(ConvertBufferTargetToGLEnum(target));
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>(
|
||||||
MakeShared<GenericErrorInfo>(
|
|
||||||
"MG_Impl/GLImpl/BufferImpl", "ValidateBufferTarget",
|
"MG_Impl/GLImpl/BufferImpl", "ValidateBufferTarget",
|
||||||
std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr)));
|
std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr)));
|
||||||
return false;
|
return false;
|
||||||
@@ -30,7 +28,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
if (target == BufferTarget::Index && MG_State::pGLContext->GetBoundVertexArray() == nullptr) {
|
if (target == BufferTarget::Index && MG_State::pGLContext->GetBoundVertexArray() == nullptr) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl",
|
||||||
"ValidateBufferTarget",
|
"ValidateBufferTarget",
|
||||||
"No vertex array object is bound."));
|
"No vertex array object is bound."));
|
||||||
return false;
|
return false;
|
||||||
@@ -46,8 +44,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
String bufferTargetStr = ConvertBufferTargetToString(target);
|
String bufferTargetStr = ConvertBufferTargetToString(target);
|
||||||
String glTargetStr = ConvertGLEnumToString(ConvertBufferTargetToGLEnum(target));
|
String glTargetStr = ConvertGLEnumToString(ConvertBufferTargetToGLEnum(target));
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>(
|
||||||
MakeShared<GenericErrorInfo>(
|
|
||||||
"MG_Impl/GLImpl/BufferImpl", "ValidateBufferTarget",
|
"MG_Impl/GLImpl/BufferImpl", "ValidateBufferTarget",
|
||||||
std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr)));
|
std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr)));
|
||||||
return false;
|
return false;
|
||||||
@@ -59,9 +56,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
if (allowZero) return true;
|
if (allowZero) return true;
|
||||||
|
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl",
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl", "ValidateBufferName",
|
||||||
"ValidateBufferName",
|
|
||||||
"Buffer name 0 is not valid."));
|
"Buffer name 0 is not valid."));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -69,7 +65,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (isValid) return true;
|
if (isValid) return true;
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl", "ValidateBufferName",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl", "ValidateBufferName",
|
||||||
std::format("Buffer name {} is not valid.", index)));
|
std::format("Buffer name {} is not valid.", index)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -83,7 +79,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
String glUsageStr = ConvertGLEnumToString(ConvertBufferUsageToGLEnum(usage));
|
String glUsageStr = ConvertGLEnumToString(ConvertBufferUsageToGLEnum(usage));
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl/BufferImpl", "ValidateBufferUsage",
|
"MG_Impl/GLImpl/BufferImpl", "ValidateBufferUsage",
|
||||||
std::format("Usage {} ({}) is not one of the allowable values.", bufferUsageStr, glUsageStr)));
|
std::format("Usage {} ({}) is not one of the allowable values.", bufferUsageStr, glUsageStr)));
|
||||||
return false;
|
return false;
|
||||||
@@ -92,7 +88,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Bool ValidateBufferMappingAccess(Flags<BufferMappingAccessBit> accessBits) {
|
Bool ValidateBufferMappingAccess(Flags<BufferMappingAccessBit> accessBits) {
|
||||||
if (accessBits == BufferMappingAccessBit::Null) {
|
if (accessBits == BufferMappingAccessBit::Null) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl",
|
||||||
"ValidateBufferMappingAccess",
|
"ValidateBufferMappingAccess",
|
||||||
"Access bits cannot be null."));
|
"Access bits cannot be null."));
|
||||||
return false;
|
return false;
|
||||||
@@ -106,12 +102,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if ((accessBits & validBits) != accessBits) {
|
if ((accessBits & validBits) != accessBits) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl", "ValidateBufferMappingAccess",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/BufferImpl", "ValidateBufferMappingAccess",
|
||||||
"Access bits cannot contain invalid flags."));
|
"Access bits cannot contain invalid flags."));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} // namespace BufferImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::BufferImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -10,12 +10,10 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_State/GLState/BufferState/BufferObject.h>
|
#include <MG_State/GLState/BufferState/BufferObject.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::BufferImpl {
|
||||||
namespace BufferImpl {
|
|
||||||
Bool ValidateBufferTarget(BufferTarget target);
|
Bool ValidateBufferTarget(BufferTarget target);
|
||||||
Bool ValidateBufferName(Uint index, Bool allowZero = false);
|
Bool ValidateBufferName(Uint index, Bool allowZero = false);
|
||||||
Bool ValidateBufferUsage(BufferUsage usage);
|
Bool ValidateBufferUsage(BufferUsage usage);
|
||||||
Bool ValidateBufferMappingAccess(Flags<BufferMappingAccessBit> accessBits);
|
Bool ValidateBufferMappingAccess(Flags<BufferMappingAccessBit> accessBits);
|
||||||
Bool ValidateBufferBindingPointTarget(BufferTarget target);
|
Bool ValidateBufferBindingPointTarget(BufferTarget target);
|
||||||
} // namespace BufferImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::BufferImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -9,11 +9,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
||||||
void MultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount,
|
void MultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride);
|
||||||
GLsizei stride);
|
|
||||||
void MultiDrawArraysIndirect(GLenum mode, 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,
|
void DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type,
|
||||||
const void* indices, GLint basevertex);
|
const void* indices, GLint basevertex);
|
||||||
@@ -38,5 +36,4 @@ namespace MobileGL {
|
|||||||
GLsizei drawcount, const GLint* basevertex);
|
GLsizei drawcount, const GLint* basevertex);
|
||||||
void Clear(GLbitfield mask);
|
void Clear(GLbitfield mask);
|
||||||
void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices);
|
void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices);
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -38,11 +38,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
RenderbufferTarget rbTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target);
|
RenderbufferTarget rbTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target);
|
||||||
if (!FramebufferImpl::ValidateRenderbufferTarget(rbTarget)) return;
|
if (!FramebufferImpl::ValidateRenderbufferTarget(rbTarget)) return;
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetRenderbufferBindingSlot(rbTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetRenderbufferBindingSlot(rbTarget);
|
||||||
auto renderbufferObject = bindingSlot.GetBoundObject();
|
auto& renderbufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!renderbufferObject) {
|
if (!renderbufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "RenderbufferStorage_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "RenderbufferStorage_State",
|
||||||
"Renderbuffer target is bound to no renderbuffer object."));
|
"Renderbuffer target is bound to no renderbuffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!TextureImpl::ValidateTextureInternalFormat(format)) return;
|
if (!TextureImpl::ValidateTextureInternalFormat(format)) return;
|
||||||
if (width < 0 || height < 0) {
|
if (width < 0 || height < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "RenderbufferStorage_State",
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "RenderbufferStorage_State",
|
||||||
"Width and height must be non-negative."));
|
"Width and height must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -74,10 +74,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GenRenderbuffers_State", "n must be non-negative"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GenRenderbuffers_State", "n must be non-negative"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto renderbufferNames = MG_State::pGLContext->GenRenderbufferNames(n);
|
static thread_local Vector<GLuint> renderbufferNames;
|
||||||
|
MG_State::pGLContext->GenRenderbufferNames(n, renderbufferNames);
|
||||||
Memcpy(renderbuffers, renderbufferNames.data(), sizeof(GLuint) * static_cast<SizeT>(n));
|
Memcpy(renderbuffers, renderbufferNames.data(), sizeof(GLuint) * static_cast<SizeT>(n));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,10 +86,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GenFramebuffers_State", "n must be non-negative"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GenFramebuffers_State", "n must be non-negative"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto framebuffersNames = MG_State::pGLContext->GenFramebufferNames(n);
|
static thread_local Vector<GLuint> framebuffersNames;
|
||||||
|
MG_State::pGLContext->GenFramebufferNames(n, framebuffersNames);
|
||||||
Memcpy(framebuffers, framebuffersNames.data(), sizeof(GLuint) * static_cast<SizeT>(n));
|
Memcpy(framebuffers, framebuffersNames.data(), sizeof(GLuint) * static_cast<SizeT>(n));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,11 +121,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!TextureImpl::ValidateTextureName(texture, true)) return;
|
if (!TextureImpl::ValidateTextureName(texture, true)) return;
|
||||||
|
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget);
|
||||||
auto framebufferObject = bindingSlot.GetBoundObject();
|
auto& framebufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!framebufferObject) {
|
if (!framebufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "FramebufferTexture2D_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FramebufferTexture2D_State",
|
||||||
"Framebuffer target is bound to no framebuffer object."));
|
"Framebuffer target is bound to no framebuffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -133,11 +135,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto textureObject = MG_State::pGLContext->GetTextureObject(texture);
|
auto& textureObject = MG_State::pGLContext->GetTextureObject(texture);
|
||||||
if (!textureObject) {
|
if (!textureObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "FramebufferTexture2D_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FramebufferTexture2D_State",
|
||||||
std::format("Texture object {} is not valid.", texture)));
|
std::format("Texture object {} is not valid.", texture)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -166,11 +168,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return;
|
if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return;
|
||||||
if (!FramebufferImpl::ValidateRenderbufferName(renderbuffer)) return;
|
if (!FramebufferImpl::ValidateRenderbufferName(renderbuffer)) return;
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget);
|
||||||
auto framebufferObject = bindingSlot.GetBoundObject();
|
auto& framebufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!framebufferObject) {
|
if (!framebufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "FramebufferRenderbuffer_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FramebufferRenderbuffer_State",
|
||||||
"Framebuffer target is bound to no framebuffer object."));
|
"Framebuffer target is bound to no framebuffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -180,11 +182,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto renderbufferObject = MG_State::pGLContext->GetRenderbufferObject(renderbuffer);
|
auto& renderbufferObject = MG_State::pGLContext->GetRenderbufferObject(renderbuffer);
|
||||||
if (!renderbufferObject) {
|
if (!renderbufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "FramebufferRenderbuffer_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FramebufferRenderbuffer_State",
|
||||||
std::format("Renderbuffer object {} is not valid.", renderbuffer)));
|
std::format("Renderbuffer object {} is not valid.", renderbuffer)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -196,18 +198,18 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`n` is less than 0."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`n` is less than 0."));
|
||||||
return;
|
return;
|
||||||
} else if (n > MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) {
|
} else if (n > MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`n` is greater than `GL_MAX_DRAW_BUFFERS`."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`n` is greater than `GL_MAX_DRAW_BUFFERS`."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get bound framebuffer
|
// Get bound framebuffer
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw);
|
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw);
|
||||||
auto fbo = bindingSlot.GetBoundObject();
|
auto& fbo = bindingSlot.GetBoundObject();
|
||||||
bool isDefaultFBO = (fbo == FramebufferImpl::pDefaultFramebufferInfo->defaultFBO);
|
bool isDefaultFBO = (fbo == FramebufferImpl::pDefaultFramebufferInfo->defaultFBO);
|
||||||
|
|
||||||
static int existenceMap[(SizeT)FramebufferAttachmentType::FramebufferAttachmentTypeCount] = {-1};
|
static int existenceMap[(SizeT)FramebufferAttachmentType::FramebufferAttachmentTypeCount] = {-1};
|
||||||
@@ -220,7 +222,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (attType == FramebufferAttachmentType::Unknown) {
|
if (attType == FramebufferAttachmentType::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::format("bufs[{}] = {} is not an accepted value.", i,
|
std::format("bufs[{}] = {} is not an accepted value.", i,
|
||||||
MG_Util::ConvertGLEnumToString(bufs[i]))));
|
MG_Util::ConvertGLEnumToString(bufs[i]))));
|
||||||
return;
|
return;
|
||||||
@@ -230,7 +232,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
attType <= FramebufferAttachmentType::Color31) {
|
attType <= FramebufferAttachmentType::Color31) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", __func__,
|
"MG_Impl/GLImpl", __func__,
|
||||||
std::format(
|
std::format(
|
||||||
"FBO is default FBO, but bufs[{}] = {} is one of the `GL_COLOR_ATTACHMENTn` tokens.", i,
|
"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) {
|
attType <= FramebufferAttachmentType::BackRight) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", __func__,
|
"MG_Impl/GLImpl", __func__,
|
||||||
std::format("FBO is not default FBO, but bufs[{}] = {} is anything other than `GL_NONE` or "
|
std::format("FBO is not default FBO, but bufs[{}] = {} is anything other than `GL_NONE` or "
|
||||||
"one of the `GL_COLOR_ATTACHMENTn` tokens.",
|
"one of the `GL_COLOR_ATTACHMENTn` tokens.",
|
||||||
@@ -253,7 +255,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (attType != FramebufferAttachmentType::None && existenceMap[(SizeT)attType] >= 0) {
|
if (attType != FramebufferAttachmentType::None && existenceMap[(SizeT)attType] >= 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::format("a symbolic constant other than `GL_NONE` appears "
|
std::format("a symbolic constant other than `GL_NONE` appears "
|
||||||
"more than once in bufs. bufs[{}] == bufs[{}] == {}.",
|
"more than once in bufs. bufs[{}] == bufs[{}] == {}.",
|
||||||
i, existenceMap[(SizeT)attType],
|
i, existenceMap[(SizeT)attType],
|
||||||
@@ -267,7 +269,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
(SizeT)FramebufferAttachmentType::Color0 + MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) {
|
(SizeT)FramebufferAttachmentType::Color0 + MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::format("bufs[{}] == {} indicates a color buffer that does "
|
std::format("bufs[{}] == {} indicates a color buffer that does "
|
||||||
"not exist in the current GL context.",
|
"not exist in the current GL context.",
|
||||||
i, MG_Util::ConvertGLEnumToString(bufs[i]))));
|
i, MG_Util::ConvertGLEnumToString(bufs[i]))));
|
||||||
@@ -297,7 +299,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (attType == FramebufferAttachmentType::Unknown) {
|
if (attType == FramebufferAttachmentType::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", __func__,
|
"MG_Impl/GLImpl", __func__,
|
||||||
std::format("`mode` = {} is not an accepted value.", MG_Util::ConvertGLEnumToString(mode))));
|
std::format("`mode` = {} is not an accepted value.", MG_Util::ConvertGLEnumToString(mode))));
|
||||||
return;
|
return;
|
||||||
@@ -305,7 +307,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
// Get bound framebuffer
|
// Get bound framebuffer
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read);
|
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read);
|
||||||
auto fbo = bindingSlot.GetBoundObject();
|
auto& fbo = bindingSlot.GetBoundObject();
|
||||||
fbo->SetReadBuffer(attType);
|
fbo->SetReadBuffer(attType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,13 +315,13 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteRenderbuffers_State", "n must be non-negative."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteRenderbuffers_State", "n must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!renderbuffers) {
|
if (!renderbuffers) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteRenderbuffers_State",
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteRenderbuffers_State",
|
||||||
"Renderbuffer names array cannot be null."));
|
"Renderbuffer names array cannot be null."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -336,13 +338,13 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteFramebuffers_State", "n must be non-negative."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteFramebuffers_State", "n must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!framebuffers) {
|
if (!framebuffers) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteFramebuffers_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteFramebuffers_State",
|
||||||
"Framebuffer names array cannot be null."));
|
"Framebuffer names array cannot be null."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -360,11 +362,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return GL_FRAMEBUFFER_UNDEFINED;
|
if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return GL_FRAMEBUFFER_UNDEFINED;
|
||||||
|
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget);
|
||||||
auto framebufferObject = bindingSlot.GetBoundObject();
|
auto& framebufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!framebufferObject) {
|
if (!framebufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "CheckFramebufferStatus_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "CheckFramebufferStatus_State",
|
||||||
"Framebuffer target is bound to no framebuffer object."));
|
"Framebuffer target is bound to no framebuffer object."));
|
||||||
return GL_FRAMEBUFFER_UNDEFINED;
|
return GL_FRAMEBUFFER_UNDEFINED;
|
||||||
}
|
}
|
||||||
@@ -382,11 +384,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
RenderbufferTarget renderbufferTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target);
|
RenderbufferTarget renderbufferTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target);
|
||||||
if (!FramebufferImpl::ValidateRenderbufferTarget(renderbufferTarget)) return;
|
if (!FramebufferImpl::ValidateRenderbufferTarget(renderbufferTarget)) return;
|
||||||
|
|
||||||
auto renderbufferObject = MG_State::pGLContext->GetRenderbufferObject(renderbuffer);
|
Bool doesRenderbufferCreated = MG_State::pGLContext->ValidateRenderbufferObject(renderbuffer);
|
||||||
if (!renderbufferObject) {
|
if (!doesRenderbufferCreated) {
|
||||||
MG_State::pGLContext->CreateRenderbufferObject(renderbuffer);
|
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);
|
auto& bindingSlot = MG_State::pGLContext->GetRenderbufferBindingSlot(renderbufferTarget);
|
||||||
bindingSlot.Bind(renderbufferObject);
|
bindingSlot.Bind(renderbufferObject);
|
||||||
@@ -403,11 +405,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
FramebufferTarget framebufferTarget = MG_Util::ConvertGLEnumToFramebufferTarget(target);
|
FramebufferTarget framebufferTarget = MG_Util::ConvertGLEnumToFramebufferTarget(target);
|
||||||
if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return;
|
if (!FramebufferImpl::ValidateFramebufferTarget(framebufferTarget)) return;
|
||||||
|
|
||||||
auto framebufferObject = MG_State::pGLContext->GetFramebufferObject(framebuffer);
|
Bool doesFramebufferCreated = MG_State::pGLContext->ValidateFramebufferObject(framebuffer);
|
||||||
if (!framebufferObject) {
|
if (!doesFramebufferCreated) {
|
||||||
MG_State::pGLContext->CreateFramebufferObject(framebuffer);
|
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);
|
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(framebufferTarget);
|
||||||
bindingSlot.Bind(framebufferObject);
|
bindingSlot.Bind(framebufferObject);
|
||||||
@@ -419,11 +421,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
RenderbufferTarget renderbufferTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target);
|
RenderbufferTarget renderbufferTarget = MG_Util::ConvertGLEnumToRenderbufferTarget(target);
|
||||||
if (!FramebufferImpl::ValidateRenderbufferTarget(renderbufferTarget)) return;
|
if (!FramebufferImpl::ValidateRenderbufferTarget(renderbufferTarget)) return;
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetRenderbufferBindingSlot(renderbufferTarget);
|
auto& bindingSlot = MG_State::pGLContext->GetRenderbufferBindingSlot(renderbufferTarget);
|
||||||
auto renderbufferObject = bindingSlot.GetBoundObject();
|
auto& renderbufferObject = bindingSlot.GetBoundObject();
|
||||||
if (!renderbufferObject) {
|
if (!renderbufferObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GetRenderbufferParameteriv_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GetRenderbufferParameteriv_State",
|
||||||
"Renderbuffer target is bound to no renderbuffer object."));
|
"Renderbuffer target is bound to no renderbuffer object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -462,7 +464,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
default:
|
default:
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", "GetRenderbufferParameteriv_State",
|
"MG_Impl/GLImpl", "GetRenderbufferParameteriv_State",
|
||||||
std::format("pname {} is not an accepted value.", MG_Util::ConvertGLEnumToString(pname))));
|
std::format("pname {} is not an accepted value.", MG_Util::ConvertGLEnumToString(pname))));
|
||||||
return;
|
return;
|
||||||
@@ -492,7 +494,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
// Check width/height
|
// Check width/height
|
||||||
if (width < 0 || height < 0) {
|
if (width < 0 || height < 0) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"Width and height must be non-negative"));
|
"Width and height must be non-negative"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -501,7 +503,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!TextureImpl::ValidateTextureInputFormat(textureInputFormat)) {
|
if (!TextureImpl::ValidateTextureInputFormat(textureInputFormat)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State", "Invalid format"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State", "Invalid format"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -509,17 +511,17 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!TextureImpl::ValidateTexturePixelDataType(texturePixelDataType)) {
|
if (!TextureImpl::ValidateTexturePixelDataType(texturePixelDataType)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State", "Invalid pixel data type"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State", "Invalid pixel data type"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get bound framebuffer
|
// Get bound framebuffer
|
||||||
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read);
|
auto& bindingSlot = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read);
|
||||||
auto framebufferObject = bindingSlot.GetBoundObject();
|
auto& framebufferObject = bindingSlot.GetBoundObject();
|
||||||
|
|
||||||
if (!framebufferObject) {
|
if (!framebufferObject) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"No framebuffer bound to read target"));
|
"No framebuffer bound to read target"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -528,7 +530,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!framebufferObject->CheckCompleteness()) {
|
if (!framebufferObject->CheckCompleteness()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidFramebufferOperation,
|
ErrorCode::InvalidFramebufferOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State", "Framebuffer is incomplete"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State", "Framebuffer is incomplete"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -537,7 +539,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!framebufferObject->GetAttachment(FramebufferAttachmentType::Stencil).IsValid()) {
|
if (!framebufferObject->GetAttachment(FramebufferAttachmentType::Stencil).IsValid()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"No stencil buffer for stencil index format"));
|
"No stencil buffer for stencil index format"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -545,7 +547,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!framebufferObject->GetAttachment(FramebufferAttachmentType::Depth).IsValid()) {
|
if (!framebufferObject->GetAttachment(FramebufferAttachmentType::Depth).IsValid()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"No depth buffer for depth component format"));
|
"No depth buffer for depth component format"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -554,7 +556,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
!framebufferObject->GetAttachment(FramebufferAttachmentType::Stencil).IsValid()) {
|
!framebufferObject->GetAttachment(FramebufferAttachmentType::Stencil).IsValid()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"No depth/stencil buffer for depth-stencil format"));
|
"No depth/stencil buffer for depth-stencil format"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -563,7 +565,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (texturePixelDataType != TexturePixelDataType::UnsignedInt248 &&
|
if (texturePixelDataType != TexturePixelDataType::UnsignedInt248 &&
|
||||||
texturePixelDataType != TexturePixelDataType::Float32UnsignedInt248Rev) {
|
texturePixelDataType != TexturePixelDataType::Float32UnsignedInt248Rev) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"Invalid type for depth-stencil format"));
|
"Invalid type for depth-stencil format"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -577,7 +579,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
// Check if PBO is mapped
|
// Check if PBO is mapped
|
||||||
if (pixelPackBufferObject->IsMapped()) {
|
if (pixelPackBufferObject->IsMapped()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
ErrorCode::InvalidOperation, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"Pixel pack buffer is currently mapped"));
|
"Pixel pack buffer is currently mapped"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -587,7 +589,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (reinterpret_cast<uintptr_t>(pixels) % typeSize != 0) {
|
if (reinterpret_cast<uintptr_t>(pixels) % typeSize != 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"Pixel data not aligned for pixel pack buffer"));
|
"Pixel data not aligned for pixel pack buffer"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -595,11 +597,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
// Check multisampling
|
// Check multisampling
|
||||||
if (framebufferObject->GetAttachment(FramebufferAttachmentType::Color0).IsRenderbuffer()) {
|
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) {
|
if (rbo && rbo->GetSamples() > 1) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ReadPixels_State",
|
||||||
"ReadPixels not supported for multisampled framebuffers"));
|
"ReadPixels not supported for multisampled framebuffers"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -732,6 +734,6 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace FramebufferImpl {
|
namespace FramebufferImpl {
|
||||||
DefaultFramebufferInfo* pDefaultFramebufferInfo;
|
UniquePtr<DefaultFramebufferInfo> pDefaultFramebufferInfo;
|
||||||
} // namespace FramebufferImpl
|
} // namespace FramebufferImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
|
|||||||
@@ -11,8 +11,7 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
||||||
void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
|
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 ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
|
||||||
@@ -55,7 +54,6 @@ namespace MobileGL {
|
|||||||
SharedPtr<MG_State::GLState::ITextureObject> stencilAttachment;
|
SharedPtr<MG_State::GLState::ITextureObject> stencilAttachment;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern DefaultFramebufferInfo* pDefaultFramebufferInfo;
|
extern UniquePtr<DefaultFramebufferInfo> pDefaultFramebufferInfo;
|
||||||
} // namespace FramebufferImpl
|
} // namespace FramebufferImpl
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -13,16 +13,14 @@
|
|||||||
#include <MG_Util/Converters/MGToGL/FramebufferEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/FramebufferEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToStr/FramebufferEnumConverter.h>
|
#include <MG_Util/Converters/MGToStr/FramebufferEnumConverter.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::FramebufferImpl {
|
||||||
namespace FramebufferImpl {
|
|
||||||
Bool ValidateFramebufferTarget(FramebufferTarget target) {
|
Bool ValidateFramebufferTarget(FramebufferTarget target) {
|
||||||
if (target == FramebufferTarget::Unknown) {
|
if (target == FramebufferTarget::Unknown) {
|
||||||
using namespace MG_Util;
|
using namespace MG_Util;
|
||||||
String bufferTargetStr = ConvertFramebufferTargetToString(target);
|
String bufferTargetStr = ConvertFramebufferTargetToString(target);
|
||||||
String glTargetStr = ConvertGLEnumToString(ConvertFramebufferTargetToGLEnum(target));
|
String glTargetStr = ConvertGLEnumToString(ConvertFramebufferTargetToGLEnum(target));
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>(
|
||||||
MakeShared<GenericErrorInfo>(
|
|
||||||
"MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferTarget",
|
"MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferTarget",
|
||||||
std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr)));
|
std::format("Target {} ({}) is not valid.", bufferTargetStr, glTargetStr)));
|
||||||
return false;
|
return false;
|
||||||
@@ -34,7 +32,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (index == 0 && !allowZero) {
|
if (index == 0 && !allowZero) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferName",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferName",
|
||||||
"Framebuffer name 0 is not valid in this situation."));
|
"Framebuffer name 0 is not valid in this situation."));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -42,7 +40,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (isValid) return true;
|
if (isValid) return true;
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferName",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferName",
|
||||||
std::format("Framebuffer name {} is not valid.", index)));
|
std::format("Framebuffer name {} is not valid.", index)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -54,7 +52,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
String glAttachmentStr = ConvertGLEnumToString(ConvertFramebufferAttachmentTypeToGLEnum(attachment));
|
String glAttachmentStr = ConvertGLEnumToString(ConvertFramebufferAttachmentTypeToGLEnum(attachment));
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferAttachmentType",
|
"MG_Impl/GLImpl/FramebufferImpl", "ValidateFramebufferAttachmentType",
|
||||||
std::format("Attachment type {} ({}) is not valid.", attachmentStr, glAttachmentStr)));
|
std::format("Attachment type {} ({}) is not valid.", attachmentStr, glAttachmentStr)));
|
||||||
return false;
|
return false;
|
||||||
@@ -69,7 +67,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
String glTargetStr = ConvertGLEnumToString(ConvertRenderbufferTargetToGLEnum(target));
|
String glTargetStr = ConvertGLEnumToString(ConvertRenderbufferTargetToGLEnum(target));
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferTarget",
|
"MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferTarget",
|
||||||
std::format("Target {} ({}) is not valid.", renderbufferTargetStr, glTargetStr)));
|
std::format("Target {} ({}) is not valid.", renderbufferTargetStr, glTargetStr)));
|
||||||
return false;
|
return false;
|
||||||
@@ -81,7 +79,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (index == 0 && !allowZero) {
|
if (index == 0 && !allowZero) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferName",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferName",
|
||||||
"Renderbuffer name 0 is not valid in this situation."));
|
"Renderbuffer name 0 is not valid in this situation."));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -89,9 +87,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (isValid) return true;
|
if (isValid) return true;
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferName",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl/FramebufferImpl", "ValidateRenderbufferName",
|
||||||
std::format("Renderbuffer name {} is not valid.", index)));
|
std::format("Renderbuffer name {} is not valid.", index)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} // namespace FramebufferImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::FramebufferImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -10,12 +10,10 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_State/GLState/FramebufferState/FramebufferObject.h>
|
#include <MG_State/GLState/FramebufferState/FramebufferObject.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::FramebufferImpl {
|
||||||
namespace FramebufferImpl {
|
|
||||||
Bool ValidateFramebufferTarget(FramebufferTarget target);
|
Bool ValidateFramebufferTarget(FramebufferTarget target);
|
||||||
Bool ValidateFramebufferName(Uint index, Bool allowZero = true);
|
Bool ValidateFramebufferName(Uint index, Bool allowZero = true);
|
||||||
Bool ValidateFramebufferAttachmentType(FramebufferAttachmentType attachment);
|
Bool ValidateFramebufferAttachmentType(FramebufferAttachmentType attachment);
|
||||||
Bool ValidateRenderbufferTarget(RenderbufferTarget target);
|
Bool ValidateRenderbufferTarget(RenderbufferTarget target);
|
||||||
Bool ValidateRenderbufferName(Uint index, Bool allowZero = true);
|
Bool ValidateRenderbufferName(Uint index, Bool allowZero = true);
|
||||||
} // namespace FramebufferImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::FramebufferImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -7,8 +7,6 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#include "GL_Getter.h"
|
#include "GL_Getter.h"
|
||||||
#include "GL/gl.h"
|
|
||||||
#include "MG_Util/Debug/Log.h"
|
|
||||||
#include <Config.h>
|
#include <Config.h>
|
||||||
#include <MGGitHash.h>
|
#include <MGGitHash.h>
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
@@ -127,7 +125,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!params) {
|
if (!params) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GetIntegerv", "params pointer cannot be null"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GetIntegerv", "params pointer cannot be null"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,9 +144,9 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
*params = 0; // TODO
|
*params = 0; // TODO
|
||||||
break;
|
break;
|
||||||
case GL_ARRAY_BUFFER_BINDING: {
|
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)
|
if (obj)
|
||||||
*params = obj->GetExternalIndex();
|
*params = (GLint)obj->GetExternalIndex();
|
||||||
else
|
else
|
||||||
*params = 0;
|
*params = 0;
|
||||||
break;
|
break;
|
||||||
@@ -256,14 +254,14 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
break;
|
break;
|
||||||
case GL_CURRENT_PROGRAM: {
|
case GL_CURRENT_PROGRAM: {
|
||||||
const auto& currentProgram = MG_State::pGLContext->GetCurrentProgram();
|
const auto& currentProgram = MG_State::pGLContext->GetCurrentProgram();
|
||||||
*params = currentProgram ? currentProgram->GetExternalIndex() : 0;
|
*params = currentProgram ? (GLint)currentProgram->GetExternalIndex() : 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_DEPTH_CLEAR_VALUE:
|
case GL_DEPTH_CLEAR_VALUE:
|
||||||
*params = MG_State::pGLContext->GetClearDepth();
|
*params = (GLint)MG_State::pGLContext->GetClearDepth();
|
||||||
break;
|
break;
|
||||||
case GL_DEPTH_FUNC:
|
case GL_DEPTH_FUNC:
|
||||||
*params = MG_Util::ConvertDepthTestFuncToGLEnum(MG_State::pGLContext->GetDepthFunc());
|
*params = (GLint)MG_Util::ConvertDepthTestFuncToGLEnum(MG_State::pGLContext->GetDepthFunc());
|
||||||
break;
|
break;
|
||||||
case GL_DEPTH_RANGE:
|
case GL_DEPTH_RANGE:
|
||||||
*params = 0; // TODO
|
*params = 0; // TODO
|
||||||
@@ -288,12 +286,12 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
break;
|
break;
|
||||||
case GL_DRAW_FRAMEBUFFER_BINDING: {
|
case GL_DRAW_FRAMEBUFFER_BINDING: {
|
||||||
const auto& FBO = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw).GetBoundObject();
|
const auto& FBO = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw).GetBoundObject();
|
||||||
*params = FBO ? FBO->GetExternalIndex() : 0;
|
*params = FBO ? (GLint)FBO->GetExternalIndex() : 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_READ_FRAMEBUFFER_BINDING: {
|
case GL_READ_FRAMEBUFFER_BINDING: {
|
||||||
const auto& FBO = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read).GetBoundObject();
|
const auto& FBO = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read).GetBoundObject();
|
||||||
*params = FBO ? FBO->GetExternalIndex() : 0;
|
*params = FBO ? (GLint)FBO->GetExternalIndex() : 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_ELEMENT_ARRAY_BUFFER_BINDING: {
|
case GL_ELEMENT_ARRAY_BUFFER_BINDING: {
|
||||||
@@ -302,7 +300,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
const auto& bufferObject = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).GetBoundObject();
|
const auto& bufferObject = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).GetBoundObject();
|
||||||
*params = bufferObject ? bufferObject->GetExternalIndex() : 0;
|
*params = bufferObject ? (GLint)bufferObject->GetExternalIndex() : 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
|
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
|
||||||
@@ -886,7 +884,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
default:
|
default:
|
||||||
MGLOG_E("glGetIntegerv: Invalid enum %s (0x%X)", MG_Util::ConvertGLEnumToString(pname).c_str(), pname);
|
MGLOG_E("glGetIntegerv: Invalid enum %s (0x%X)", MG_Util::ConvertGLEnumToString(pname).c_str(), pname);
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GetIntegerv",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GetIntegerv",
|
||||||
std::format("Invalid enum: 0x{:X}", pname)));
|
std::format("Invalid enum: 0x{:X}", pname)));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -894,7 +892,10 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GLenum GetError() {
|
GLenum GetError() {
|
||||||
ErrorCode errorCode = MG_State::pGLContext->PopGLError().value_or(Error{ErrorCode::NoError, nullptr}).code;
|
auto error = MG_State::pGLContext->PopGLError();
|
||||||
return MG_Util::ConvertErrorCodeToGLEnum(errorCode);
|
if (!error || !error->get()) {
|
||||||
|
return GL_NO_ERROR;
|
||||||
|
}
|
||||||
|
return MG_Util::ConvertErrorCodeToGLEnum(error->get()->code);
|
||||||
}
|
}
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
|
|||||||
@@ -8,35 +8,35 @@
|
|||||||
|
|
||||||
#include "GL_Program.h"
|
#include "GL_Program.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "MG_Util/Converters/GLToStr/GLEnumConverter.h"
|
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
|
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
||||||
#include <MG_Util/Converters/GLToMG/ProgramEnumConverter.h>
|
#include <MG_Util/Converters/GLToMG/ProgramEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/ProgramEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/ProgramEnumConverter.h>
|
||||||
#include <MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.h>
|
#include <MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
static bool CheckShaderNameValidity(Uint shader) {
|
static bool CheckShaderNameValidity(Uint shader) {
|
||||||
if (shader == 0 || !MG_State::pGLContext->ValidateShaderName(shader)) {
|
if (shader == 0 || !MG_State::pGLContext->ValidateShaderName(shader)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(shader) + " is not a valid name."));
|
std::to_string(shader) + " is not a valid name."));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SharedPtr<MG_State::GLState::ShaderObject> TryToGetShaderObject(Uint shader) {
|
static const SharedPtr<MG_State::GLState::ShaderObject>& TryToGetShaderObject(Uint shader) {
|
||||||
if (!CheckShaderNameValidity(shader)) return nullptr;
|
static const SharedPtr<MG_State::GLState::ShaderObject> nullShaderObject = nullptr;
|
||||||
|
if (!CheckShaderNameValidity(shader)) return nullShaderObject;
|
||||||
|
|
||||||
auto shaderObject = MG_State::pGLContext->GetShaderObject(shader);
|
auto& shaderObject = MG_State::pGLContext->GetShaderObject(shader);
|
||||||
if (!shaderObject) {
|
if (!shaderObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(shader) + " is not a shader object."));
|
std::to_string(shader) + " is not a shader object."));
|
||||||
return nullptr;
|
return nullShaderObject;
|
||||||
}
|
}
|
||||||
return shaderObject;
|
return shaderObject;
|
||||||
}
|
}
|
||||||
@@ -45,23 +45,24 @@ namespace MobileGL {
|
|||||||
if (!MG_State::pGLContext->ValidateProgramName(program)) {
|
if (!MG_State::pGLContext->ValidateProgramName(program)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) + " is not a valid name."));
|
std::to_string(program) + " is not a valid name."));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SharedPtr<MG_State::GLState::ProgramObject> TryToGetProgramObject(GLuint program) {
|
static const SharedPtr<MG_State::GLState::ProgramObject>& TryToGetProgramObject(GLuint program) {
|
||||||
if (!CheckProgramNameValidity(program)) return nullptr;
|
static const SharedPtr<MG_State::GLState::ProgramObject> nullProgramObject = nullptr;
|
||||||
|
if (!CheckProgramNameValidity(program)) return nullProgramObject;
|
||||||
|
|
||||||
auto programObject = MG_State::pGLContext->GetProgramObject(program);
|
auto& programObject = MG_State::pGLContext->GetProgramObject(program);
|
||||||
if (!programObject) {
|
if (!programObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) + " is not a program object."));
|
std::to_string(program) + " is not a program object."));
|
||||||
return nullptr;
|
return nullProgramObject;
|
||||||
}
|
}
|
||||||
return programObject;
|
return programObject;
|
||||||
}
|
}
|
||||||
@@ -77,13 +78,13 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AttachShader_State(GLuint program, GLuint shader) {
|
void AttachShader_State(GLuint program, GLuint shader) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
auto shaderObject = TryToGetShaderObject(shader);
|
auto& shaderObject = TryToGetShaderObject(shader);
|
||||||
if (!shaderObject) return;
|
if (!shaderObject) return;
|
||||||
if (!programObject->AttachShader(shaderObject)) {
|
if (!programObject->AttachShader(shaderObject)) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(shader) +
|
std::to_string(shader) +
|
||||||
" is already attached to " +
|
" is already attached to " +
|
||||||
std::to_string(program) + "."));
|
std::to_string(program) + "."));
|
||||||
@@ -95,7 +96,7 @@ namespace MobileGL {
|
|||||||
if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) {
|
if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"index " + std::to_string(index) +
|
"index " + std::to_string(index) +
|
||||||
" is greater than or equal to `GL_MAX_VERTEX_ATTRIBS`."));
|
" is greater than or equal to `GL_MAX_VERTEX_ATTRIBS`."));
|
||||||
return;
|
return;
|
||||||
@@ -104,13 +105,12 @@ namespace MobileGL {
|
|||||||
if (strncmp(name, "gl_", 3) == 0) {
|
if (strncmp(name, "gl_", 3) == 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"name " + std::string(name) +
|
"name " + std::string(name) + " starts with the reserved prefix `gl_`."));
|
||||||
" starts with the reserved prefix `gl_`."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
|
|
||||||
MGLOG_D("%s: loc %02d = \"%s\"", __func__, index, name);
|
MGLOG_D("%s: loc %02d = \"%s\"", __func__, index, name);
|
||||||
@@ -118,12 +118,12 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CompileShader_State(GLuint shader) {
|
void CompileShader_State(GLuint shader) {
|
||||||
auto shaderObject = TryToGetShaderObject(shader);
|
auto& shaderObject = TryToGetShaderObject(shader);
|
||||||
if (!shaderObject) return;
|
if (!shaderObject) return;
|
||||||
shaderObject->Compile();
|
shaderObject->Compile();
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint CreateProgram_State(void) {
|
GLuint CreateProgram_State() {
|
||||||
return MG_State::pGLContext->CreateProgram();
|
return MG_State::pGLContext->CreateProgram();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ namespace MobileGL {
|
|||||||
if (shaderId == 0) {
|
if (shaderId == 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`shaderType` is not an accepted value."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`shaderType` is not an accepted value."));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return shaderId;
|
return shaderId;
|
||||||
@@ -149,16 +149,16 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DetachShader_State(GLuint program, GLuint shader) {
|
void DetachShader_State(GLuint program, GLuint shader) {
|
||||||
auto shaderObject = TryToGetShaderObject(shader);
|
auto& shaderObject = TryToGetShaderObject(shader);
|
||||||
if (!shaderObject) return;
|
if (!shaderObject) return;
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
|
|
||||||
auto count = programObject->DetachShader(shaderObject);
|
auto count = programObject->DetachShader(shaderObject);
|
||||||
if (count <= 0) {
|
if (count <= 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "Shader is not attached to program."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "Shader is not attached to program."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -168,17 +168,17 @@ namespace MobileGL {
|
|||||||
if (bufSize < 0) {
|
if (bufSize < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"bufSize " + std::to_string(bufSize) + " is less than 0."));
|
"bufSize " + std::to_string(bufSize) + " is less than 0."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject || !programObject->GetLinkStatus()) return;
|
if (!programObject || !programObject->GetLinkStatus()) return;
|
||||||
auto attribCount = programObject->GetActiveAttributesCount();
|
auto attribCount = programObject->GetActiveAttributesCount();
|
||||||
if (index >= attribCount) {
|
if (index >= attribCount) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", __func__,
|
"MG_Impl/GLImpl", __func__,
|
||||||
"index " + std::to_string(index) +
|
"index " + std::to_string(index) +
|
||||||
" is greater than or equal to the number of active attribute variables in " +
|
" is greater than or equal to the number of active attribute variables in " +
|
||||||
@@ -188,7 +188,7 @@ namespace MobileGL {
|
|||||||
if (type != nullptr) *type = programObject->GetAttribType(index);
|
if (type != nullptr) *type = programObject->GetAttribType(index);
|
||||||
if (bufSize == 0) return;
|
if (bufSize == 0) return;
|
||||||
auto& attribName = programObject->GetAttribName(index);
|
auto& attribName = programObject->GetAttribName(index);
|
||||||
CopyStr(bufSize, length, name, attribName.c_str(), attribName.length());
|
CopyStr(bufSize, length, name, attribName.c_str(), (GLsizei)attribName.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetActiveUniform_State(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size,
|
void GetActiveUniform_State(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size,
|
||||||
@@ -196,17 +196,17 @@ namespace MobileGL {
|
|||||||
if (bufSize < 0) {
|
if (bufSize < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"bufSize " + std::to_string(bufSize) + " is less than 0."));
|
"bufSize " + std::to_string(bufSize) + " is less than 0."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject || !programObject->GetLinkStatus()) return;
|
if (!programObject || !programObject->GetLinkStatus()) return;
|
||||||
auto uniformCount = programObject->GetUniformCount();
|
auto uniformCount = programObject->GetUniformCount();
|
||||||
if (index >= uniformCount) {
|
if (index >= uniformCount) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", __func__,
|
"MG_Impl/GLImpl", __func__,
|
||||||
"index " + std::to_string(index) +
|
"index " + std::to_string(index) +
|
||||||
" is greater than or equal to the number of active uniform variables in " +
|
" is greater than or equal to the number of active uniform variables in " +
|
||||||
@@ -217,18 +217,18 @@ namespace MobileGL {
|
|||||||
if (type != nullptr) *type = programObject->GetUniformType(index);
|
if (type != nullptr) *type = programObject->GetUniformType(index);
|
||||||
if (bufSize == 0) return;
|
if (bufSize == 0) return;
|
||||||
auto& uniformName = programObject->GetUniformName(index);
|
auto& uniformName = programObject->GetUniformName(index);
|
||||||
CopyStr(bufSize, length, name, uniformName.c_str(), uniformName.length());
|
CopyStr(bufSize, length, name, uniformName.c_str(), (GLsizei)uniformName.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetAttachedShaders_State(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) {
|
void GetAttachedShaders_State(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) {
|
||||||
if (maxCount < 0) {
|
if (maxCount < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"maxCount " + std::to_string(maxCount) + " is less than 0."));
|
"maxCount " + std::to_string(maxCount) + " is less than 0."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
const auto& s = programObject->GetAttachedShaders();
|
const auto& s = programObject->GetAttachedShaders();
|
||||||
GLsizei c = std::min((GLsizei)s.size(), maxCount);
|
GLsizei c = std::min((GLsizei)s.size(), maxCount);
|
||||||
@@ -239,7 +239,7 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GLint GetAttribLocation_State(GLuint program, const GLchar* name) {
|
GLint GetAttribLocation_State(GLuint program, const GLchar* name) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return -1;
|
if (!programObject) return -1;
|
||||||
if (strncmp(name, "gl_", 3) == 0) return -1;
|
if (strncmp(name, "gl_", 3) == 0) return -1;
|
||||||
if (!programObject->GetLinkStatus()) return -1;
|
if (!programObject->GetLinkStatus()) return -1;
|
||||||
@@ -247,7 +247,7 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GetProgramiv_State(GLuint program, GLenum pname, GLint* params) {
|
void GetProgramiv_State(GLuint program, GLenum pname, GLint* params) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
|
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
@@ -265,13 +265,13 @@ namespace MobileGL {
|
|||||||
break;
|
break;
|
||||||
case GL_INFO_LOG_LENGTH: {
|
case GL_INFO_LOG_LENGTH: {
|
||||||
const auto& log = programObject->GetInfoLog();
|
const auto& log = programObject->GetInfoLog();
|
||||||
*params = log.length();
|
*params = (GLint)log.length();
|
||||||
MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params);
|
MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_ATTACHED_SHADERS: {
|
case GL_ATTACHED_SHADERS: {
|
||||||
const auto& attachedShaders = programObject->GetAttachedShaders();
|
const auto& attachedShaders = programObject->GetAttachedShaders();
|
||||||
*params = attachedShaders.size();
|
*params = (GLint)attachedShaders.size();
|
||||||
MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params);
|
MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -288,7 +288,7 @@ namespace MobileGL {
|
|||||||
MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params);
|
MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params);
|
||||||
break;
|
break;
|
||||||
case GL_ACTIVE_UNIFORMS:
|
case GL_ACTIVE_UNIFORMS:
|
||||||
*params = programObject->GetUniformCount();
|
*params = (GLint)programObject->GetUniformCount();
|
||||||
MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params);
|
MGLOG_D("%s: %s = %d", __func__, MG_Util::ConvertGLEnumToString(pname).c_str(), *params);
|
||||||
break;
|
break;
|
||||||
case GL_ACTIVE_UNIFORM_MAX_LENGTH:
|
case GL_ACTIVE_UNIFORM_MAX_LENGTH:
|
||||||
@@ -317,27 +317,27 @@ namespace MobileGL {
|
|||||||
MGLOG_D("%s: %s", __func__, MG_Util::ConvertGLEnumToString(pname).c_str());
|
MGLOG_D("%s: %s", __func__, MG_Util::ConvertGLEnumToString(pname).c_str());
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"pname " + std::to_string(pname) + " is not an accepted value."));
|
"pname " + std::to_string(pname) + " is not an accepted value."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetProgramInfoLog_State(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) {
|
void GetProgramInfoLog_State(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
|
|
||||||
const auto& log = programObject->GetInfoLog();
|
const auto& log = programObject->GetInfoLog();
|
||||||
CopyStr(bufSize, length, infoLog, log.c_str(), log.length());
|
CopyStr(bufSize, length, infoLog, log.c_str(), (GLsizei)log.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetShaderiv_State(GLuint shader, GLenum pname, GLint* params) {
|
void GetShaderiv_State(GLuint shader, GLenum pname, GLint* params) {
|
||||||
auto shaderObject = TryToGetShaderObject(shader);
|
auto& shaderObject = TryToGetShaderObject(shader);
|
||||||
if (!shaderObject) return;
|
if (!shaderObject) return;
|
||||||
|
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
case GL_SHADER_TYPE:
|
case GL_SHADER_TYPE:
|
||||||
*params = MG_Util::ConvertShaderStageToGLEnum(shaderObject->GetShaderStage());
|
*params = (GLint)MG_Util::ConvertShaderStageToGLEnum(shaderObject->GetShaderStage());
|
||||||
break;
|
break;
|
||||||
case GL_DELETE_STATUS:
|
case GL_DELETE_STATUS:
|
||||||
*params = shaderObject->GetDeleteStatus();
|
*params = shaderObject->GetDeleteStatus();
|
||||||
@@ -346,45 +346,45 @@ namespace MobileGL {
|
|||||||
*params = shaderObject->GetCompileStatus();
|
*params = shaderObject->GetCompileStatus();
|
||||||
break;
|
break;
|
||||||
case GL_INFO_LOG_LENGTH:
|
case GL_INFO_LOG_LENGTH:
|
||||||
*params = shaderObject->GetInfoLog().length();
|
*params = (GLint)shaderObject->GetInfoLog().length();
|
||||||
break;
|
break;
|
||||||
case GL_SHADER_SOURCE_LENGTH:
|
case GL_SHADER_SOURCE_LENGTH:
|
||||||
*params = shaderObject->GetShaderSource().length();
|
*params = (GLint)shaderObject->GetShaderSource().length();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"pname " + std::to_string(pname) + " is not an accepted value."));
|
"pname " + std::to_string(pname) + " is not an accepted value."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetShaderInfoLog_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) {
|
void GetShaderInfoLog_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) {
|
||||||
auto shaderObject = TryToGetShaderObject(shader);
|
auto& shaderObject = TryToGetShaderObject(shader);
|
||||||
if (!shaderObject) return;
|
if (!shaderObject) return;
|
||||||
|
|
||||||
const auto& log = shaderObject->GetInfoLog();
|
const auto& log = shaderObject->GetInfoLog();
|
||||||
CopyStr(bufSize, length, infoLog, log.c_str(), log.length());
|
CopyStr(bufSize, length, infoLog, log.c_str(), (GLsizei)log.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetShaderSource_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) {
|
void GetShaderSource_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) {
|
||||||
if (bufSize < 0) {
|
if (bufSize < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"bufSize " + std::to_string(bufSize) + " is less than 0."));
|
"bufSize " + std::to_string(bufSize) + " is less than 0."));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto shaderObject = TryToGetShaderObject(shader);
|
auto& shaderObject = TryToGetShaderObject(shader);
|
||||||
if (!shaderObject) return;
|
if (!shaderObject) return;
|
||||||
|
|
||||||
auto& src = shaderObject->GetShaderSource();
|
auto& src = shaderObject->GetShaderSource();
|
||||||
CopyStr(bufSize, length, source, src.c_str(), src.length());
|
CopyStr(bufSize, length, source, src.c_str(), (GLsizei)src.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
GLint GetUniformLocation_State(GLuint program, const GLchar* name) {
|
GLint GetUniformLocation_State(GLuint program, const GLchar* name) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return -1;
|
if (!programObject) return -1;
|
||||||
auto loc = programObject->GetUniformLocation(name);
|
auto loc = programObject->GetUniformLocation(name);
|
||||||
MGLOG_D("%s: loc %02d = %s", __func__, loc, name);
|
MGLOG_D("%s: loc %02d = %s", __func__, loc, name);
|
||||||
@@ -392,13 +392,13 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GetUniform_State(GLuint program, GLint location, void* params) {
|
void GetUniform_State(GLuint program, GLint location, void* params) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
|
|
||||||
if (!programObject->GetLinkStatus()) {
|
if (!programObject->GetLinkStatus()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) + " has not been successfully linked."));
|
std::to_string(program) + " has not been successfully linked."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -407,7 +407,7 @@ namespace MobileGL {
|
|||||||
if (location < 0 || location > programObject->GetMaxUniformLocation()) {
|
if (location < 0 || location > programObject->GetMaxUniformLocation()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"location " + std::to_string(location) +
|
"location " + std::to_string(location) +
|
||||||
" does not correspond to a valid uniform variable location "
|
" does not correspond to a valid uniform variable location "
|
||||||
"for the specified program object."));
|
"for the specified program object."));
|
||||||
@@ -419,7 +419,7 @@ namespace MobileGL {
|
|||||||
if (uniformName.empty()) {
|
if (uniformName.empty()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"location " + std::to_string(location) +
|
"location " + std::to_string(location) +
|
||||||
" does not correspond to a valid uniform variable location "
|
" does not correspond to a valid uniform variable location "
|
||||||
"for the specified program object."));
|
"for the specified program object."));
|
||||||
@@ -441,8 +441,8 @@ namespace MobileGL {
|
|||||||
// assuming float here, which may not be the case
|
// assuming float here, which may not be the case
|
||||||
auto* pBase = pUBO + offset;
|
auto* pBase = pUBO + offset;
|
||||||
for (int i = 0; i < ttype->getMatrixRows(); i++) {
|
for (int i = 0; i < ttype->getMatrixRows(); i++) {
|
||||||
Memcpy((char*)params + ttype->getMatrixCols() * sizeof(float) * i,
|
Memcpy((char*)params + ttype->getMatrixCols() * sizeof(float) * i, pBase + 4 * sizeof(float) * i,
|
||||||
pBase + 4 * sizeof(float) * i, ttype->getMatrixCols() * sizeof(float));
|
ttype->getMatrixCols() * sizeof(float));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -474,7 +474,7 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LinkProgram_State(GLuint program) {
|
void LinkProgram_State(GLuint program) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
MGLOG_D("%s: linking program %d", __func__, program);
|
MGLOG_D("%s: linking program %d", __func__, program);
|
||||||
|
|
||||||
@@ -496,12 +496,12 @@ namespace MobileGL {
|
|||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"count " + std::to_string(count) + " is less than 0."));
|
"count " + std::to_string(count) + " is less than 0."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto shaderObject = TryToGetShaderObject(shader);
|
auto& shaderObject = TryToGetShaderObject(shader);
|
||||||
if (!shaderObject) return;
|
if (!shaderObject) return;
|
||||||
|
|
||||||
std::string src;
|
std::string src;
|
||||||
@@ -511,7 +511,7 @@ namespace MobileGL {
|
|||||||
shaderObject->SetShaderSource(Move(src));
|
shaderObject->SetShaderSource(Move(src));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseProgram_State(GLint program) {
|
void UseProgram_State(GLuint program) {
|
||||||
MGLOG_D("UseProgram_State: program=%u", program);
|
MGLOG_D("UseProgram_State: program=%u", program);
|
||||||
|
|
||||||
if (program == 0) {
|
if (program == 0) {
|
||||||
@@ -519,7 +519,7 @@ namespace MobileGL {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
MG_State::pGLContext->UseProgram(program);
|
MG_State::pGLContext->UseProgram(program);
|
||||||
}
|
}
|
||||||
@@ -533,8 +533,8 @@ namespace MobileGL {
|
|||||||
auto size = programObject.GetUniformSizesInBytes(location);
|
auto size = programObject.GetUniformSizesInBytes(location);
|
||||||
auto offset = programObject.GetUniformOffset(location);
|
auto offset = programObject.GetUniformOffset(location);
|
||||||
MOBILEGL_ASSERT(size >= ItemCount * sizeof(T),
|
MOBILEGL_ASSERT(size >= ItemCount * sizeof(T),
|
||||||
"Uniform size mismatch, expected at least %zu bytes, got %zu bytes.",
|
"Uniform size mismatch, expected at least %zu bytes, got %zu bytes.", ItemCount * sizeof(T),
|
||||||
ItemCount * sizeof(T), size);
|
size);
|
||||||
MGLOG_D("%s: program = %d, location = %d, byteOffset = %d", __func__, programObject.GetExternalIndex(),
|
MGLOG_D("%s: program = %d, location = %d, byteOffset = %d", __func__, programObject.GetExternalIndex(),
|
||||||
location, offset + byteOffsetInsideUniform);
|
location, offset + byteOffsetInsideUniform);
|
||||||
Memcpy((char*)programObject.MapUBO() + offset + byteOffsetInsideUniform, value, ItemCount * sizeof(T));
|
Memcpy((char*)programObject.MapUBO() + offset + byteOffsetInsideUniform, value, ItemCount * sizeof(T));
|
||||||
@@ -550,18 +550,18 @@ namespace MobileGL {
|
|||||||
void Uniformv_State(GLint location, GLsizei count, T* value) {
|
void Uniformv_State(GLint location, GLsizei count, T* value) {
|
||||||
if (location == -1) return;
|
if (location == -1) return;
|
||||||
|
|
||||||
auto programObject = MG_State::pGLContext->GetCurrentProgram();
|
auto& programObject = MG_State::pGLContext->GetCurrentProgram();
|
||||||
if (programObject == nullptr) {
|
if (programObject == nullptr) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (location > programObject->GetMaxUniformLocation() || location < -1) {
|
if (location > programObject->GetMaxUniformLocation() || location < -1) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"location " + std::to_string(location) +
|
"location " + std::to_string(location) +
|
||||||
" is an invalid uniform location for the current program "
|
" is an invalid uniform location for the current program "
|
||||||
"object and location " +
|
"object and location " +
|
||||||
@@ -679,18 +679,18 @@ namespace MobileGL {
|
|||||||
// If transpose is GL_TRUE, we need to transpose the matrix data
|
// If transpose is GL_TRUE, we need to transpose the matrix data
|
||||||
if (location == -1) return;
|
if (location == -1) return;
|
||||||
|
|
||||||
auto programObject = MG_State::pGLContext->GetCurrentProgram();
|
auto& programObject = MG_State::pGLContext->GetCurrentProgram();
|
||||||
if (programObject == nullptr) {
|
if (programObject == nullptr) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (location > programObject->GetMaxUniformLocation() || location < -1) {
|
if (location > programObject->GetMaxUniformLocation() || location < -1) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"location " + std::to_string(location) +
|
"location " + std::to_string(location) +
|
||||||
" is an invalid uniform location for the current program "
|
" is an invalid uniform location for the current program "
|
||||||
"object and location " +
|
"object and location " +
|
||||||
@@ -717,18 +717,18 @@ namespace MobileGL {
|
|||||||
// If transpose is GL_TRUE, we need to transpose the matrix data
|
// If transpose is GL_TRUE, we need to transpose the matrix data
|
||||||
if (location == -1) return;
|
if (location == -1) return;
|
||||||
|
|
||||||
auto programObject = MG_State::pGLContext->GetCurrentProgram();
|
auto& programObject = MG_State::pGLContext->GetCurrentProgram();
|
||||||
if (programObject == nullptr) {
|
if (programObject == nullptr) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (location > programObject->GetMaxUniformLocation() || location < -1) {
|
if (location > programObject->GetMaxUniformLocation() || location < -1) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"location " + std::to_string(location) +
|
"location " + std::to_string(location) +
|
||||||
" is an invalid uniform location for the current program "
|
" is an invalid uniform location for the current program "
|
||||||
"object and location " +
|
"object and location " +
|
||||||
@@ -744,14 +744,12 @@ namespace MobileGL {
|
|||||||
GLfloat transposedMatrix[9];
|
GLfloat transposedMatrix[9];
|
||||||
TransposeMatrix3x3(value + i * 9, transposedMatrix);
|
TransposeMatrix3x3(value + i * 9, transposedMatrix);
|
||||||
for (int row = 0; row < 3; ++row) {
|
for (int row = 0; row < 3; ++row) {
|
||||||
Uniform_State<3>(*programObject, location + i, transposedMatrix + row * 3,
|
Uniform_State<3>(*programObject, location + i, transposedMatrix + row * 3, row * 4 * sizeof(float));
|
||||||
row * 4 * sizeof(float));
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// No transpose needed, directly copy the matrix data
|
// No transpose needed, directly copy the matrix data
|
||||||
for (int row = 0; row < 3; ++row) {
|
for (int row = 0; row < 3; ++row) {
|
||||||
Uniform_State<3>(*programObject, location + i, value + i * 9 + row * 3,
|
Uniform_State<3>(*programObject, location + i, value + i * 9 + row * 3, row * 4 * sizeof(float));
|
||||||
row * 4 * sizeof(float));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -762,18 +760,18 @@ namespace MobileGL {
|
|||||||
// If transpose is GL_TRUE, we need to transpose the matrix data
|
// If transpose is GL_TRUE, we need to transpose the matrix data
|
||||||
if (location == -1) return;
|
if (location == -1) return;
|
||||||
|
|
||||||
auto programObject = MG_State::pGLContext->GetCurrentProgram();
|
auto& programObject = MG_State::pGLContext->GetCurrentProgram();
|
||||||
if (programObject == nullptr) {
|
if (programObject == nullptr) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (location > programObject->GetMaxUniformLocation() || location < -1) {
|
if (location > programObject->GetMaxUniformLocation() || location < -1) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"location " + std::to_string(location) +
|
"location " + std::to_string(location) +
|
||||||
" is an invalid uniform location for the current program "
|
" is an invalid uniform location for the current program "
|
||||||
"object and location " +
|
"object and location " +
|
||||||
@@ -801,7 +799,7 @@ namespace MobileGL {
|
|||||||
if (!programObject->GetLinkStatus()) {
|
if (!programObject->GetLinkStatus()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) +
|
std::to_string(program) +
|
||||||
" is not a program object that has been linked."));
|
" is not a program object that has been linked."));
|
||||||
return GL_INVALID_INDEX;
|
return GL_INVALID_INDEX;
|
||||||
@@ -814,17 +812,16 @@ namespace MobileGL {
|
|||||||
void UniformBlockBinding_State(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) {
|
void UniformBlockBinding_State(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) {
|
||||||
const auto& programObject = TryToGetProgramObject(program);
|
const auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject->GetLinkStatus()) {
|
if (!programObject->GetLinkStatus()) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
ErrorCode::InvalidOperation,
|
||||||
"Program object" +
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) +
|
"Program object" + std::to_string(program) + " that has been linked."));
|
||||||
" that has been linked."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) {
|
if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", __func__,
|
"MG_Impl/GLImpl", __func__,
|
||||||
"uniformBlockIndex " + std::to_string(uniformBlockIndex) +
|
"uniformBlockIndex " + std::to_string(uniformBlockIndex) +
|
||||||
" is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is "
|
" is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is "
|
||||||
@@ -838,17 +835,16 @@ namespace MobileGL {
|
|||||||
void GetActiveUniformBlockiv_State(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) {
|
void GetActiveUniformBlockiv_State(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) {
|
||||||
const auto& programObject = TryToGetProgramObject(program);
|
const auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject->GetLinkStatus()) {
|
if (!programObject->GetLinkStatus()) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
ErrorCode::InvalidOperation,
|
||||||
"Program object" +
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) +
|
"Program object" + std::to_string(program) + " that has been linked."));
|
||||||
" that has been linked."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) {
|
if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", __func__,
|
"MG_Impl/GLImpl", __func__,
|
||||||
"uniformBlockIndex " + std::to_string(uniformBlockIndex) +
|
"uniformBlockIndex " + std::to_string(uniformBlockIndex) +
|
||||||
" is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is "
|
" is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is "
|
||||||
@@ -858,12 +854,12 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
case GL_UNIFORM_BLOCK_DATA_SIZE: {
|
case GL_UNIFORM_BLOCK_DATA_SIZE: {
|
||||||
*params = programObject->GetUBOSizeAt(uniformBlockIndex);
|
*params = (GLint)programObject->GetUBOSizeAt(uniformBlockIndex);
|
||||||
MGLOG_D("%s: GL_UNIFORM_BLOCK_DATA_SIZE = %d", __func__, *params);
|
MGLOG_D("%s: GL_UNIFORM_BLOCK_DATA_SIZE = %d", __func__, *params);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_UNIFORM_BLOCK_NAME_LENGTH: {
|
case GL_UNIFORM_BLOCK_NAME_LENGTH: {
|
||||||
*params = programObject->GetUniformBlockName(uniformBlockIndex).length() + 1;
|
*params = (GLint)programObject->GetUniformBlockName(uniformBlockIndex).length() + 1;
|
||||||
MGLOG_D("%s: GL_UNIFORM_BLOCK_NAME_LENGTH = %d", __func__, *params);
|
MGLOG_D("%s: GL_UNIFORM_BLOCK_NAME_LENGTH = %d", __func__, *params);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -887,21 +883,21 @@ namespace MobileGL {
|
|||||||
default:
|
default:
|
||||||
MGLOG_E("%s: unknown pname = %p %s", __func__, pname, MG_Util::ConvertGLEnumToString(pname).c_str());
|
MGLOG_E("%s: unknown pname = %p %s", __func__, pname, MG_Util::ConvertGLEnumToString(pname).c_str());
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
ErrorCode::InvalidEnum,
|
||||||
"pname " + std::to_string(pname) +
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
" is not one of the accepted tokens."));
|
"pname " + std::to_string(pname) + " is not one of the accepted tokens."));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetActiveUniformBlockName_State(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length,
|
void GetActiveUniformBlockName_State(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length,
|
||||||
GLchar* uniformBlockName) {
|
GLchar* uniformBlockName) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (!programObject) return;
|
if (!programObject) return;
|
||||||
if (!programObject->GetLinkStatus()) {
|
if (!programObject->GetLinkStatus()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) +
|
std::to_string(program) +
|
||||||
" is not a program object that has been linked."));
|
" is not a program object that has been linked."));
|
||||||
return;
|
return;
|
||||||
@@ -909,7 +905,7 @@ namespace MobileGL {
|
|||||||
if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) {
|
if (!programObject->IsActiveUniformBlock(uniformBlockIndex)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", __func__,
|
"MG_Impl/GLImpl", __func__,
|
||||||
"uniformBlockIndex " + std::to_string(uniformBlockIndex) +
|
"uniformBlockIndex " + std::to_string(uniformBlockIndex) +
|
||||||
" is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is "
|
" is greater than or equal to the value of `GL_ACTIVE_UNIFORM_BLOCKS` or is "
|
||||||
@@ -917,26 +913,25 @@ namespace MobileGL {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto& name = programObject->GetUniformBlockName(uniformBlockIndex);
|
const auto& name = programObject->GetUniformBlockName(uniformBlockIndex);
|
||||||
CopyStr(bufSize, length, uniformBlockName, name.c_str(), name.length());
|
CopyStr(bufSize, length, uniformBlockName, name.c_str(), (GLsizei)name.length());
|
||||||
MGLOG_D("%s: \"%s\" at uniformBlockIndex %02d, length = %d", __func__, uniformBlockName, uniformBlockIndex,
|
MGLOG_D("%s: \"%s\" at uniformBlockIndex %02d, length = %d", __func__, uniformBlockName, uniformBlockIndex,
|
||||||
*length);
|
*length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BindFragDataLocation_State(GLuint program, GLuint colorNumber, const char* name) {
|
void BindFragDataLocation_State(GLuint program, GLuint colorNumber, const char* name) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (programObject == nullptr) {
|
if (programObject == nullptr) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) + " is not the name of a program object."));
|
std::to_string(program) + " is not the name of a program object."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (strncmp(name, "gl_", 3) == 0) {
|
if (strncmp(name, "gl_", 3) == 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
"name " + std::string(name) +
|
"name " + std::string(name) + " starts with the reserved prefix `gl_`."));
|
||||||
" starts with the reserved prefix `gl_`."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: Emit error "if `colorNumber` is greater than or equal to `GL_MAX_DRAW_BUFFERS`"
|
// TODO: Emit error "if `colorNumber` is greater than or equal to `GL_MAX_DRAW_BUFFERS`"
|
||||||
@@ -946,11 +941,11 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GLint GetFragDataLocation_State(GLuint program, const char* name) {
|
GLint GetFragDataLocation_State(GLuint program, const char* name) {
|
||||||
auto programObject = TryToGetProgramObject(program);
|
auto& programObject = TryToGetProgramObject(program);
|
||||||
if (programObject == nullptr) {
|
if (programObject == nullptr) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
std::to_string(program) + " is not the name of a program object."));
|
std::to_string(program) + " is not the name of a program object."));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -1171,5 +1166,4 @@ namespace MobileGL {
|
|||||||
void ValidateProgram(GLuint program) {
|
void ValidateProgram(GLuint program) {
|
||||||
ValidateProgram_State(program);
|
ValidateProgram_State(program);
|
||||||
}
|
}
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
void AttachShader(GLuint program, GLuint shader);
|
void AttachShader(GLuint program, GLuint shader);
|
||||||
void BindAttribLocation(GLuint program, GLuint index, const GLchar* name);
|
void BindAttribLocation(GLuint program, GLuint index, const GLchar* name);
|
||||||
void CompileShader(GLuint shader);
|
void CompileShader(GLuint shader);
|
||||||
@@ -65,5 +64,4 @@ namespace MobileGL {
|
|||||||
void BindFragDataLocation(GLuint program, GLuint colorNumber, const char* name);
|
void BindFragDataLocation(GLuint program, GLuint colorNumber, const char* name);
|
||||||
GLint GetFragDataLocation(GLuint program, const char* name);
|
GLint GetFragDataLocation(GLuint program, const char* name);
|
||||||
void ValidateProgram(GLuint program);
|
void ValidateProgram(GLuint program);
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -7,19 +7,17 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#include "GL_RenderState.h"
|
#include "GL_RenderState.h"
|
||||||
#include "MG_State/GLState/RenderState/RenderState.h"
|
|
||||||
#include "MG_Util/Converters/GLToStr/GLEnumConverter.h"
|
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
|
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
||||||
#include <MG_Util/Converters/GLToMG/RenderStateEnumConverter.h>
|
#include <MG_Util/Converters/GLToMG/RenderStateEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/RenderStateEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/RenderStateEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToStr/RenderStateEnumConverter.h>
|
#include <MG_Util/Converters/MGToStr/RenderStateEnumConverter.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
void Viewport_State(GLint x, GLint y, GLsizei width, GLsizei height) {
|
void Viewport_State(GLint x, GLint y, GLsizei width, GLsizei height) {
|
||||||
if (width < 0 || height < 0) {
|
if (width < 0 || height < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "Viewport_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "Viewport_State",
|
||||||
"Width abd height must be non-negative."));
|
"Width abd height must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -53,8 +51,8 @@ namespace MobileGL {
|
|||||||
|
|
||||||
void Scissor_State(GLint x, GLint y, GLsizei width, GLsizei height) {
|
void Scissor_State(GLint x, GLint y, GLsizei width, GLsizei height) {
|
||||||
if (width < 0 || height < 0) {
|
if (width < 0 || height < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "Scissor_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "Scissor_State",
|
||||||
"Width abd height must be non-negative."));
|
"Width abd height must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -92,7 +90,7 @@ namespace MobileGL {
|
|||||||
if (pixelStoreParam == PixelStoreParam::Unknown) {
|
if (pixelStoreParam == PixelStoreParam::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "PixelStorei_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "PixelStorei_State",
|
||||||
"Pixel store param enum " +
|
"Pixel store param enum " +
|
||||||
MG_Util::ConvertPixelStoreParamToString(pixelStoreParam) + "(" +
|
MG_Util::ConvertPixelStoreParamToString(pixelStoreParam) + "(" +
|
||||||
MG_Util::ConvertGLEnumToString(pname) + ") is not supported."));
|
MG_Util::ConvertGLEnumToString(pname) + ") is not supported."));
|
||||||
@@ -115,10 +113,9 @@ namespace MobileGL {
|
|||||||
if (capInput == CapabilityInput::Unknown) {
|
if (capInput == CapabilityInput::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "IsEnabledi_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "IsEnabledi_State",
|
||||||
"Capability enum " +
|
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
||||||
MG_Util::ConvertCapabilityInputToString(capInput) + "(" +
|
"(" + MG_Util::ConvertGLEnumToString(target) + ") is not supported."));
|
||||||
MG_Util::ConvertGLEnumToString(target) + ") is not supported."));
|
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,8 +126,8 @@ namespace MobileGL {
|
|||||||
CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap);
|
CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap);
|
||||||
if (capInput == CapabilityInput::Unknown) {
|
if (capInput == CapabilityInput::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>(
|
ErrorCode::InvalidEnum,
|
||||||
"MG_Impl/GLImpl", "IsEnabled_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "IsEnabled_State",
|
||||||
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
||||||
"(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported."));
|
"(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported."));
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
@@ -151,8 +148,8 @@ namespace MobileGL {
|
|||||||
CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap);
|
CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap);
|
||||||
if (capInput == CapabilityInput::Unknown) {
|
if (capInput == CapabilityInput::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>(
|
ErrorCode::InvalidEnum,
|
||||||
"MG_Impl/GLImpl", "Enable_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "Enable_State",
|
||||||
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
||||||
"(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported."));
|
"(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported."));
|
||||||
return;
|
return;
|
||||||
@@ -165,8 +162,8 @@ namespace MobileGL {
|
|||||||
CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap);
|
CapabilityInput capInput = MG_Util::ConvertGLEnumToCapabilityInput(cap);
|
||||||
if (capInput == CapabilityInput::Unknown) {
|
if (capInput == CapabilityInput::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>(
|
ErrorCode::InvalidEnum,
|
||||||
"MG_Impl/GLImpl", "Disable_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "Disable_State",
|
||||||
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
||||||
"(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported."));
|
"(" + MG_Util::ConvertGLEnumToString(cap) + ") is not supported."));
|
||||||
return;
|
return;
|
||||||
@@ -188,10 +185,9 @@ namespace MobileGL {
|
|||||||
if (depthFunc == DepthTestFunc::Unknown) {
|
if (depthFunc == DepthTestFunc::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DepthFunc_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DepthFunc_State",
|
||||||
"Depth function enum " +
|
"Depth function enum " + MG_Util::ConvertDepthTestFuncToString(depthFunc) +
|
||||||
MG_Util::ConvertDepthTestFuncToString(depthFunc) + "(" +
|
"(" + MG_Util::ConvertGLEnumToString(func) + ") is not supported."));
|
||||||
MG_Util::ConvertGLEnumToString(func) + ") is not supported."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,7 +199,7 @@ namespace MobileGL {
|
|||||||
if (cullFaceMode == CullFaceMode::Unknown) {
|
if (cullFaceMode == CullFaceMode::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "CullFace_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "CullFace_State",
|
||||||
"Cull face mode enum " +
|
"Cull face mode enum " +
|
||||||
MG_Util::ConvertCullFaceModeToString(cullFaceMode) + "(" +
|
MG_Util::ConvertCullFaceModeToString(cullFaceMode) + "(" +
|
||||||
MG_Util::ConvertGLEnumToString(mode) + ") is not supported."));
|
MG_Util::ConvertGLEnumToString(mode) + ") is not supported."));
|
||||||
@@ -232,7 +228,7 @@ namespace MobileGL {
|
|||||||
dstAlpha == BlendFactor::Unknown) {
|
dstAlpha == BlendFactor::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BlendFuncSeparate_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BlendFuncSeparate_State",
|
||||||
"One of the blend factor enums is not supported: srcRGB " +
|
"One of the blend factor enums is not supported: srcRGB " +
|
||||||
MG_Util::ConvertBlendFactorToString(srcRGB) + "(" +
|
MG_Util::ConvertBlendFactorToString(srcRGB) + "(" +
|
||||||
MG_Util::ConvertGLEnumToString(sfactorRGB) + "), dstRGB " +
|
MG_Util::ConvertGLEnumToString(sfactorRGB) + "), dstRGB " +
|
||||||
@@ -276,7 +272,7 @@ namespace MobileGL {
|
|||||||
if (buf >= MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) {
|
if (buf >= MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", "BlendFuncSeparatei_State",
|
"MG_Impl/GLImpl", "BlendFuncSeparatei_State",
|
||||||
"Buffer index " + std::to_string(buf) + " is out of range. Max supported is " +
|
"Buffer index " + std::to_string(buf) + " is out of range. Max supported is " +
|
||||||
std::to_string(MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS - 1) + "."));
|
std::to_string(MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS - 1) + "."));
|
||||||
@@ -295,10 +291,9 @@ namespace MobileGL {
|
|||||||
if (capInput == CapabilityInput::Unknown) {
|
if (capInput == CapabilityInput::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "Disablei_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "Disablei_State",
|
||||||
"Capability enum " +
|
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
||||||
MG_Util::ConvertCapabilityInputToString(capInput) + "(" +
|
"(" + MG_Util::ConvertGLEnumToString(target) + ") is not supported."));
|
||||||
MG_Util::ConvertGLEnumToString(target) + ") is not supported."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,10 +305,9 @@ namespace MobileGL {
|
|||||||
if (capInput == CapabilityInput::Unknown) {
|
if (capInput == CapabilityInput::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "Enablei_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "Enablei_State",
|
||||||
"Capability enum " +
|
"Capability enum " + MG_Util::ConvertCapabilityInputToString(capInput) +
|
||||||
MG_Util::ConvertCapabilityInputToString(capInput) + "(" +
|
"(" + MG_Util::ConvertGLEnumToString(target) + ") is not supported."));
|
||||||
MG_Util::ConvertGLEnumToString(target) + ") is not supported."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,5 +470,4 @@ namespace MobileGL {
|
|||||||
void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
|
void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
|
||||||
ClearColor_State(red, green, blue, alpha);
|
ClearColor_State(red, green, blue, alpha);
|
||||||
}
|
}
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
||||||
void BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
|
void BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
|
||||||
void Disablei(GLenum target, GLuint index);
|
void Disablei(GLenum target, GLuint index);
|
||||||
@@ -51,5 +50,4 @@ namespace MobileGL {
|
|||||||
void ClearStencil(GLint s);
|
void ClearStencil(GLint s);
|
||||||
void ClearDepth(GLclampd depth);
|
void ClearDepth(GLclampd depth);
|
||||||
void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
|
void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -12,15 +12,16 @@
|
|||||||
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/TextureEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/TextureEnumConverter.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
void SetSamplerParam_State(GLuint sampler, GLenum pname, const void* param, bool isFloat, bool isInteger) {
|
void SetSamplerParam_State(GLuint sampler, GLenum pname, const void* param, bool isFloat, bool isInteger) {
|
||||||
if (!SamplerImpl::ValidateSamplerName(sampler)) return;
|
if (!SamplerImpl::ValidateSamplerName(sampler)) return;
|
||||||
|
|
||||||
auto samplerObj = MG_State::pGLContext->GetSamplerObject(sampler);
|
Bool doesSamplerObjectCreated = MG_State::pGLContext->ValidateSamplerObject(sampler);
|
||||||
if (!samplerObj) {
|
if (!doesSamplerObjectCreated) {
|
||||||
samplerObj = MG_State::pGLContext->CreateSamplerObject(sampler); // for compatibility
|
// Create one for compatibility
|
||||||
|
MG_State::pGLContext->CreateSamplerObject(sampler);
|
||||||
}
|
}
|
||||||
|
auto& samplerObj = MG_State::pGLContext->GetSamplerObject(sampler);
|
||||||
if (!SamplerImpl::ValidateSamplerObject(sampler)) return;
|
if (!SamplerImpl::ValidateSamplerObject(sampler)) return;
|
||||||
|
|
||||||
using namespace MG_Util;
|
using namespace MG_Util;
|
||||||
@@ -57,8 +58,8 @@ namespace MobileGL {
|
|||||||
samplerObj->SetSamplerCompareFunc(MG_Util::ConvertGLEnumToSamplerCompareFunc(*(const GLint*)param));
|
samplerObj->SetSamplerCompareFunc(MG_Util::ConvertGLEnumToSamplerCompareFunc(*(const GLint*)param));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "SetSamplerParam_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "SetSamplerParam_State",
|
||||||
"Invalid pname for sampler parameter"));
|
"Invalid pname for sampler parameter"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,29 +67,31 @@ namespace MobileGL {
|
|||||||
void GetSamplerParam_State(GLuint sampler, GLenum pname, void* params, bool isFloat, bool isInteger) {
|
void GetSamplerParam_State(GLuint sampler, GLenum pname, void* params, bool isFloat, bool isInteger) {
|
||||||
if (!SamplerImpl::ValidateSamplerName(sampler)) return;
|
if (!SamplerImpl::ValidateSamplerName(sampler)) return;
|
||||||
|
|
||||||
auto samplerObj = MG_State::pGLContext->GetSamplerObject(sampler);
|
Bool doesSamplerObjectCreated = MG_State::pGLContext->ValidateSamplerObject(sampler);
|
||||||
if (!samplerObj) {
|
if (!doesSamplerObjectCreated) {
|
||||||
samplerObj = MG_State::pGLContext->CreateSamplerObject(sampler); // for compatibility
|
// Create one for compatibility
|
||||||
|
MG_State::pGLContext->CreateSamplerObject(sampler);
|
||||||
}
|
}
|
||||||
|
auto& samplerObj = MG_State::pGLContext->GetSamplerObject(sampler);
|
||||||
if (!SamplerImpl::ValidateSamplerObject(sampler)) return;
|
if (!SamplerImpl::ValidateSamplerObject(sampler)) return;
|
||||||
|
|
||||||
using namespace MG_Util;
|
using namespace MG_Util;
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
case GL_TEXTURE_WRAP_S:
|
case GL_TEXTURE_WRAP_S:
|
||||||
*(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapS());
|
*(GLuint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapS());
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_WRAP_T:
|
case GL_TEXTURE_WRAP_T:
|
||||||
*(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapT());
|
*(GLuint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapT());
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_WRAP_R:
|
case GL_TEXTURE_WRAP_R:
|
||||||
*(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapR());
|
*(GLuint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapR());
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_MIN_FILTER:
|
case GL_TEXTURE_MIN_FILTER:
|
||||||
*(GLint*)params =
|
*(GLuint*)params =
|
||||||
MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMinFilter(), samplerObj->GetMipmapMode());
|
MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMinFilter(), samplerObj->GetMipmapMode());
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_MAG_FILTER:
|
case GL_TEXTURE_MAG_FILTER:
|
||||||
*(GLint*)params =
|
*(GLuint*)params =
|
||||||
MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMagFilter(), SamplerMipmapMode::None);
|
MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMagFilter(), SamplerMipmapMode::None);
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_MIN_LOD:
|
case GL_TEXTURE_MIN_LOD:
|
||||||
@@ -101,14 +104,14 @@ namespace MobileGL {
|
|||||||
*(GLfloat*)params = samplerObj->GetLodBias();
|
*(GLfloat*)params = samplerObj->GetLodBias();
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_COMPARE_MODE:
|
case GL_TEXTURE_COMPARE_MODE:
|
||||||
*(GLint*)params = MG_Util::ConvertSamplerCompareModeToGLEnum(samplerObj->GetCompareMode());
|
*(GLuint*)params = MG_Util::ConvertSamplerCompareModeToGLEnum(samplerObj->GetCompareMode());
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_COMPARE_FUNC:
|
case GL_TEXTURE_COMPARE_FUNC:
|
||||||
*(GLint*)params = MG_Util::ConvertSamplerCompareFuncToGLEnum(samplerObj->GetSamplerCompareFunc());
|
*(GLuint*)params = MG_Util::ConvertSamplerCompareFuncToGLEnum(samplerObj->GetSamplerCompareFunc());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GetSamplerParam_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GetSamplerParam_State",
|
||||||
"Invalid pname for sampler parameter"));
|
"Invalid pname for sampler parameter"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,21 +125,20 @@ namespace MobileGL {
|
|||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto names = MG_State::pGLContext->GenSamplerNames(count);
|
static thread_local Vector<GLuint> names;
|
||||||
for (GLsizei i = 0; i < count; ++i) {
|
MG_State::pGLContext->GenSamplerNames(count, names);
|
||||||
samplers[i] = names[i];
|
Memcpy(samplers, names.data(), count * sizeof(GLuint));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeleteSamplers_State(GLsizei count, const GLuint* samplers) {
|
void DeleteSamplers_State(GLsizei count, const GLuint* samplers) {
|
||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteSamplers", "count must be non-negative"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteSamplers", "count must be non-negative"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,11 +153,13 @@ namespace MobileGL {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto names = MG_State::pGLContext->GenSamplerNames(n);
|
static thread_local Vector<GLuint> names;
|
||||||
|
MG_State::pGLContext->GenSamplerNames(n, names);
|
||||||
|
Memcpy(samplers, names.data(), n * sizeof(GLuint));
|
||||||
for (GLsizei i = 0; i < n; ++i) {
|
for (GLsizei i = 0; i < n; ++i) {
|
||||||
samplers[i] = names[i];
|
samplers[i] = names[i];
|
||||||
MG_State::pGLContext->CreateSamplerObject(names[i]);
|
MG_State::pGLContext->CreateSamplerObject(names[i]);
|
||||||
@@ -166,19 +170,20 @@ namespace MobileGL {
|
|||||||
if (unit >= MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS) {
|
if (unit >= MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BindSampler", "texture unit out of range"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BindSampler", "texture unit out of range"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& textureUnit = MG_State::pGLContext->GetTextureUnitObject(unit);
|
auto& textureUnit = MG_State::pGLContext->GetTextureUnitObject((Int)unit);
|
||||||
if (sampler == 0) {
|
if (sampler == 0) {
|
||||||
textureUnit.SetSamplerObject(nullptr);
|
textureUnit.SetSamplerObject(nullptr);
|
||||||
} else {
|
} else {
|
||||||
if (!SamplerImpl::ValidateSamplerName(sampler)) return;
|
if (!SamplerImpl::ValidateSamplerName(sampler)) return;
|
||||||
auto samplerObject = MG_State::pGLContext->GetSamplerObject(sampler);
|
Bool doesSamplerObjectCreated = MG_State::pGLContext->ValidateSamplerObject(sampler);
|
||||||
if (!samplerObject) {
|
if (!doesSamplerObjectCreated) {
|
||||||
samplerObject = MG_State::pGLContext->CreateSamplerObject(sampler);
|
MG_State::pGLContext->CreateSamplerObject(sampler);
|
||||||
}
|
}
|
||||||
|
auto& samplerObject = MG_State::pGLContext->GetSamplerObject(sampler);
|
||||||
|
|
||||||
textureUnit.SetSamplerObject(MG_State::pGLContext->GetSamplerObject(sampler));
|
textureUnit.SetSamplerObject(MG_State::pGLContext->GetSamplerObject(sampler));
|
||||||
}
|
}
|
||||||
@@ -188,7 +193,7 @@ namespace MobileGL {
|
|||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "BindSamplers", "count must be non-negative"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "BindSamplers", "count must be non-negative"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,5 +266,4 @@ namespace MobileGL {
|
|||||||
void BindSampler(GLuint unit, GLuint sampler) {
|
void BindSampler(GLuint unit, GLuint sampler) {
|
||||||
BindSampler_State(unit, sampler);
|
BindSampler_State(unit, sampler);
|
||||||
}
|
}
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
||||||
void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params);
|
void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params);
|
||||||
void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param);
|
void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param);
|
||||||
@@ -28,5 +27,4 @@ namespace MobileGL {
|
|||||||
void CreateSamplers(GLsizei n, GLuint* samplers);
|
void CreateSamplers(GLsizei n, GLuint* samplers);
|
||||||
void BindSamplers(GLuint first, GLsizei count, const GLuint* samplers);
|
void BindSamplers(GLuint first, GLsizei count, const GLuint* samplers);
|
||||||
void BindSampler(GLuint unit, GLuint sampler);
|
void BindSampler(GLuint unit, GLuint sampler);
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -11,13 +11,11 @@
|
|||||||
#include <MG_State/GLState/ErrorState/Error.h>
|
#include <MG_State/GLState/ErrorState/Error.h>
|
||||||
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::SamplerImpl {
|
||||||
namespace SamplerImpl {
|
|
||||||
Bool ValidateSamplerName(GLuint sampler) {
|
Bool ValidateSamplerName(GLuint sampler) {
|
||||||
if (!MG_State::pGLContext->ValidateSamplerName(sampler)) {
|
if (!MG_State::pGLContext->ValidateSamplerName(sampler)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerName",
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerName",
|
|
||||||
std::format("Invalid sampler name {}", sampler)));
|
std::format("Invalid sampler name {}", sampler)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -28,7 +26,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!MG_State::pGLContext->ValidateSamplerObject(sampler)) {
|
if (!MG_State::pGLContext->ValidateSamplerObject(sampler)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerObject",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerObject",
|
||||||
std::format("Sampler object {} does not exist", sampler)));
|
std::format("Sampler object {} does not exist", sampler)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -42,8 +40,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
case GL_TEXTURE_WRAP_T:
|
case GL_TEXTURE_WRAP_T:
|
||||||
case GL_TEXTURE_WRAP_R:
|
case GL_TEXTURE_WRAP_R:
|
||||||
if (MG_Util::ConvertGLEnumToSamplerWrapMode(param) == SamplerWrapMode::Unknown) {
|
if (MG_Util::ConvertGLEnumToSamplerWrapMode(param) == SamplerWrapMode::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
||||||
"Invalid wrap mode parameter"));
|
"Invalid wrap mode parameter"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -51,8 +49,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
case GL_TEXTURE_MIN_FILTER:
|
case GL_TEXTURE_MIN_FILTER:
|
||||||
if (MG_Util::ConvertGLEnumToSamplerFilterMode(param) == SamplerFilterMode::Unknown) {
|
if (MG_Util::ConvertGLEnumToSamplerFilterMode(param) == SamplerFilterMode::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
||||||
"Invalid min filter parameter"));
|
"Invalid min filter parameter"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -60,8 +58,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
case GL_TEXTURE_MAG_FILTER:
|
case GL_TEXTURE_MAG_FILTER:
|
||||||
if (param != GL_NEAREST && param != GL_LINEAR) {
|
if (param != GL_NEAREST && param != GL_LINEAR) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
||||||
"Invalid mag filter parameter"));
|
"Invalid mag filter parameter"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -69,8 +67,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
case GL_TEXTURE_COMPARE_MODE:
|
case GL_TEXTURE_COMPARE_MODE:
|
||||||
if (param != GL_NONE && param != GL_COMPARE_REF_TO_TEXTURE) {
|
if (param != GL_NONE && param != GL_COMPARE_REF_TO_TEXTURE) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
||||||
"Invalid compare mode parameter"));
|
"Invalid compare mode parameter"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -78,8 +76,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
case GL_TEXTURE_COMPARE_FUNC:
|
case GL_TEXTURE_COMPARE_FUNC:
|
||||||
if (param < GL_LEQUAL || param > GL_ALWAYS) {
|
if (param < GL_LEQUAL || param > GL_ALWAYS) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
||||||
"Invalid compare function parameter"));
|
"Invalid compare function parameter"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -87,7 +85,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerParam",
|
||||||
"Invalid pname for sampler parameter"));
|
"Invalid pname for sampler parameter"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -104,8 +102,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
case GL_TEXTURE_BORDER_COLOR:
|
case GL_TEXTURE_BORDER_COLOR:
|
||||||
if (param < 0.0f || param > 1.0f) {
|
if (param < 0.0f || param > 1.0f) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerFloatParam",
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerFloatParam",
|
|
||||||
"Border color component out of [0,1] range"));
|
"Border color component out of [0,1] range"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -122,7 +119,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (param < 0 || param > 255) {
|
if (param < 0 || param > 255) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerIntParam",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateSamplerIntParam",
|
||||||
"Border color component out of [0,255] range"));
|
"Border color component out of [0,255] range"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -132,5 +129,4 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
return ValidateSamplerParam(pname, static_cast<GLenum>(param));
|
return ValidateSamplerParam(pname, static_cast<GLenum>(param));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace SamplerImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::SamplerImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -10,12 +10,10 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_State/GLState/SamplerState/SamplerObject.h>
|
#include <MG_State/GLState/SamplerState/SamplerObject.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::SamplerImpl {
|
||||||
namespace SamplerImpl {
|
|
||||||
Bool ValidateSamplerName(GLuint sampler);
|
Bool ValidateSamplerName(GLuint sampler);
|
||||||
Bool ValidateSamplerObject(GLuint sampler);
|
Bool ValidateSamplerObject(GLuint sampler);
|
||||||
Bool ValidateSamplerParam(GLenum pname, GLenum param);
|
Bool ValidateSamplerParam(GLenum pname, GLenum param);
|
||||||
Bool ValidateSamplerFloatParam(GLenum pname, GLfloat param);
|
Bool ValidateSamplerFloatParam(GLenum pname, GLfloat param);
|
||||||
Bool ValidateSamplerIntParam(GLenum pname, GLint param);
|
Bool ValidateSamplerIntParam(GLenum pname, GLint param);
|
||||||
} // namespace SamplerImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::SamplerImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -10,8 +10,7 @@
|
|||||||
|
|
||||||
#include "MG_State/GLState/Core.h"
|
#include "MG_State/GLState/Core.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
GLsync FenceSync_Backend(GLenum condition, GLbitfield flags) {
|
GLsync FenceSync_Backend(GLenum condition, GLbitfield flags) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -41,5 +40,4 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DeleteSync(GLsync sync) {}
|
void DeleteSync(GLsync sync) {}
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -9,10 +9,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
GLsync FenceSync(GLenum condition, GLbitfield flags);
|
GLsync FenceSync(GLenum condition, GLbitfield flags);
|
||||||
GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
|
GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
|
||||||
void DeleteSync(GLsync sync);
|
void DeleteSync(GLsync sync);
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,12 +7,10 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#include "ProxyTexture.h"
|
#include "ProxyTexture.h"
|
||||||
#include "MG_State/GLState/TextureState/TextureObject2D.h"
|
#include <MG_State/GLState/TextureState/TextureObject2D.h>
|
||||||
#include "MG_Util/Types.h"
|
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::TextureImpl {
|
||||||
namespace TextureImpl {
|
UniquePtr<ProxyTextureManager> pProxyTextureManager;
|
||||||
ProxyTextureManager* pProxyTextureManager;
|
|
||||||
|
|
||||||
Bool IsProxyTextureTarget(TextureUploadTarget target) {
|
Bool IsProxyTextureTarget(TextureUploadTarget target) {
|
||||||
switch (target) {
|
switch (target) {
|
||||||
@@ -32,23 +30,24 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> ProxyTextureManager::CreateOrReplaceProxyTextureObject(
|
const SharedPtr<MG_State::GLState::ITextureObject>& ProxyTextureManager::CreateOrReplaceProxyTextureObject(
|
||||||
TextureUploadTarget target) {
|
TextureUploadTarget target) {
|
||||||
auto it = m_proxyTexturesMap.find(target);
|
auto it = m_proxyTexturesMap.find(target);
|
||||||
if (it != m_proxyTexturesMap.end()) {
|
if (it != m_proxyTexturesMap.end()) {
|
||||||
m_proxyTexturesMap.erase(it);
|
m_proxyTexturesMap.erase(it);
|
||||||
}
|
}
|
||||||
m_proxyTexturesMap[target] = MakeShared<MG_State::GLState::TextureObject2D>(0);
|
auto& obj = m_proxyTexturesMap[target];
|
||||||
return m_proxyTexturesMap[target];
|
obj = MakeShared<MG_State::GLState::TextureObject2D>(0);
|
||||||
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> ProxyTextureManager::GetProxyTextureObject(
|
const SharedPtr<MG_State::GLState::ITextureObject>& ProxyTextureManager::GetProxyTextureObject(
|
||||||
TextureUploadTarget target) {
|
TextureUploadTarget target) {
|
||||||
auto it = m_proxyTexturesMap.find(target);
|
auto it = m_proxyTexturesMap.find(target);
|
||||||
if (it != m_proxyTexturesMap.end()) {
|
if (it != m_proxyTexturesMap.end()) {
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
return nullptr;
|
static SharedPtr<MG_State::GLState::ITextureObject> nullTextureObject = nullptr;
|
||||||
|
return nullTextureObject;
|
||||||
}
|
}
|
||||||
} // namespace TextureImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::TextureImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -10,19 +10,18 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::TextureImpl {
|
||||||
namespace TextureImpl {
|
|
||||||
Bool IsProxyTextureTarget(TextureUploadTarget target);
|
Bool IsProxyTextureTarget(TextureUploadTarget target);
|
||||||
|
|
||||||
class ProxyTextureManager {
|
class ProxyTextureManager {
|
||||||
public:
|
public:
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> CreateOrReplaceProxyTextureObject(TextureUploadTarget target);
|
const SharedPtr<MG_State::GLState::ITextureObject>& CreateOrReplaceProxyTextureObject(
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> GetProxyTextureObject(TextureUploadTarget target);
|
TextureUploadTarget target);
|
||||||
|
const SharedPtr<MG_State::GLState::ITextureObject>& GetProxyTextureObject(TextureUploadTarget target);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
UnorderedMap<TextureUploadTarget, SharedPtr<MG_State::GLState::ITextureObject>> m_proxyTexturesMap;
|
UnorderedMap<TextureUploadTarget, SharedPtr<MG_State::GLState::ITextureObject>> m_proxyTexturesMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ProxyTextureManager* pProxyTextureManager;
|
extern UniquePtr<ProxyTextureManager> pProxyTextureManager;
|
||||||
} // namespace TextureImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::TextureImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -15,13 +15,12 @@
|
|||||||
#include <MG_Util/Converters/MGToMG/TextureEnumConverter.h>
|
#include <MG_Util/Converters/MGToMG/TextureEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToStr/TextureEnumConverter.h>
|
#include <MG_Util/Converters/MGToStr/TextureEnumConverter.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::TextureImpl {
|
||||||
namespace TextureImpl {
|
|
||||||
Bool ValidateTextureTarget(TextureTarget target) {
|
Bool ValidateTextureTarget(TextureTarget target) {
|
||||||
if (target == TextureTarget::Unknown) {
|
if (target == TextureTarget::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureTarget", "Invalid texture target"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureTarget", "Invalid texture target"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -29,9 +28,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
Bool ValidateTextureUploadTarget(TextureUploadTarget textureUploadTarget) {
|
Bool ValidateTextureUploadTarget(TextureUploadTarget textureUploadTarget) {
|
||||||
if (textureUploadTarget == TextureUploadTarget::Unknown) {
|
if (textureUploadTarget == TextureUploadTarget::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureUploadTarget",
|
||||||
"ValidateTextureUploadTarget",
|
|
||||||
"Invalid texture upload target"));
|
"Invalid texture upload target"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -42,16 +40,16 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (texture == 0) {
|
if (texture == 0) {
|
||||||
if (allowZero) return true;
|
if (allowZero) return true;
|
||||||
|
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureName",
|
ErrorCode::InvalidValue,
|
||||||
"Texture name cannot be zero"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureName", "Texture name cannot be zero"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MG_State::pGLContext->ValidateTextureName(texture)) {
|
if (!MG_State::pGLContext->ValidateTextureName(texture)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureName", "Invalid texture name"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureName", "Invalid texture name"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -60,7 +58,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Bool ValidateTextureInputFormat(TextureInputFormat format) {
|
Bool ValidateTextureInputFormat(TextureInputFormat format) {
|
||||||
if (format == TextureInputFormat::Unknown) {
|
if (format == TextureInputFormat::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInputFormat",
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInputFormat",
|
||||||
"Invalid texture input format"));
|
"Invalid texture input format"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -69,9 +67,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
Bool ValidateTexturePixelDataType(TexturePixelDataType texturePixelDataType) {
|
Bool ValidateTexturePixelDataType(TexturePixelDataType texturePixelDataType) {
|
||||||
if (texturePixelDataType == TexturePixelDataType::Unknown) {
|
if (texturePixelDataType == TexturePixelDataType::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTexturePixelDataType",
|
||||||
"ValidateTexturePixelDataType",
|
|
||||||
"Invalid texture pixel data type"));
|
"Invalid texture pixel data type"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -80,9 +77,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
Bool ValidateTextureLevelNumber(GLint level) {
|
Bool ValidateTextureLevelNumber(GLint level) {
|
||||||
if (level < 0) {
|
if (level < 0) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureLevelNumber",
|
||||||
"ValidateTextureLevelNumber",
|
|
||||||
"Texture level must be non-negative"));
|
"Texture level must be non-negative"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -100,18 +96,17 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (width != height) {
|
if (width != height) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget",
|
||||||
"Width and height must be equal for cube map textures"));
|
"Width and height must be equal for cube map textures"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(target == TextureUploadTarget::Texture1DArray ||
|
if (!(target == TextureUploadTarget::Texture1DArray || target == TextureUploadTarget::ProxyTexture1DArray)) {
|
||||||
target == TextureUploadTarget::ProxyTexture1DArray)) {
|
|
||||||
if (height < 0) {
|
if (height < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget",
|
||||||
"Height must be greater than or equal to zero"));
|
"Height must be greater than or equal to zero"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -123,7 +118,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (height < 0) {
|
if (height < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSizeWithTarget",
|
||||||
"Height must be greater than or equal to zero"));
|
"Height must be greater than or equal to zero"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -137,8 +132,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Bool ValidateTextureSizeRange(SizeT width, SizeT height, SizeT depth) {
|
Bool ValidateTextureSizeRange(SizeT width, SizeT height, SizeT depth) {
|
||||||
if (width < 0 || height < 0 || depth < 0) {
|
if (width < 0 || height < 0 || depth < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSizeRange",
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSizeRange",
|
|
||||||
"Width and height must be greater than zero"));
|
"Width and height must be greater than zero"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -151,8 +145,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Bool ValidateTextureInternalFormat(TextureInternalFormat format) {
|
Bool ValidateTextureInternalFormat(TextureInternalFormat format) {
|
||||||
if (format == TextureInternalFormat::Unknown) {
|
if (format == TextureInternalFormat::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInternalFormat",
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInternalFormat",
|
|
||||||
"Invalid texture sized internal format"));
|
"Invalid texture sized internal format"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -161,10 +154,9 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
Bool ValidateTextureBorderNumber(Int border) {
|
Bool ValidateTextureBorderNumber(Int border) {
|
||||||
if (border != 0) {
|
if (border != 0) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
ErrorCode::InvalidValue,
|
||||||
"ValidateTextureBorderNumber",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureBorderNumber", "Border must be zero"));
|
||||||
"Border must be zero"));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -179,8 +171,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (format != TextureInputFormat::RGB) {
|
if (format != TextureInputFormat::RGB) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput",
|
||||||
"ValidateTextureInternalFormatCompatibleWithInput",
|
|
||||||
"Invalid format for the given type"));
|
"Invalid format for the given type"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -189,14 +180,12 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (type == TexturePixelDataType::UnsignedShort4444 || type == TexturePixelDataType::UnsignedShort4444Rev ||
|
if (type == TexturePixelDataType::UnsignedShort4444 || type == TexturePixelDataType::UnsignedShort4444Rev ||
|
||||||
type == TexturePixelDataType::UnsignedShort5551 || type == TexturePixelDataType::UnsignedShort1555Rev ||
|
type == TexturePixelDataType::UnsignedShort5551 || type == TexturePixelDataType::UnsignedShort1555Rev ||
|
||||||
type == TexturePixelDataType::UnsignedInt8888 || type == TexturePixelDataType::UnsignedInt8888Rev ||
|
type == TexturePixelDataType::UnsignedInt8888 || type == TexturePixelDataType::UnsignedInt8888Rev ||
|
||||||
type == TexturePixelDataType::UnsignedInt1010102 ||
|
type == TexturePixelDataType::UnsignedInt1010102 || type == TexturePixelDataType::UnsignedInt2101010Rev ||
|
||||||
type == TexturePixelDataType::UnsignedInt2101010Rev ||
|
|
||||||
type == TexturePixelDataType::UnsignedInt5999Rev) {
|
type == TexturePixelDataType::UnsignedInt5999Rev) {
|
||||||
if (format != TextureInputFormat::RGBA && format != TextureInputFormat::BGRA) {
|
if (format != TextureInputFormat::RGBA && format != TextureInputFormat::BGRA) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput",
|
||||||
"ValidateTextureInternalFormatCompatibleWithInput",
|
|
||||||
"Invalid format for the given type"));
|
"Invalid format for the given type"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -209,8 +198,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (format != TextureInputFormat::DepthComponent) {
|
if (format != TextureInputFormat::DepthComponent) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput",
|
||||||
"ValidateTextureInternalFormatCompatibleWithInput",
|
|
||||||
"Invalid format for depth component internal format"));
|
"Invalid format for depth component internal format"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -225,7 +213,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
)) {
|
)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureInternalFormatCompatibleWithInput",
|
||||||
"Invalid internal format for depth component format"));
|
"Invalid internal format for depth component format"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -233,12 +221,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Bool ValidateTextureLevelWithUploadTarget(TextureUploadTarget target, Int level) {
|
Bool ValidateTextureLevelWithUploadTarget(TextureUploadTarget target, Int level) {
|
||||||
if (target == TextureUploadTarget::TextureRectangle ||
|
if (target == TextureUploadTarget::TextureRectangle || target == TextureUploadTarget::ProxyTextureRectangle) {
|
||||||
target == TextureUploadTarget::ProxyTextureRectangle) {
|
|
||||||
if (level != 0) {
|
if (level != 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureLevelWithUploadTarget",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureLevelWithUploadTarget",
|
||||||
"Level must be zero for rectangle textures"));
|
"Level must be zero for rectangle textures"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -250,7 +237,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!textureObject) {
|
if (!textureObject) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureObject", "Texture object is null"));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureObject", "Texture object is null"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -263,7 +250,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (prevTarget != target) {
|
if (prevTarget != target) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureTargetUniformity",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureTargetUniformity",
|
||||||
"Texture target does not match the previously created texture"));
|
"Texture target does not match the previously created texture"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -276,7 +263,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (xoffset < 0 || (xoffset + width) > baseSize.x()) {
|
if (xoffset < 0 || (xoffset + width) > baseSize.x()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets",
|
||||||
"xoffset must be non-negative and (xoffset + width) must not exceed "
|
"xoffset must be non-negative and (xoffset + width) must not exceed "
|
||||||
"the texture width."));
|
"the texture width."));
|
||||||
return false;
|
return false;
|
||||||
@@ -286,7 +273,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (yoffset < 0 || (yoffset + height) > baseSize.y()) {
|
if (yoffset < 0 || (yoffset + height) > baseSize.y()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets",
|
||||||
"yoffset must be non-negative and (yoffset + height) must not exceed "
|
"yoffset must be non-negative and (yoffset + height) must not exceed "
|
||||||
"the texture height."));
|
"the texture height."));
|
||||||
return false;
|
return false;
|
||||||
@@ -296,7 +283,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (zoffset < 0 || (zoffset + depth) > baseSize.z()) {
|
if (zoffset < 0 || (zoffset + depth) > baseSize.z()) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateTextureSubImageOffsets",
|
||||||
"zoffset must be non-negative and (zoffset + depth) must not exceed "
|
"zoffset must be non-negative and (zoffset + depth) must not exceed "
|
||||||
"the texture depth."));
|
"the texture depth."));
|
||||||
return false;
|
return false;
|
||||||
@@ -310,7 +297,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (unsizedFormat1 != unsizedFormat2) {
|
if (unsizedFormat1 != unsizedFormat2) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
std::format("MG_Impl/GLImpl", "ValidateBaseInternalFormatMatch",
|
std::format("MG_Impl/GLImpl", "ValidateBaseInternalFormatMatch",
|
||||||
"The base internal format of the two formats do not match ({} vs. {})",
|
"The base internal format of the two formats do not match ({} vs. {})",
|
||||||
MG_Util::ConvertTextureInternalFormatToString(unsizedFormat1).c_str(),
|
MG_Util::ConvertTextureInternalFormatToString(unsizedFormat1).c_str(),
|
||||||
@@ -319,5 +306,4 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} // namespace TextureImpl
|
} // namespace TextureImpl
|
||||||
} // namespace TextureImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::TextureImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -12,8 +12,7 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_State/GLState/TextureState/TextureObject.h>
|
#include <MG_State/GLState/TextureState/TextureObject.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::TextureImpl {
|
||||||
namespace TextureImpl {
|
|
||||||
Bool ValidateTextureTarget(TextureTarget target);
|
Bool ValidateTextureTarget(TextureTarget target);
|
||||||
Bool ValidateTextureUploadTarget(TextureUploadTarget textureUploadTarget);
|
Bool ValidateTextureUploadTarget(TextureUploadTarget textureUploadTarget);
|
||||||
Bool ValidateTextureName(Uint texture, Bool allowZero = false);
|
Bool ValidateTextureName(Uint texture, Bool allowZero = false);
|
||||||
@@ -34,5 +33,4 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Bool ValidateTextureSubImageOffsets(SharedPtr<MG_State::GLState::ITextureObject> textureObject, Int xoffset,
|
Bool ValidateTextureSubImageOffsets(SharedPtr<MG_State::GLState::ITextureObject> textureObject, Int xoffset,
|
||||||
Int width, Int yoffset = 0, Int height = 0, Int zoffset = 0, Int depth = 0);
|
Int width, Int yoffset = 0, Int height = 0, Int zoffset = 0, Int depth = 0);
|
||||||
Bool ValidateBaseInternalFormatMatch(TextureInternalFormat format1, TextureInternalFormat format2);
|
Bool ValidateBaseInternalFormatMatch(TextureInternalFormat format1, TextureInternalFormat format2);
|
||||||
} // namespace TextureImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::TextureImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -12,15 +12,14 @@
|
|||||||
#include <MG_State/GLState/ErrorState/Error.h>
|
#include <MG_State/GLState/ErrorState/Error.h>
|
||||||
#include <MG_Util/Converters/GLToMG/DataTypeConverter.h>
|
#include <MG_Util/Converters/GLToMG/DataTypeConverter.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
void DisableVertexAttribArray_State(GLuint index) {
|
void DisableVertexAttribArray_State(GLuint index) {
|
||||||
if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return;
|
if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return;
|
||||||
|
|
||||||
auto vao = MG_State::pGLContext->GetBoundVertexArray();
|
auto& vao = MG_State::pGLContext->GetBoundVertexArray();
|
||||||
if (!vao) {
|
if (!vao) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl",
|
||||||
"EnableVertexAttribArray_State",
|
"EnableVertexAttribArray_State",
|
||||||
"No vertex array object is bound."));
|
"No vertex array object is bound."));
|
||||||
return;
|
return;
|
||||||
@@ -32,10 +31,10 @@ namespace MobileGL {
|
|||||||
void EnableVertexAttribArray_State(GLuint index) {
|
void EnableVertexAttribArray_State(GLuint index) {
|
||||||
if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return;
|
if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return;
|
||||||
|
|
||||||
auto vao = MG_State::pGLContext->GetBoundVertexArray();
|
auto& vao = MG_State::pGLContext->GetBoundVertexArray();
|
||||||
if (!vao) {
|
if (!vao) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl",
|
||||||
"EnableVertexAttribArray_State",
|
"EnableVertexAttribArray_State",
|
||||||
"No vertex array object is bound."));
|
"No vertex array object is bound."));
|
||||||
return;
|
return;
|
||||||
@@ -51,26 +50,24 @@ namespace MobileGL {
|
|||||||
DataType dataType = MG_Util::ConvertGLEnumToDataType(type);
|
DataType dataType = MG_Util::ConvertGLEnumToDataType(type);
|
||||||
if (!VertexArrayImpl::ValidateVertexAttribPointerParams(index, size, dataType, stride)) return;
|
if (!VertexArrayImpl::ValidateVertexAttribPointerParams(index, size, dataType, stride)) return;
|
||||||
|
|
||||||
auto vao = MG_State::pGLContext->GetBoundVertexArray();
|
auto& vao = MG_State::pGLContext->GetBoundVertexArray();
|
||||||
if (!vao) {
|
if (!vao) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
ErrorCode::InvalidOperation, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "VertexAttribPointer_State",
|
||||||
"VertexAttribPointer_State",
|
|
||||||
"No vertex array object is bound."));
|
"No vertex array object is bound."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& vboSlot = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex);
|
auto& vboSlot = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex);
|
||||||
auto vbo = vboSlot.GetBoundObject();
|
auto& vbo = vboSlot.GetBoundObject();
|
||||||
if (!vbo) {
|
if (!vbo) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "VertexAttribPointer_State",
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "VertexAttribPointer_State",
|
|
||||||
"No buffer is bound to GL_ARRAY_BUFFER."));
|
"No buffer is bound to GL_ARRAY_BUFFER."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SizeT offset = reinterpret_cast<SizeT>(pointer);
|
auto offset = reinterpret_cast<SizeT>(pointer);
|
||||||
|
|
||||||
vao->SetAttributeFormat(index, size, dataType, false, stride, offset, true);
|
vao->SetAttributeFormat(index, size, dataType, false, stride, offset, true);
|
||||||
vao->BindAttributeBuffer(index, vbo);
|
vao->BindAttributeBuffer(index, vbo);
|
||||||
@@ -84,21 +81,19 @@ namespace MobileGL {
|
|||||||
DataType dataType = MG_Util::ConvertGLEnumToDataType(type);
|
DataType dataType = MG_Util::ConvertGLEnumToDataType(type);
|
||||||
if (!VertexArrayImpl::ValidateVertexAttribPointerParams(index, size, dataType, stride)) return;
|
if (!VertexArrayImpl::ValidateVertexAttribPointerParams(index, size, dataType, stride)) return;
|
||||||
|
|
||||||
auto vao = MG_State::pGLContext->GetBoundVertexArray();
|
auto& vao = MG_State::pGLContext->GetBoundVertexArray();
|
||||||
if (!vao) {
|
if (!vao) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
ErrorCode::InvalidOperation, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "VertexAttribPointer_State",
|
||||||
"VertexAttribPointer_State",
|
|
||||||
"No vertex array object is bound."));
|
"No vertex array object is bound."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& vboSlot = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex);
|
auto& vboSlot = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex);
|
||||||
auto vbo = vboSlot.GetBoundObject();
|
auto& vbo = vboSlot.GetBoundObject();
|
||||||
if (!vbo) {
|
if (!vbo) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "VertexAttribPointer_State",
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "VertexAttribPointer_State",
|
|
||||||
"No buffer is bound to GL_ARRAY_BUFFER."));
|
"No buffer is bound to GL_ARRAY_BUFFER."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -127,8 +122,8 @@ namespace MobileGL {
|
|||||||
void DeleteVertexArrays_State(GLsizei n, const GLuint* arrays) {
|
void DeleteVertexArrays_State(GLsizei n, const GLuint* arrays) {
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteVertexArrays_State",
|
ErrorCode::InvalidValue,
|
||||||
"n must be non-negative."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "DeleteVertexArrays_State", "n must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,18 +146,19 @@ namespace MobileGL {
|
|||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GenVertexArrays_State", "n must be non-negative."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "GenVertexArrays_State", "n must be non-negative."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto vaoNames = MG_State::pGLContext->GenVertexArrayNames(n);
|
static thread_local Vector<Uint> vaos;
|
||||||
Copy(vaoNames.data(), arrays, vaoNames.size());
|
MG_State::pGLContext->GenVertexArrayNames(n, vaos);
|
||||||
|
Memcpy(arrays, vaos.data(), n * sizeof(GLuint));
|
||||||
}
|
}
|
||||||
|
|
||||||
GLboolean IsVertexArray_State(GLuint array) {
|
GLboolean IsVertexArray_State(GLuint array) {
|
||||||
if (array == 0) {
|
if (array == 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(ErrorCode::InvalidValue,
|
||||||
ErrorCode::InvalidValue, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "IsVertexArray_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "IsVertexArray_State",
|
||||||
"Vertex array name 0 is not supported."));
|
"Vertex array name 0 is not supported."));
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -170,7 +166,7 @@ namespace MobileGL {
|
|||||||
if (!MG_State::pGLContext->ValidateVertexArrayObject(array)) {
|
if (!MG_State::pGLContext->ValidateVertexArrayObject(array)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "IsVertexArray_State",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "IsVertexArray_State",
|
||||||
std::format("Vertex array object {} does not exist.", array)));
|
std::format("Vertex array object {} does not exist.", array)));
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -180,11 +176,10 @@ namespace MobileGL {
|
|||||||
void VertexAttribDivisor_State(GLuint index, GLuint divisor) {
|
void VertexAttribDivisor_State(GLuint index, GLuint divisor) {
|
||||||
if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return;
|
if (!VertexArrayImpl::ValidateVertexAttributeIndex(index)) return;
|
||||||
|
|
||||||
auto vao = MG_State::pGLContext->GetBoundVertexArray();
|
auto& vao = MG_State::pGLContext->GetBoundVertexArray();
|
||||||
if (!vao) {
|
if (!vao) {
|
||||||
MG_State::pGLContext->RecordError(ErrorCode::InvalidOperation,
|
MG_State::pGLContext->RecordError(
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl",
|
ErrorCode::InvalidOperation, MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "VertexAttribDivisor_State",
|
||||||
"VertexAttribDivisor_State",
|
|
||||||
"No vertex array object is bound."));
|
"No vertex array object is bound."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -229,5 +224,4 @@ namespace MobileGL {
|
|||||||
void GenVertexArrays(GLsizei n, GLuint* arrays) {
|
void GenVertexArrays(GLsizei n, GLuint* arrays) {
|
||||||
GenVertexArrays_State(n, arrays);
|
GenVertexArrays_State(n, arrays);
|
||||||
}
|
}
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace MG_Impl::GLImpl {
|
|
||||||
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
/* @INSERTION_POINT:FUNCTION_DECLARATION@ */
|
||||||
void VertexAttribDivisor(GLuint index, GLuint divisor);
|
void VertexAttribDivisor(GLuint index, GLuint divisor);
|
||||||
GLboolean IsVertexArray(GLuint array);
|
GLboolean IsVertexArray(GLuint array);
|
||||||
@@ -22,5 +21,4 @@ namespace MobileGL {
|
|||||||
void BindVertexArray(GLuint array);
|
void BindVertexArray(GLuint array);
|
||||||
void DeleteVertexArrays(GLsizei n, const GLuint* arrays);
|
void DeleteVertexArrays(GLsizei n, const GLuint* arrays);
|
||||||
void GenVertexArrays(GLsizei n, GLuint* arrays);
|
void GenVertexArrays(GLsizei n, GLuint* arrays);
|
||||||
} // namespace MG_Impl::GLImpl
|
} // namespace MobileGL::MG_Impl::GLImpl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -12,15 +12,13 @@
|
|||||||
#include <MG_Util/Converters/MGToGL/DataTypeConverter.h>
|
#include <MG_Util/Converters/MGToGL/DataTypeConverter.h>
|
||||||
#include <MG_Util/Converters/MGToStr/DataTypeConverter.h>
|
#include <MG_Util/Converters/MGToStr/DataTypeConverter.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::VertexArrayImpl {
|
||||||
namespace VertexArrayImpl {
|
|
||||||
|
|
||||||
Bool ValidateVertexArrayName(Uint index) {
|
Bool ValidateVertexArrayName(Uint index) {
|
||||||
Bool isValid = MG_State::pGLContext->ValidateVertexArrayName(index);
|
Bool isValid = MG_State::pGLContext->ValidateVertexArrayName(index);
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateVertexArrayName",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateVertexArrayName",
|
||||||
std::format("Vertex array name {} is not valid.", index)));
|
std::format("Vertex array name {} is not valid.", index)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -31,7 +29,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!MG_State::pGLContext->ValidateVertexArrayObject(index)) {
|
if (!MG_State::pGLContext->ValidateVertexArrayObject(index)) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidOperation,
|
ErrorCode::InvalidOperation,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateVertexArrayObject",
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateVertexArrayObject",
|
||||||
std::format("Vertex array object {} does not exist.", index)));
|
std::format("Vertex array object {} does not exist.", index)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -42,7 +40,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) {
|
if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", "ValidateVertexAttributeIndex",
|
"MG_Impl/GLImpl", "ValidateVertexAttributeIndex",
|
||||||
std::format("Attribute index {} exceeds maximum of {}.", index,
|
std::format("Attribute index {} exceeds maximum of {}.", index,
|
||||||
MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS - 1)));
|
MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS - 1)));
|
||||||
@@ -55,7 +53,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (size < 1 || size > 4) {
|
if (size < 1 || size > 4) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", "ValidateVertexAttribPointerParams",
|
"MG_Impl/GLImpl", "ValidateVertexAttribPointerParams",
|
||||||
std::format("Invalid size {} for attribute {}. Must be 1-4.", size, index)));
|
std::format("Invalid size {} for attribute {}. Must be 1-4.", size, index)));
|
||||||
return false;
|
return false;
|
||||||
@@ -64,16 +62,16 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (type == DataType::Unknown) {
|
if (type == DataType::Unknown) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum,
|
ErrorCode::InvalidEnum,
|
||||||
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "ValidateVertexAttribPointerParams",
|
MakeUnique<GenericErrorInfo>(
|
||||||
std::format("Invalid type {} for attribute {}.",
|
"MG_Impl/GLImpl", "ValidateVertexAttribPointerParams",
|
||||||
MG_Util::ConvertDataTypeToString(type).c_str(), index)));
|
std::format("Invalid type {} for attribute {}.", MG_Util::ConvertDataTypeToString(type), index)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stride < 0) {
|
if (stride < 0) {
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidValue,
|
ErrorCode::InvalidValue,
|
||||||
MakeShared<GenericErrorInfo>(
|
MakeUnique<GenericErrorInfo>(
|
||||||
"MG_Impl/GLImpl", "ValidateVertexAttribPointerParams",
|
"MG_Impl/GLImpl", "ValidateVertexAttribPointerParams",
|
||||||
std::format("Negative stride {} is not allowed for attribute {}.", stride, index)));
|
std::format("Negative stride {} is not allowed for attribute {}.", stride, index)));
|
||||||
return false;
|
return false;
|
||||||
@@ -81,5 +79,4 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} // namespace VertexArrayImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::VertexArrayImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -10,11 +10,9 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_State/GLState/VertexArrayState/VertexArrayObject.h>
|
#include <MG_State/GLState/VertexArrayState/VertexArrayObject.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl::VertexArrayImpl {
|
||||||
namespace VertexArrayImpl {
|
|
||||||
Bool ValidateVertexArrayName(Uint index);
|
Bool ValidateVertexArrayName(Uint index);
|
||||||
Bool ValidateVertexArrayObject(Uint index);
|
Bool ValidateVertexArrayObject(Uint index);
|
||||||
Bool ValidateVertexAttributeIndex(Uint index);
|
Bool ValidateVertexAttributeIndex(Uint index);
|
||||||
Bool ValidateVertexAttribPointerParams(Uint index, SizeT size, DataType type, Int stride);
|
Bool ValidateVertexAttribPointerParams(Uint index, SizeT size, DataType type, Int stride);
|
||||||
} // namespace VertexArrayImpl
|
} // namespace MobileGL::MG_Impl::GLImpl::VertexArrayImpl
|
||||||
} // namespace MobileGL::MG_Impl::GLImpl
|
|
||||||
|
|||||||
@@ -10,9 +10,7 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include "MG_Impl/GetProcAddress.h"
|
#include "MG_Impl/GetProcAddress.h"
|
||||||
|
|
||||||
namespace MG_Impl {
|
namespace MG_Impl::GLXImpl {
|
||||||
namespace GLXImpl {
|
|
||||||
void* GetProcAddress(const char* name);
|
void* GetProcAddress(const char* name);
|
||||||
void* GetProcAddressARB(const char* name);
|
void* GetProcAddressARB(const char* name);
|
||||||
} // namespace GLXImpl
|
} // namespace MG_Impl::GLXImpl
|
||||||
} // namespace MG_Impl
|
|
||||||
|
|||||||
@@ -12,8 +12,7 @@
|
|||||||
return (void*)name; \
|
return (void*)name; \
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl {
|
||||||
namespace MG_Impl {
|
|
||||||
void* GetProcAddress(const char* name) {
|
void* GetProcAddress(const char* name) {
|
||||||
MGLOG_D("GetProcAddress(%s)", name);
|
MGLOG_D("GetProcAddress(%s)", name);
|
||||||
GETPROC(eglChooseConfig, name);
|
GETPROC(eglChooseConfig, name);
|
||||||
@@ -1352,5 +1351,4 @@ namespace MobileGL {
|
|||||||
MGLOG_W("GetProcAddress(%s) = nullptr!", name);
|
MGLOG_W("GetProcAddress(%s) = nullptr!", name);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
} // namespace MG_Impl
|
} // namespace MobileGL::MG_Impl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_Impl {
|
||||||
namespace MG_Impl {
|
|
||||||
void* GetProcAddress(const char* name);
|
void* GetProcAddress(const char* name);
|
||||||
} // namespace MG_Impl
|
} // namespace MobileGL::MG_Impl
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -18,25 +18,27 @@
|
|||||||
namespace MobileGL::MG_Impl {
|
namespace MobileGL::MG_Impl {
|
||||||
void Init() {
|
void Init() {
|
||||||
MGLOG_D("Initializing MobileGL Implementation...");
|
MGLOG_D("Initializing MobileGL Implementation...");
|
||||||
GLImpl::TextureImpl::pProxyTextureManager = new GLImpl::TextureImpl::ProxyTextureManager();
|
GLImpl::TextureImpl::pProxyTextureManager = MakeUnique<GLImpl::TextureImpl::ProxyTextureManager>();
|
||||||
|
|
||||||
// TODO: get real info in EGL
|
// TODO: get real info in EGL
|
||||||
auto fbo0 = MG_State::pGLContext->CreateFramebufferObject(0);
|
auto& fbo0 = MG_State::pGLContext->CreateFramebufferObject(0);
|
||||||
auto colorTex = MakeShared<MG_State::GLState::TextureObject2D>(0);
|
auto colorTex = MakeShared<MG_State::GLState::TextureObject2D>(0);
|
||||||
colorTex->SetInternalFormat(TextureInternalFormat::RGBA8);
|
colorTex->SetInternalFormat(TextureInternalFormat::RGBA8);
|
||||||
colorTex->AllocateStorage(TextureUploadTarget::Texture2D, 0, {{512, 512, 1}, 0});
|
colorTex->AllocateStorage(TextureUploadTarget::Texture2D, 0, {{512, 512, 1}, 0});
|
||||||
|
// colorTex->SetMipmapLevel({{512, 512, 1}, 0, false, 0, {nullptr, 0}});
|
||||||
auto depthTex = MakeShared<MG_State::GLState::TextureObject2D>(0);
|
auto depthTex = MakeShared<MG_State::GLState::TextureObject2D>(0);
|
||||||
depthTex->SetInternalFormat(TextureInternalFormat::Depth32FStencil8);
|
depthTex->SetInternalFormat(TextureInternalFormat::Depth32FStencil8);
|
||||||
depthTex->AllocateStorage(TextureUploadTarget::Texture2D, 0, {{512, 512, 1}, 0});
|
depthTex->AllocateStorage(TextureUploadTarget::Texture2D, 0, {{512, 512, 1}, 0});
|
||||||
|
// depthTex->SetMipmapLevel({{512, 512, 1}, 0, false, 0, {nullptr, 0}});
|
||||||
auto stencilTex = MakeShared<MG_State::GLState::TextureObject2D>(0);
|
auto stencilTex = MakeShared<MG_State::GLState::TextureObject2D>(0);
|
||||||
stencilTex->SetInternalFormat(TextureInternalFormat::Depth32FStencil8);
|
stencilTex->SetInternalFormat(TextureInternalFormat::Depth32FStencil8);
|
||||||
stencilTex->AllocateStorage(TextureUploadTarget::Texture2D, 0, {{512, 512, 1}, 0});
|
stencilTex->AllocateStorage(TextureUploadTarget::Texture2D, 0, {{512, 512, 1}, 0});
|
||||||
|
// stencilTex->SetMipmapLevel({{512, 512, 1}, 0, false, 0, {nullptr, 0}});
|
||||||
fbo0->AttachTexture(FramebufferAttachmentType::Color0, colorTex);
|
fbo0->AttachTexture(FramebufferAttachmentType::Color0, colorTex);
|
||||||
fbo0->AttachTexture(FramebufferAttachmentType::Depth, depthTex);
|
fbo0->AttachTexture(FramebufferAttachmentType::Depth, depthTex);
|
||||||
fbo0->AttachTexture(FramebufferAttachmentType::Stencil, stencilTex);
|
fbo0->AttachTexture(FramebufferAttachmentType::Stencil, stencilTex);
|
||||||
GLImpl::FramebufferImpl::pDefaultFramebufferInfo =
|
GLImpl::FramebufferImpl::pDefaultFramebufferInfo =
|
||||||
new GLImpl::FramebufferImpl::DefaultFramebufferInfo(fbo0, colorTex, depthTex, stencilTex);
|
MakeUnique<GLImpl::FramebufferImpl::DefaultFramebufferInfo>(fbo0, colorTex, depthTex, stencilTex);
|
||||||
MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw).Bind(fbo0);
|
MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw).Bind(fbo0);
|
||||||
MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read).Bind(fbo0);
|
MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read).Bind(fbo0);
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,258 @@
|
|||||||
|
// MobileGL - MobileGL/MG_State/EGLState/Core.h
|
||||||
|
// Copyright (c) 2025-2026 MobileGL-Dev
|
||||||
|
// Licensed under the GNU Lesser General Public License v3.0:
|
||||||
|
// https://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
|
// https://www.gnu.org/licenses/lgpl-3.0.txt
|
||||||
|
// SPDX-License-Identifier: LGPL-3.0-only
|
||||||
|
// End of Source File Header
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <Includes.h>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace MobileGL {
|
||||||
|
namespace MG_State {
|
||||||
|
namespace EGLState {
|
||||||
|
class EGLContext {
|
||||||
|
public:
|
||||||
|
using EGLDisplayHandle = ::EGLDisplay;
|
||||||
|
using EGLConfigHandle = ::EGLConfig;
|
||||||
|
using EGLSurfaceHandle = ::EGLSurface;
|
||||||
|
using EGLContextHandle = ::EGLContext;
|
||||||
|
using EGLSyncHandle = ::EGLSync;
|
||||||
|
using EGLImageHandle = ::EGLImage;
|
||||||
|
|
||||||
|
EGLContext() = default;
|
||||||
|
|
||||||
|
// Error
|
||||||
|
void SetError(EGLint errorCode);
|
||||||
|
EGLint ConsumeError();
|
||||||
|
|
||||||
|
// API
|
||||||
|
void SetBoundAPI(EGLenum api);
|
||||||
|
EGLenum GetBoundAPI() const;
|
||||||
|
|
||||||
|
// Display
|
||||||
|
EGLDisplayHandle GetDisplay(NativeDisplayType nativeDisplay);
|
||||||
|
EGLDisplayHandle GetPlatformDisplay(EGLenum platform, void* nativeDisplay);
|
||||||
|
Bool ValidateDisplay(EGLDisplayHandle display) const;
|
||||||
|
Bool IsDisplayInitialized(EGLDisplayHandle display) const;
|
||||||
|
Bool InitializeDisplay(EGLDisplayHandle display, EGLint* major, EGLint* minor);
|
||||||
|
Bool TerminateDisplay(EGLDisplayHandle display);
|
||||||
|
|
||||||
|
// Config
|
||||||
|
Bool ChooseConfig(EGLDisplayHandle display, const EGLint* attribList, EGLConfigHandle* configs,
|
||||||
|
EGLint configSize, EGLint* numConfig);
|
||||||
|
Bool GetConfigs(EGLDisplayHandle display, EGLConfigHandle* configs, EGLint configSize,
|
||||||
|
EGLint* numConfig);
|
||||||
|
Bool ValidateConfig(EGLConfigHandle config) const;
|
||||||
|
Bool ValidateConfigOnDisplay(EGLDisplayHandle display, EGLConfigHandle config) const;
|
||||||
|
Bool GetConfigAttrib(EGLDisplayHandle display, EGLConfigHandle config, EGLint attribute,
|
||||||
|
EGLint* value) const;
|
||||||
|
|
||||||
|
// Context
|
||||||
|
EGLContextHandle CreateContext(EGLDisplayHandle display, EGLConfigHandle config,
|
||||||
|
EGLContextHandle shareCtx, const EGLint* attribList);
|
||||||
|
Bool DestroyContext(EGLDisplayHandle display, EGLContextHandle context);
|
||||||
|
Bool QueryContext(EGLDisplayHandle display, EGLContextHandle context, EGLint attribute,
|
||||||
|
EGLint* value) const;
|
||||||
|
Bool ValidateContext(EGLContextHandle context) const;
|
||||||
|
Bool ValidateContextOnDisplay(EGLDisplayHandle display, EGLContextHandle context) const;
|
||||||
|
|
||||||
|
// Surface
|
||||||
|
EGLSurfaceHandle CreateWindowSurface(EGLDisplayHandle display, EGLConfigHandle config,
|
||||||
|
NativeWindowType window, const EGLint* attribList);
|
||||||
|
EGLSurfaceHandle CreatePbufferSurface(EGLDisplayHandle display, EGLConfigHandle config,
|
||||||
|
const EGLint* attribList);
|
||||||
|
EGLSurfaceHandle CreatePixmapSurface(EGLDisplayHandle display, EGLConfigHandle config,
|
||||||
|
EGLNativePixmapType pixmap, const EGLint* attribList);
|
||||||
|
EGLSurfaceHandle CreatePbufferFromClientBuffer(EGLDisplayHandle display, EGLenum bufferType,
|
||||||
|
EGLClientBuffer buffer, EGLConfigHandle config,
|
||||||
|
const EGLint* attribList);
|
||||||
|
EGLSurfaceHandle CreatePlatformWindowSurface(EGLDisplayHandle display, EGLConfigHandle config,
|
||||||
|
void* nativeWindow, const EGLAttrib* attribList);
|
||||||
|
EGLSurfaceHandle CreatePlatformPixmapSurface(EGLDisplayHandle display, EGLConfigHandle config,
|
||||||
|
void* nativePixmap, const EGLAttrib* attribList);
|
||||||
|
Bool DestroySurface(EGLDisplayHandle display, EGLSurfaceHandle surface);
|
||||||
|
Bool QuerySurface(EGLDisplayHandle display, EGLSurfaceHandle surface, EGLint attribute,
|
||||||
|
EGLint* value) const;
|
||||||
|
Bool ValidateSurface(EGLSurfaceHandle surface) const;
|
||||||
|
Bool ValidateSurfaceOnDisplay(EGLDisplayHandle display, EGLSurfaceHandle surface) const;
|
||||||
|
Bool SwapInterval(EGLDisplayHandle display, EGLint interval);
|
||||||
|
|
||||||
|
// Current
|
||||||
|
Bool MakeCurrent(EGLDisplayHandle display, EGLSurfaceHandle draw, EGLSurfaceHandle read,
|
||||||
|
EGLContextHandle context);
|
||||||
|
void ReleaseThread();
|
||||||
|
EGLContextHandle GetCurrentContext() const;
|
||||||
|
EGLDisplayHandle GetCurrentDisplay() const;
|
||||||
|
EGLSurfaceHandle GetCurrentSurface(EGLint readdraw) const;
|
||||||
|
|
||||||
|
// Sync
|
||||||
|
EGLSyncHandle CreateSync(EGLDisplayHandle display, EGLenum type, const EGLAttrib* attribList);
|
||||||
|
Bool DestroySync(EGLDisplayHandle display, EGLSyncHandle sync);
|
||||||
|
EGLint ClientWaitSync(EGLDisplayHandle display, EGLSyncHandle sync, EGLint flags, EGLTime timeout);
|
||||||
|
Bool GetSyncAttrib(EGLDisplayHandle display, EGLSyncHandle sync, EGLint attribute,
|
||||||
|
EGLAttrib* value) const;
|
||||||
|
Bool WaitSync(EGLDisplayHandle display, EGLSyncHandle sync, EGLint flags) const;
|
||||||
|
|
||||||
|
// Image
|
||||||
|
EGLImageHandle CreateImage(EGLDisplayHandle display, EGLContextHandle context, EGLenum target,
|
||||||
|
EGLClientBuffer buffer, const EGLAttrib* attribList);
|
||||||
|
Bool DestroyImage(EGLDisplayHandle display, EGLImageHandle image);
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum class SurfaceType {
|
||||||
|
Window,
|
||||||
|
Pbuffer,
|
||||||
|
Pixmap,
|
||||||
|
PbufferFromClientBuffer,
|
||||||
|
PlatformWindow,
|
||||||
|
PlatformPixmap
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DisplayLookupKey {
|
||||||
|
Uint64 NativeDisplayKey = 0;
|
||||||
|
EGLenum Platform = EGL_NONE;
|
||||||
|
|
||||||
|
Bool operator==(const DisplayLookupKey& rhs) const = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DisplayLookupHasher {
|
||||||
|
SizeT operator()(const DisplayLookupKey& key) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DisplayObject {
|
||||||
|
Uint64 NativeDisplayKey = 0;
|
||||||
|
EGLenum Platform = EGL_NONE;
|
||||||
|
Bool Initialized = false;
|
||||||
|
EGLint MajorVersion = 1;
|
||||||
|
EGLint MinorVersion = 5;
|
||||||
|
EGLint SwapInterval = 1;
|
||||||
|
Vector<EGLConfigHandle> Configs;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ConfigObject {
|
||||||
|
EGLDisplayHandle Display = EGL_NO_DISPLAY;
|
||||||
|
EGLint ConfigId = 1;
|
||||||
|
EGLint RedSize = 8;
|
||||||
|
EGLint GreenSize = 8;
|
||||||
|
EGLint BlueSize = 8;
|
||||||
|
EGLint AlphaSize = 8;
|
||||||
|
EGLint DepthSize = 24;
|
||||||
|
EGLint StencilSize = 8;
|
||||||
|
EGLint SurfaceType = EGL_WINDOW_BIT | EGL_PBUFFER_BIT | EGL_PIXMAP_BIT;
|
||||||
|
EGLint RenderableType = EGL_OPENGL_BIT | EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
|
||||||
|
EGLint MinSwapInterval = 0;
|
||||||
|
EGLint MaxSwapInterval = 4;
|
||||||
|
EGLint NativeVisualId = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ContextObject {
|
||||||
|
EGLDisplayHandle Display = EGL_NO_DISPLAY;
|
||||||
|
EGLConfigHandle Config = nullptr;
|
||||||
|
EGLContextHandle SharedContext = nullptr;
|
||||||
|
EGLenum ClientAPI = EGL_OPENGL_API;
|
||||||
|
EGLint ClientVersion = 1;
|
||||||
|
EGLint MajorVersion = 1;
|
||||||
|
EGLint MinorVersion = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SurfaceObject {
|
||||||
|
EGLDisplayHandle Display = EGL_NO_DISPLAY;
|
||||||
|
EGLConfigHandle Config = nullptr;
|
||||||
|
SurfaceType Type = SurfaceType::Window;
|
||||||
|
Uint64 NativeHandleKey = 0;
|
||||||
|
EGLClientBuffer ClientBuffer = nullptr;
|
||||||
|
EGLenum BufferType = EGL_NONE;
|
||||||
|
EGLint Width = 0;
|
||||||
|
EGLint Height = 0;
|
||||||
|
EGLint TextureFormat = EGL_NO_TEXTURE;
|
||||||
|
EGLint TextureTarget = EGL_NO_TEXTURE;
|
||||||
|
EGLint MipmapLevel = 0;
|
||||||
|
EGLint MipmapTexture = EGL_FALSE;
|
||||||
|
EGLint RenderBuffer = EGL_BACK_BUFFER;
|
||||||
|
EGLint SwapBehavior = EGL_BUFFER_DESTROYED;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SyncObject {
|
||||||
|
EGLDisplayHandle Display = EGL_NO_DISPLAY;
|
||||||
|
EGLenum Type = EGL_SYNC_FENCE;
|
||||||
|
EGLenum Condition = EGL_SYNC_PRIOR_COMMANDS_COMPLETE;
|
||||||
|
EGLenum Status = EGL_SIGNALED;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ImageObject {
|
||||||
|
EGLDisplayHandle Display = EGL_NO_DISPLAY;
|
||||||
|
EGLContextHandle Context = nullptr;
|
||||||
|
EGLenum Target = EGL_NONE;
|
||||||
|
EGLClientBuffer Buffer = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ThreadCurrentState {
|
||||||
|
EGLDisplayHandle Display = EGL_NO_DISPLAY;
|
||||||
|
EGLSurfaceHandle DrawSurface = EGL_NO_SURFACE;
|
||||||
|
EGLSurfaceHandle ReadSurface = EGL_NO_SURFACE;
|
||||||
|
EGLContextHandle Context = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename HandleType>
|
||||||
|
static HandleType EncodeHandle(Uint64 rawHandle) {
|
||||||
|
return reinterpret_cast<HandleType>(static_cast<SizeT>(rawHandle));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename NativeType>
|
||||||
|
static Uint64 ToNativeKey(NativeType nativeHandle) {
|
||||||
|
if constexpr (std::is_pointer_v<NativeType>) {
|
||||||
|
return static_cast<Uint64>(reinterpret_cast<SizeT>(nativeHandle));
|
||||||
|
} else {
|
||||||
|
return static_cast<Uint64>(nativeHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Optional<EGLint> ParseAttribValue(const EGLint* attribList, EGLint attrib);
|
||||||
|
static Optional<EGLAttrib> ParseAttribValue(const EGLAttrib* attribList, EGLint attrib);
|
||||||
|
static std::thread::id CurrentThreadKey();
|
||||||
|
|
||||||
|
EGLDisplayHandle GetOrCreateDisplay(Uint64 nativeDisplayKey, EGLenum platform);
|
||||||
|
EGLConfigHandle CreateDefaultConfig(EGLDisplayHandle display);
|
||||||
|
|
||||||
|
DisplayObject* TryGetDisplay(EGLDisplayHandle display);
|
||||||
|
const DisplayObject* TryGetDisplay(EGLDisplayHandle display) const;
|
||||||
|
const ConfigObject* TryGetConfig(EGLConfigHandle config) const;
|
||||||
|
const ContextObject* TryGetContext(EGLContextHandle context) const;
|
||||||
|
const SurfaceObject* TryGetSurface(EGLSurfaceHandle surface) const;
|
||||||
|
const SyncObject* TryGetSync(EGLSyncHandle sync) const;
|
||||||
|
const ImageObject* TryGetImage(EGLImageHandle image) const;
|
||||||
|
|
||||||
|
void ReleaseDisplayObjects(EGLDisplayHandle display);
|
||||||
|
void ReleaseThreadUnlocked(const std::thread::id& threadKey);
|
||||||
|
|
||||||
|
private:
|
||||||
|
mutable std::recursive_mutex m_mutex;
|
||||||
|
|
||||||
|
Uint64 m_nextDisplayHandle = 1;
|
||||||
|
Uint64 m_nextConfigHandle = 1;
|
||||||
|
Uint64 m_nextSurfaceHandle = 1;
|
||||||
|
Uint64 m_nextContextHandle = 1;
|
||||||
|
Uint64 m_nextSyncHandle = 1;
|
||||||
|
Uint64 m_nextImageHandle = 1;
|
||||||
|
|
||||||
|
UnorderedMap<DisplayLookupKey, EGLDisplayHandle, DisplayLookupHasher> m_displayLookup;
|
||||||
|
UnorderedMap<EGLDisplayHandle, DisplayObject> m_displays;
|
||||||
|
UnorderedMap<EGLConfigHandle, ConfigObject> m_configs;
|
||||||
|
UnorderedMap<EGLSurfaceHandle, SurfaceObject> m_surfaces;
|
||||||
|
UnorderedMap<EGLContextHandle, ContextObject> m_contexts;
|
||||||
|
UnorderedMap<EGLSyncHandle, SyncObject> m_syncs;
|
||||||
|
UnorderedMap<EGLImageHandle, ImageObject> m_images;
|
||||||
|
|
||||||
|
UnorderedMap<std::thread::id, EGLint> m_threadErrors;
|
||||||
|
UnorderedMap<std::thread::id, EGLenum> m_threadBoundAPI;
|
||||||
|
UnorderedMap<std::thread::id, ThreadCurrentState> m_threadCurrents;
|
||||||
|
UnorderedMap<EGLContextHandle, std::thread::id> m_contextOwners;
|
||||||
|
};
|
||||||
|
} // namespace EGLState
|
||||||
|
|
||||||
|
extern UniquePtr<EGLState::EGLContext> pEGLContext;
|
||||||
|
} // namespace MG_State
|
||||||
|
} // namespace MobileGL
|
||||||
@@ -7,16 +7,13 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#include "BufferObject.h"
|
#include "BufferObject.h"
|
||||||
#include "MG_Util/Types.h"
|
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
BufferObject::BufferObject(Uint externalIndex)
|
BufferObject::BufferObject(Uint externalIndex)
|
||||||
: m_externalIndex(externalIndex), m_size(0), m_usage(BufferUsage::StaticDraw), m_isMapped(false),
|
: m_externalIndex(externalIndex), m_size(0), m_usage(BufferUsage::StaticDraw), m_isMapped(false),
|
||||||
m_mappingAccess(BufferMappingAccessBit::Null),
|
m_mappingAccess(BufferMappingAccessBit::Null),
|
||||||
m_change(BufferChangeBits::DirtyBit | BufferChangeBits::PreferReallocationBit), m_mappedRange({0, 0}),
|
m_change(BufferChangeBits::DirtyBit | BufferChangeBits::PreferReallocationBit), m_mappedRange({0, 0}),
|
||||||
m_dataPtr(MakeShared<Data>()) {
|
m_dataPtr(MakeShared<Data>()), m_ownsStagingData{} {
|
||||||
m_change.DirtyRanges.reserve(BufferChange::DEFAULT_RESERVED_DIRTY_RANGES_COUNT);
|
m_change.DirtyRanges.reserve(BufferChange::DEFAULT_RESERVED_DIRTY_RANGES_COUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,8 +74,8 @@ namespace MobileGL {
|
|||||||
|
|
||||||
SizeT start = m_mappedRange.start + offset;
|
SizeT start = m_mappedRange.start + offset;
|
||||||
SizeT end = start + length;
|
SizeT end = start + length;
|
||||||
MOBILEGL_ASSERT(end <= m_mappedRange.end,
|
MOBILEGL_ASSERT(end <= m_mappedRange.end, "Flush range out of bounds: mappedRange.end (%zu) < end (%zu)",
|
||||||
"Flush range out of bounds: mappedRange.end (%zu) < end (%zu)", m_mappedRange.end, end);
|
m_mappedRange.end, end);
|
||||||
|
|
||||||
Memcpy(m_dataPtr->data() + start, m_stagingData.data() + offset, length);
|
Memcpy(m_dataPtr->data() + start, m_stagingData.data() + offset, length);
|
||||||
m_change.DirtyRanges.Add({start, end});
|
m_change.DirtyRanges.Add({start, end});
|
||||||
@@ -88,8 +85,8 @@ namespace MobileGL {
|
|||||||
void BufferObject::UploadSubData(DataPtr data, SizeT atOffset) {
|
void BufferObject::UploadSubData(DataPtr data, SizeT atOffset) {
|
||||||
MOBILEGL_ASSERT(!m_isMapped, "Cannot upload sub data while buffer is mapped.");
|
MOBILEGL_ASSERT(!m_isMapped, "Cannot upload sub data while buffer is mapped.");
|
||||||
MOBILEGL_ASSERT(atOffset + data.size <= m_size,
|
MOBILEGL_ASSERT(atOffset + data.size <= m_size,
|
||||||
"UploadSubData out of bounds: atOffset (%zu) + data.size (%zu) > m_size (%zu)",
|
"UploadSubData out of bounds: atOffset (%zu) + data.size (%zu) > m_size (%zu)", atOffset,
|
||||||
atOffset, data.size, m_size);
|
data.size, m_size);
|
||||||
|
|
||||||
Memcpy(m_dataPtr->data() + atOffset, data.data, data.size);
|
Memcpy(m_dataPtr->data() + atOffset, data.data, data.size);
|
||||||
m_change.DirtyRanges.Add({atOffset, atOffset + data.size});
|
m_change.DirtyRanges.Add({atOffset, atOffset + data.size});
|
||||||
@@ -98,16 +95,15 @@ namespace MobileGL {
|
|||||||
m_change.Bits |= BufferChangeBits::ForbidUnsynchronizationBit;
|
m_change.Bits |= BufferChangeBits::ForbidUnsynchronizationBit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BufferObject::CopyDataFrom(const SharedPtr<BufferObject>& src, SizeT srcOffset, SizeT dstOffset,
|
void BufferObject::CopyDataFrom(const SharedPtr<BufferObject>& src, SizeT srcOffset, SizeT dstOffset, SizeT size) {
|
||||||
SizeT size) {
|
|
||||||
MOBILEGL_ASSERT(!m_isMapped, "Cannot copy data while buffer is mapped.");
|
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(!src->IsMapped(), "Cannot copy data from a buffer that is mapped.");
|
||||||
MOBILEGL_ASSERT(srcOffset + size <= src->GetSize(),
|
MOBILEGL_ASSERT(srcOffset + size <= src->GetSize(),
|
||||||
"Source buffer copy out of bounds: srcOffset (%zu) + size (%zu) > src->GetSize() (%zu)",
|
"Source buffer copy out of bounds: srcOffset (%zu) + size (%zu) > src->GetSize() (%zu)",
|
||||||
srcOffset, size, src->GetSize());
|
srcOffset, size, src->GetSize());
|
||||||
MOBILEGL_ASSERT(dstOffset + size <= m_size,
|
MOBILEGL_ASSERT(dstOffset + size <= m_size,
|
||||||
"Destination buffer copy out of bounds: dstOffset (%zu) + size (%zu) > m_size (%zu)",
|
"Destination buffer copy out of bounds: dstOffset (%zu) + size (%zu) > m_size (%zu)", dstOffset,
|
||||||
dstOffset, size, m_size);
|
size, m_size);
|
||||||
|
|
||||||
const Uint8* srcData = src->m_dataPtr->data() + srcOffset;
|
const Uint8* srcData = src->m_dataPtr->data() + srcOffset;
|
||||||
Memcpy(m_dataPtr->data() + dstOffset, srcData, size);
|
Memcpy(m_dataPtr->data() + dstOffset, srcData, size);
|
||||||
@@ -151,8 +147,7 @@ namespace MobileGL {
|
|||||||
m_stagingData.resize(range.end - range.start);
|
m_stagingData.resize(range.end - range.start);
|
||||||
m_ownsStagingData = true;
|
m_ownsStagingData = true;
|
||||||
|
|
||||||
if (!(access &
|
if (!(access & (BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer))) {
|
||||||
(BufferMappingAccessBit::InvalidateRange | BufferMappingAccessBit::InvalidateBuffer))) {
|
|
||||||
Memcpy(m_stagingData.data(), m_dataPtr->data() + range.start, m_stagingData.size());
|
Memcpy(m_stagingData.data(), m_dataPtr->data() + range.start, m_stagingData.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,8 +157,8 @@ namespace MobileGL {
|
|||||||
return m_dataPtr->data() + range.start;
|
return m_dataPtr->data() + range.start;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_change.Bits |= !(access & BufferMappingAccessBit::InvalidateBuffer ||
|
m_change.Bits |=
|
||||||
access & BufferMappingAccessBit::InvalidateRange)
|
!(access & BufferMappingAccessBit::InvalidateBuffer || access & BufferMappingAccessBit::InvalidateRange)
|
||||||
? BufferChangeBits::ForbidInvalidationBit
|
? BufferChangeBits::ForbidInvalidationBit
|
||||||
: BufferChangeBits::None;
|
: BufferChangeBits::None;
|
||||||
m_change.Bits |= !(access & BufferMappingAccessBit::Unsynchronized)
|
m_change.Bits |= !(access & BufferMappingAccessBit::Unsynchronized)
|
||||||
@@ -171,7 +166,7 @@ namespace MobileGL {
|
|||||||
: BufferChangeBits::None;
|
: BufferChangeBits::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SharedPtr<Data> BufferObject::GetDataReadOnly() const {
|
const SharedPtr<Data>& BufferObject::GetDataReadOnly() const {
|
||||||
return m_dataPtr;
|
return m_dataPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,6 +206,4 @@ namespace MobileGL {
|
|||||||
Uint BufferObject::GetExternalIndex() const {
|
Uint BufferObject::GetExternalIndex() const {
|
||||||
return m_externalIndex;
|
return m_externalIndex;
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "MG_Util/Types.h"
|
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_Util/Math/VectorTypes.h>
|
#include <MG_Util/Math/VectorTypes.h>
|
||||||
|
|
||||||
@@ -73,8 +72,7 @@ namespace MobileGL {
|
|||||||
VecRange1D DirtyRanges;
|
VecRange1D DirtyRanges;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace MG_State {
|
namespace MG_State::GLState {
|
||||||
namespace GLState {
|
|
||||||
class BufferObject {
|
class BufferObject {
|
||||||
public:
|
public:
|
||||||
using TargetEnum = BufferTarget;
|
using TargetEnum = BufferTarget;
|
||||||
@@ -96,7 +94,7 @@ namespace MobileGL {
|
|||||||
SizeT GetSize() const;
|
SizeT GetSize() const;
|
||||||
BufferUsage GetUsage() const;
|
BufferUsage GetUsage() const;
|
||||||
Range1D GetMappedRange() const;
|
Range1D GetMappedRange() const;
|
||||||
const SharedPtr<Data> GetDataReadOnly() const;
|
const SharedPtr<Data>& GetDataReadOnly() const;
|
||||||
Flags<BufferMappingAccessBit> GetMappingAccess() const;
|
Flags<BufferMappingAccessBit> GetMappingAccess() const;
|
||||||
Uint GetExternalIndex() const;
|
Uint GetExternalIndex() const;
|
||||||
const VecRange1D& GetDirtyRanges() const;
|
const VecRange1D& GetDirtyRanges() const;
|
||||||
@@ -114,6 +112,5 @@ namespace MobileGL {
|
|||||||
Vector<Uint8> m_stagingData;
|
Vector<Uint8> m_stagingData;
|
||||||
Bool m_ownsStagingData;
|
Bool m_ownsStagingData;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
} // namespace MobileGL
|
||||||
|
|||||||
@@ -8,39 +8,39 @@
|
|||||||
|
|
||||||
#include "BufferState.h"
|
#include "BufferState.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
BufferState::BufferState() : m_indexGenerator(1024, 1) {
|
BufferState::BufferState() : m_indexGenerator(1024, 1) {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
||||||
m_bindingSlots[i] = BindingSlot<BufferObject>(GlobalBufferTargets[i]);
|
m_bindingSlots[i] = BindingSlot<BufferObject>(GlobalBufferTargets[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<BufferObject> BufferState::GetBufferObject(Uint index) {
|
const SharedPtr<BufferObject>& BufferState::GetBufferObject(Uint index) {
|
||||||
auto it = m_bufferObjects.find(index);
|
auto it = m_bufferObjects.find(index);
|
||||||
if (it != m_bufferObjects.end()) {
|
if (it != m_bufferObjects.end()) {
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
return nullptr;
|
static SharedPtr<BufferObject> nullBufferObject = nullptr;
|
||||||
|
return nullBufferObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Uint> BufferState::GenerateNames(Uint number) {
|
void BufferState::GenerateNames(Uint number, Vector<Uint>& buffers) {
|
||||||
Vector<Uint> buffers(number);
|
buffers.resize(number);
|
||||||
m_indexGenerator.Generate(number, buffers.data());
|
m_indexGenerator.Generate(number, buffers.data());
|
||||||
return buffers;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<BufferObject> BufferState::CreateBufferObject(Uint index) {
|
const SharedPtr<BufferObject>& BufferState::CreateBufferObject(Uint index) {
|
||||||
auto bufferObject = MakeShared<BufferObject>(index);
|
auto& bufferObj = m_bufferObjects[index];
|
||||||
m_bufferObjects[index] = bufferObject;
|
if (!bufferObj) {
|
||||||
return bufferObject;
|
bufferObj = MakeShared<BufferObject>(index);
|
||||||
|
}
|
||||||
|
return bufferObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
BindingSlot<BufferObject>& BufferState::GetBindingSlot(BufferTarget target) {
|
BindingSlot<BufferObject>& BufferState::GetBindingSlot(BufferTarget target) {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (auto& bindingSlot : m_bindingSlots) {
|
||||||
if (m_bindingSlots[i].GetTarget() == target) {
|
if (bindingSlot.GetTarget() == target) {
|
||||||
return m_bindingSlots[i];
|
return bindingSlot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MOBILEGL_ASSERT(false, "Invalid BufferTarget enum value: %d", static_cast<int>(target));
|
MOBILEGL_ASSERT(false, "Invalid BufferTarget enum value: %d", static_cast<int>(target));
|
||||||
@@ -51,9 +51,9 @@ namespace MobileGL {
|
|||||||
if (m_indexGenerator.IsValid(index)) {
|
if (m_indexGenerator.IsValid(index)) {
|
||||||
auto it = m_bufferObjects.find(index);
|
auto it = m_bufferObjects.find(index);
|
||||||
if (it != m_bufferObjects.end()) {
|
if (it != m_bufferObjects.end()) {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (auto& bindingSlot : m_bindingSlots) {
|
||||||
if (m_bindingSlots[i].GetBoundObject() == it->second) {
|
if (bindingSlot.GetBoundObject() == it->second) {
|
||||||
m_bindingSlots[i].Bind(nullptr);
|
bindingSlot.Bind(nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_bufferObjects.erase(it);
|
m_bufferObjects.erase(it);
|
||||||
@@ -76,10 +76,7 @@ namespace MobileGL {
|
|||||||
return m_bufferBindPointTargets[i][index];
|
return m_bufferBindPointTargets[i][index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MOBILEGL_ASSERT(false, "Invalid BufferTarget enum value for binding point: %d",
|
MOBILEGL_ASSERT(false, "Invalid BufferTarget enum value for binding point: %d", static_cast<int>(target));
|
||||||
static_cast<int>(target));
|
|
||||||
return m_bufferBindPointTargets[0][index];
|
return m_bufferBindPointTargets[0][index];
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -11,25 +11,22 @@
|
|||||||
#include <MG_Util/Miscellany/IndexGenerator.h>
|
#include <MG_Util/Miscellany/IndexGenerator.h>
|
||||||
#include "BufferObject.h"
|
#include "BufferObject.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
constexpr const auto GlobalBufferTargets =
|
constexpr const auto GlobalBufferTargets =
|
||||||
ToArray(BufferTarget::Vertex, BufferTarget::Uniform, BufferTarget::CopyRead, BufferTarget::CopyWrite,
|
ToArray(BufferTarget::Vertex, BufferTarget::Uniform, BufferTarget::CopyRead, BufferTarget::CopyWrite,
|
||||||
BufferTarget::PixelPack, BufferTarget::PixelUnpack, BufferTarget::Query, BufferTarget::Texture,
|
BufferTarget::PixelPack, BufferTarget::PixelUnpack, BufferTarget::Query, BufferTarget::Texture,
|
||||||
BufferTarget::TransformFeedback, BufferTarget::AtomicCounter, BufferTarget::DispatchIndirect,
|
BufferTarget::TransformFeedback, BufferTarget::AtomicCounter, BufferTarget::DispatchIndirect,
|
||||||
BufferTarget::DrawIndirect, BufferTarget::ShaderStorage);
|
BufferTarget::DrawIndirect, BufferTarget::ShaderStorage);
|
||||||
constexpr const auto BufferBindPointTargets =
|
constexpr const auto BufferBindPointTargets = ToArray(BufferTarget::Uniform, BufferTarget::TransformFeedback,
|
||||||
ToArray(BufferTarget::Uniform, BufferTarget::TransformFeedback, BufferTarget::AtomicCounter,
|
BufferTarget::AtomicCounter, BufferTarget::ShaderStorage);
|
||||||
BufferTarget::ShaderStorage);
|
|
||||||
|
|
||||||
class BufferState {
|
class BufferState {
|
||||||
public:
|
public:
|
||||||
BufferState();
|
BufferState();
|
||||||
|
|
||||||
SharedPtr<BufferObject> GetBufferObject(Uint index);
|
const SharedPtr<BufferObject>& GetBufferObject(Uint index);
|
||||||
Vector<Uint> GenerateNames(Uint number);
|
void GenerateNames(Uint number, Vector<Uint>& buffers);
|
||||||
SharedPtr<BufferObject> CreateBufferObject(Uint index);
|
const SharedPtr<BufferObject>& CreateBufferObject(Uint index);
|
||||||
BindingSlot<BufferObject>& GetBindingSlot(BufferTarget target);
|
BindingSlot<BufferObject>& GetBindingSlot(BufferTarget target);
|
||||||
// For glBindBufferBase / glBindBufferRange
|
// For glBindBufferBase / glBindBufferRange
|
||||||
BindingSlotRange1D<BufferObject>& GetBindingPoint(BufferTarget target, Uint index);
|
BindingSlotRange1D<BufferObject>& GetBindingPoint(BufferTarget target, Uint index);
|
||||||
@@ -48,9 +45,6 @@ namespace MobileGL {
|
|||||||
Array<BindingSlot<BufferObject>, GlobalBufferTargets.size()> m_bindingSlots;
|
Array<BindingSlot<BufferObject>, GlobalBufferTargets.size()> m_bindingSlots;
|
||||||
// TODO: query the count somewhere globally?
|
// TODO: query the count somewhere globally?
|
||||||
// For glBindBufferBase / glBindBufferRange
|
// For glBindBufferBase / glBindBufferRange
|
||||||
Array<Array<BindingSlotRange1D<BufferObject>, 16>, BufferBindPointTargets.size()>
|
Array<Array<BindingSlotRange1D<BufferObject>, 16>, BufferBindPointTargets.size()> m_bufferBindPointTargets;
|
||||||
m_bufferBindPointTargets;
|
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -8,42 +8,43 @@
|
|||||||
|
|
||||||
#include "Core.h"
|
#include "Core.h"
|
||||||
#include "MG_State/GLState/RenderbufferState/RenderbufferObject.h"
|
#include "MG_State/GLState/RenderbufferState/RenderbufferObject.h"
|
||||||
|
#include "MG_State/EGLState/Core.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State {
|
||||||
namespace MG_State {
|
|
||||||
void Init() {
|
void Init() {
|
||||||
MGLOG_D("Initializing MobileGL State...");
|
MGLOG_D("Initializing MobileGL State...");
|
||||||
pGLContext = new MG_State::GLState::GLContext();
|
pGLContext = MakeUnique<GLState::GLContext>();
|
||||||
|
pEGLContext = MakeUnique<EGLState::EGLContext>();
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace GLState {
|
namespace GLState {
|
||||||
// Error
|
// Error
|
||||||
void GLContext::RecordError(ErrorCode code, SharedPtr<ErrorInfo> info) {
|
void GLContext::RecordError(ErrorCode code, UniquePtr<ErrorInfo> info) {
|
||||||
m_errorState.RecordError(code, info);
|
m_errorState.RecordError(code, Move(info));
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool GLContext::HasGLError() const {
|
Bool GLContext::HasGLError() const {
|
||||||
return m_errorState.HasGLError();
|
return m_errorState.HasGLError();
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<const Error> GLContext::PeekGLError() const {
|
Optional<const Error*> GLContext::PeekGLError() const {
|
||||||
return m_errorState.PeekGLError();
|
return m_errorState.PeekGLError();
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<Error> GLContext::PopGLError() {
|
Optional<UniquePtr<Error>> GLContext::PopGLError() {
|
||||||
return m_errorState.PopGLError();
|
return Move(m_errorState.PopGLError());
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool GLContext::HasNonGLError() const {
|
Bool GLContext::HasNonGLError() const {
|
||||||
return m_errorState.HasNonGLError();
|
return m_errorState.HasNonGLError();
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<const Error> GLContext::PeekNonGLError() const {
|
Optional<const Error*> GLContext::PeekNonGLError() const {
|
||||||
return m_errorState.PeekNonGLError();
|
return m_errorState.PeekNonGLError();
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<Error> GLContext::PopNonGLError() {
|
Optional<UniquePtr<Error>> GLContext::PopNonGLError() {
|
||||||
return m_errorState.PopNonGLError();
|
return Move(m_errorState.PopNonGLError());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLContext::ClearErrors() {
|
void GLContext::ClearErrors() {
|
||||||
@@ -51,19 +52,18 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Buffer
|
// Buffer
|
||||||
Vector<Uint> GLContext::GenBufferNames(Uint number) {
|
void GLContext::GenBufferNames(Uint number, Vector<Uint>& buffers) {
|
||||||
return m_bufferState.GenerateNames(number);
|
m_bufferState.GenerateNames(number, buffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<BufferObject> GLContext::GetBufferObject(Uint index) {
|
const SharedPtr<BufferObject>& GLContext::GetBufferObject(Uint index) {
|
||||||
return m_bufferState.GetBufferObject(index);
|
return m_bufferState.GetBufferObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
BindingSlot<BufferObject>& GLContext::GetBufferBindingSlot(BufferTarget target) {
|
BindingSlot<BufferObject>& GLContext::GetBufferBindingSlot(BufferTarget target) {
|
||||||
if (target == BufferTarget::Index) {
|
if (target == BufferTarget::Index) {
|
||||||
const auto& vao = m_vertexArrayState.GetBoundVertexArray();
|
const auto& vao = m_vertexArrayState.GetBoundVertexArray();
|
||||||
MOBILEGL_ASSERT(vao != nullptr,
|
MOBILEGL_ASSERT(vao != nullptr, "No VAO is currently bound when accessing index buffer binding slot.");
|
||||||
"No VAO is currently bound when accessing index buffer binding slot.");
|
|
||||||
return vao->GetIndexBufferBindingSlot();
|
return vao->GetIndexBufferBindingSlot();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ namespace MobileGL {
|
|||||||
return m_bufferState.GetBindingPoint(target, index);
|
return m_bufferState.GetBindingPoint(target, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<BufferObject> GLContext::CreateBufferObject(Uint index) {
|
const SharedPtr<BufferObject>& GLContext::CreateBufferObject(Uint index) {
|
||||||
return m_bufferState.CreateBufferObject(index);
|
return m_bufferState.CreateBufferObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,8 +82,7 @@ namespace MobileGL {
|
|||||||
if (ValidateBufferObject(index)) {
|
if (ValidateBufferObject(index)) {
|
||||||
auto bufferObject = m_bufferState.GetBufferObject(index);
|
auto bufferObject = m_bufferState.GetBufferObject(index);
|
||||||
auto& vaos = m_vertexArrayState.GetAllVertexArrays();
|
auto& vaos = m_vertexArrayState.GetAllVertexArrays();
|
||||||
for (SizeT i = 0; i < vaos.size(); ++i) {
|
for (auto& vao : vaos) {
|
||||||
auto vao = vaos[i];
|
|
||||||
if (vao == nullptr) continue;
|
if (vao == nullptr) continue;
|
||||||
|
|
||||||
if (vao->GetIndexBufferBindingSlot().GetBoundObject() == bufferObject) {
|
if (vao->GetIndexBufferBindingSlot().GetBoundObject() == bufferObject) {
|
||||||
@@ -109,11 +108,11 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// VertexArray
|
// VertexArray
|
||||||
Vector<Uint> GLContext::GenVertexArrayNames(Uint number) {
|
void GLContext::GenVertexArrayNames(Uint number, Vector<Uint>& vertexArrays) {
|
||||||
return m_vertexArrayState.GenerateNames(number);
|
m_vertexArrayState.GenerateNames(number, vertexArrays);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<VertexArrayObject> GLContext::GetVertexArrayObject(Uint index) {
|
const SharedPtr<VertexArrayObject>& GLContext::GetVertexArrayObject(Uint index) {
|
||||||
return m_vertexArrayState.GetVertexArrayObject(index);
|
return m_vertexArrayState.GetVertexArrayObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +120,7 @@ namespace MobileGL {
|
|||||||
m_vertexArrayState.Bind(index);
|
m_vertexArrayState.Bind(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<VertexArrayObject> GLContext::CreateVertexArrayObject(Uint index) {
|
const SharedPtr<VertexArrayObject>& GLContext::CreateVertexArrayObject(Uint index) {
|
||||||
return m_vertexArrayState.CreateVertexArrayObject(index);
|
return m_vertexArrayState.CreateVertexArrayObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,20 +136,20 @@ namespace MobileGL {
|
|||||||
return m_vertexArrayState.ValidateVertexArrayObject(index);
|
return m_vertexArrayState.ValidateVertexArrayObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<VertexArrayObject> GLContext::GetBoundVertexArray() {
|
const SharedPtr<VertexArrayObject>& GLContext::GetBoundVertexArray() {
|
||||||
return m_vertexArrayState.GetBoundVertexArray();
|
return m_vertexArrayState.GetBoundVertexArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Texture
|
// Texture
|
||||||
Vector<Uint> GLContext::GenTextureNames(Uint number) {
|
void GLContext::GenTextureNames(Uint number, Vector<Uint>& textures) {
|
||||||
return m_textureState.GenerateNames(number);
|
m_textureState.GenerateNames(number, textures);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ITextureObject> GLContext::GetTextureObject(Uint index) {
|
const SharedPtr<ITextureObject>& GLContext::GetTextureObject(Uint index) {
|
||||||
return m_textureState.GetTextureObject(index);
|
return m_textureState.GetTextureObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ITextureObject> GLContext::CreateTextureObject(Uint index, TextureTarget target) {
|
const SharedPtr<ITextureObject>& GLContext::CreateTextureObject(Uint index, TextureTarget target) {
|
||||||
return m_textureState.CreateTextureObject(index, target);
|
return m_textureState.CreateTextureObject(index, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,11 +202,11 @@ namespace MobileGL {
|
|||||||
return m_programState.ValidateShaderObject(index);
|
return m_programState.ValidateShaderObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ProgramObject> GLContext::GetProgramObject(const Uint index) {
|
const SharedPtr<ProgramObject>& GLContext::GetProgramObject(const Uint index) {
|
||||||
return m_programState.GetProgramObject(index);
|
return m_programState.GetProgramObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ShaderObject> GLContext::GetShaderObject(const Uint index) {
|
const SharedPtr<ShaderObject>& GLContext::GetShaderObject(const Uint index) {
|
||||||
return m_programState.GetShaderObject(index);
|
return m_programState.GetShaderObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,7 +214,7 @@ namespace MobileGL {
|
|||||||
return m_programState.UseProgram(program);
|
return m_programState.UseProgram(program);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ProgramObject> GLContext::GetCurrentProgram() {
|
const SharedPtr<ProgramObject>& GLContext::GetCurrentProgram() {
|
||||||
return m_programState.GetCurrentProgram();
|
return m_programState.GetCurrentProgram();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,13 +261,13 @@ namespace MobileGL {
|
|||||||
m_renderState.GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha);
|
m_renderState.GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLContext::SetBlendFuncIndexed(Uint index, BlendFactor srcRGB, BlendFactor dstRGB,
|
void GLContext::SetBlendFuncIndexed(Uint index, BlendFactor srcRGB, BlendFactor dstRGB, BlendFactor srcAlpha,
|
||||||
BlendFactor srcAlpha, BlendFactor dstAlpha) {
|
BlendFactor dstAlpha) {
|
||||||
m_renderState.SetBlendFuncIndexed(index, srcRGB, dstRGB, srcAlpha, dstAlpha);
|
m_renderState.SetBlendFuncIndexed(index, srcRGB, dstRGB, srcAlpha, dstAlpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLContext::GetBlendFuncIndexed(Uint index, BlendFactor& srcRGB, BlendFactor& dstRGB,
|
void GLContext::GetBlendFuncIndexed(Uint index, BlendFactor& srcRGB, BlendFactor& dstRGB, BlendFactor& srcAlpha,
|
||||||
BlendFactor& srcAlpha, BlendFactor& dstAlpha) const {
|
BlendFactor& dstAlpha) const {
|
||||||
m_renderState.GetBlendFuncIndexed(index, srcRGB, dstRGB, srcAlpha, dstAlpha);
|
m_renderState.GetBlendFuncIndexed(index, srcRGB, dstRGB, srcAlpha, dstAlpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,7 +291,7 @@ namespace MobileGL {
|
|||||||
m_renderState.SetColorMask(mask);
|
m_renderState.SetColorMask(mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
const BoolVec4 GLContext::GetColorMask() const {
|
BoolVec4 GLContext::GetColorMask() const {
|
||||||
return m_renderState.GetColorMask();
|
return m_renderState.GetColorMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,11 +348,11 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Framebuffer
|
// Framebuffer
|
||||||
Vector<Uint> GLContext::GenFramebufferNames(Uint number) {
|
void GLContext::GenFramebufferNames(Uint number, Vector<Uint>& framebuffers) {
|
||||||
return m_framebufferState.GenerateNames(number);
|
m_framebufferState.GenerateNames(number, framebuffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<FramebufferObject> GLContext::GetFramebufferObject(Uint index) {
|
const SharedPtr<FramebufferObject>& GLContext::GetFramebufferObject(Uint index) {
|
||||||
return m_framebufferState.GetFramebufferObject(index);
|
return m_framebufferState.GetFramebufferObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,7 +360,7 @@ namespace MobileGL {
|
|||||||
return m_framebufferState.GetBindingSlot(target);
|
return m_framebufferState.GetBindingSlot(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<FramebufferObject> GLContext::CreateFramebufferObject(Uint index) {
|
const SharedPtr<FramebufferObject>& GLContext::CreateFramebufferObject(Uint index) {
|
||||||
return m_framebufferState.CreateFramebufferObject(index);
|
return m_framebufferState.CreateFramebufferObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,15 +377,15 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sampler
|
// Sampler
|
||||||
Vector<Uint> GLContext::GenSamplerNames(Uint number) {
|
void GLContext::GenSamplerNames(Uint number, Vector<Uint>& samplers) {
|
||||||
return m_samplerState.GenerateNames(number);
|
m_samplerState.GenerateNames(number, samplers);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<SamplerObject> GLContext::GetSamplerObject(Uint index) {
|
const SharedPtr<SamplerObject>& GLContext::GetSamplerObject(Uint index) {
|
||||||
return m_samplerState.GetSamplerObject(index);
|
return m_samplerState.GetSamplerObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<SamplerObject> GLContext::CreateSamplerObject(Uint index) {
|
const SharedPtr<SamplerObject>& GLContext::CreateSamplerObject(Uint index) {
|
||||||
return m_samplerState.CreateSamplerObject(index);
|
return m_samplerState.CreateSamplerObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,11 +412,11 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Renderbuffer
|
// Renderbuffer
|
||||||
Vector<Uint> GLContext::GenRenderbufferNames(Uint number) {
|
void GLContext::GenRenderbufferNames(Uint number, Vector<Uint>& renderbuffers) {
|
||||||
return m_renderbufferState.GenerateNames(number);
|
m_renderbufferState.GenerateNames(number, renderbuffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<RenderbufferObject> GLContext::GetRenderbufferObject(Uint index) {
|
const SharedPtr<RenderbufferObject>& GLContext::GetRenderbufferObject(Uint index) {
|
||||||
return m_renderbufferState.GetRenderbufferObject(index);
|
return m_renderbufferState.GetRenderbufferObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -425,7 +424,7 @@ namespace MobileGL {
|
|||||||
return m_renderbufferState.GetBindingSlot(target);
|
return m_renderbufferState.GetBindingSlot(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<RenderbufferObject> GLContext::CreateRenderbufferObject(Uint index) {
|
const SharedPtr<RenderbufferObject>& GLContext::CreateRenderbufferObject(Uint index) {
|
||||||
return m_renderbufferState.CreateRenderbufferObject(index);
|
return m_renderbufferState.CreateRenderbufferObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,8 +435,11 @@ namespace MobileGL {
|
|||||||
Bool GLContext::ValidateRenderbufferName(Uint index) const {
|
Bool GLContext::ValidateRenderbufferName(Uint index) const {
|
||||||
return m_renderbufferState.ValidateName(index);
|
return m_renderbufferState.ValidateName(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bool GLContext::ValidateRenderbufferObject(Uint index) const {
|
||||||
|
return m_renderbufferState.ValidateRenderbufferObject(index);
|
||||||
|
}
|
||||||
} // namespace GLState
|
} // namespace GLState
|
||||||
|
|
||||||
GLState::GLContext* pGLContext;
|
UniquePtr<GLState::GLContext> pGLContext;
|
||||||
} // namespace MG_State
|
} // namespace MobileGL::MG_State
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -30,42 +30,42 @@ namespace MobileGL {
|
|||||||
GLContext() = default;
|
GLContext() = default;
|
||||||
|
|
||||||
// Error
|
// Error
|
||||||
void RecordError(ErrorCode code, SharedPtr<ErrorInfo> info = nullptr);
|
void RecordError(ErrorCode code, UniquePtr<ErrorInfo> info);
|
||||||
Bool HasGLError() const;
|
Bool HasGLError() const;
|
||||||
Optional<const Error> PeekGLError() const;
|
Optional<const Error*> PeekNonGLError() const;
|
||||||
Optional<Error> PopGLError();
|
Optional<UniquePtr<Error>> PopNonGLError();
|
||||||
Bool HasNonGLError() const;
|
Bool HasNonGLError() const;
|
||||||
Optional<const Error> PeekNonGLError() const;
|
Optional<const Error*> PeekGLError() const;
|
||||||
Optional<Error> PopNonGLError();
|
Optional<UniquePtr<Error>> PopGLError();
|
||||||
void ClearErrors();
|
void ClearErrors();
|
||||||
|
|
||||||
// Buffer
|
// Buffer
|
||||||
Vector<Uint> GenBufferNames(Uint number);
|
void GenBufferNames(Uint number, Vector<Uint>& buffers);
|
||||||
SharedPtr<BufferObject> GetBufferObject(Uint index);
|
const SharedPtr<BufferObject>& GetBufferObject(Uint index);
|
||||||
BindingSlot<BufferObject>& GetBufferBindingSlot(BufferTarget target);
|
BindingSlot<BufferObject>& GetBufferBindingSlot(BufferTarget target);
|
||||||
BindingSlotRange1D<BufferObject>& GetBufferBindingPoint(BufferTarget target, Uint index);
|
BindingSlotRange1D<BufferObject>& GetBufferBindingPoint(BufferTarget target, Uint index);
|
||||||
constexpr SizeT GetBufferBindingPointCount(BufferTarget target) const {
|
constexpr SizeT GetBufferBindingPointCount(BufferTarget target) const {
|
||||||
return m_bufferState.GetBindingPointCount(target);
|
return m_bufferState.GetBindingPointCount(target);
|
||||||
}
|
}
|
||||||
SharedPtr<BufferObject> CreateBufferObject(Uint index);
|
const SharedPtr<BufferObject>& CreateBufferObject(Uint index);
|
||||||
void MarkBufferObjectForDeletion(Uint index);
|
void MarkBufferObjectForDeletion(Uint index);
|
||||||
Bool ValidateBufferName(Uint index) const;
|
Bool ValidateBufferName(Uint index) const;
|
||||||
Bool ValidateBufferObject(Uint index) const;
|
Bool ValidateBufferObject(Uint index) const;
|
||||||
|
|
||||||
// VertexArray
|
// VertexArray
|
||||||
Vector<Uint> GenVertexArrayNames(Uint number);
|
void GenVertexArrayNames(Uint number, Vector<Uint>& vertexArrays);
|
||||||
SharedPtr<VertexArrayObject> GetVertexArrayObject(Uint index);
|
const SharedPtr<VertexArrayObject>& GetVertexArrayObject(Uint index);
|
||||||
void BindVertexArray(Uint index);
|
void BindVertexArray(Uint index);
|
||||||
SharedPtr<VertexArrayObject> CreateVertexArrayObject(Uint index);
|
const SharedPtr<VertexArrayObject>& CreateVertexArrayObject(Uint index);
|
||||||
void MarkVertexArrayForDeletion(Uint index);
|
void MarkVertexArrayForDeletion(Uint index);
|
||||||
Bool ValidateVertexArrayName(Uint index) const;
|
Bool ValidateVertexArrayName(Uint index) const;
|
||||||
Bool ValidateVertexArrayObject(Uint index) const;
|
Bool ValidateVertexArrayObject(Uint index) const;
|
||||||
SharedPtr<VertexArrayObject> GetBoundVertexArray();
|
const SharedPtr<VertexArrayObject>& GetBoundVertexArray();
|
||||||
|
|
||||||
// Texture
|
// Texture
|
||||||
Vector<Uint> GenTextureNames(Uint number);
|
void GenTextureNames(Uint number, Vector<Uint>& textures);
|
||||||
SharedPtr<ITextureObject> GetTextureObject(Uint index);
|
const SharedPtr<ITextureObject>& GetTextureObject(Uint index);
|
||||||
SharedPtr<ITextureObject> CreateTextureObject(Uint index, TextureTarget target);
|
const SharedPtr<ITextureObject>& CreateTextureObject(Uint index, TextureTarget target);
|
||||||
void MarkTextureObjectForDeletion(Uint index);
|
void MarkTextureObjectForDeletion(Uint index);
|
||||||
TextureUnit& GetTextureUnitObject(Int unit);
|
TextureUnit& GetTextureUnitObject(Int unit);
|
||||||
Bool ValidateTextureName(Uint index) const;
|
Bool ValidateTextureName(Uint index) const;
|
||||||
@@ -80,10 +80,10 @@ namespace MobileGL {
|
|||||||
void MarkShaderForDeletion(Uint index);
|
void MarkShaderForDeletion(Uint index);
|
||||||
Bool ValidateProgramName(Uint index) const;
|
Bool ValidateProgramName(Uint index) const;
|
||||||
Bool ValidateShaderName(Uint index) const;
|
Bool ValidateShaderName(Uint index) const;
|
||||||
SharedPtr<ProgramObject> GetProgramObject(Uint index);
|
const SharedPtr<ProgramObject>& GetProgramObject(Uint index);
|
||||||
SharedPtr<ShaderObject> GetShaderObject(Uint index);
|
const SharedPtr<ShaderObject>& GetShaderObject(Uint index);
|
||||||
void UseProgram(Uint program);
|
void UseProgram(Uint program);
|
||||||
SharedPtr<ProgramObject> GetCurrentProgram();
|
const SharedPtr<ProgramObject>& GetCurrentProgram();
|
||||||
|
|
||||||
// RenderState
|
// RenderState
|
||||||
Uint GetRenderStateParametersVersion() const;
|
Uint GetRenderStateParametersVersion() const;
|
||||||
@@ -106,7 +106,7 @@ namespace MobileGL {
|
|||||||
void SetDepthMask(Bool flag);
|
void SetDepthMask(Bool flag);
|
||||||
Bool GetDepthMask() const;
|
Bool GetDepthMask() const;
|
||||||
void SetColorMask(BoolVec4 mask);
|
void SetColorMask(BoolVec4 mask);
|
||||||
const BoolVec4 GetColorMask() const;
|
BoolVec4 GetColorMask() const;
|
||||||
void SetClearColor(FloatVec4 color);
|
void SetClearColor(FloatVec4 color);
|
||||||
const FloatVec4& GetClearColor() const;
|
const FloatVec4& GetClearColor() const;
|
||||||
void SetClearDepth(Float depth);
|
void SetClearDepth(Float depth);
|
||||||
@@ -122,27 +122,27 @@ namespace MobileGL {
|
|||||||
const IntVec4& GetScissorBox() const; // x, y, width, height
|
const IntVec4& GetScissorBox() const; // x, y, width, height
|
||||||
|
|
||||||
// Framebuffer
|
// Framebuffer
|
||||||
Vector<Uint> GenFramebufferNames(Uint number);
|
void GenFramebufferNames(Uint number, Vector<Uint>& framebuffers);
|
||||||
SharedPtr<FramebufferObject> GetFramebufferObject(Uint index);
|
const SharedPtr<FramebufferObject>& GetFramebufferObject(Uint index);
|
||||||
BindingSlot<FramebufferObject>& GetFramebufferBindingSlot(FramebufferTarget target);
|
BindingSlot<FramebufferObject>& GetFramebufferBindingSlot(FramebufferTarget target);
|
||||||
SharedPtr<FramebufferObject> CreateFramebufferObject(Uint index);
|
const SharedPtr<FramebufferObject>& CreateFramebufferObject(Uint index);
|
||||||
void MarkFramebufferObjectForDeletion(Uint index);
|
void MarkFramebufferObjectForDeletion(Uint index);
|
||||||
Bool ValidateFramebufferName(Uint index) const;
|
Bool ValidateFramebufferName(Uint index) const;
|
||||||
Bool ValidateFramebufferObject(Uint index) const;
|
Bool ValidateFramebufferObject(Uint index) const;
|
||||||
|
|
||||||
// Sampler
|
// Sampler
|
||||||
Vector<Uint> GenSamplerNames(Uint number);
|
void GenSamplerNames(Uint number, Vector<Uint>& samplers);
|
||||||
SharedPtr<SamplerObject> GetSamplerObject(Uint index);
|
const SharedPtr<SamplerObject>& GetSamplerObject(Uint index);
|
||||||
SharedPtr<SamplerObject> CreateSamplerObject(Uint index);
|
const SharedPtr<SamplerObject>& CreateSamplerObject(Uint index);
|
||||||
void MarkSamplerObjectForDeletion(Uint index);
|
void MarkSamplerObjectForDeletion(Uint index);
|
||||||
Bool ValidateSamplerName(Uint index) const;
|
Bool ValidateSamplerName(Uint index) const;
|
||||||
Bool ValidateSamplerObject(Uint index) const;
|
Bool ValidateSamplerObject(Uint index) const;
|
||||||
|
|
||||||
// Renderbuffer
|
// Renderbuffer
|
||||||
Vector<Uint> GenRenderbufferNames(Uint number);
|
void GenRenderbufferNames(Uint number, Vector<Uint>& renderbuffers);
|
||||||
SharedPtr<RenderbufferObject> GetRenderbufferObject(Uint index);
|
const SharedPtr<RenderbufferObject>& GetRenderbufferObject(Uint index);
|
||||||
BindingSlot<RenderbufferObject>& GetRenderbufferBindingSlot(RenderbufferTarget target);
|
BindingSlot<RenderbufferObject>& GetRenderbufferBindingSlot(RenderbufferTarget target);
|
||||||
SharedPtr<RenderbufferObject> CreateRenderbufferObject(Uint index);
|
const SharedPtr<RenderbufferObject>& CreateRenderbufferObject(Uint index);
|
||||||
void MarkRenderbufferObjectForDeletion(Uint index);
|
void MarkRenderbufferObjectForDeletion(Uint index);
|
||||||
Bool ValidateRenderbufferName(Uint index) const;
|
Bool ValidateRenderbufferName(Uint index) const;
|
||||||
Bool ValidateRenderbufferObject(Uint index) const;
|
Bool ValidateRenderbufferObject(Uint index) const;
|
||||||
@@ -161,6 +161,6 @@ namespace MobileGL {
|
|||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace GLState
|
||||||
|
|
||||||
extern GLState::GLContext* pGLContext;
|
extern UniquePtr<GLState::GLContext> pGLContext;
|
||||||
} // namespace MG_State
|
} // namespace MG_State
|
||||||
} // namespace MobileGL
|
} // namespace MobileGL
|
||||||
|
|||||||
@@ -10,18 +10,16 @@
|
|||||||
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToGL/ErrorCodeConverter.h>
|
#include <MG_Util/Converters/MGToGL/ErrorCodeConverter.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
void ErrorState::RecordError(ErrorCode code, UniquePtr<ErrorInfo> info) {
|
||||||
namespace GLState {
|
|
||||||
void ErrorState::RecordError(ErrorCode code, SharedPtr<ErrorInfo> info) {
|
|
||||||
if (code == ErrorCode::NoError) {
|
if (code == ErrorCode::NoError) {
|
||||||
MGLOG_E("Recording Non-OpenGL error:\n%s", info->ToString().c_str());
|
MGLOG_E("Recording Non-OpenGL error:\n%s", info->toString().c_str());
|
||||||
m_nonGLErrors.push_back(Error{code, info});
|
m_nonGLErrors.push_back(MakeUnique<Error>(code, Move(info)));
|
||||||
} else {
|
} else {
|
||||||
MGLOG_E("Recording OpenGL error (%s):\n%s",
|
MGLOG_E("Recording OpenGL error (%s):\n%s",
|
||||||
MG_Util::ConvertGLEnumToString(MG_Util::ConvertErrorCodeToGLEnum(code)).c_str(),
|
MG_Util::ConvertGLEnumToString(MG_Util::ConvertErrorCodeToGLEnum(code)).c_str(),
|
||||||
info->ToString().c_str());
|
info->toString().c_str());
|
||||||
m_errors.push_back(Error{code, info});
|
m_errors.push_back(MakeUnique<Error>(code, Move(info)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,38 +27,36 @@ namespace MobileGL {
|
|||||||
return !m_nonGLErrors.empty();
|
return !m_nonGLErrors.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<const Error> ErrorState::PeekNonGLError() const {
|
Optional<const Error*> ErrorState::PeekNonGLError() const {
|
||||||
if (m_nonGLErrors.empty()) return Optional<const Error>{};
|
if (m_nonGLErrors.empty()) return Nullopt;
|
||||||
return Optional<const Error>{m_nonGLErrors.front()};
|
return Optional<const Error*>{m_nonGLErrors.front().get()};
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<Error> ErrorState::PopNonGLError() {
|
Optional<UniquePtr<Error>> ErrorState::PopNonGLError() {
|
||||||
if (m_nonGLErrors.empty()) return Optional<const Error>{};
|
if (m_nonGLErrors.empty()) return Nullopt;
|
||||||
auto error = Move(m_nonGLErrors.front());
|
auto error = Move(m_nonGLErrors.front());
|
||||||
m_nonGLErrors.erase(m_nonGLErrors.begin());
|
m_nonGLErrors.erase(m_nonGLErrors.begin());
|
||||||
return Optional<const Error>{error};
|
return Move(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool ErrorState::HasGLError() const {
|
Bool ErrorState::HasGLError() const {
|
||||||
return !m_errors.empty();
|
return !m_errors.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<const Error> ErrorState::PeekGLError() const {
|
Optional<const Error*> ErrorState::PeekGLError() const {
|
||||||
if (m_errors.empty()) return Optional<const Error>{};
|
if (m_errors.empty()) return Optional<const Error*>{};
|
||||||
return Optional<const Error>{m_errors.front()};
|
return Optional<const Error*>{m_errors.front().get()};
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<Error> ErrorState::PopGLError() {
|
Optional<UniquePtr<Error>> ErrorState::PopGLError() {
|
||||||
if (m_errors.empty()) return Optional<const Error>{};
|
if (m_errors.empty()) return Nullopt;
|
||||||
auto error = Move(m_errors.front());
|
auto error = Move(m_errors.front());
|
||||||
m_errors.erase(m_errors.begin());
|
m_errors.erase(m_errors.begin());
|
||||||
return Optional<const Error>{error};
|
return Move(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ErrorState::Clear() {
|
void ErrorState::Clear() {
|
||||||
m_errors.clear();
|
m_errors.clear();
|
||||||
m_nonGLErrors.clear();
|
m_nonGLErrors.clear();
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -14,26 +14,24 @@
|
|||||||
namespace MobileGL {
|
namespace MobileGL {
|
||||||
struct Error {
|
struct Error {
|
||||||
ErrorCode code;
|
ErrorCode code;
|
||||||
SharedPtr<ErrorInfo> info;
|
UniquePtr<ErrorInfo> info;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace MG_State {
|
namespace MG_State::GLState {
|
||||||
namespace GLState {
|
|
||||||
class ErrorState {
|
class ErrorState {
|
||||||
public:
|
public:
|
||||||
void RecordError(ErrorCode code, SharedPtr<ErrorInfo> info = nullptr);
|
void RecordError(ErrorCode code, UniquePtr<ErrorInfo> info);
|
||||||
Bool HasNonGLError() const;
|
Bool HasNonGLError() const;
|
||||||
Optional<const Error> PeekNonGLError() const;
|
Optional<const Error*> PeekNonGLError() const;
|
||||||
Optional<Error> PopNonGLError();
|
Optional<UniquePtr<Error>> PopNonGLError();
|
||||||
Bool HasGLError() const;
|
Bool HasGLError() const;
|
||||||
Optional<const Error> PeekGLError() const;
|
Optional<const Error*> PeekGLError() const;
|
||||||
Optional<Error> PopGLError();
|
Optional<UniquePtr<Error>> PopGLError();
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Vector<Error> m_errors;
|
Vector<UniquePtr<Error>> m_errors;
|
||||||
Vector<Error> m_nonGLErrors;
|
Vector<UniquePtr<Error>> m_nonGLErrors;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
} // namespace MobileGL
|
||||||
@@ -13,7 +13,7 @@ namespace MobileGL {
|
|||||||
class ErrorInfo {
|
class ErrorInfo {
|
||||||
public:
|
public:
|
||||||
virtual ~ErrorInfo() = default;
|
virtual ~ErrorInfo() = default;
|
||||||
virtual String ToString() const = 0;
|
virtual String toString() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GenericErrorInfo : public ErrorInfo {
|
class GenericErrorInfo : public ErrorInfo {
|
||||||
@@ -24,7 +24,7 @@ namespace MobileGL {
|
|||||||
explicit GenericErrorInfo(String m_prefix, String m_prefix_2, String message)
|
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)) {}
|
: 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;
|
StringStream ss;
|
||||||
if (m_prefix.has_value()) {
|
if (m_prefix.has_value()) {
|
||||||
ss << "[" << m_prefix.value() << "] ";
|
ss << "[" << m_prefix.value() << "] ";
|
||||||
|
|||||||
@@ -9,14 +9,12 @@
|
|||||||
#include "FramebufferObject.h"
|
#include "FramebufferObject.h"
|
||||||
#include "MG_Util/Types.h"
|
#include "MG_Util/Types.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
// FramebufferAttachmentObject
|
// FramebufferAttachmentObject
|
||||||
FramebufferAttachmentObject::FramebufferAttachmentObject(
|
FramebufferAttachmentObject::FramebufferAttachmentObject(
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> texture, Int level)
|
const SharedPtr<MG_State::GLState::ITextureObject>& texture, Int level)
|
||||||
: m_texture(texture), m_textureLevel(level) {}
|
: m_texture(texture), m_textureLevel(level) {}
|
||||||
FramebufferAttachmentObject::FramebufferAttachmentObject(SharedPtr<RenderbufferObject> renderbuffer)
|
FramebufferAttachmentObject::FramebufferAttachmentObject(const SharedPtr<RenderbufferObject>& renderbuffer)
|
||||||
: m_renderbuffer(renderbuffer) {}
|
: m_renderbuffer(renderbuffer) {}
|
||||||
FramebufferAttachmentObject::FramebufferAttachmentObject(Bool IsValid)
|
FramebufferAttachmentObject::FramebufferAttachmentObject(Bool IsValid)
|
||||||
: m_texture(nullptr), m_renderbuffer(nullptr) {
|
: m_texture(nullptr), m_renderbuffer(nullptr) {
|
||||||
@@ -35,11 +33,11 @@ namespace MobileGL {
|
|||||||
return m_texture == nullptr && m_renderbuffer == nullptr;
|
return m_texture == nullptr && m_renderbuffer == nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> FramebufferAttachmentObject::GetTexture() const {
|
const SharedPtr<MG_State::GLState::ITextureObject>& FramebufferAttachmentObject::GetTexture() const {
|
||||||
return m_texture;
|
return m_texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<RenderbufferObject> FramebufferAttachmentObject::GetRenderbuffer() const {
|
const SharedPtr<RenderbufferObject>& FramebufferAttachmentObject::GetRenderbuffer() const {
|
||||||
return m_renderbuffer;
|
return m_renderbuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,12 +60,12 @@ namespace MobileGL {
|
|||||||
IntVec3 FramebufferAttachmentObject::GetSize() const {
|
IntVec3 FramebufferAttachmentObject::GetSize() const {
|
||||||
if (IsTexture()) {
|
if (IsTexture()) {
|
||||||
// TODO: get correct upload target
|
// TODO: get correct upload target
|
||||||
MOBILEGL_ASSERT(nullptr != dynamic_cast<MG_State::GLState::TextureObjectMipmap*>(m_texture.get()),
|
MOBILEGL_ASSERT(nullptr != static_cast<MG_State::GLState::TextureObjectMipmap*>(m_texture.get()),
|
||||||
"Texture object here should always be an object with mipmap");
|
"Texture object here should always be an object with mipmap");
|
||||||
auto textureMipmapObject = static_cast<MG_State::GLState::TextureObjectMipmap*>(m_texture.get());
|
auto textureMipmapObject = static_cast<MG_State::GLState::TextureObjectMipmap*>(m_texture.get());
|
||||||
return textureMipmapObject->GetMipmapTexelSize(TextureUploadTarget::Texture2D, m_textureLevel);
|
return textureMipmapObject->GetMipmapTexelSize(TextureUploadTarget::Texture2D, m_textureLevel);
|
||||||
} else if (IsRenderbuffer()) {
|
} else if (IsRenderbuffer()) {
|
||||||
return IntVec3(m_renderbuffer->GetWidth(), m_renderbuffer->GetHeight(), 1);
|
return {m_renderbuffer->GetWidth(), m_renderbuffer->GetHeight(), 1};
|
||||||
}
|
}
|
||||||
return {0, 0, 0};
|
return {0, 0, 0};
|
||||||
}
|
}
|
||||||
@@ -77,21 +75,22 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FramebufferObject
|
// FramebufferObject
|
||||||
FramebufferObject::FramebufferObject(Uint externalIndex) : m_externalIndex(externalIndex) {
|
FramebufferObject::FramebufferObject(Uint externalIndex)
|
||||||
|
: m_externalIndex(externalIndex), m_attachmentVersions{}, m_drawBuffers{} {
|
||||||
m_attachmentObjects.fill(FramebufferAttachmentObject(false));
|
m_attachmentObjects.fill(FramebufferAttachmentObject(false));
|
||||||
m_drawBuffers.fill(FramebufferAttachmentType::None);
|
m_drawBuffers.fill(FramebufferAttachmentType::None);
|
||||||
m_drawBuffers[0] = FramebufferAttachmentType::Color0;
|
m_drawBuffers[0] = FramebufferAttachmentType::Color0;
|
||||||
m_attachmentVersions.fill(0);
|
m_attachmentVersions.fill(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferObject::AttachTexture(FramebufferAttachmentType type, SharedPtr<ITextureObject> texture,
|
void FramebufferObject::AttachTexture(FramebufferAttachmentType type, const SharedPtr<ITextureObject>& texture,
|
||||||
int level) {
|
int level) {
|
||||||
m_attachmentObjects[static_cast<SizeT>(type)] = FramebufferAttachmentObject(std::move(texture), level);
|
m_attachmentObjects[static_cast<SizeT>(type)] = FramebufferAttachmentObject(texture, level);
|
||||||
BumpAttachmentVersion(type);
|
BumpAttachmentVersion(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferObject::AttachRenderbuffer(FramebufferAttachmentType type,
|
void FramebufferObject::AttachRenderbuffer(FramebufferAttachmentType type,
|
||||||
std::shared_ptr<RenderbufferObject> renderbuffer) {
|
const SharedPtr<RenderbufferObject>& renderbuffer) {
|
||||||
m_attachmentObjects[static_cast<SizeT>(type)] = FramebufferAttachmentObject(renderbuffer);
|
m_attachmentObjects[static_cast<SizeT>(type)] = FramebufferAttachmentObject(renderbuffer);
|
||||||
BumpAttachmentVersion(type);
|
BumpAttachmentVersion(type);
|
||||||
}
|
}
|
||||||
@@ -105,8 +104,7 @@ namespace MobileGL {
|
|||||||
return m_attachmentObjects[static_cast<SizeT>(type)];
|
return m_attachmentObjects[static_cast<SizeT>(type)];
|
||||||
}
|
}
|
||||||
|
|
||||||
const FramebufferObject::FramebufferAttachmentObjectArray& FramebufferObject::GetAllAttachmentObjects()
|
const FramebufferObject::FramebufferAttachmentObjectArray& FramebufferObject::GetAllAttachmentObjects() const {
|
||||||
const {
|
|
||||||
return m_attachmentObjects;
|
return m_attachmentObjects;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,11 +115,11 @@ namespace MobileGL {
|
|||||||
|
|
||||||
Int width = -1, height = -1;
|
Int width = -1, height = -1;
|
||||||
Int validAttachmentCount = 0;
|
Int validAttachmentCount = 0;
|
||||||
for (SizeT i = 0; i < m_attachmentObjects.size(); ++i) {
|
for (const auto& attachmentObject : m_attachmentObjects) {
|
||||||
if (!m_attachmentObjects[i].IsValid()) continue;
|
if (!attachmentObject.IsValid()) continue;
|
||||||
|
|
||||||
++validAttachmentCount;
|
++validAttachmentCount;
|
||||||
const auto& attachment = m_attachmentObjects[i];
|
const auto& attachment = attachmentObject;
|
||||||
auto attachmentSize = attachment.GetSize();
|
auto attachmentSize = attachment.GetSize();
|
||||||
Int w = attachmentSize.x();
|
Int w = attachmentSize.x();
|
||||||
Int h = attachmentSize.y();
|
Int h = attachmentSize.y();
|
||||||
@@ -160,6 +158,4 @@ namespace MobileGL {
|
|||||||
++m_attachmentVersions[static_cast<SizeT>(type)];
|
++m_attachmentVersions[static_cast<SizeT>(type)];
|
||||||
++m_objectVersion;
|
++m_objectVersion;
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "MG_Util/Types.h"
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_State/GLState/TextureState/TextureObject.h>
|
#include <MG_State/GLState/TextureState/TextureObject.h>
|
||||||
#include <MG_State/GLState/RenderbufferState/RenderbufferObject.h>
|
#include <MG_State/GLState/RenderbufferState/RenderbufferObject.h>
|
||||||
@@ -68,20 +69,19 @@ namespace MobileGL {
|
|||||||
Unknown = -1
|
Unknown = -1
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace MG_State {
|
namespace MG_State::GLState {
|
||||||
namespace GLState {
|
|
||||||
class FramebufferAttachmentObject {
|
class FramebufferAttachmentObject {
|
||||||
public:
|
public:
|
||||||
explicit FramebufferAttachmentObject(SharedPtr<MG_State::GLState::ITextureObject> texture,
|
explicit FramebufferAttachmentObject(const SharedPtr<MG_State::GLState::ITextureObject>& texture,
|
||||||
Int level = 0);
|
Int level = 0);
|
||||||
explicit FramebufferAttachmentObject(SharedPtr<RenderbufferObject> renderbuffer);
|
explicit FramebufferAttachmentObject(const SharedPtr<RenderbufferObject>& renderbuffer);
|
||||||
explicit FramebufferAttachmentObject(Bool IsValid = true);
|
explicit FramebufferAttachmentObject(Bool IsValid = true);
|
||||||
|
|
||||||
Bool IsTexture() const;
|
Bool IsTexture() const;
|
||||||
Bool IsRenderbuffer() const;
|
Bool IsRenderbuffer() const;
|
||||||
Bool IsEmpty() const;
|
Bool IsEmpty() const;
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> GetTexture() const;
|
const SharedPtr<MG_State::GLState::ITextureObject>& GetTexture() const;
|
||||||
SharedPtr<RenderbufferObject> GetRenderbuffer() const;
|
const SharedPtr<RenderbufferObject>& GetRenderbuffer() const;
|
||||||
Int GetTextureLevel() const;
|
Int GetTextureLevel() const;
|
||||||
Bool IsComplete() const;
|
Bool IsComplete() const;
|
||||||
IntVec3 GetSize() const;
|
IntVec3 GetSize() const;
|
||||||
@@ -108,9 +108,8 @@ namespace MobileGL {
|
|||||||
|
|
||||||
FramebufferObject(Uint externalIndex);
|
FramebufferObject(Uint externalIndex);
|
||||||
|
|
||||||
void AttachTexture(FramebufferAttachmentType type, SharedPtr<ITextureObject> texture, int level = 0);
|
void AttachTexture(FramebufferAttachmentType type, const SharedPtr<ITextureObject>& texture, int level = 0);
|
||||||
void AttachRenderbuffer(FramebufferAttachmentType type,
|
void AttachRenderbuffer(FramebufferAttachmentType type, const SharedPtr<RenderbufferObject>& renderbuffer);
|
||||||
std::shared_ptr<RenderbufferObject> renderbuffer);
|
|
||||||
void Detach(FramebufferAttachmentType type);
|
void Detach(FramebufferAttachmentType type);
|
||||||
const FramebufferAttachmentObject& GetAttachment(FramebufferAttachmentType type) const;
|
const FramebufferAttachmentObject& GetAttachment(FramebufferAttachmentType type) const;
|
||||||
const FramebufferAttachmentObjectArray& GetAllAttachmentObjects() const;
|
const FramebufferAttachmentObjectArray& GetAllAttachmentObjects() const;
|
||||||
@@ -121,7 +120,7 @@ namespace MobileGL {
|
|||||||
void SetReadBuffer(FramebufferAttachmentType buf) { m_readBuffer = buf; }
|
void SetReadBuffer(FramebufferAttachmentType buf) { m_readBuffer = buf; }
|
||||||
FramebufferAttachmentType GetReadBuffer() const { return m_readBuffer; }
|
FramebufferAttachmentType GetReadBuffer() const { return m_readBuffer; }
|
||||||
|
|
||||||
const FramebufferAttachmentVersionArray GetAllFramebufferAttachmentVersions() const {
|
FramebufferAttachmentVersionArray GetAllFramebufferAttachmentVersions() const {
|
||||||
return m_attachmentVersions;
|
return m_attachmentVersions;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,6 +142,5 @@ namespace MobileGL {
|
|||||||
Uint16 m_objectVersion = 0;
|
Uint16 m_objectVersion = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace GLState
|
} // namespace MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
} // namespace MobileGL
|
||||||
|
|||||||
@@ -9,46 +9,47 @@
|
|||||||
#include "FramebufferState.h"
|
#include "FramebufferState.h"
|
||||||
#include "MG_State/GLState/FramebufferState/FramebufferObject.h"
|
#include "MG_State/GLState/FramebufferState/FramebufferObject.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
FramebufferState::FramebufferState() {
|
FramebufferState::FramebufferState() {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
||||||
m_bindingSlots[i] = BindingSlot<FramebufferObject>(static_cast<FramebufferTarget>(i));
|
m_bindingSlots[i] = BindingSlot<FramebufferObject>(static_cast<FramebufferTarget>(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<FramebufferObject> FramebufferState::GetFramebufferObject(Uint index) {
|
const SharedPtr<FramebufferObject>& FramebufferState::GetFramebufferObject(Uint index) {
|
||||||
auto it = m_framebufferObjects.find(index);
|
auto it = m_framebufferObjects.find(index);
|
||||||
if (it != m_framebufferObjects.end()) {
|
if (it != m_framebufferObjects.end()) {
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
return nullptr;
|
static SharedPtr<FramebufferObject> nullFramebufferObject = nullptr;
|
||||||
|
return nullFramebufferObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Uint> FramebufferState::GenerateNames(Uint number) {
|
void FramebufferState::GenerateNames(Uint number, Vector<Uint>& buffers) {
|
||||||
Vector<Uint> buffers(number);
|
buffers.resize(number);
|
||||||
m_indexGenerator.Generate(number, buffers.data());
|
m_indexGenerator.Generate(number, buffers.data());
|
||||||
return buffers;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<FramebufferObject> FramebufferState::CreateFramebufferObject(Uint index) {
|
const SharedPtr<FramebufferObject>& FramebufferState::CreateFramebufferObject(Uint index) {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
if (!m_indexGenerator.IsValid(0)) {
|
if (!m_indexGenerator.IsValid(0)) {
|
||||||
m_indexGenerator.Insert(0);
|
m_indexGenerator.Insert(0);
|
||||||
} else {
|
} else {
|
||||||
return nullptr;
|
static SharedPtr<FramebufferObject> nullFramebufferObject = nullptr;
|
||||||
|
return nullFramebufferObject;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto bufferObject = MakeShared<FramebufferObject>(index);
|
auto& framebufferObject = m_framebufferObjects[index];
|
||||||
m_framebufferObjects[index] = bufferObject;
|
if (!framebufferObject) {
|
||||||
return bufferObject;
|
framebufferObject = MakeShared<FramebufferObject>(index);
|
||||||
|
}
|
||||||
|
return framebufferObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
BindingSlot<FramebufferObject>& FramebufferState::GetBindingSlot(FramebufferTarget target) {
|
BindingSlot<FramebufferObject>& FramebufferState::GetBindingSlot(FramebufferTarget target) {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (auto& bindingSlot : m_bindingSlots) {
|
||||||
if (m_bindingSlots[i].GetTarget() == target) {
|
if (bindingSlot.GetTarget() == target) {
|
||||||
return m_bindingSlots[i];
|
return bindingSlot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MOBILEGL_ASSERT(false, "Invalid FramebufferTarget enum value: %d", static_cast<int>(target));
|
MOBILEGL_ASSERT(false, "Invalid FramebufferTarget enum value: %d", static_cast<int>(target));
|
||||||
@@ -59,9 +60,9 @@ namespace MobileGL {
|
|||||||
if (m_indexGenerator.IsValid(index)) {
|
if (m_indexGenerator.IsValid(index)) {
|
||||||
auto it = m_framebufferObjects.find(index);
|
auto it = m_framebufferObjects.find(index);
|
||||||
if (it != m_framebufferObjects.end()) {
|
if (it != m_framebufferObjects.end()) {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (auto& bindingSlot : m_bindingSlots) {
|
||||||
if (m_bindingSlots[i].GetBoundObject() == it->second) {
|
if (bindingSlot.GetBoundObject() == it->second) {
|
||||||
m_bindingSlots[i].Bind(nullptr);
|
bindingSlot.Bind(nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_framebufferObjects.erase(it);
|
m_framebufferObjects.erase(it);
|
||||||
@@ -77,6 +78,4 @@ namespace MobileGL {
|
|||||||
Bool FramebufferState::ValidateFramebufferObject(Uint index) const {
|
Bool FramebufferState::ValidateFramebufferObject(Uint index) const {
|
||||||
return m_framebufferObjects.find(index) != m_framebufferObjects.end();
|
return m_framebufferObjects.find(index) != m_framebufferObjects.end();
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -11,17 +11,15 @@
|
|||||||
#include <MG_Util/Miscellany/IndexGenerator.h>
|
#include <MG_Util/Miscellany/IndexGenerator.h>
|
||||||
#include "FramebufferObject.h"
|
#include "FramebufferObject.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
class FramebufferState {
|
class FramebufferState {
|
||||||
public:
|
public:
|
||||||
FramebufferState();
|
FramebufferState();
|
||||||
|
|
||||||
// FBO 0 should be created by MG_Backend when initializing the context
|
// FBO 0 should be created by MG_Backend when initializing the context
|
||||||
SharedPtr<FramebufferObject> GetFramebufferObject(Uint index);
|
const SharedPtr<FramebufferObject>& GetFramebufferObject(Uint index);
|
||||||
Vector<Uint> GenerateNames(Uint number);
|
void GenerateNames(Uint number, Vector<Uint>& framebuffers);
|
||||||
SharedPtr<FramebufferObject> CreateFramebufferObject(Uint index);
|
const SharedPtr<FramebufferObject>& CreateFramebufferObject(Uint index);
|
||||||
BindingSlot<FramebufferObject>& GetBindingSlot(FramebufferTarget target);
|
BindingSlot<FramebufferObject>& GetBindingSlot(FramebufferTarget target);
|
||||||
void MarkFramebufferObjectForDeletion(Uint index);
|
void MarkFramebufferObjectForDeletion(Uint index);
|
||||||
Bool ValidateName(Uint index) const;
|
Bool ValidateName(Uint index) const;
|
||||||
@@ -33,6 +31,4 @@ namespace MobileGL {
|
|||||||
Array<BindingSlot<FramebufferObject>, static_cast<SizeT>(FramebufferTarget::FramebufferTargetCount)>
|
Array<BindingSlot<FramebufferObject>, static_cast<SizeT>(FramebufferTarget::FramebufferTargetCount)>
|
||||||
m_bindingSlots;
|
m_bindingSlots;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#include "ProgramObject.h"
|
#include "ProgramObject.h"
|
||||||
#include "MG_Util/Converters/GLToStr/GLEnumConverter.h"
|
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
||||||
#include "MG_Util/ShaderTranspiler/Types.h"
|
#include <MG_Util/ShaderTranspiler/Types.h>
|
||||||
#include <MG_Util/ShaderTranspiler/ShaderCompiler.h>
|
#include <MG_Util/ShaderTranspiler/ShaderCompiler.h>
|
||||||
#include <MG_Util/Converters/MGToGL/ProgramEnumConverter.h>
|
#include <MG_Util/Converters/MGToGL/ProgramEnumConverter.h>
|
||||||
#include <MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.h>
|
#include <MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.h>
|
||||||
@@ -18,10 +18,8 @@ layout(location = 0) out vec4 FragColor;
|
|||||||
void main() {}
|
void main() {}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
bool ProgramObject::ShaderIsAttached(const SharedPtr<ShaderObject>& shader) {
|
||||||
namespace GLState {
|
|
||||||
bool ProgramObject::ShaderIsAttached(SharedPtr<ShaderObject> shader) {
|
|
||||||
MGLOG_D("ProgramObject %u: ShaderIsAttached check for shader %p", m_externalIndex, shader.get());
|
MGLOG_D("ProgramObject %u: ShaderIsAttached check for shader %p", m_externalIndex, shader.get());
|
||||||
auto it = std::find_if(m_shaders.begin(), m_shaders.end(),
|
auto it = std::find_if(m_shaders.begin(), m_shaders.end(),
|
||||||
[shader](const SharedPtr<ShaderObject>& s) { return s.get() == shader.get(); });
|
[shader](const SharedPtr<ShaderObject>& s) { return s.get() == shader.get(); });
|
||||||
@@ -30,23 +28,22 @@ namespace MobileGL {
|
|||||||
return attached;
|
return attached;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ProgramObject::AttachShader(SharedPtr<ShaderObject> shader) {
|
bool ProgramObject::AttachShader(const SharedPtr<ShaderObject>& shader) {
|
||||||
MGLOG_D("ProgramObject %u: AttachShader called for shader %p", m_externalIndex, shader.get());
|
MGLOG_D("ProgramObject %u: AttachShader called for shader %p", m_externalIndex, shader.get());
|
||||||
if (ShaderIsAttached(shader)) {
|
if (ShaderIsAttached(shader)) {
|
||||||
MGLOG_D("ProgramObject %u: AttachShader - shader already attached, skipping", m_externalIndex);
|
MGLOG_D("ProgramObject %u: AttachShader - shader already attached, skipping", m_externalIndex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_shaders.emplace_back(shader);
|
m_shaders.emplace_back(shader);
|
||||||
MGLOG_D("ProgramObject %u: AttachShader - attached successfully, total shaders now %zu",
|
MGLOG_D("ProgramObject %u: AttachShader - attached successfully, total shaders now %zu", m_externalIndex,
|
||||||
m_externalIndex, m_shaders.size());
|
m_shaders.size());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SizeT ProgramObject::DetachShader(SharedPtr<ShaderObject> shader) {
|
SizeT ProgramObject::DetachShader(const SharedPtr<ShaderObject>& shader) {
|
||||||
MGLOG_D("DetachShader called for shader %p from ProgramObject %u", shader.get(), m_externalIndex);
|
MGLOG_D("DetachShader called for shader %p from ProgramObject %u", shader.get(), m_externalIndex);
|
||||||
if (!ShaderIsAttached(shader)) {
|
if (!ShaderIsAttached(shader)) {
|
||||||
MGLOG_D("Shader %p is not attached to ProgramObject %u, cannot detach.", shader.get(),
|
MGLOG_D("Shader %p is not attached to ProgramObject %u, cannot detach.", shader.get(), m_externalIndex);
|
||||||
m_externalIndex);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
m_detachedShaders.push_back(shader);
|
m_detachedShaders.push_back(shader);
|
||||||
@@ -54,10 +51,10 @@ namespace MobileGL {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SizeT ProgramObject::RemoveShader(SharedPtr<ShaderObject> shader) {
|
SizeT ProgramObject::RemoveShader(const SharedPtr<ShaderObject>& shader) {
|
||||||
MGLOG_D("ProgramObject %u: RemoveShader called for shader %p", m_externalIndex, shader.get());
|
MGLOG_D("ProgramObject %u: RemoveShader called for shader %p", m_externalIndex, shader.get());
|
||||||
auto count = std::erase_if(
|
auto count =
|
||||||
m_shaders, [shader](const SharedPtr<ShaderObject>& s) { return s.get() == shader.get(); });
|
std::erase_if(m_shaders, [shader](const SharedPtr<ShaderObject>& s) { return s.get() == shader.get(); });
|
||||||
|
|
||||||
MGLOG_D("ProgramObject %u: RemoveShader - removed %zu shader(s), remaining %zu", m_externalIndex, count,
|
MGLOG_D("ProgramObject %u: RemoveShader - removed %zu shader(s), remaining %zu", m_externalIndex, count,
|
||||||
m_shaders.size());
|
m_shaders.size());
|
||||||
@@ -80,15 +77,14 @@ namespace MobileGL {
|
|||||||
|
|
||||||
if (!needsDefaultFS) return;
|
if (!needsDefaultFS) return;
|
||||||
|
|
||||||
MGLOG_D("ProgramObject %u: No fragment shader attached, adding default fragment shader.",
|
MGLOG_D("ProgramObject %u: No fragment shader attached, adding default fragment shader.", m_externalIndex);
|
||||||
m_externalIndex);
|
|
||||||
SharedPtr<ShaderObject> defaultFS = MakeShared<ShaderObject>(ShaderStage::Fragment, 0);
|
SharedPtr<ShaderObject> defaultFS = MakeShared<ShaderObject>(ShaderStage::Fragment, 0);
|
||||||
defaultFS->SetShaderSource(kDefaultFragmentShaderSource);
|
defaultFS->SetShaderSource(kDefaultFragmentShaderSource);
|
||||||
defaultFS->Compile(); // TODO: use a global default FS object.
|
defaultFS->Compile(); // TODO: use a global default FS object.
|
||||||
auto status = defaultFS->GetCompileStatus();
|
auto status = defaultFS->GetCompileStatus();
|
||||||
if (!status) {
|
if (!status) {
|
||||||
MGLOG_E("ProgramObject %u: Failed to compile default fragment shader. InfoLog:\n%s",
|
MGLOG_E("ProgramObject %u: Failed to compile default fragment shader. InfoLog:\n%s", m_externalIndex,
|
||||||
m_externalIndex, defaultFS->GetInfoLog().c_str());
|
defaultFS->GetInfoLog().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_shaders.push_back(defaultFS);
|
m_shaders.push_back(defaultFS);
|
||||||
@@ -111,7 +107,7 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::sort(m_shaders.begin(), m_shaders.end(),
|
std::sort(m_shaders.begin(), m_shaders.end(),
|
||||||
[](SharedPtr<ShaderObject>& a, SharedPtr<ShaderObject>& b) {
|
[](const SharedPtr<ShaderObject>& a, const SharedPtr<ShaderObject>& b) {
|
||||||
return a->GetShaderStage() < b->GetShaderStage();
|
return a->GetShaderStage() < b->GetShaderStage();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -121,11 +117,10 @@ namespace MobileGL {
|
|||||||
MG_Util::ConvertGLEnumToString(shaderTypes[i]).c_str(), m_shaders[i].get());
|
MG_Util::ConvertGLEnumToString(shaderTypes[i]).c_str(), m_shaders[i].get());
|
||||||
|
|
||||||
if (!m_shaders[i]->GetCompileStatus()) {
|
if (!m_shaders[i]->GetCompileStatus()) {
|
||||||
m_infoLog =
|
m_infoLog = std::format("Linking a {} with compilation error, linking will now terminate. Shader error "
|
||||||
std::format("Linking a {} with compilation error, linking will now terminate. Shader error "
|
|
||||||
"log:\n{}\nShader src:\n{}",
|
"log:\n{}\nShader src:\n{}",
|
||||||
MG_Util::ConvertGLEnumToString(shaderTypes[i]).c_str(),
|
MG_Util::ConvertGLEnumToString(shaderTypes[i]), m_shaders[i]->GetInfoLog(),
|
||||||
m_shaders[i]->GetInfoLog().c_str(), m_shaders[i]->GetShaderSource().c_str());
|
m_shaders[i]->GetShaderSource());
|
||||||
m_linkStatus = false;
|
m_linkStatus = false;
|
||||||
MGLOG_E("ProgramObject %u: Link failed - shader[%zu] compile status false. InfoLog:\n%s",
|
MGLOG_E("ProgramObject %u: Link failed - shader[%zu] compile status false. InfoLog:\n%s",
|
||||||
m_externalIndex, i, m_infoLog.c_str());
|
m_externalIndex, i, m_infoLog.c_str());
|
||||||
@@ -140,16 +135,14 @@ namespace MobileGL {
|
|||||||
|
|
||||||
MG_Util::ShaderTranspiler::ProgramAttrib attrib{.shaders = Move(shaders),
|
MG_Util::ShaderTranspiler::ProgramAttrib attrib{.shaders = Move(shaders),
|
||||||
.explicitVertexInLocations = m_explicitAttribLocations,
|
.explicitVertexInLocations = m_explicitAttribLocations,
|
||||||
.explicitFragmentOutLocations =
|
.explicitFragmentOutLocations = m_explicitFragDataLocation};
|
||||||
m_explicitFragDataLocation};
|
|
||||||
|
|
||||||
MGLOG_D("ProgramObject %u: Calling ShaderCompiler::LinkProgram", m_externalIndex);
|
MGLOG_D("ProgramObject %u: Calling ShaderCompiler::LinkProgram", m_externalIndex);
|
||||||
auto result = MG_Util::ShaderTranspiler::ShaderCompiler::LinkProgram(attrib);
|
auto result = MG_Util::ShaderTranspiler::ShaderCompiler::LinkProgram(attrib);
|
||||||
if (result) {
|
if (result) {
|
||||||
m_linkStatus = true;
|
m_linkStatus = true;
|
||||||
m_program = result.value();
|
m_program = result.value();
|
||||||
MGLOG_D("ProgramObject %u: LinkProgram succeeded, TProgram ptr %p", m_externalIndex,
|
MGLOG_D("ProgramObject %u: LinkProgram succeeded, TProgram ptr %p", m_externalIndex, m_program.get());
|
||||||
m_program.get());
|
|
||||||
} else {
|
} else {
|
||||||
m_linkStatus = false;
|
m_linkStatus = false;
|
||||||
m_infoLog = result.error().log;
|
m_infoLog = result.error().log;
|
||||||
@@ -202,8 +195,7 @@ namespace MobileGL {
|
|||||||
// ------------ Uniforms (GL Plain) ----------------
|
// ------------ Uniforms (GL Plain) ----------------
|
||||||
// Allocate uniform locations
|
// Allocate uniform locations
|
||||||
m_activeUniformCount = m_program->getNumUniformVariables();
|
m_activeUniformCount = m_program->getNumUniformVariables();
|
||||||
MGLOG_D("ProgramObject %u: Reflection - active uniform count = %d", m_externalIndex,
|
MGLOG_D("ProgramObject %u: Reflection - active uniform count = %d", m_externalIndex, m_activeUniformCount);
|
||||||
m_activeUniformCount);
|
|
||||||
for (int i = 0; i < m_activeUniformCount; i++) {
|
for (int i = 0; i < m_activeUniformCount; i++) {
|
||||||
auto& uniform = m_program->getUniform(i);
|
auto& uniform = m_program->getUniform(i);
|
||||||
auto location = uniform.layoutLocation();
|
auto location = uniform.layoutLocation();
|
||||||
@@ -212,8 +204,8 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
m_uniformNameMaxLength = std::max(m_uniformNameMaxLength, (Int)uniform.name.length());
|
m_uniformNameMaxLength = std::max(m_uniformNameMaxLength, (Int)uniform.name.length());
|
||||||
m_uniformLocations[uniform.name] = location;
|
m_uniformLocations[uniform.name] = location;
|
||||||
MGLOG_D("ProgramObject %u: Reflection - uniform[%d] name='%s' layoutLocation=%d", m_externalIndex,
|
MGLOG_D("ProgramObject %u: Reflection - uniform[%d] name='%s' layoutLocation=%d", m_externalIndex, i,
|
||||||
i, uniform.name.c_str(), location);
|
uniform.name.c_str(), location);
|
||||||
}
|
}
|
||||||
|
|
||||||
MGLOG_D("ProgramObject %u: Reflection - computed m_maxUniformLocation=%u m_uniformNameMaxLength=%d",
|
MGLOG_D("ProgramObject %u: Reflection - computed m_maxUniformLocation=%u m_uniformNameMaxLength=%d",
|
||||||
@@ -266,12 +258,12 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ------------ attributes (vertex in) ---------------
|
// ------------ attributes (vertex in) ---------------
|
||||||
int inCount = m_program->getNumPipeInputs();
|
Int inCount = m_program->getNumPipeInputs();
|
||||||
MGLOG_D("ProgramObject %u: Reflection - pipe input count (attributes) = %d", m_externalIndex, inCount);
|
MGLOG_D("ProgramObject %u: Reflection - pipe input count (attributes) = %d", m_externalIndex, inCount);
|
||||||
|
|
||||||
int maxLoc = -1;
|
Int maxLoc = -1;
|
||||||
for (int i = 0; i < inCount; ++i) {
|
for (int i = 0; i < inCount; ++i) {
|
||||||
int loc = m_program->getPipeInput(i).layoutLocation();
|
Int loc = (Int)m_program->getPipeInput(i).layoutLocation();
|
||||||
if (loc >= 0 && loc != glslang::TQualifier::layoutLocationEnd) maxLoc = std::max(maxLoc, loc);
|
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",
|
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_externalIndex, i, m_program->getPipeInput(i).name.c_str(), loc,
|
||||||
@@ -283,8 +275,8 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GLint maxAttribs = 16; // TODO: get from backend
|
GLint maxAttribs = 16; // TODO: get from backend
|
||||||
MGLOG_D("ProgramObject %u: Reflection - computed maxLoc=%d, using maxAttribs=%d", m_externalIndex,
|
MGLOG_D("ProgramObject %u: Reflection - computed maxLoc=%d, using maxAttribs=%d", m_externalIndex, maxLoc,
|
||||||
maxLoc, maxAttribs);
|
maxAttribs);
|
||||||
|
|
||||||
if (maxLoc >= maxAttribs) {
|
if (maxLoc >= maxAttribs) {
|
||||||
MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - required attrib location %d >= "
|
MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - required attrib location %d >= "
|
||||||
@@ -298,14 +290,14 @@ namespace MobileGL {
|
|||||||
|
|
||||||
for (int i = 0; i < inCount; ++i) {
|
for (int i = 0; i < inCount; ++i) {
|
||||||
auto& inVar = m_program->getPipeInput(i);
|
auto& inVar = m_program->getPipeInput(i);
|
||||||
int location = inVar.layoutLocation();
|
Int location = (Int)inVar.layoutLocation();
|
||||||
m_attribInNameMaxLength = std::max(m_attribInNameMaxLength, (Int)inVar.name.length());
|
m_attribInNameMaxLength = std::max(m_attribInNameMaxLength, (Int)inVar.name.length());
|
||||||
|
|
||||||
if (location >= 0 && location < (int)m_attribs.size()) {
|
if (location >= 0 && location < (int)m_attribs.size()) {
|
||||||
m_attribs[location] = inVar.name;
|
m_attribs[location] = inVar.name;
|
||||||
m_attribTypes[location] = inVar.glDefineType;
|
m_attribTypes[location] = inVar.glDefineType;
|
||||||
MGLOG_D("ProgramObject %u: Reflection - got attrib '%s' at explicit location %d",
|
MGLOG_D("ProgramObject %u: Reflection - got attrib '%s' at explicit location %d", m_externalIndex,
|
||||||
m_externalIndex, inVar.name.c_str(), location);
|
inVar.name.c_str(), location);
|
||||||
}
|
}
|
||||||
// else if (location >= (int)m_attribs.size()) {
|
// else if (location >= (int)m_attribs.size()) {
|
||||||
// MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - attrib location %d >= attribs.size()
|
// MGLOG_W("ProgramObject %u: ProgramObject::DoReflection - attrib location %d >= attribs.size()
|
||||||
@@ -386,7 +378,7 @@ namespace MobileGL {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// ---------- UBO ----------
|
// ---------- UBO ----------
|
||||||
int uboCount = m_program->getNumUniformBlocks();
|
Int uboCount = m_program->getNumUniformBlocks();
|
||||||
MGLOG_D("ProgramObject %u: Reflection - uniform block count (UBO) = %d", m_externalIndex, uboCount);
|
MGLOG_D("ProgramObject %u: Reflection - uniform block count (UBO) = %d", m_externalIndex, uboCount);
|
||||||
m_uniformBlockBinding.resize(uboCount, -1);
|
m_uniformBlockBinding.resize(uboCount, -1);
|
||||||
for (int i = 0; i < uboCount; i++) {
|
for (int i = 0; i < uboCount; i++) {
|
||||||
@@ -417,22 +409,21 @@ namespace MobileGL {
|
|||||||
ShaderAttrib attrib{.shaderType = shaderType,
|
ShaderAttrib attrib{.shaderType = shaderType,
|
||||||
.sourceStr = m_shaders[i]->GetShaderSource(),
|
.sourceStr = m_shaders[i]->GetShaderSource(),
|
||||||
.flags = 0}; // Will need patched glslang to work
|
.flags = 0}; // Will need patched glslang to work
|
||||||
MGLOG_D("ProgramObject %u: GenerateBinary - compiling shader[%zu] type %u", m_externalIndex, i,
|
MGLOG_D("ProgramObject %u: GenerateBinary - compiling shader[%zu] type %u", m_externalIndex, i, shaderType);
|
||||||
shaderType);
|
|
||||||
auto res = ShaderCompiler::CompileShader(attrib);
|
auto res = ShaderCompiler::CompileShader(attrib);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
MGLOG_E("ProgramObject %u: GenerateBinary - CompileShader failed for shader[%zu], aborting "
|
MGLOG_E("ProgramObject %u: GenerateBinary - CompileShader failed for shader[%zu], aborting "
|
||||||
"binary generation",
|
"binary generation",
|
||||||
m_externalIndex, i);
|
m_externalIndex, i);
|
||||||
MGLOG_E("ProgramObject %u: GenerateBinary - CompileShader return code %d, log:\n%s",
|
MGLOG_E("ProgramObject %u: GenerateBinary - CompileShader return code %d, log:\n%s", m_externalIndex,
|
||||||
m_externalIndex, res.error().errc, res.error().log.c_str());
|
res.error().errc, res.error().log.c_str());
|
||||||
MGLOG_E("ProgramObject %u: GenerateBinary - last compiled shader src: \n%s", m_externalIndex,
|
MGLOG_E("ProgramObject %u: GenerateBinary - last compiled shader src: \n%s", m_externalIndex,
|
||||||
m_shaders[i]->GetShaderSource().c_str());
|
m_shaders[i]->GetShaderSource().c_str());
|
||||||
}
|
}
|
||||||
MOBILEGL_ASSERT(res, "CompileShader failed during binary generation");
|
MOBILEGL_ASSERT(res, "CompileShader failed during binary generation");
|
||||||
shaders[i] = res.value();
|
shaders[i] = res.value();
|
||||||
MGLOG_D("ProgramObject %u: GenerateBinary - compiled shader[%zu] -> TShader ptr %p",
|
MGLOG_D("ProgramObject %u: GenerateBinary - compiled shader[%zu] -> TShader ptr %p", m_externalIndex, i,
|
||||||
m_externalIndex, i, shaders[i].get());
|
shaders[i].get());
|
||||||
}
|
}
|
||||||
|
|
||||||
ProgramAttrib attrib{.shaders = Move(shaders),
|
ProgramAttrib attrib{.shaders = Move(shaders),
|
||||||
@@ -441,11 +432,10 @@ namespace MobileGL {
|
|||||||
MGLOG_D("ProgramObject %u: GenerateBinary - linking program for binary", m_externalIndex);
|
MGLOG_D("ProgramObject %u: GenerateBinary - linking program for binary", m_externalIndex);
|
||||||
auto programResult = ShaderCompiler::LinkProgram(attrib);
|
auto programResult = ShaderCompiler::LinkProgram(attrib);
|
||||||
if (!programResult) {
|
if (!programResult) {
|
||||||
MGLOG_E("ProgramObject %u: GenerateBinary - LinkProgram failed during binary generation",
|
MGLOG_E("ProgramObject %u: GenerateBinary - LinkProgram failed during binary generation", m_externalIndex);
|
||||||
m_externalIndex);
|
|
||||||
}
|
}
|
||||||
MOBILEGL_ASSERT(programResult, "LinkProgram failed during binary generation");
|
MOBILEGL_ASSERT(programResult, "LinkProgram failed during binary generation");
|
||||||
auto program = programResult.value();
|
auto& program = programResult.value();
|
||||||
MGLOG_D("ProgramObject %u: GenerateBinary - got linked program object", m_externalIndex);
|
MGLOG_D("ProgramObject %u: GenerateBinary - got linked program object", m_externalIndex);
|
||||||
|
|
||||||
ProgramBinaryAttrib binaryAttrib{
|
ProgramBinaryAttrib binaryAttrib{
|
||||||
@@ -497,8 +487,7 @@ namespace MobileGL {
|
|||||||
for (const auto& [name, offset] : meta.plainUniformOffsetsInUBO) {
|
for (const auto& [name, offset] : meta.plainUniformOffsetsInUBO) {
|
||||||
if (m_uniformLocations.find(name) != m_uniformLocations.end()) {
|
if (m_uniformLocations.find(name) != m_uniformLocations.end()) {
|
||||||
m_uniformOffsets[m_uniformLocations[name]] = offset;
|
m_uniformOffsets[m_uniformLocations[name]] = offset;
|
||||||
MGLOG_D(
|
MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' offset=%u assigned to location %u",
|
||||||
"ProgramObject %u: GenerateBinary - uniform '%s' offset=%u assigned to location %u",
|
|
||||||
m_externalIndex, name.c_str(), offset, m_uniformLocations[name]);
|
m_externalIndex, name.c_str(), offset, m_uniformLocations[name]);
|
||||||
} else {
|
} else {
|
||||||
MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' offset=%u but not found in "
|
MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' offset=%u but not found in "
|
||||||
@@ -510,8 +499,7 @@ namespace MobileGL {
|
|||||||
for (const auto& [name, size] : meta.plainUniformMemberSizesInBytes) {
|
for (const auto& [name, size] : meta.plainUniformMemberSizesInBytes) {
|
||||||
if (m_uniformLocations.find(name) != m_uniformLocations.end()) {
|
if (m_uniformLocations.find(name) != m_uniformLocations.end()) {
|
||||||
m_uniformSizesInBytes[m_uniformLocations[name]] = size;
|
m_uniformSizesInBytes[m_uniformLocations[name]] = size;
|
||||||
MGLOG_D(
|
MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' size=%u assigned to location %u",
|
||||||
"ProgramObject %u: GenerateBinary - uniform '%s' size=%u assigned to location %u",
|
|
||||||
m_externalIndex, name.c_str(), size, m_uniformLocations[name]);
|
m_externalIndex, name.c_str(), size, m_uniformLocations[name]);
|
||||||
} else {
|
} else {
|
||||||
MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' size=%u but not found in "
|
MGLOG_D("ProgramObject %u: GenerateBinary - uniform '%s' size=%u but not found in "
|
||||||
@@ -528,23 +516,23 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProgramObject::WaitUntilGenerationCompleted() {
|
void ProgramObject::WaitUntilGenerationCompleted() const {
|
||||||
MGLOG_D("ProgramObject %u: WaitUntilGenerationCompleted called (no-op)", m_externalIndex);
|
MGLOG_D("ProgramObject %u: WaitUntilGenerationCompleted called (no-op)", m_externalIndex);
|
||||||
// currently no-op, but keep log for debugging
|
// currently no-op, but keep log for debugging
|
||||||
// will probably be useful when multi-threaded compilation
|
// will probably be useful when multi-threaded compilation
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProgramObject::SetExplicitVertexInLocation(Uint index, const char* name) {
|
void ProgramObject::SetExplicitVertexInLocation(Uint index, const char* name) {
|
||||||
MGLOG_D("ProgramObject %u: SetExplicitVertexInLocation called name='%s' index=%u", m_externalIndex,
|
MGLOG_D("ProgramObject %u: SetExplicitVertexInLocation called name='%s' index=%u", m_externalIndex, name,
|
||||||
name, index);
|
index);
|
||||||
m_explicitAttribLocations[name] = index;
|
m_explicitAttribLocations[name] = index;
|
||||||
MGLOG_D("ProgramObject %u: SetExplicitVertexInLocation - stored explicit location for '%s' -> %u",
|
MGLOG_D("ProgramObject %u: SetExplicitVertexInLocation - stored explicit location for '%s' -> %u",
|
||||||
m_externalIndex, name, index);
|
m_externalIndex, name, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProgramObject::SetExplicitFragmentOutLocation(Uint index, const char* name) {
|
void ProgramObject::SetExplicitFragmentOutLocation(Uint index, const char* name) {
|
||||||
MGLOG_D("ProgramObject %u: SetExplicitFragmentOutLocation called name='%s' index=%u", m_externalIndex,
|
MGLOG_D("ProgramObject %u: SetExplicitFragmentOutLocation called name='%s' index=%u", m_externalIndex, name,
|
||||||
name, index);
|
index);
|
||||||
m_explicitFragDataLocation[name] = index;
|
m_explicitFragDataLocation[name] = index;
|
||||||
MGLOG_D("ProgramObject %u: SetExplicitFragmentOutLocation - stored explicit location for '%s' -> %u",
|
MGLOG_D("ProgramObject %u: SetExplicitFragmentOutLocation - stored explicit location for '%s' -> %u",
|
||||||
m_externalIndex, name, index);
|
m_externalIndex, name, index);
|
||||||
@@ -554,8 +542,6 @@ namespace MobileGL {
|
|||||||
// TODO: should retrieve "post-mortem" location from glslang instead
|
// TODO: should retrieve "post-mortem" location from glslang instead
|
||||||
auto it = m_explicitFragDataLocation.find(name);
|
auto it = m_explicitFragDataLocation.find(name);
|
||||||
if (it == m_explicitFragDataLocation.end()) return -1;
|
if (it == m_explicitFragDataLocation.end()) return -1;
|
||||||
return it->second;
|
return (Int)it->second;
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -9,19 +9,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include "ShaderObject.h"
|
#include "ShaderObject.h"
|
||||||
#include "MG_Util/Metrics/BufferMetrics.h"
|
|
||||||
#include "MG_Util/ShaderTranspiler/SpvcSession.h"
|
|
||||||
|
|
||||||
namespace MobileGL {
|
#include <MG_Util/Metrics/BufferMetrics.h>
|
||||||
namespace MG_State {
|
#include <MG_Util/ShaderTranspiler/SpvcSession.h>
|
||||||
namespace GLState {
|
|
||||||
|
namespace MobileGL::MG_State::GLState {
|
||||||
class ProgramObject {
|
class ProgramObject {
|
||||||
public:
|
public:
|
||||||
ProgramObject(Uint externalIndex) : m_externalIndex(externalIndex) {}
|
ProgramObject(Uint externalIndex) : m_externalIndex(externalIndex) {}
|
||||||
bool ShaderIsAttached(SharedPtr<ShaderObject> shader);
|
bool ShaderIsAttached(const SharedPtr<ShaderObject>& shader);
|
||||||
bool AttachShader(SharedPtr<ShaderObject> shader);
|
bool AttachShader(const SharedPtr<ShaderObject>& shader);
|
||||||
SizeT DetachShader(SharedPtr<ShaderObject> shader);
|
SizeT DetachShader(const SharedPtr<ShaderObject>& shader);
|
||||||
SizeT RemoveShader(SharedPtr<ShaderObject> shader);
|
SizeT RemoveShader(const SharedPtr<ShaderObject>& shader);
|
||||||
void Link(Bool addDefaultFSIfMissingForRenderingPipelineProgram = false);
|
void Link(Bool addDefaultFSIfMissingForRenderingPipelineProgram = false);
|
||||||
void MarkAsDeleted();
|
void MarkAsDeleted();
|
||||||
|
|
||||||
@@ -33,7 +32,7 @@ namespace MobileGL {
|
|||||||
const Vector<SharedPtr<ShaderObject>>& GetAttachedShaders() const;
|
const Vector<SharedPtr<ShaderObject>>& GetAttachedShaders() const;
|
||||||
const String& GetInfoLog() const { return m_infoLog; }
|
const String& GetInfoLog() const { return m_infoLog; }
|
||||||
Int GetUniformMaxLength() const { return m_uniformNameMaxLength; }
|
Int GetUniformMaxLength() const { return m_uniformNameMaxLength; }
|
||||||
Uint GetUniformCount() { return m_activeUniformCount; }
|
Uint GetUniformCount() const { return m_activeUniformCount; }
|
||||||
Uint GetMaxUniformLocation() const { return m_maxUniformLocation; }
|
Uint GetMaxUniformLocation() const { return m_maxUniformLocation; }
|
||||||
Int GetUniformLocation(const String& name) const {
|
Int GetUniformLocation(const String& name) const {
|
||||||
const auto it = m_uniformLocations.find(name);
|
const auto it = m_uniformLocations.find(name);
|
||||||
@@ -58,13 +57,11 @@ namespace MobileGL {
|
|||||||
return uniform.name;
|
return uniform.name;
|
||||||
}
|
}
|
||||||
Uint GetUniformOffset(Uint location) const { return m_uniformOffsets[location]; }
|
Uint GetUniformOffset(Uint location) const { return m_uniformOffsets[location]; }
|
||||||
Uint GetUniformSizesInBytes(Uint location) const {
|
Uint GetUniformSizesInBytes(Uint location) const { return MG_Util::GetGLTypeSize(GetUniformType(location)); }
|
||||||
return MG_Util::GetGLTypeSize(GetUniformType(location));
|
|
||||||
}
|
|
||||||
|
|
||||||
Int GetAttributeLocation(const String& name) {
|
Int GetAttributeLocation(const String& name) {
|
||||||
const auto it = std::find(m_attribs.begin(), m_attribs.end(), 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);
|
return (it == m_attribs.end()) ? -1 : (Int)std::distance(m_attribs.begin(), it);
|
||||||
}
|
}
|
||||||
GLenum GetAttribType(Uint index) const { return m_attribTypes[index]; }
|
GLenum GetAttribType(Uint index) const { return m_attribTypes[index]; }
|
||||||
const String& GetAttribName(Uint index) const { return m_attribs[index]; }
|
const String& GetAttribName(Uint index) const { return m_attribs[index]; }
|
||||||
@@ -99,16 +96,16 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
Uint GetUBOSizeAt(Uint index) const {
|
Uint GetUBOSizeAt(Uint index) const {
|
||||||
if (!IsActiveUniformBlock(index)) return 0;
|
if (!IsActiveUniformBlock(index)) return 0;
|
||||||
return m_program->getUniformBlock(index).size;
|
return m_program->getUniformBlock((Int)index).size;
|
||||||
}
|
}
|
||||||
|
|
||||||
const String& GetUniformBlockName(Uint index) const {
|
const String& GetUniformBlockName(Uint index) const {
|
||||||
auto& ubo = m_program->getUniformBlock(index);
|
auto& ubo = m_program->getUniformBlock((Int)index);
|
||||||
return ubo.name;
|
return ubo.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set by glUniformBlockBinding
|
// Set by glUniformBlockBinding
|
||||||
void SetUniformBlockBinding(Uint index, Uint binding) { m_uniformBlockBinding[index] = binding; }
|
void SetUniformBlockBinding(Uint index, Uint binding) { m_uniformBlockBinding[index] = (Int)binding; }
|
||||||
|
|
||||||
Uint GetUniformBlockBinding(Uint index) const { return m_uniformBlockBinding[index]; }
|
Uint GetUniformBlockBinding(Uint index) const { return m_uniformBlockBinding[index]; }
|
||||||
|
|
||||||
@@ -116,9 +113,10 @@ namespace MobileGL {
|
|||||||
const Vector<Vector<unsigned>>& GetGeneratedSpirv() const { return m_generatedSpirv; }
|
const Vector<Vector<unsigned>>& GetGeneratedSpirv() const { return m_generatedSpirv; }
|
||||||
|
|
||||||
Int GetShaderIndexByStage(ShaderStage stage) const {
|
Int GetShaderIndexByStage(ShaderStage stage) const {
|
||||||
auto it = std::find_if(m_shaders.begin(), m_shaders.end(),
|
auto it = std::find_if(m_shaders.begin(), m_shaders.end(), [stage](const SharedPtr<ShaderObject>& shader) {
|
||||||
[stage](const SharedPtr<ShaderObject>& shader) { return shader->GetShaderStage() == stage; });
|
return shader->GetShaderStage() == stage;
|
||||||
return it == m_shaders.end() ? -1 : std::distance(m_shaders.begin(), it);
|
});
|
||||||
|
return it == m_shaders.end() ? -1 : (Int)std::distance(m_shaders.begin(), it);
|
||||||
}
|
}
|
||||||
|
|
||||||
Uint GetExternalIndex() const { return m_externalIndex; }
|
Uint GetExternalIndex() const { return m_externalIndex; }
|
||||||
@@ -129,7 +127,7 @@ namespace MobileGL {
|
|||||||
private:
|
private:
|
||||||
void DoReflection();
|
void DoReflection();
|
||||||
void GenerateBinary();
|
void GenerateBinary();
|
||||||
void WaitUntilGenerationCompleted();
|
void WaitUntilGenerationCompleted() const;
|
||||||
void AddDefaultFragmentShaderIfMissing();
|
void AddDefaultFragmentShaderIfMissing();
|
||||||
|
|
||||||
const Uint m_externalIndex = 0;
|
const Uint m_externalIndex = 0;
|
||||||
@@ -183,6 +181,4 @@ namespace MobileGL {
|
|||||||
Bool m_linkStatus = false;
|
Bool m_linkStatus = false;
|
||||||
Bool m_validateStatus = true;
|
Bool m_validateStatus = true;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
|
|
||||||
#include "ProgramState.h"
|
#include "ProgramState.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
Uint ProgramState::CreateProgram() {
|
Uint ProgramState::CreateProgram() {
|
||||||
Uint programId = 0;
|
Uint programId = 0;
|
||||||
m_programIndexGenerator.Generate(1, &programId);
|
m_programIndexGenerator.Generate(1, &programId);
|
||||||
@@ -21,8 +19,9 @@ namespace MobileGL {
|
|||||||
return programId;
|
return programId;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ProgramObject> ProgramState::GetProgramObject(const Uint id) {
|
const SharedPtr<ProgramObject>& ProgramState::GetProgramObject(const Uint id) {
|
||||||
if (!CheckIndexAvail(id, m_programObjects)) return nullptr; // FIXME: add error reporting here
|
static SharedPtr<ProgramObject> nullProgramObject = nullptr;
|
||||||
|
if (!CheckIndexAvail(id, m_programObjects)) return nullProgramObject; // FIXME: add error reporting here
|
||||||
return m_programObjects[id];
|
return m_programObjects[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,8 +56,9 @@ namespace MobileGL {
|
|||||||
return shaderId;
|
return shaderId;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ShaderObject> ProgramState::GetShaderObject(const Uint shader) {
|
const SharedPtr<ShaderObject>& ProgramState::GetShaderObject(const Uint shader) {
|
||||||
if (!CheckIndexAvail(shader, m_shaderObjects)) return nullptr;
|
static SharedPtr<ShaderObject> nullShaderObject = nullptr;
|
||||||
|
if (!CheckIndexAvail(shader, m_shaderObjects)) return nullShaderObject;
|
||||||
return m_shaderObjects[shader];
|
return m_shaderObjects[shader];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,6 +75,4 @@ namespace MobileGL {
|
|||||||
Bool ProgramState::ValidateShaderObject(Uint shader) const {
|
Bool ProgramState::ValidateShaderObject(Uint shader) const {
|
||||||
return CheckIndexAvail(shader, m_shaderObjects) && m_shaderObjects[shader] != nullptr;
|
return CheckIndexAvail(shader, m_shaderObjects) && m_shaderObjects[shader] != nullptr;
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -11,26 +11,24 @@
|
|||||||
#include <MG_Util/Miscellany/IndexGenerator.h>
|
#include <MG_Util/Miscellany/IndexGenerator.h>
|
||||||
#include "ProgramObject.h"
|
#include "ProgramObject.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
class ProgramState {
|
class ProgramState {
|
||||||
public:
|
public:
|
||||||
// This function WILL actually create the program object.
|
// This function WILL actually create the program object.
|
||||||
// To retrieve created program object, use GetProgramObject()
|
// To retrieve created program object, use GetProgramObject()
|
||||||
Uint CreateProgram();
|
Uint CreateProgram();
|
||||||
SharedPtr<ProgramObject> GetProgramObject(Uint id);
|
const SharedPtr<ProgramObject>& GetProgramObject(Uint id);
|
||||||
void MarkProgramObjectForDeletion(Uint program);
|
void MarkProgramObjectForDeletion(Uint program);
|
||||||
Bool ValidateProgramObject(Uint program) const;
|
Bool ValidateProgramObject(Uint program) const;
|
||||||
|
|
||||||
void UseProgram(Uint program);
|
void UseProgram(Uint program);
|
||||||
|
|
||||||
Uint CreateShader(ShaderStage stage);
|
Uint CreateShader(ShaderStage stage);
|
||||||
SharedPtr<ShaderObject> GetShaderObject(Uint shader);
|
const SharedPtr<ShaderObject>& GetShaderObject(Uint shader);
|
||||||
void MarkShaderObjectForDeletion(Uint shader);
|
void MarkShaderObjectForDeletion(Uint shader);
|
||||||
Bool ValidateShaderObject(Uint shader) const;
|
Bool ValidateShaderObject(Uint shader) const;
|
||||||
|
|
||||||
SharedPtr<ProgramObject> GetCurrentProgram() const { return m_currentProgram; }
|
const SharedPtr<ProgramObject>& GetCurrentProgram() const { return m_currentProgram; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@@ -54,6 +52,4 @@ namespace MobileGL {
|
|||||||
|
|
||||||
SharedPtr<ProgramObject> m_currentProgram;
|
SharedPtr<ProgramObject> m_currentProgram;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -13,9 +13,7 @@
|
|||||||
#include <MG_Util/ShaderTranspiler/ShaderSourceProcessor.h>
|
#include <MG_Util/ShaderTranspiler/ShaderSourceProcessor.h>
|
||||||
#include <MG_Util/ShaderTranspiler/glslang/UniformTraverser.h>
|
#include <MG_Util/ShaderTranspiler/glslang/UniformTraverser.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
void ShaderObject::SetShaderSource(const String& source) {
|
void ShaderObject::SetShaderSource(const String& source) {
|
||||||
m_source = source;
|
m_source = source;
|
||||||
}
|
}
|
||||||
@@ -31,8 +29,9 @@ namespace MobileGL {
|
|||||||
// Compile for OpenGL here, so that we can do validation and link
|
// Compile for OpenGL here, so that we can do validation and link
|
||||||
// like a real OpenGL driver at linking stage
|
// like a real OpenGL driver at linking stage
|
||||||
// Will compile for other backends later.
|
// Will compile for other backends later.
|
||||||
ShaderAttrib attrib{
|
ShaderAttrib attrib{.shaderType = MG_Util::ConvertShaderStageToGLEnum(m_stage),
|
||||||
.shaderType = MG_Util::ConvertShaderStageToGLEnum(m_stage), .sourceStr = m_source, .flags = ShaderCompileBits::CompileForOpenGL};
|
.sourceStr = m_source,
|
||||||
|
.flags = ShaderCompileBits::CompileForOpenGL};
|
||||||
|
|
||||||
auto result = ShaderCompiler::CompileShader(attrib);
|
auto result = ShaderCompiler::CompileShader(attrib);
|
||||||
if (result) {
|
if (result) {
|
||||||
@@ -50,6 +49,4 @@ namespace MobileGL {
|
|||||||
void ShaderObject::MarkAsDeleted() {
|
void ShaderObject::MarkAsDeleted() {
|
||||||
m_deleteStatus = true;
|
m_deleteStatus = true;
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ namespace MobileGL {
|
|||||||
Unknown = -1
|
Unknown = -1
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace MG_State {
|
namespace MG_State::GLState {
|
||||||
namespace GLState {
|
|
||||||
class ShaderObject {
|
class ShaderObject {
|
||||||
public:
|
public:
|
||||||
ShaderObject(const ShaderStage stage, Uint externalIndex)
|
ShaderObject(const ShaderStage stage, Uint externalIndex)
|
||||||
@@ -35,7 +34,7 @@ namespace MobileGL {
|
|||||||
Uint GetExternalIndex() const { return m_externalIndex; }
|
Uint GetExternalIndex() const { return m_externalIndex; }
|
||||||
ShaderStage GetShaderStage() const { return m_stage; }
|
ShaderStage GetShaderStage() const { return m_stage; }
|
||||||
const String& GetShaderSource() const { return m_source; }
|
const String& GetShaderSource() const { return m_source; }
|
||||||
SharedPtr<glslang::TShader> GetCompiledShader() const { return m_shader; }
|
const SharedPtr<glslang::TShader>& GetCompiledShader() const { return m_shader; }
|
||||||
const String& GetInfoLog() const { return m_infoLog; }
|
const String& GetInfoLog() const { return m_infoLog; }
|
||||||
const UnorderedMap<String, Uint>& GetUniformLocations() const { return m_uniforms; }
|
const UnorderedMap<String, Uint>& GetUniformLocations() const { return m_uniforms; }
|
||||||
Bool GetCompileStatus() const { return m_compileStatus; }
|
Bool GetCompileStatus() const { return m_compileStatus; }
|
||||||
@@ -52,6 +51,5 @@ namespace MobileGL {
|
|||||||
Bool m_deleteStatus = false;
|
Bool m_deleteStatus = false;
|
||||||
Bool m_compileStatus = false;
|
Bool m_compileStatus = false;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
} // namespace MobileGL
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ namespace MobileGL {
|
|||||||
void RenderState::SetCapability(CapabilityInput cap, Bool enabled) {
|
void RenderState::SetCapability(CapabilityInput cap, Bool enabled) {
|
||||||
#define SET_CAPABILITY(capability, flag) \
|
#define SET_CAPABILITY(capability, flag) \
|
||||||
case CapabilityInput::capability: \
|
case CapabilityInput::capability: \
|
||||||
if (m_parameters.capability##Enabled == flag) break; \
|
if (m_parameters.capability##Enabled == (flag)) break; \
|
||||||
m_parameters.capability##Enabled = flag; \
|
m_parameters.capability##Enabled = (flag); \
|
||||||
++m_version; \
|
++m_version; \
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@ namespace MobileGL {
|
|||||||
++m_version;
|
++m_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
const BoolVec4 RenderState::GetColorMask() const {
|
BoolVec4 RenderState::GetColorMask() const {
|
||||||
return m_parameters.ColorMask;
|
return m_parameters.ColorMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,8 +237,8 @@ namespace MobileGL {
|
|||||||
void RenderState::SetPixelStoreParam(PixelStoreParam param, Int value) {
|
void RenderState::SetPixelStoreParam(PixelStoreParam param, Int value) {
|
||||||
#define SET_PIXEL_STORE_PARAM(paramNameHead, paramNameTail, val) \
|
#define SET_PIXEL_STORE_PARAM(paramNameHead, paramNameTail, val) \
|
||||||
case PixelStoreParam::paramNameHead##paramNameTail: \
|
case PixelStoreParam::paramNameHead##paramNameTail: \
|
||||||
if (m_pixelStore##paramNameHead##Parameters.paramNameTail == val) break; \
|
if (m_pixelStore##paramNameHead##Parameters.paramNameTail == (val)) break; \
|
||||||
m_pixelStore##paramNameHead##Parameters.paramNameTail = val; \
|
m_pixelStore##paramNameHead##Parameters.paramNameTail = (val); \
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (param) {
|
switch (param) {
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ namespace MobileGL {
|
|||||||
|
|
||||||
// Color Mask
|
// Color Mask
|
||||||
void SetColorMask(BoolVec4 mask);
|
void SetColorMask(BoolVec4 mask);
|
||||||
const BoolVec4 GetColorMask() const;
|
BoolVec4 GetColorMask() const;
|
||||||
|
|
||||||
// Clear State
|
// Clear State
|
||||||
void SetClearColor(FloatVec4 color);
|
void SetClearColor(FloatVec4 color);
|
||||||
|
|||||||
@@ -7,40 +7,41 @@
|
|||||||
// End of Source File Header
|
// End of Source File Header
|
||||||
|
|
||||||
#include "RenderbufferState.h"
|
#include "RenderbufferState.h"
|
||||||
|
#include "MG_Util/Types.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
RenderbufferState::RenderbufferState() : m_indexGenerator(1024, 1) {
|
RenderbufferState::RenderbufferState() : m_indexGenerator(1024, 1) {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
||||||
m_bindingSlots[i] = BindingSlot<RenderbufferObject>(static_cast<RenderbufferTarget>(i));
|
m_bindingSlots[i] = BindingSlot<RenderbufferObject>(static_cast<RenderbufferTarget>(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<RenderbufferObject> RenderbufferState::GetRenderbufferObject(Uint index) {
|
const SharedPtr<RenderbufferObject>& RenderbufferState::GetRenderbufferObject(Uint index) {
|
||||||
auto it = m_renderbufferObjects.find(index);
|
auto it = m_renderbufferObjects.find(index);
|
||||||
if (it != m_renderbufferObjects.end()) {
|
if (it != m_renderbufferObjects.end()) {
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
return nullptr;
|
static SharedPtr<RenderbufferObject> nullRenderbufferObject = nullptr;
|
||||||
|
return nullRenderbufferObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Uint> RenderbufferState::GenerateNames(Uint number) {
|
void RenderbufferState::GenerateNames(Uint number, Vector<Uint>& renderbuffers) {
|
||||||
Vector<Uint> buffers(number);
|
renderbuffers.resize(number);
|
||||||
m_indexGenerator.Generate(number, buffers.data());
|
m_indexGenerator.Generate(number, renderbuffers.data());
|
||||||
return buffers;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<RenderbufferObject> RenderbufferState::CreateRenderbufferObject(Uint index) {
|
const SharedPtr<RenderbufferObject>& RenderbufferState::CreateRenderbufferObject(Uint index) {
|
||||||
auto bufferObject = MakeShared<RenderbufferObject>(index);
|
auto& bufferObject = m_renderbufferObjects[index];
|
||||||
m_renderbufferObjects[index] = bufferObject;
|
if (!bufferObject) {
|
||||||
|
bufferObject = MakeShared<RenderbufferObject>(index);
|
||||||
|
}
|
||||||
return bufferObject;
|
return bufferObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
BindingSlot<RenderbufferObject>& RenderbufferState::GetBindingSlot(RenderbufferTarget target) {
|
BindingSlot<RenderbufferObject>& RenderbufferState::GetBindingSlot(RenderbufferTarget target) {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (auto& bindingSlot : m_bindingSlots) {
|
||||||
if (m_bindingSlots[i].GetTarget() == target) {
|
if (bindingSlot.GetTarget() == target) {
|
||||||
return m_bindingSlots[i];
|
return bindingSlot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MOBILEGL_ASSERT(false, "Invalid RenderbufferTarget enum value: %d", static_cast<int>(target));
|
MOBILEGL_ASSERT(false, "Invalid RenderbufferTarget enum value: %d", static_cast<int>(target));
|
||||||
@@ -51,9 +52,9 @@ namespace MobileGL {
|
|||||||
if (m_indexGenerator.IsValid(index)) {
|
if (m_indexGenerator.IsValid(index)) {
|
||||||
auto it = m_renderbufferObjects.find(index);
|
auto it = m_renderbufferObjects.find(index);
|
||||||
if (it != m_renderbufferObjects.end()) {
|
if (it != m_renderbufferObjects.end()) {
|
||||||
for (SizeT i = 0; i < m_bindingSlots.size(); ++i) {
|
for (auto& bindingSlot : m_bindingSlots) {
|
||||||
if (m_bindingSlots[i].GetBoundObject() == it->second) {
|
if (bindingSlot.GetBoundObject() == it->second) {
|
||||||
m_bindingSlots[i].Bind(nullptr);
|
bindingSlot.Bind(nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_renderbufferObjects.erase(it);
|
m_renderbufferObjects.erase(it);
|
||||||
@@ -69,6 +70,4 @@ namespace MobileGL {
|
|||||||
Bool RenderbufferState::ValidateRenderbufferObject(Uint index) const {
|
Bool RenderbufferState::ValidateRenderbufferObject(Uint index) const {
|
||||||
return m_renderbufferObjects.find(index) != m_renderbufferObjects.end();
|
return m_renderbufferObjects.find(index) != m_renderbufferObjects.end();
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -11,16 +11,14 @@
|
|||||||
#include <MG_Util/Miscellany/IndexGenerator.h>
|
#include <MG_Util/Miscellany/IndexGenerator.h>
|
||||||
#include "RenderbufferObject.h"
|
#include "RenderbufferObject.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
class RenderbufferState {
|
class RenderbufferState {
|
||||||
public:
|
public:
|
||||||
RenderbufferState();
|
RenderbufferState();
|
||||||
|
|
||||||
SharedPtr<RenderbufferObject> GetRenderbufferObject(Uint index);
|
const SharedPtr<RenderbufferObject>& GetRenderbufferObject(Uint index);
|
||||||
Vector<Uint> GenerateNames(Uint number);
|
void GenerateNames(Uint number, Vector<Uint>& renderbuffers);
|
||||||
SharedPtr<RenderbufferObject> CreateRenderbufferObject(Uint index);
|
const SharedPtr<RenderbufferObject>& CreateRenderbufferObject(Uint index);
|
||||||
BindingSlot<RenderbufferObject>& GetBindingSlot(RenderbufferTarget target);
|
BindingSlot<RenderbufferObject>& GetBindingSlot(RenderbufferTarget target);
|
||||||
void MarkRenderbufferObjectForDeletion(Uint index);
|
void MarkRenderbufferObjectForDeletion(Uint index);
|
||||||
Bool ValidateName(Uint index) const;
|
Bool ValidateName(Uint index) const;
|
||||||
@@ -32,6 +30,4 @@ namespace MobileGL {
|
|||||||
Array<BindingSlot<RenderbufferObject>, static_cast<SizeT>(RenderbufferTarget::RenderbufferTargetCount)>
|
Array<BindingSlot<RenderbufferObject>, static_cast<SizeT>(RenderbufferTarget::RenderbufferTargetCount)>
|
||||||
m_bindingSlots;
|
m_bindingSlots;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -8,25 +8,23 @@
|
|||||||
|
|
||||||
#include "SamplerState.h"
|
#include "SamplerState.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
SamplerState::SamplerState() : m_indexGenerator(1024, 1) {}
|
SamplerState::SamplerState() : m_indexGenerator(1024, 1) {}
|
||||||
|
|
||||||
Vector<Uint> SamplerState::GenerateNames(Uint number) {
|
void SamplerState::GenerateNames(Uint number, Vector<Uint>& samplers) {
|
||||||
Vector<Uint> names(number);
|
samplers.resize(number);
|
||||||
m_indexGenerator.Generate(number, names.data());
|
m_indexGenerator.Generate(number, samplers.data());
|
||||||
return names;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<SamplerObject> SamplerState::GetSamplerObject(Uint index) {
|
const SharedPtr<SamplerObject>& SamplerState::GetSamplerObject(Uint index) {
|
||||||
auto it = m_samplerObjects.find(index);
|
auto it = m_samplerObjects.find(index);
|
||||||
return it != m_samplerObjects.end() ? it->second : nullptr;
|
static SharedPtr<SamplerObject> nullSamplerObject = nullptr;
|
||||||
|
return it != m_samplerObjects.end() ? it->second : nullSamplerObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<SamplerObject> SamplerState::CreateSamplerObject(Uint index) {
|
const SharedPtr<SamplerObject>& SamplerState::CreateSamplerObject(Uint index) {
|
||||||
auto sampler = MakeShared<SamplerObject>(index);
|
auto& sampler = m_samplerObjects[index];
|
||||||
m_samplerObjects[index] = sampler;
|
sampler = MakeShared<SamplerObject>(index);
|
||||||
return sampler;
|
return sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,6 +42,4 @@ namespace MobileGL {
|
|||||||
Bool SamplerState::ValidateSamplerObject(Uint index) const {
|
Bool SamplerState::ValidateSamplerObject(Uint index) const {
|
||||||
return m_samplerObjects.find(index) != m_samplerObjects.end();
|
return m_samplerObjects.find(index) != m_samplerObjects.end();
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ namespace MobileGL {
|
|||||||
public:
|
public:
|
||||||
SamplerState();
|
SamplerState();
|
||||||
|
|
||||||
Vector<Uint> GenerateNames(Uint number);
|
void GenerateNames(Uint number, Vector<Uint>& samplers);
|
||||||
SharedPtr<SamplerObject> GetSamplerObject(Uint index);
|
const SharedPtr<SamplerObject>& GetSamplerObject(Uint index);
|
||||||
SharedPtr<SamplerObject> CreateSamplerObject(Uint index);
|
const SharedPtr<SamplerObject>& CreateSamplerObject(Uint index);
|
||||||
void MarkSamplerObjectForDeletion(Uint index);
|
void MarkSamplerObjectForDeletion(Uint index);
|
||||||
Bool ValidateName(Uint index) const;
|
Bool ValidateName(Uint index) const;
|
||||||
Bool ValidateSamplerObject(Uint index) const;
|
Bool ValidateSamplerObject(Uint index) const;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace MobileGL {
|
|||||||
return {0, 0, 0};
|
return {0, 0, 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<SamplerObject> TextureObjectBase::GetSamplerObject() const {
|
const SharedPtr<SamplerObject>& TextureObjectBase::GetSamplerObject() const {
|
||||||
return m_sampler;
|
return m_sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,9 +14,7 @@
|
|||||||
#include <Includes.h>
|
#include <Includes.h>
|
||||||
#include <MG_Util/Math/VectorTypes.h>
|
#include <MG_Util/Math/VectorTypes.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
class ITextureObject {
|
class ITextureObject {
|
||||||
public:
|
public:
|
||||||
using TargetEnum = TextureTarget;
|
using TargetEnum = TextureTarget;
|
||||||
@@ -28,7 +26,7 @@ namespace MobileGL {
|
|||||||
virtual TextureTarget GetTarget() const = 0;
|
virtual TextureTarget GetTarget() const = 0;
|
||||||
virtual const Vector<TextureUploadTarget>& GetUploadTargets() const = 0;
|
virtual const Vector<TextureUploadTarget>& GetUploadTargets() const = 0;
|
||||||
virtual IntVec3 GetBaseSize() const = 0;
|
virtual IntVec3 GetBaseSize() const = 0;
|
||||||
virtual SharedPtr<SamplerObject> GetSamplerObject() const = 0;
|
virtual const SharedPtr<SamplerObject>& GetSamplerObject() const = 0;
|
||||||
virtual void SetInternalFormat(TextureInternalFormat format) = 0;
|
virtual void SetInternalFormat(TextureInternalFormat format) = 0;
|
||||||
virtual Bool IsComplete() const = 0;
|
virtual Bool IsComplete() const = 0;
|
||||||
virtual Uint GetExternalIndex() const = 0;
|
virtual Uint GetExternalIndex() const = 0;
|
||||||
@@ -55,7 +53,7 @@ namespace MobileGL {
|
|||||||
TextureInternalFormat GetFormat() const override;
|
TextureInternalFormat GetFormat() const override;
|
||||||
TextureTarget GetTarget() const override;
|
TextureTarget GetTarget() const override;
|
||||||
IntVec3 GetBaseSize() const override;
|
IntVec3 GetBaseSize() const override;
|
||||||
SharedPtr<SamplerObject> GetSamplerObject() const override;
|
const SharedPtr<SamplerObject>& GetSamplerObject() const override;
|
||||||
void SetInternalFormat(TextureInternalFormat format) override;
|
void SetInternalFormat(TextureInternalFormat format) override;
|
||||||
Bool IsComplete() const override;
|
Bool IsComplete() const override;
|
||||||
Uint GetExternalIndex() const override;
|
Uint GetExternalIndex() const override;
|
||||||
@@ -84,8 +82,7 @@ namespace MobileGL {
|
|||||||
|
|
||||||
class TextureObjectMipmap : public TextureObjectBase {
|
class TextureObjectMipmap : public TextureObjectBase {
|
||||||
public:
|
public:
|
||||||
TextureObjectMipmap(TextureTarget target, Uint externalIndex)
|
TextureObjectMipmap(TextureTarget target, Uint externalIndex) : TextureObjectBase(target, externalIndex) {}
|
||||||
: TextureObjectBase(target, externalIndex) {}
|
|
||||||
|
|
||||||
TextureStorageType GetStorageType() const override { return TextureStorageType::Mipmap; }
|
TextureStorageType GetStorageType() const override { return TextureStorageType::Mipmap; }
|
||||||
|
|
||||||
@@ -95,8 +92,7 @@ namespace MobileGL {
|
|||||||
virtual void AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, MipmapInput input) = 0;
|
virtual void AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, MipmapInput input) = 0;
|
||||||
virtual void UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, DataPtr input) = 0;
|
virtual void UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, DataPtr input) = 0;
|
||||||
virtual void* MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) = 0;
|
virtual void* MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) = 0;
|
||||||
virtual void MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel,
|
virtual void MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, Bool dirty = true) = 0;
|
||||||
Bool dirty = true) = 0;
|
|
||||||
virtual Bool IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const = 0;
|
virtual Bool IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -121,6 +117,4 @@ namespace MobileGL {
|
|||||||
protected:
|
protected:
|
||||||
MipmapUploadTargetArray<1> m_textureStorage;
|
MipmapUploadTargetArray<1> m_textureStorage;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "TextureObject.h"
|
#include "TextureObject.h"
|
||||||
#include "MG_State/GLState/BufferState/BufferObject.h"
|
#include <MG_State/GLState/BufferState/BufferObject.h>
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL {
|
||||||
namespace MG_State {
|
namespace MG_State {
|
||||||
|
|||||||
@@ -17,31 +17,29 @@
|
|||||||
#include "TextureObjectBuffer.h"
|
#include "TextureObjectBuffer.h"
|
||||||
#include "TextureObjectStubs.h"
|
#include "TextureObjectStubs.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
TextureState::TextureState() : m_indexGenerator(1024, 1) {
|
TextureState::TextureState() : m_indexGenerator(1024, 1) {
|
||||||
for (int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i) {
|
for (int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i) {
|
||||||
m_textureUnits[i] = TextureUnit();
|
m_textureUnits[i] = TextureUnit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ITextureObject> TextureState::GetTextureObject(Uint index) {
|
const SharedPtr<ITextureObject>& TextureState::GetTextureObject(Uint index) {
|
||||||
auto it = m_textureObjects.find(index);
|
auto it = m_textureObjects.find(index);
|
||||||
if (it != m_textureObjects.end()) {
|
if (it != m_textureObjects.end()) {
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
return nullptr;
|
static SharedPtr<ITextureObject> nullTextureObject = nullptr;
|
||||||
|
return nullTextureObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Uint> TextureState::GenerateNames(Uint number) {
|
void TextureState::GenerateNames(Uint number, Vector<Uint>& textures) {
|
||||||
Vector<Uint> textures(number);
|
textures.resize(number);
|
||||||
m_indexGenerator.Generate(number, textures.data());
|
m_indexGenerator.Generate(number, textures.data());
|
||||||
return textures;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<ITextureObject> TextureState::CreateTextureObject(Uint index, TextureTarget target) {
|
const SharedPtr<ITextureObject>& TextureState::CreateTextureObject(Uint index, TextureTarget target) {
|
||||||
SharedPtr<ITextureObject> textureObject = nullptr;
|
auto& textureObject = m_textureObjects[index];
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case TextureTarget::Texture1D:
|
case TextureTarget::Texture1D:
|
||||||
textureObject = MakeShared<TextureObject1D>(index);
|
textureObject = MakeShared<TextureObject1D>(index);
|
||||||
@@ -80,10 +78,10 @@ namespace MobileGL {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
MOBILEGL_ASSERT(false, "Unimplemented texture type when creating texture object!: %d", (int)target);
|
MOBILEGL_ASSERT(false, "Unimplemented texture type when creating texture object!: %d", (int)target);
|
||||||
return nullptr;
|
static SharedPtr<ITextureObject> nullTextureObject = nullptr;
|
||||||
|
return nullTextureObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_textureObjects[index] = textureObject;
|
|
||||||
return textureObject;
|
return textureObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,9 +91,9 @@ namespace MobileGL {
|
|||||||
if (it != m_textureObjects.end()) {
|
if (it != m_textureObjects.end()) {
|
||||||
for (auto& unit : m_textureUnits) {
|
for (auto& unit : m_textureUnits) {
|
||||||
auto& bindingSlots = unit.GetAllBindingSlots();
|
auto& bindingSlots = unit.GetAllBindingSlots();
|
||||||
for (SizeT i = 0; i < bindingSlots.size(); ++i) {
|
for (auto& bindingSlot : bindingSlots) {
|
||||||
if (bindingSlots[i].GetBoundObject() == it->second) {
|
if (bindingSlot.GetBoundObject() == it->second) {
|
||||||
bindingSlots[i].Bind(nullptr);
|
bindingSlot.Bind(nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,8 +104,8 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TextureUnit& TextureState::GetUnitObject(Int unit) {
|
TextureUnit& TextureState::GetUnitObject(Int unit) {
|
||||||
MOBILEGL_ASSERT(unit >= 0 && unit < MAX_TEXTURE_IMAGE_UNITS, "Texture unit is out of range: %d > %d",
|
MOBILEGL_ASSERT(unit >= 0 && unit < MAX_TEXTURE_IMAGE_UNITS, "Texture unit is out of range: %d > %d", unit,
|
||||||
unit, MAX_TEXTURE_IMAGE_UNITS - 1);
|
MAX_TEXTURE_IMAGE_UNITS - 1);
|
||||||
return m_textureUnits[unit];
|
return m_textureUnits[unit];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,6 +124,4 @@ namespace MobileGL {
|
|||||||
Bool TextureState::ValidateTextureObject(Uint index) const {
|
Bool TextureState::ValidateTextureObject(Uint index) const {
|
||||||
return m_textureObjects.find(index) != m_textureObjects.end();
|
return m_textureObjects.find(index) != m_textureObjects.end();
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -13,17 +13,15 @@
|
|||||||
#include "MG_Util/Types.h"
|
#include "MG_Util/Types.h"
|
||||||
#include "TextureUnit.h"
|
#include "TextureUnit.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
class TextureState {
|
class TextureState {
|
||||||
public:
|
public:
|
||||||
static constexpr int MAX_TEXTURE_IMAGE_UNITS = 32;
|
static constexpr int MAX_TEXTURE_IMAGE_UNITS = 32;
|
||||||
|
|
||||||
TextureState();
|
TextureState();
|
||||||
Vector<Uint> GenerateNames(Uint number);
|
void GenerateNames(Uint number, Vector<Uint>& textures);
|
||||||
SharedPtr<ITextureObject> CreateTextureObject(Uint index, TextureTarget target);
|
const SharedPtr<ITextureObject>& CreateTextureObject(Uint index, TextureTarget target);
|
||||||
SharedPtr<ITextureObject> GetTextureObject(Uint index);
|
const SharedPtr<ITextureObject>& GetTextureObject(Uint index);
|
||||||
TextureUnit& GetUnitObject(Int unit);
|
TextureUnit& GetUnitObject(Int unit);
|
||||||
Int GetActiveTextureUnit() const;
|
Int GetActiveTextureUnit() const;
|
||||||
void SetActiveTextureUnit(Int unit);
|
void SetActiveTextureUnit(Int unit);
|
||||||
@@ -37,6 +35,4 @@ namespace MobileGL {
|
|||||||
IndexGenerator<Uint> m_indexGenerator;
|
IndexGenerator<Uint> m_indexGenerator;
|
||||||
UnorderedMap<GLuint, SharedPtr<ITextureObject>> m_textureObjects;
|
UnorderedMap<GLuint, SharedPtr<ITextureObject>> m_textureObjects;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
|
|
||||||
#include "TextureUnit.h"
|
#include "TextureUnit.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
TextureUnit::TextureUnit() : m_sampler(nullptr) {
|
TextureUnit::TextureUnit() : m_sampler(nullptr) {
|
||||||
for (int i = 0; i < (int)TextureTarget::TextureTargetCount; ++i) {
|
for (int i = 0; i < (int)TextureTarget::TextureTargetCount; ++i) {
|
||||||
m_slots[i] = BindingSlot<ITextureObject>(static_cast<TextureTarget>(i));
|
m_slots[i] = BindingSlot<ITextureObject>(static_cast<TextureTarget>(i));
|
||||||
@@ -21,18 +19,15 @@ namespace MobileGL {
|
|||||||
return m_slots[(int)target];
|
return m_slots[(int)target];
|
||||||
}
|
}
|
||||||
|
|
||||||
Array<BindingSlot<ITextureObject>, (int)TextureTarget::TextureTargetCount>& TextureUnit::
|
Array<BindingSlot<ITextureObject>, (int)TextureTarget::TextureTargetCount>& TextureUnit::GetAllBindingSlots() {
|
||||||
GetAllBindingSlots() {
|
|
||||||
return m_slots;
|
return m_slots;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureUnit::SetSamplerObject(SharedPtr<SamplerObject> sampler) {
|
void TextureUnit::SetSamplerObject(const SharedPtr<SamplerObject>& sampler) {
|
||||||
m_sampler = sampler;
|
m_sampler = sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<SamplerObject> TextureUnit::GetSamplerObject() const {
|
const SharedPtr<SamplerObject>& TextureUnit::GetSamplerObject() const {
|
||||||
return m_sampler;
|
return m_sampler;
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -11,21 +11,17 @@
|
|||||||
#include <MG_State/GLState/SamplerState/SamplerObject.h>
|
#include <MG_State/GLState/SamplerState/SamplerObject.h>
|
||||||
#include "TextureObject.h"
|
#include "TextureObject.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
class TextureUnit {
|
class TextureUnit {
|
||||||
public:
|
public:
|
||||||
TextureUnit();
|
TextureUnit();
|
||||||
BindingSlot<ITextureObject>& GetBindingSlot(TextureTarget target);
|
BindingSlot<ITextureObject>& GetBindingSlot(TextureTarget target);
|
||||||
SharedPtr<SamplerObject> GetSamplerObject() const;
|
const SharedPtr<SamplerObject>& GetSamplerObject() const;
|
||||||
Array<BindingSlot<ITextureObject>, (int)TextureTarget::TextureTargetCount>& GetAllBindingSlots();
|
Array<BindingSlot<ITextureObject>, (int)TextureTarget::TextureTargetCount>& GetAllBindingSlots();
|
||||||
void SetSamplerObject(SharedPtr<SamplerObject> sampler);
|
void SetSamplerObject(const SharedPtr<SamplerObject>& sampler);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Array<BindingSlot<ITextureObject>, (int)TextureTarget::TextureTargetCount> m_slots;
|
Array<BindingSlot<ITextureObject>, (int)TextureTarget::TextureTargetCount> m_slots;
|
||||||
SharedPtr<SamplerObject> m_sampler;
|
SharedPtr<SamplerObject> m_sampler;
|
||||||
};
|
};
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
|
|
||||||
#include "VertexArrayObject.h"
|
#include "VertexArrayObject.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
VertexArrayObject::VertexArrayObject(Uint externIndex) : m_externalIndex(externIndex) {
|
VertexArrayObject::VertexArrayObject(Uint externIndex) : m_externalIndex(externIndex) {
|
||||||
for (int index = 0; index < MAX_VERTEX_ATTRIBS; ++index) {
|
for (int index = 0; index < MAX_VERTEX_ATTRIBS; ++index) {
|
||||||
auto& attr = m_attributes[index];
|
auto& attr = m_attributes[index];
|
||||||
@@ -93,8 +91,7 @@ namespace MobileGL {
|
|||||||
return m_attributes[index];
|
return m_attributes[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
const Array<VertexAttribute, VertexArrayObject::MAX_VERTEX_ATTRIBS>& VertexArrayObject::GetAllAttributes()
|
const Array<VertexAttribute, VertexArrayObject::MAX_VERTEX_ATTRIBS>& VertexArrayObject::GetAllAttributes() const {
|
||||||
const {
|
|
||||||
return m_attributes;
|
return m_attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,6 +136,4 @@ namespace MobileGL {
|
|||||||
GetAllAttributeVersions() const {
|
GetAllAttributeVersions() const {
|
||||||
return m_attributeVersions;
|
return m_attributeVersions;
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
|
|
||||||
#include "VertexArrayState.h"
|
#include "VertexArrayState.h"
|
||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL::MG_State::GLState {
|
||||||
namespace MG_State {
|
|
||||||
namespace GLState {
|
|
||||||
VertexArrayState::VertexArrayState() : m_indexGenerator(1024, 1) {
|
VertexArrayState::VertexArrayState() : m_indexGenerator(1024, 1) {
|
||||||
// Generate default VAO at index 0, which is not valid in core profile, but still remains for
|
// Generate default VAO at index 0, which is not valid in core profile, but still remains for
|
||||||
// compatibility reasons.
|
// compatibility reasons.
|
||||||
@@ -20,31 +18,33 @@ namespace MobileGL {
|
|||||||
m_boundVertexArray = defaultVAO;
|
m_boundVertexArray = defaultVAO;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<VertexArrayObject> VertexArrayState::GetVertexArrayObject(Uint index) {
|
const SharedPtr<VertexArrayObject>& VertexArrayState::GetVertexArrayObject(Uint index) {
|
||||||
if (index >= m_vertexArrays.size())
|
if (index >= m_vertexArrays.size()) {
|
||||||
// FIXME: report a GL error here
|
// FIXME: report a GL error here
|
||||||
return nullptr;
|
static SharedPtr<VertexArrayObject> nullVertexArrayObject = nullptr;
|
||||||
|
return nullVertexArrayObject;
|
||||||
|
}
|
||||||
|
|
||||||
return m_vertexArrays[index];
|
return m_vertexArrays[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Uint> VertexArrayState::GenerateNames(Uint number) {
|
void VertexArrayState::GenerateNames(Uint number, Vector<Uint>& arrays) {
|
||||||
Vector<Uint> arrays(number);
|
arrays.resize(number);
|
||||||
m_indexGenerator.Generate(number, arrays.data());
|
m_indexGenerator.Generate(number, arrays.data());
|
||||||
return arrays;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexArrayState::Bind(Uint index) {
|
void VertexArrayState::Bind(Uint index) {
|
||||||
m_boundVertexArray = GetVertexArrayObject(index);
|
m_boundVertexArray = GetVertexArrayObject(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<VertexArrayObject> VertexArrayState::CreateVertexArrayObject(Uint index) {
|
const SharedPtr<VertexArrayObject>& VertexArrayState::CreateVertexArrayObject(Uint index) {
|
||||||
if (index >= m_vertexArrays.size()) {
|
if (index >= m_vertexArrays.size()) {
|
||||||
// power-of-2 reallocation
|
// power-of-2 reallocation
|
||||||
m_vertexArrays.reserve(std::bit_ceil(index + 1));
|
m_vertexArrays.reserve(std::bit_ceil(index + 1));
|
||||||
m_vertexArrays.resize(index + 1, nullptr);
|
m_vertexArrays.resize(index + 1, nullptr);
|
||||||
}
|
}
|
||||||
auto vao = m_vertexArrays[index] = MakeShared<VertexArrayObject>(index);
|
auto& vao = m_vertexArrays[index];
|
||||||
|
vao = MakeShared<VertexArrayObject>(index);
|
||||||
return vao;
|
return vao;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,13 +71,11 @@ namespace MobileGL {
|
|||||||
return index < m_vertexArrays.size() && m_vertexArrays[index] != nullptr;
|
return index < m_vertexArrays.size() && m_vertexArrays[index] != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<VertexArrayObject> VertexArrayState::GetBoundVertexArray() {
|
const SharedPtr<VertexArrayObject>& VertexArrayState::GetBoundVertexArray() {
|
||||||
return m_boundVertexArray;
|
return m_boundVertexArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<SharedPtr<VertexArrayObject>>& VertexArrayState::GetAllVertexArrays() {
|
Vector<SharedPtr<VertexArrayObject>>& VertexArrayState::GetAllVertexArrays() {
|
||||||
return m_vertexArrays;
|
return m_vertexArrays;
|
||||||
}
|
}
|
||||||
} // namespace GLState
|
} // namespace MobileGL::MG_State::GLState
|
||||||
} // namespace MG_State
|
|
||||||
} // namespace MobileGL
|
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ namespace MobileGL {
|
|||||||
public:
|
public:
|
||||||
VertexArrayState();
|
VertexArrayState();
|
||||||
|
|
||||||
SharedPtr<VertexArrayObject> GetVertexArrayObject(Uint index);
|
const SharedPtr<VertexArrayObject>& GetVertexArrayObject(Uint index);
|
||||||
Vector<Uint> GenerateNames(Uint number);
|
void GenerateNames(Uint number, Vector<Uint>& arrays);
|
||||||
void Bind(Uint index);
|
void Bind(Uint index);
|
||||||
SharedPtr<VertexArrayObject> CreateVertexArrayObject(Uint index);
|
const SharedPtr<VertexArrayObject>& CreateVertexArrayObject(Uint index);
|
||||||
void MarkVertexArrayForDeletion(Uint index);
|
void MarkVertexArrayForDeletion(Uint index);
|
||||||
Bool ValidateName(Uint index) const;
|
Bool ValidateName(Uint index) const;
|
||||||
Bool ValidateVertexArrayObject(Uint index) const;
|
Bool ValidateVertexArrayObject(Uint index) const;
|
||||||
SharedPtr<VertexArrayObject> GetBoundVertexArray();
|
const SharedPtr<VertexArrayObject>& GetBoundVertexArray();
|
||||||
Vector<SharedPtr<VertexArrayObject>>& GetAllVertexArrays();
|
Vector<SharedPtr<VertexArrayObject>>& GetAllVertexArrays();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -150,15 +150,15 @@ namespace MobileGL {
|
|||||||
public:
|
public:
|
||||||
using TargetEnum = typename ObjectType::TargetEnum;
|
using TargetEnum = typename ObjectType::TargetEnum;
|
||||||
|
|
||||||
BindingSlot() : m_target((TargetEnum)0), m_boundObject(nullptr) {}
|
BindingSlot() : m_target((TargetEnum)0) {}
|
||||||
explicit BindingSlot(TargetEnum target) : m_target(target), m_boundObject(nullptr) {}
|
explicit BindingSlot(TargetEnum target) : m_target(target) {}
|
||||||
void Bind(SharedPtr<ObjectType> object) {
|
void Bind(SharedPtr<ObjectType> object) {
|
||||||
if (m_boundObject == object) return;
|
if (m_boundObject == object) return;
|
||||||
|
|
||||||
m_boundObject = object;
|
m_boundObject = Move(object);
|
||||||
++m_version;
|
++m_version;
|
||||||
}
|
}
|
||||||
SharedPtr<ObjectType> GetBoundObject() const { return m_boundObject; }
|
SharedPtr<ObjectType> const& GetBoundObject() const noexcept { return m_boundObject; }
|
||||||
TargetEnum GetTarget() const { return m_target; }
|
TargetEnum GetTarget() const { return m_target; }
|
||||||
Uint16 GetVersion() const { return m_version; }
|
Uint16 GetVersion() const { return m_version; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user