Skip to content

Commit

Permalink
QOpenGLFramebufferObject: Avoid illegal call to glTexImage2D
Browse files Browse the repository at this point in the history
According to the documentation:
GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is not one of those in the tables above.
https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml

We were allowing the RGB values be passed as RGBA, after this change we
don't do so anymore.
This would result for KWin in:
Mesa: User error: GL_INVALID_OPERATION in glTexImage2D(format = GL_RGBA, type = GL_UNSIGNED_BYTE, internalformat = GL_RGB8)

Pick-to: 6.5 6.6 6.7
Change-Id: Ifde8a570eff01be573f780655d8cedbb96f5ba2b
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
  • Loading branch information
aleixpol committed Jan 31, 2024
1 parent 23d2aaa commit ba9e57d
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions src/opengl/qopenglframebufferobject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -550,8 +550,20 @@ void QOpenGLFramebufferObjectPrivate::initTexture(int idx)
else if (color.internalFormat == GL_RGB16F || color.internalFormat == GL_RGBA16F)
pixelType = GL_HALF_FLOAT;

bool isOpaque = false;
switch (color.internalFormat) {
case GL_RGB8:
case GL_RGB10:
case GL_RGB16:
case GL_RGB16F:
case GL_RGB32F:
isOpaque = true;
break;
}
const GLuint textureFormat = isOpaque ? GL_RGB : GL_RGBA;

funcs.glTexImage2D(target, 0, color.internalFormat, color.size.width(), color.size.height(), 0,
GL_RGBA, pixelType, nullptr);
textureFormat, pixelType, nullptr);
if (format.mipmap()) {
int width = color.size.width();
int height = color.size.height();
Expand All @@ -560,8 +572,8 @@ void QOpenGLFramebufferObjectPrivate::initTexture(int idx)
width = qMax(1, width >> 1);
height = qMax(1, height >> 1);
++level;
funcs.glTexImage2D(target, level, color.internalFormat, width, height, 0,
GL_RGBA, pixelType, nullptr);
funcs.glTexImage2D(target, level, color.internalFormat, width, height, 0, textureFormat,
pixelType, nullptr);
}
}
funcs.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + idx,
Expand Down

0 comments on commit ba9e57d

Please sign in to comment.