From fc2805d2182d55dd7513088b6f4564ca5e225ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Thu, 29 Oct 2015 17:11:14 +0100 Subject: [PATCH] Turn compile time checks to runtime check in kwinglutils.cpp Only those which truly are different are kept as compile time checks. In addition the index buffer is made available to GLES as in principle all required functionality is available on gles. REVIEW: 125865 --- libkwineffects/kwinglutils.cpp | 89 ++++++++++++---------------------- 1 file changed, 32 insertions(+), 57 deletions(-) diff --git a/libkwineffects/kwinglutils.cpp b/libkwineffects/kwinglutils.cpp index 7604554331..b1842f4550 100644 --- a/libkwineffects/kwinglutils.cpp +++ b/libkwineffects/kwinglutils.cpp @@ -294,20 +294,16 @@ const QByteArray GLShader::prepareSource(GLenum shaderType, const QByteArray &so { // Prepare the source code QByteArray ba; -#ifdef KWIN_HAVE_OPENGLES - if (GLPlatform::instance()->glslVersion() < kVersionNumber(3, 0)) { + if (GLPlatform::instance()->isGLES() && GLPlatform::instance()->glslVersion() < kVersionNumber(3, 0)) { ba.append("precision highp float;\n"); } -#endif if (ShaderManager::instance()->isShaderDebug()) { ba.append("#define KWIN_SHADER_DEBUG 1\n"); } ba.append(source); -#ifdef KWIN_HAVE_OPENGLES - if (GLPlatform::instance()->glslVersion() >= kVersionNumber(3, 0)) { + if (GLPlatform::instance()->isGLES() && GLPlatform::instance()->glslVersion() >= kVersionNumber(3, 0)) { ba.replace("#version 140", "#version 300 es\n\nprecision highp float;\n"); } -#endif // Inject color correction code for fragment shaders, if possible if (shaderType == GL_FRAGMENT_SHADER && sColorCorrect) @@ -353,13 +349,11 @@ bool GLShader::compile(GLuint program, GLenum shaderType, const QByteArray &sour bool GLShader::load(const QByteArray &vertexSource, const QByteArray &fragmentSource) { -#ifndef KWIN_HAVE_OPENGLES // Make sure shaders are actually supported if (!GLPlatform::instance()->supports(GLSL) || GLPlatform::instance()->supports(LimitedNPOT)) { qCCritical(LIBKWINGLUTILS) << "Shaders are not supported"; return false; } -#endif mValid = false; @@ -1192,11 +1186,7 @@ void ShaderManager::initShaders() "scene-color-fragment.glsl", }; -#ifdef KWIN_HAVE_OPENGLES - const qint64 coreVersionNumber = kVersionNumber(3, 0); -#else - const qint64 coreVersionNumber = kVersionNumber(1, 40); -#endif + const qint64 coreVersionNumber = GLPlatform::instance()->isGLES() ? kVersionNumber(3, 0) : kVersionNumber(1, 40); if (GLPlatform::instance()->glslVersion() >= coreVersionNumber) m_shaderDir = ":/resources/shaders/1.40/"; else @@ -1292,18 +1282,18 @@ QSize GLRenderTarget::s_virtualScreenSize; void GLRenderTarget::initStatic() { -#ifdef KWIN_HAVE_OPENGLES - sSupported = true; - s_blitSupported = hasGLVersion(3, 0); -#else - sSupported = hasGLVersion(3, 0) || - hasGLExtension(QByteArrayLiteral("GL_ARB_framebuffer_object")) || - hasGLExtension(QByteArrayLiteral("GL_EXT_framebuffer_object")); + if (GLPlatform::instance()->isGLES()) { + sSupported = true; + s_blitSupported = hasGLVersion(3, 0); + } else { + sSupported = hasGLVersion(3, 0) || + hasGLExtension(QByteArrayLiteral("GL_ARB_framebuffer_object")) || + hasGLExtension(QByteArrayLiteral("GL_EXT_framebuffer_object")); - s_blitSupported = hasGLVersion(3, 0) || - hasGLExtension(QByteArrayLiteral("GL_ARB_framebuffer_object")) || - hasGLExtension(QByteArrayLiteral("GL_EXT_framebuffer_blit")); -#endif + s_blitSupported = hasGLVersion(3, 0) || + hasGLExtension(QByteArrayLiteral("GL_ARB_framebuffer_object")) || + hasGLExtension(QByteArrayLiteral("GL_EXT_framebuffer_blit")); + } } void GLRenderTarget::cleanup() @@ -1516,9 +1506,6 @@ void GLRenderTarget::attachTexture(const GLTexture& target) // ------------------------------------------------------------------ - -#ifndef KWIN_HAVE_OPENGLES - static const uint16_t indices[] = { 1, 0, 3, 3, 2, 1, 5, 4, 7, 7, 6, 5, 9, 8, 11, 11, 10, 9, 13, 12, 15, 15, 14, 13, 17, 16, 19, 19, 18, 17, 21, 20, 23, 23, 22, 21, @@ -1693,18 +1680,12 @@ static const uint16_t indices[] = { 2041, 2040, 2043, 2043, 2042, 2041, 2045, 2044, 2047, 2047, 2046, 2045 }; -#endif // KWIN_HAVE_OPENGLES - template T align(T value, int bytes) { return (value + bytes - 1) & ~T(bytes - 1); } -#ifndef KWIN_HAVE_OPENGLES - -// This class is not be used with OpenGL ES for now, since we need -// GL_ARB_draw_elements_base_vertex and GL_ARB_copy_buffer. class IndexBuffer { public: @@ -1779,8 +1760,6 @@ void IndexBuffer::bind() glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffer); } -#endif // KWIN_HAVE_OPENGLES - // ------------------------------------------------------------------ @@ -1995,9 +1974,7 @@ public: FrameSizesArray<4> frameSizes; VertexAttrib attrib[VertexAttributeCount]; Bitfield enabledArrays; -#ifndef KWIN_HAVE_OPENGLES static IndexBuffer *s_indexBuffer; -#endif }; bool GLVertexBufferPrivate::hasMapBufferRange = false; @@ -2005,9 +1982,7 @@ bool GLVertexBufferPrivate::supportsIndexedQuads = false; GLVertexBuffer *GLVertexBufferPrivate::streamingBuffer = nullptr; bool GLVertexBufferPrivate::haveBufferStorage = false; bool GLVertexBufferPrivate::haveSyncFences = false; -#ifndef KWIN_HAVE_OPENGLES IndexBuffer *GLVertexBufferPrivate::s_indexBuffer = nullptr; -#endif void GLVertexBufferPrivate::interleaveArrays(float *dst, int dim, const float *vertices, const float *texcoords, @@ -2356,7 +2331,6 @@ void GLVertexBuffer::draw(GLenum primitiveMode, int first, int count) void GLVertexBuffer::draw(const QRegion ®ion, GLenum primitiveMode, int first, int count, bool hardwareClipping) { -#ifndef KWIN_HAVE_OPENGLES if (primitiveMode == GL_QUADS) { IndexBuffer *&indexBuffer = GLVertexBufferPrivate::s_indexBuffer; @@ -2379,7 +2353,6 @@ void GLVertexBuffer::draw(const QRegion ®ion, GLenum primitiveMode, int first } return; } -#endif if (!hardwareClipping) { glDrawArrays(primitiveMode, first, count); @@ -2467,22 +2440,26 @@ void GLVertexBuffer::framePosted() void GLVertexBuffer::initStatic() { -#ifdef KWIN_HAVE_OPENGLES - GLVertexBufferPrivate::hasMapBufferRange = hasGLExtension(QByteArrayLiteral("GL_EXT_map_buffer_range")); - GLVertexBufferPrivate::supportsIndexedQuads = false; - GLVertexBufferPrivate::haveBufferStorage = false; - GLVertexBufferPrivate::haveSyncFences = false; -#else - bool haveBaseVertex = hasGLVersion(3, 2) || hasGLExtension(QByteArrayLiteral("GL_ARB_draw_elements_base_vertex")); - bool haveCopyBuffer = hasGLVersion(3, 1) || hasGLExtension(QByteArrayLiteral("GL_ARB_copy_buffer")); - bool haveMapBufferRange = hasGLVersion(3, 0) || hasGLExtension(QByteArrayLiteral("GL_ARB_map_buffer_range")); + if (GLPlatform::instance()->isGLES()) { + bool haveBaseVertex = hasGLExtension(QByteArrayLiteral("GL_OES_draw_elements_base_vertex")); + bool haveCopyBuffer = hasGLVersion(3, 0); + bool haveMapBufferRange = hasGLExtension(QByteArrayLiteral("GL_EXT_map_buffer_range")); - GLVertexBufferPrivate::hasMapBufferRange = haveMapBufferRange; - GLVertexBufferPrivate::supportsIndexedQuads = haveBaseVertex && haveCopyBuffer && haveMapBufferRange; + GLVertexBufferPrivate::hasMapBufferRange = haveMapBufferRange; + GLVertexBufferPrivate::supportsIndexedQuads = haveBaseVertex && haveCopyBuffer && haveMapBufferRange; + GLVertexBufferPrivate::haveBufferStorage = hasGLExtension("GL_EXT_buffer_storage"); + GLVertexBufferPrivate::haveSyncFences = hasGLVersion(3, 0); + } else { + bool haveBaseVertex = hasGLVersion(3, 2) || hasGLExtension(QByteArrayLiteral("GL_ARB_draw_elements_base_vertex")); + bool haveCopyBuffer = hasGLVersion(3, 1) || hasGLExtension(QByteArrayLiteral("GL_ARB_copy_buffer")); + bool haveMapBufferRange = hasGLVersion(3, 0) || hasGLExtension(QByteArrayLiteral("GL_ARB_map_buffer_range")); + + GLVertexBufferPrivate::hasMapBufferRange = haveMapBufferRange; + GLVertexBufferPrivate::supportsIndexedQuads = haveBaseVertex && haveCopyBuffer && haveMapBufferRange; + GLVertexBufferPrivate::haveBufferStorage = hasGLVersion(4, 4) || hasGLExtension("GL_ARB_buffer_storage"); + GLVertexBufferPrivate::haveSyncFences = hasGLVersion(3, 2) || hasGLExtension("GL_ARB_sync"); + } GLVertexBufferPrivate::s_indexBuffer = nullptr; - GLVertexBufferPrivate::haveBufferStorage = hasGLVersion(4, 4) || hasGLExtension("GL_ARB_buffer_storage"); - GLVertexBufferPrivate::haveSyncFences = hasGLVersion(3, 2) || hasGLExtension("GL_ARB_sync"); -#endif GLVertexBufferPrivate::streamingBuffer = new GLVertexBuffer(GLVertexBuffer::Stream); if (GLVertexBufferPrivate::haveBufferStorage && GLVertexBufferPrivate::haveSyncFences) { @@ -2494,10 +2471,8 @@ void GLVertexBuffer::initStatic() void GLVertexBuffer::cleanup() { -#ifndef KWIN_HAVE_OPENGLES delete GLVertexBufferPrivate::s_indexBuffer; GLVertexBufferPrivate::s_indexBuffer = nullptr; -#endif GLVertexBufferPrivate::hasMapBufferRange = false; GLVertexBufferPrivate::supportsIndexedQuads = false; delete GLVertexBufferPrivate::streamingBuffer;