From d7996329c10242d51ec034367cbfd1af649b0bba Mon Sep 17 00:00:00 2001 From: fzurita Date: Sun, 3 Nov 2019 12:04:49 -0500 Subject: [PATCH] Added more GL functions to threaded GL implementation --- src/Graphics/OpenGLContext/GLFunctions.cpp | 5 + src/Graphics/OpenGLContext/GLFunctions.h | 10 +- .../ThreadedOpenGl/opengl_WrappedFunctions.h | 96 +++++++++++++++++-- .../ThreadedOpenGl/opengl_Wrapper.cpp | 22 ++++- .../ThreadedOpenGl/opengl_Wrapper.h | 5 +- src/Graphics/OpenGLContext/opengl_GLInfo.cpp | 9 +- 6 files changed, 128 insertions(+), 19 deletions(-) diff --git a/src/Graphics/OpenGLContext/GLFunctions.cpp b/src/Graphics/OpenGLContext/GLFunctions.cpp index 2c885131..fb4f1a72 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.cpp +++ b/src/Graphics/OpenGLContext/GLFunctions.cpp @@ -196,7 +196,9 @@ PFNGLENABLEIPROC ptrEnablei; PFNGLDISABLEIPROC ptrDisablei; PFNGLDEBUGMESSAGECALLBACKPROC ptrDebugMessageCallback; PFNGLDEBUGMESSAGECONTROLPROC ptrDebugMessageControl; +PFNGLCOPYTEXIMAGE2DPROC ptrCopyTexImage2D; PFNGLEGLIMAGETARGETTEXTURE2DOESPROC ptrEGLImageTargetTexture2DOES; +PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC ptrEGLImageTargetRenderbufferStorageOES; void initGLFunctions() { @@ -382,5 +384,8 @@ void initGLFunctions() GL_GET_PROC_ADR(PFNGLDISABLEIPROC, Disablei); GL_GET_PROC_ADR(PFNGLDEBUGMESSAGECALLBACKPROC, DebugMessageCallback); GL_GET_PROC_ADR(PFNGLDEBUGMESSAGECONTROLPROC, DebugMessageControl); + GL_GET_PROC_ADR(PFNGLCOPYTEXIMAGE2DPROC, CopyTexImage2D); + GL_GET_PROC_ADR(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC, EGLImageTargetTexture2DOES); + GL_GET_PROC_ADR(PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC, EGLImageTargetRenderbufferStorageOES); } diff --git a/src/Graphics/OpenGLContext/GLFunctions.h b/src/Graphics/OpenGLContext/GLFunctions.h index ffd86842..caf4aff4 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.h +++ b/src/Graphics/OpenGLContext/GLFunctions.h @@ -48,6 +48,7 @@ typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); #endif extern PFNGLBLENDFUNCPROC ptrBlendFunc; @@ -190,11 +191,14 @@ extern PFNGLENABLEIPROC ptrEnablei; extern PFNGLDISABLEIPROC ptrDisablei; extern PFNGLDEBUGMESSAGECALLBACKPROC ptrDebugMessageCallback; extern PFNGLDEBUGMESSAGECONTROLPROC ptrDebugMessageControl; - +extern PFNGLCOPYTEXIMAGE2DPROC ptrCopyTexImage2D; typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, void* image); extern PFNGLEGLIMAGETARGETTEXTURE2DOESPROC ptrEGLImageTargetTexture2DOES; +typedef void (APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, void* image); +extern PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC ptrEGLImageTargetRenderbufferStorageOES; + void initGLFunctions(); #define glGetError(...) opengl::FunctionWrapper::wrGetError(__VA_ARGS__) @@ -329,9 +333,11 @@ void initGLFunctions(); #define glClearBufferfv(...) opengl::FunctionWrapper::wrClearBufferfv(__VA_ARGS__) #define glEnablei(...) opengl::FunctionWrapper::wrEnablei(__VA_ARGS__) #define glDisablei(...) opengl::FunctionWrapper::wrDisablei(__VA_ARGS__) -#define glEGLImageTargetTexture2DOES(...) opengl::FunctionWrapper::wrEGLImageTargetTexture2DOES(__VA_ARGS__) +#define glCopyTexImage2D(...) opengl::FunctionWrapper::wrCopyTexImage2D(__VA_ARGS__) #define glDebugMessageCallback(...) opengl::FunctionWrapper::wrDebugMessageCallback(__VA_ARGS__) #define glDebugMessageControl(...) opengl::FunctionWrapper::wrDebugMessageControl(__VA_ARGS__) +#define glEGLImageTargetTexture2DOES(...) opengl::FunctionWrapper::wrEGLImageTargetTexture2DOES(__VA_ARGS__) +#define glEGLImageTargetRenderbufferStorageOES(...) opengl::FunctionWrapper::wrEGLImageTargetRenderbufferStorageOES(__VA_ARGS__) #define GL_TEXTURE_EXTERNAL_OES 0x8D65 diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_WrappedFunctions.h b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_WrappedFunctions.h index 58e21567..4c87d36c 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_WrappedFunctions.h +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_WrappedFunctions.h @@ -4714,36 +4714,48 @@ private: } }; -class GlEGLImageTargetTexture2DOESCommand : public OpenGlCommand +class GlCopyTexImage2DCommand : public OpenGlCommand { public: - GlEGLImageTargetTexture2DOESCommand() : - OpenGlCommand(false, false, "glEGLImageTargetTexture2DOES") + GlCopyTexImage2DCommand() : + OpenGlCommand(false, false, "glCopyTexImage2D") { } - static std::shared_ptr get(GLenum target, void* image) + static std::shared_ptr get(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { static int poolId = OpenGlCommandPool::get().getNextAvailablePool(); - auto ptr = getFromPool(poolId); - ptr->set(target, image); + auto ptr = getFromPool(poolId); + ptr->set(target, level, internalformat, x, y, width, height, border); return ptr; } void commandToExecute() override { - ptrEGLImageTargetTexture2DOES(m_target, m_image); + ptrCopyTexImage2D(m_target, m_level, m_internalformat, m_x, m_y, m_width, m_height, m_border); } private: - void set(GLenum target, void* image) + void set(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { m_target = target; - m_image = image; + m_level = level; + m_internalformat = internalformat; + m_x = x; + m_y = y; + m_width = width; + m_height = height; + m_border = border; } GLenum m_target; - void* m_image; + GLint m_level; + GLenum m_internalformat; + GLint m_x; + GLint m_y; + GLsizei m_width; + GLsizei m_height; + GLint m_border; }; class GlDebugMessageCallbackCommand : public OpenGlCommand @@ -4818,6 +4830,70 @@ private: GLboolean m_enabled; }; +class GlEGLImageTargetTexture2DOESCommand : public OpenGlCommand +{ +public: + GlEGLImageTargetTexture2DOESCommand() : + OpenGlCommand(false, false, "glEGLImageTargetTexture2DOES") + { + } + + static std::shared_ptr get(GLenum target, void* image) + { + static int poolId = OpenGlCommandPool::get().getNextAvailablePool(); + auto ptr = getFromPool(poolId); + ptr->set(target, image); + return ptr; + } + + void commandToExecute() override + { + ptrEGLImageTargetTexture2DOES(m_target, m_image); + } + +private: + void set(GLenum target, void* image) + { + m_target = target; + m_image = image; + } + + GLenum m_target; + void* m_image; +}; + +class GlEGLImageTargetRenderbufferStorageOESCommand : public OpenGlCommand +{ +public: + GlEGLImageTargetRenderbufferStorageOESCommand() : + OpenGlCommand(false, false, "glEGLImageTargetRenderbufferStorageOES") + { + } + + static std::shared_ptr get(GLenum target, void* image) + { + static int poolId = OpenGlCommandPool::get().getNextAvailablePool(); + auto ptr = getFromPool(poolId); + ptr->set(target, image); + return ptr; + } + + void commandToExecute() override + { + ptrEGLImageTargetRenderbufferStorageOES(m_target, m_image); + } + +private: + void set(GLenum target, void* image) + { + m_target = target; + m_image = image; + } + + GLenum m_target; + void* m_image; +}; + class ShutdownCommand : public OpenGlCommand { public: diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp index 2bc5a7a9..dd9a5b01 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp @@ -1302,12 +1302,12 @@ namespace opengl { ptrFinish(); } - void FunctionWrapper::wrEGLImageTargetTexture2DOES(GLenum target, void* image) + void FunctionWrapper::wrCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { if (m_threaded_wrapper) - executeCommand(GlEGLImageTargetTexture2DOESCommand::get(target, image)); + executeCommand(GlCopyTexImage2DCommand::get(target, level, internalformat, x, y, width, height, border)); else - ptrEGLImageTargetTexture2DOES(target, image); + ptrCopyTexImage2D(target, level, internalformat, x, y, width, height, border); } void FunctionWrapper::wrDebugMessageCallback(GLDEBUGPROC callback, const void *userParam) @@ -1318,7 +1318,6 @@ namespace opengl { ptrDebugMessageCallback(callback, userParam); } - void FunctionWrapper::wrDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) { if (m_threaded_wrapper) @@ -1327,6 +1326,21 @@ namespace opengl { ptrDebugMessageControl(source, type, severity, count, ids, enabled); } + void FunctionWrapper::wrEGLImageTargetTexture2DOES(GLenum target, void* image) + { + if (m_threaded_wrapper) + executeCommand(GlEGLImageTargetTexture2DOESCommand::get(target, image)); + else + ptrEGLImageTargetTexture2DOES(target, image); + } + + void FunctionWrapper::wrEGLImageTargetRenderbufferStorageOES(GLenum target, void* image) + { + if (m_threaded_wrapper) + executeCommand(GlEGLImageTargetRenderbufferStorageOESCommand::get(target, image)); + else + ptrEGLImageTargetRenderbufferStorageOES(target, image); + } #if defined(OS_ANDROID) EGLClientBuffer FunctionWrapper::ewrGetNativeClientBufferANDROID(const AHardwareBuffer *buffer) diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.h b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.h index 9e017a0c..9e4b74c1 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.h +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.h @@ -171,10 +171,11 @@ namespace opengl { static void wrDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const u16* indices, GLint basevertex); static void wrFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length); static void wrFinish(); - static void wrEGLImageTargetTexture2DOES(GLenum target, void* image); + static void wrCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); static void wrDebugMessageCallback(GLDEBUGPROC callback, const void *userParam); static void wrDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); - + static void wrEGLImageTargetTexture2DOES(GLenum target, void* image); + static void wrEGLImageTargetRenderbufferStorageOES(GLenum target, void* image); #if defined(OS_ANDROID) static EGLClientBuffer ewrGetNativeClientBufferANDROID(const AHardwareBuffer *buffer); diff --git a/src/Graphics/OpenGLContext/opengl_GLInfo.cpp b/src/Graphics/OpenGLContext/opengl_GLInfo.cpp index 0de4d6fb..5d9add3d 100644 --- a/src/Graphics/OpenGLContext/opengl_GLInfo.cpp +++ b/src/Graphics/OpenGLContext/opengl_GLInfo.cpp @@ -13,7 +13,14 @@ using namespace opengl; -static void on_gl_error(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char* message, const void *userParam) +static +void APIENTRY on_gl_error(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const char* message, + const void *userParam) { LOG(LOG_ERROR, "%s", message); }