diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2016-02-02 15:58:48 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2016-03-01 14:46:33 +0000 |
commit | 095b338732b6756b60aeb1461395237735a523e5 (patch) | |
tree | 90ae91acfb2abb57eb727417d212dbdc3bcc1405 /src/gui/opengl/qopenglfunctions.cpp | |
parent | a900645c2a067d6580a5fb3335c11db927a407e9 (diff) |
Generate more compact code to resolve the QOpenGLFunctions
Use a similar mechanism as in QOpenGLVersionFunctions and resolve
the methods in a loop. This requires some macro magic but significantly
reduces the size of the generated code.
Change-Id: If5f5e5551af0d1aed4b4ce7ce82932d8988dab59
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'src/gui/opengl/qopenglfunctions.cpp')
-rw-r--r-- | src/gui/opengl/qopenglfunctions.cpp | 270 |
1 files changed, 38 insertions, 232 deletions
diff --git a/src/gui/opengl/qopenglfunctions.cpp b/src/gui/opengl/qopenglfunctions.cpp index 294e4a27c9..a50a8be792 100644 --- a/src/gui/opengl/qopenglfunctions.cpp +++ b/src/gui/opengl/qopenglfunctions.cpp @@ -55,6 +55,24 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcGLES3, "qt.opengl.es3") + +#define QT_OPENGL_COUNT_FUNCTIONS(ret, name, args) +1 +#define QT_OPENGL_FUNCTION_NAMES(ret, name, args) \ + "gl"#name"\0" +#define QT_OPENGL_FLAGS(ret, name, args) \ + 0, +#define QT_OPENGL_IMPLEMENT_WITH_FLAGS(CLASS, FUNCTIONS) \ +void CLASS::init(QOpenGLContext *context) \ +{ \ + const int flags[] = { FUNCTIONS(QT_OPENGL_FLAGS) 0 }; \ + const char *names = FUNCTIONS(QT_OPENGL_FUNCTION_NAMES); \ + const char *name = names; \ + for (int i = 0; i < FUNCTIONS(QT_OPENGL_COUNT_FUNCTIONS); ++i) { \ + functions[i] = ::getProcAddress(context, name, flags[i]); \ + name += strlen(name) + 1; \ + } \ +} + /*! \class QOpenGLFunctions \brief The QOpenGLFunctions class provides cross-platform access to the OpenGL ES 2.0 API. @@ -2149,9 +2167,6 @@ Func resolveWithFallback(QOpenGLContext *context, const char *name, int policy, #define RESOLVE(name, policy) \ resolve(context, "gl"#name, policy, name) -#define RESOLVE_WITH_FALLBACK(name, policy) \ - resolveWithFallback(context, "gl"#name, policy, qopenglfSpecial##name) - #ifndef QT_OPENGL_ES_2 // some fallback functions @@ -2159,14 +2174,14 @@ static void QOPENGLF_APIENTRY qopenglfSpecialClearDepthf(GLclampf depth) { QOpenGLContext *context = QOpenGLContext::currentContext(); QOpenGLFunctionsPrivateEx *funcs = qt_gl_functions(context); - funcs->ClearDepth((GLdouble) depth); + funcs->f.ClearDepth((GLdouble) depth); } static void QOPENGLF_APIENTRY qopenglfSpecialDepthRangef(GLclampf zNear, GLclampf zFar) { QOpenGLContext *context = QOpenGLContext::currentContext(); QOpenGLFunctionsPrivateEx *funcs = qt_gl_functions(context); - funcs->DepthRange((GLdouble) zNear, (GLdouble) zFar); + funcs->f.DepthRange((GLdouble) zNear, (GLdouble) zFar); } static void QOPENGLF_APIENTRY qopenglfSpecialGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) @@ -2192,240 +2207,31 @@ static void QOPENGLF_APIENTRY qopenglfSpecialReleaseShaderCompiler() #endif // !QT_OPENGL_ES_2 -#if !defined(QT_OPENGL_ES_2) && !defined(QT_OPENGL_DYNAMIC) -// Special translation functions for ES-specific calls on desktop GL -static void QOPENGLF_APIENTRY qopenglfTranslateClearDepthf(GLclampf depth) +QOpenGLFunctionsPrivate::QOpenGLFunctionsPrivate(QOpenGLContext *c) { - ::glClearDepth(depth); -} + init(c); -static void QOPENGLF_APIENTRY qopenglfTranslateDepthRangef(GLclampf zNear, GLclampf zFar) -{ - ::glDepthRange(zNear, zFar); -} -#endif // !ES && !DYNAMIC - -QOpenGLFunctionsPrivate::QOpenGLFunctionsPrivate(QOpenGLContext *) -{ - /* Assign a pointer to an above defined static function - * which on first call resolves the function from the current - * context, assigns it to the member variable and executes it - * (see Resolver template) */ #ifndef QT_OPENGL_ES_2 - QOpenGLContext *context = QOpenGLContext::currentContext(); - - // The GL1 functions may not be queriable via getProcAddress(). - if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::AllGLFunctionsQueryable)) { - // The platform plugin supports resolving these. - BindTexture = RESOLVE(BindTexture, 0); - BlendFunc = RESOLVE(BlendFunc, 0); - Clear = RESOLVE(Clear, 0); - ClearColor = RESOLVE(ClearColor, 0); - ClearDepthf = RESOLVE_WITH_FALLBACK(ClearDepthf, 0); - ClearStencil = RESOLVE(ClearStencil, 0); - ColorMask = RESOLVE(ColorMask, 0); - CopyTexImage2D = RESOLVE(CopyTexImage2D, 0); - CopyTexSubImage2D = RESOLVE(CopyTexSubImage2D, 0); - CullFace = RESOLVE(CullFace, 0); - DeleteTextures = RESOLVE(DeleteTextures, 0); - DepthFunc = RESOLVE(DepthFunc, 0); - DepthMask = RESOLVE(DepthMask, 0); - DepthRangef = RESOLVE_WITH_FALLBACK(DepthRangef, 0); - Disable = RESOLVE(Disable, 0); - DrawArrays = RESOLVE(DrawArrays, 0); - DrawElements = RESOLVE(DrawElements, 0); - Enable = RESOLVE(Enable, 0); - Finish = RESOLVE(Finish, 0); - Flush = RESOLVE(Flush, 0); - FrontFace = RESOLVE(FrontFace, 0); - GenTextures = RESOLVE(GenTextures, 0); - GetBooleanv = RESOLVE(GetBooleanv, 0); - GetError = RESOLVE(GetError, 0); - GetFloatv = RESOLVE(GetFloatv, 0); - GetIntegerv = RESOLVE(GetIntegerv, 0); - GetString = RESOLVE(GetString, 0); - GetTexParameterfv = RESOLVE(GetTexParameterfv, 0); - GetTexParameteriv = RESOLVE(GetTexParameteriv, 0); - Hint = RESOLVE(Hint, 0); - IsEnabled = RESOLVE(IsEnabled, 0); - IsTexture = RESOLVE(IsTexture, 0); - LineWidth = RESOLVE(LineWidth, 0); - PixelStorei = RESOLVE(PixelStorei, 0); - PolygonOffset = RESOLVE(PolygonOffset, 0); - ReadPixels = RESOLVE(ReadPixels, 0); - Scissor = RESOLVE(Scissor, 0); - StencilFunc = RESOLVE(StencilFunc, 0); - StencilMask = RESOLVE(StencilMask, 0); - StencilOp = RESOLVE(StencilOp, 0); - TexImage2D = RESOLVE(TexImage2D, 0); - TexParameterf = RESOLVE(TexParameterf, 0); - TexParameterfv = RESOLVE(TexParameterfv, 0); - TexParameteri = RESOLVE(TexParameteri, 0); - TexParameteriv = RESOLVE(TexParameteriv, 0); - TexSubImage2D = RESOLVE(TexSubImage2D, 0); - Viewport = RESOLVE(Viewport, 0); - } else { -#ifndef QT_OPENGL_DYNAMIC - // Use the functions directly. This requires linking QtGui to an OpenGL implementation. - BindTexture = ::glBindTexture; - BlendFunc = ::glBlendFunc; - Clear = ::glClear; - ClearColor = ::glClearColor; - ClearDepthf = qopenglfTranslateClearDepthf; - ClearStencil = ::glClearStencil; - ColorMask = ::glColorMask; - CopyTexImage2D = ::glCopyTexImage2D; - CopyTexSubImage2D = ::glCopyTexSubImage2D; - CullFace = ::glCullFace; - DeleteTextures = ::glDeleteTextures; - DepthFunc = ::glDepthFunc; - DepthMask = ::glDepthMask; - DepthRangef = qopenglfTranslateDepthRangef; - Disable = ::glDisable; - DrawArrays = ::glDrawArrays; - DrawElements = ::glDrawElements; - Enable = ::glEnable; - Finish = ::glFinish; - Flush = ::glFlush; - FrontFace = ::glFrontFace; - GenTextures = ::glGenTextures; - GetBooleanv = ::glGetBooleanv; - GetError = ::glGetError; - GetFloatv = ::glGetFloatv; - GetIntegerv = ::glGetIntegerv; - GetString = ::glGetString; - GetTexParameterfv = ::glGetTexParameterfv; - GetTexParameteriv = ::glGetTexParameteriv; - Hint = ::glHint; - IsEnabled = ::glIsEnabled; - IsTexture = ::glIsTexture; - LineWidth = ::glLineWidth; - PixelStorei = ::glPixelStorei; - PolygonOffset = ::glPolygonOffset; - ReadPixels = ::glReadPixels; - Scissor = ::glScissor; - StencilFunc = ::glStencilFunc; - StencilMask = ::glStencilMask; - StencilOp = ::glStencilOp; -#if defined(Q_OS_OSX) && MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 - TexImage2D = reinterpret_cast<void (*)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *)>(glTexImage2D); -#else - TexImage2D = glTexImage2D; + // setup fallbacks in case some methods couldn't get resolved + if (!f.ClearDepthf) + f.ClearDepthf = qopenglfSpecialClearDepthf; + if (!f.DepthRangef) + f.DepthRangef = qopenglfSpecialDepthRangef; + if (!f.GetShaderPrecisionFormat) + f.GetShaderPrecisionFormat = qopenglfSpecialGetShaderPrecisionFormat; + if (!f.IsProgram) + f.IsProgram = qopenglfSpecialIsProgram; + if (!f.IsShader) + f.IsShader = qopenglfSpecialIsShader; + if (!f.ReleaseShaderCompiler) + f.ReleaseShaderCompiler = qopenglfSpecialReleaseShaderCompiler; #endif - TexParameterf = ::glTexParameterf; - TexParameterfv = ::glTexParameterfv; - TexParameteri = ::glTexParameteri; - TexParameteriv = ::glTexParameteriv; - TexSubImage2D = ::glTexSubImage2D; - Viewport = ::glViewport; -#else // QT_OPENGL_DYNAMIC - // This should not happen. - qFatal("QOpenGLFunctions: Dynamic OpenGL builds do not support platforms with insufficient function resolving capabilities"); -#endif - } - - ActiveTexture = RESOLVE(ActiveTexture, 0); - AttachShader = RESOLVE(AttachShader, 0); - BindAttribLocation = RESOLVE(BindAttribLocation, 0); - BindBuffer = RESOLVE(BindBuffer, ResolveOES | ResolveEXT); - BindFramebuffer = RESOLVE(BindFramebuffer, ResolveOES | ResolveEXT); - BindRenderbuffer = RESOLVE(BindRenderbuffer, ResolveOES | ResolveEXT); - BlendColor = RESOLVE(BlendColor, ResolveOES | ResolveEXT); - BlendEquation = RESOLVE(BlendEquation, ResolveOES | ResolveEXT); - BlendEquationSeparate = RESOLVE(BlendEquationSeparate, ResolveOES | ResolveEXT); - BlendFuncSeparate = RESOLVE(BlendFuncSeparate, ResolveOES | ResolveEXT); - BufferData = RESOLVE(BufferData, ResolveOES | ResolveEXT); - BufferSubData = RESOLVE(BufferSubData, ResolveOES | ResolveEXT); - CheckFramebufferStatus = RESOLVE(CheckFramebufferStatus, ResolveOES | ResolveEXT); - CompileShader = RESOLVE(CompileShader, 0); - CompressedTexImage2D = RESOLVE(CompressedTexImage2D, ResolveOES | ResolveEXT); - CompressedTexSubImage2D = RESOLVE(CompressedTexSubImage2D, ResolveOES | ResolveEXT); - CreateProgram = RESOLVE(CreateProgram, 0); - CreateShader = RESOLVE(CreateShader, 0); - DeleteBuffers = RESOLVE(DeleteBuffers, ResolveOES | ResolveEXT); - DeleteFramebuffers = RESOLVE(DeleteFramebuffers, ResolveOES | ResolveEXT); - DeleteProgram = RESOLVE(DeleteProgram, 0); - DeleteRenderbuffers = RESOLVE(DeleteRenderbuffers, ResolveOES | ResolveEXT); - DeleteShader = RESOLVE(DeleteShader, 0); - DetachShader = RESOLVE(DetachShader, 0); - DisableVertexAttribArray = RESOLVE(DisableVertexAttribArray, 0); - EnableVertexAttribArray = RESOLVE(EnableVertexAttribArray, 0); - FramebufferRenderbuffer = RESOLVE(FramebufferRenderbuffer, ResolveOES | ResolveEXT); - FramebufferTexture2D = RESOLVE(FramebufferTexture2D, ResolveOES | ResolveEXT); - GenBuffers = RESOLVE(GenBuffers, ResolveOES | ResolveEXT); - GenerateMipmap = RESOLVE(GenerateMipmap, ResolveOES | ResolveEXT); - GenFramebuffers = RESOLVE(GenFramebuffers, ResolveOES | ResolveEXT); - GenRenderbuffers = RESOLVE(GenRenderbuffers, ResolveOES | ResolveEXT); - GetActiveAttrib = RESOLVE(GetActiveAttrib, 0); - GetActiveUniform = RESOLVE(GetActiveUniform, 0); - GetAttachedShaders = RESOLVE(GetAttachedShaders, 0); - GetAttribLocation = RESOLVE(GetAttribLocation, 0); - GetBufferParameteriv = RESOLVE(GetBufferParameteriv, ResolveOES | ResolveEXT); - GetFramebufferAttachmentParameteriv = RESOLVE(GetFramebufferAttachmentParameteriv, ResolveOES | ResolveEXT); - GetProgramiv = RESOLVE(GetProgramiv, 0); - GetProgramInfoLog = RESOLVE(GetProgramInfoLog, 0); - GetRenderbufferParameteriv = RESOLVE(GetRenderbufferParameteriv, ResolveOES | ResolveEXT); - GetShaderiv = RESOLVE(GetShaderiv, 0); - GetShaderInfoLog = RESOLVE(GetShaderInfoLog, 0); - GetShaderPrecisionFormat = RESOLVE_WITH_FALLBACK(GetShaderPrecisionFormat, ResolveOES | ResolveEXT); - GetShaderSource = RESOLVE(GetShaderSource, 0); - GetUniformfv = RESOLVE(GetUniformfv, 0); - GetUniformiv = RESOLVE(GetUniformiv, 0); - GetUniformLocation = RESOLVE(GetUniformLocation, 0); - GetVertexAttribfv = RESOLVE(GetVertexAttribfv, 0); - GetVertexAttribiv = RESOLVE(GetVertexAttribiv, 0); - GetVertexAttribPointerv = RESOLVE(GetVertexAttribPointerv, 0); - IsBuffer = RESOLVE(IsBuffer, ResolveOES | ResolveEXT); - IsFramebuffer = RESOLVE(IsFramebuffer, ResolveOES | ResolveEXT); - IsProgram = RESOLVE_WITH_FALLBACK(IsProgram, 0); - IsRenderbuffer = RESOLVE(IsRenderbuffer, ResolveOES | ResolveEXT); - IsShader = RESOLVE_WITH_FALLBACK(IsShader, 0); - LinkProgram = RESOLVE(LinkProgram, 0); - ReleaseShaderCompiler = RESOLVE_WITH_FALLBACK(ReleaseShaderCompiler, 0); - RenderbufferStorage = RESOLVE(RenderbufferStorage, ResolveOES | ResolveEXT); - SampleCoverage = RESOLVE(SampleCoverage, ResolveOES | ResolveEXT); - ShaderBinary = RESOLVE(ShaderBinary, 0); - ShaderSource = RESOLVE(ShaderSource, 0); - StencilFuncSeparate = RESOLVE(StencilFuncSeparate, ResolveEXT); - StencilMaskSeparate = RESOLVE(StencilMaskSeparate, ResolveEXT); - StencilOpSeparate = RESOLVE(StencilOpSeparate, ResolveEXT); - Uniform1f = RESOLVE(Uniform1f, 0); - Uniform1fv = RESOLVE(Uniform1fv, 0); - Uniform1i = RESOLVE(Uniform1i, 0); - Uniform1iv = RESOLVE(Uniform1iv, 0); - Uniform2f = RESOLVE(Uniform2f, 0); - Uniform2fv = RESOLVE(Uniform2fv, 0); - Uniform2i = RESOLVE(Uniform2i, 0); - Uniform2iv = RESOLVE(Uniform2iv, 0); - Uniform3f = RESOLVE(Uniform3f, 0); - Uniform3fv = RESOLVE(Uniform3fv, 0); - Uniform3i = RESOLVE(Uniform3i, 0); - Uniform3iv = RESOLVE(Uniform3iv, 0); - Uniform4f = RESOLVE(Uniform4f, 0); - Uniform4fv = RESOLVE(Uniform4fv, 0); - Uniform4i = RESOLVE(Uniform4i, 0); - Uniform4iv = RESOLVE(Uniform4iv, 0); - UniformMatrix2fv = RESOLVE(UniformMatrix2fv, 0); - UniformMatrix3fv = RESOLVE(UniformMatrix3fv, 0); - UniformMatrix4fv = RESOLVE(UniformMatrix4fv, 0); - UseProgram = RESOLVE(UseProgram, 0); - ValidateProgram = RESOLVE(ValidateProgram, 0); - VertexAttrib1f = RESOLVE(VertexAttrib1f, 0); - VertexAttrib1fv = RESOLVE(VertexAttrib1fv, 0); - VertexAttrib2f = RESOLVE(VertexAttrib2f, 0); - VertexAttrib2fv = RESOLVE(VertexAttrib2fv, 0); - VertexAttrib3f = RESOLVE(VertexAttrib3f, 0); - VertexAttrib3fv = RESOLVE(VertexAttrib3fv, 0); - VertexAttrib4f = RESOLVE(VertexAttrib4f, 0); - VertexAttrib4fv = RESOLVE(VertexAttrib4fv, 0); - VertexAttribPointer = RESOLVE(VertexAttribPointer, 0); - - ClearDepth = RESOLVE(ClearDepth, 0); - DepthRange = RESOLVE(DepthRange, 0); -#endif // !QT_OPENGL_ES_2 } + +QT_OPENGL_IMPLEMENT_WITH_FLAGS(QOpenGLFunctionsPrivate, QT_OPENGL_FUNCTIONS) + /*! \class QOpenGLExtraFunctions \brief The QOpenGLExtraFunctions class provides cross-platform access to the OpenGL ES 3.0 and 3.1 API. |