From 4d24fe8b30f5fce6fe377e1efb8ffab942530ffb Mon Sep 17 00:00:00 2001 From: Casian Andrei Date: Mon, 24 Jun 2013 23:41:00 +0300 Subject: [PATCH] Fix many color correction problems with OpenGL ES On GLES, check for OES_texture_3D extension for color correction Remove a block of ugly hack code that was supposedly needed to build with OpenGL ES. Convert the lookup texture data to uint8 on OpenGL ES before sending it via glTexImage3D, because uint16 is not supported. Check if the shaders have been reinitialized successfuly when trying to activate color correction, prevent black screens when there are issues with the shaders. BUG: 315419 REVIEW: 111225 (cherry picked from commit 68c68ee3c2b54f968c4d8275f1e8a2e0ccc90dd7) --- libkwineffects/kwinglcolorcorrection.cpp | 54 +++++++++++++----------- libkwineffects/kwinglutils_funcs.cpp | 9 ++++ libkwineffects/kwinglutils_funcs.h | 6 +++ 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/libkwineffects/kwinglcolorcorrection.cpp b/libkwineffects/kwinglcolorcorrection.cpp index 6e4f778ffe..a389cc67ff 100644 --- a/libkwineffects/kwinglcolorcorrection.cpp +++ b/libkwineffects/kwinglcolorcorrection.cpp @@ -34,27 +34,6 @@ along with this program. If not, see . #include #include -#ifdef KWIN_HAVE_OPENGLES -#define CC_TEXTURE_INTERNAL_FORMAT GL_RGB - -/* - * A bit of ugliness to allow building with OpenGL ES < 3, without - * ifdef's everywhere in the code. These should not actually be used anywhere. - */ -#ifndef GL_TEXTURE_3D -#define GL_TEXTURE_3D 0x806F // From OES_texture_3D extension -#define GL_TEXTURE_WRAP_R 0x8072 // From OES_texture_3D extension -void glTexImage3D(GLenum, int, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) -{ - Q_ASSERT(false); // Execution must not reach here -} -#endif // defined(GL_TEXTURE_3D) - -#else // KWIN_HAVE_OPENGLES -#define CC_TEXTURE_INTERNAL_FORMAT GL_RGB16 -#endif // KWIN_HAVE_OPENGLES - - namespace KWin { /* @@ -305,11 +284,14 @@ bool ColorCorrection::setEnabled(bool enabled) return false; } +#ifdef KWIN_HAVE_OPENGLES const GLPlatform *gl = GLPlatform::instance(); - if (enabled && gl->isGLES() && (gl->glVersion() >> 32) < 3) { - kError(1212) << "color correction is not supported with OpenGL ES < 3.0"; + if (enabled && gl->isGLES() && glTexImage3D == 0) { + kError(1212) << "color correction is not supported on OpenGL ES without OES_texture_3D"; + d->m_hasError = true; return false; } +#endif // KWIN_HAVE_OPENGLES if (enabled) { // Update all profiles and regions @@ -642,9 +624,22 @@ bool ColorCorrectionPrivate::setupCCTexture(GLuint texture, const Clut& clut) glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexImage3D(GL_TEXTURE_3D, 0, CC_TEXTURE_INTERNAL_FORMAT, +#ifndef KWIN_HAVE_OPENGLES + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16, LUT_GRID_POINTS, LUT_GRID_POINTS, LUT_GRID_POINTS, 0, GL_RGB, GL_UNSIGNED_SHORT, clut.data()); +#else + const int textureDataSize = clut.size(); + QVector textureData(textureDataSize); + quint8 *pTextureData = textureData.data(); + const quint16 *pClutData = clut.data(); + for (int i = 0; i < textureDataSize; ++i) + *(pTextureData++) = *(pClutData++) >> 8; + + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, + LUT_GRID_POINTS, LUT_GRID_POINTS, LUT_GRID_POINTS, + 0, GL_RGB, GL_UNSIGNED_BYTE, textureData.data()); +#endif // KWIN_HAVE_OPENGLES return !checkGLError("setupCCTexture"); } @@ -667,7 +662,16 @@ void ColorCorrectionPrivate::colorServerUpdateSucceededSlot() // Reload all shaders ShaderManager::cleanup(); - ShaderManager::instance(); + if (!ShaderManager::instance()->isValid()) { + kError(1212) << "Shader reinitialization failed, possible compile problems with the shaders " + "altered for color-correction"; + m_hasError = true; + kDebug(1212) << "Color correction has been disabled due to shader issues"; + m_enabled = false; + GLShader::sColorCorrect = false; + ShaderManager::cleanup(); + ShaderManager::instance(); + } } emit q->changed(); diff --git a/libkwineffects/kwinglutils_funcs.cpp b/libkwineffects/kwinglutils_funcs.cpp index da9ec2ea8d..cb5391e34c 100644 --- a/libkwineffects/kwinglutils_funcs.cpp +++ b/libkwineffects/kwinglutils_funcs.cpp @@ -268,6 +268,9 @@ glMapBuffer_func glMapBuffer; glUnmapBuffer_func glUnmapBuffer; glGetBufferPointerv_func glGetBufferPointerv; +// GL_OES_texture_3D +glTexImage3DOES_func glTexImage3D; + // GL_EXT_map_buffer_range glMapBufferRange_func glMapBufferRange; glFlushMappedBufferRange_func glFlushMappedBufferRange; @@ -731,6 +734,12 @@ void glResolveFunctions(OpenGLPlatformInterface platformInterface) glGetBufferPointerv = NULL; } + if (hasGLExtension("GL_OES_texture_3D")) { + glTexImage3D = (glTexImage3DOES_func)eglGetProcAddress("glTexImage3DOES"); + } else { + glTexImage3D = NULL; + } + if (hasGLExtension("GL_EXT_map_buffer_range")) { // See http://www.khronos.org/registry/gles/extensions/EXT/EXT_map_buffer_range.txt glMapBufferRange = (glMapBufferRange_func) eglGetProcAddress("glMapBufferRangeEXT"); diff --git a/libkwineffects/kwinglutils_funcs.h b/libkwineffects/kwinglutils_funcs.h index 7e79144ae2..d2248e52c5 100644 --- a/libkwineffects/kwinglutils_funcs.h +++ b/libkwineffects/kwinglutils_funcs.h @@ -538,6 +538,8 @@ extern KWIN_EXPORT glCopyBufferSubData_func glCopyBufferSubData; #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_WRAP_R 0x8072 #endif namespace KWin @@ -570,6 +572,10 @@ extern KWIN_EXPORT glMapBuffer_func glMapBuffer; extern KWIN_EXPORT glUnmapBuffer_func glUnmapBuffer; extern KWIN_EXPORT glGetBufferPointerv_func glGetBufferPointerv; +// GL_OES_texture_3D +typedef GLvoid(*glTexImage3DOES_func)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*); +extern KWIN_EXPORT glTexImage3DOES_func glTexImage3D; + // GL_EXT_map_buffer_range typedef GLvoid *(*glMapBufferRange_func)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (*glFlushMappedBufferRange_func)(GLenum target, GLintptr offset, GLsizeiptr length);