summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-10-03 09:50:19 +0200
committerLaszlo Agocs <laszlo.agocs@digia.com>2014-10-03 12:07:11 +0200
commit1a801e0eefc7064dbb8138e8b97e60e102fffb4a (patch)
tree99e8e21601f1b311dcdf7fd91ef15a3b21d83107
parent54814bbd8f0af5f5b83de46b75b80959c5805546 (diff)
Pass a sized format when creating multisampled renderbuffers on ES
Task-number: QTBUG-40921 Change-Id: I96b05442dd5928992dab06553b3d41feca89084d Reviewed-by: BogDan Vatra <bogdan@kde.org> Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-rw-r--r--src/gui/opengl/qopenglextensions_p.h3
-rw-r--r--src/gui/opengl/qopenglframebufferobject.cpp18
-rw-r--r--src/gui/opengl/qopenglfunctions.cpp12
3 files changed, 18 insertions, 15 deletions
diff --git a/src/gui/opengl/qopenglextensions_p.h b/src/gui/opengl/qopenglextensions_p.h
index 72e32e939e..23cfe16467 100644
--- a/src/gui/opengl/qopenglextensions_p.h
+++ b/src/gui/opengl/qopenglextensions_p.h
@@ -80,7 +80,8 @@ public:
SRGBFrameBuffer = 0x00020000,
MapBuffer = 0x00040000,
GeometryShaders = 0x00080000,
- MapBufferRange = 0x00100000
+ MapBufferRange = 0x00100000,
+ Sized8Formats = 0x00200000
};
Q_DECLARE_FLAGS(OpenGLExtensions, OpenGLExtension)
diff --git a/src/gui/opengl/qopenglframebufferobject.cpp b/src/gui/opengl/qopenglframebufferobject.cpp
index f33d4df280..b185e332e6 100644
--- a/src/gui/opengl/qopenglframebufferobject.cpp
+++ b/src/gui/opengl/qopenglframebufferobject.cpp
@@ -452,13 +452,7 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
if (!funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)
|| !funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit)) {
samples = 0;
- }
-
- // On GLES 2.0 multisampled framebuffers are available through vendor-specific extensions
- const bool msaaES2 = ctx->isOpenGLES() && (ctx->hasExtension("GL_ANGLE_framebuffer_multisample")
- || ctx->hasExtension("GL_NV_framebuffer_multisample"));
-
- if (!ctx->isOpenGLES() || msaaES2) {
+ } else if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
GLint maxSamples;
funcs.glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
samples = qBound(0, int(samples), int(maxSamples));
@@ -483,11 +477,15 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
initTexture(texture_target, internal_format, size, mipmap);
} else {
GLenum storageFormat = internal_format;
+ // ES requires a sized format. The older desktop extension does not. Correct the format on ES.
+ if (ctx->isOpenGLES() && internal_format == GL_RGBA) {
#ifdef GL_RGBA8_OES
- // Correct the internal format used by the render buffer when using ES with extensions
- if (msaaES2 && internal_format == GL_RGBA)
- storageFormat = GL_RGBA8_OES;
+ if (funcs.hasOpenGLExtension(QOpenGLExtensions::Sized8Formats))
+ storageFormat = GL_RGBA8_OES;
+ else
#endif
+ storageFormat = GL_RGBA4;
+ }
mipmap = false;
funcs.glGenRenderbuffers(1, &color_buffer);
diff --git a/src/gui/opengl/qopenglfunctions.cpp b/src/gui/opengl/qopenglfunctions.cpp
index 5ee72f54bf..44b56699df 100644
--- a/src/gui/opengl/qopenglfunctions.cpp
+++ b/src/gui/opengl/qopenglfunctions.cpp
@@ -385,7 +385,8 @@ static int qt_gl_resolve_extensions()
| QOpenGLExtensions::ElementIndexUint
| QOpenGLExtensions::MapBufferRange
| QOpenGLExtensions::FramebufferBlit
- | QOpenGLExtensions::FramebufferMultisample;
+ | QOpenGLExtensions::FramebufferMultisample
+ | QOpenGLExtensions::Sized8Formats;
} else {
// Recognize features by extension name.
if (extensionMatcher.match("GL_OES_packed_depth_stencil"))
@@ -400,6 +401,8 @@ static int qt_gl_resolve_extensions()
extensions |= QOpenGLExtensions::FramebufferBlit;
if (extensionMatcher.match("GL_NV_framebuffer_multisample"))
extensions |= QOpenGLExtensions::FramebufferMultisample;
+ if (extensionMatcher.match("GL_OES_rgb8_rgba8"))
+ extensions |= QOpenGLExtensions::Sized8Formats;
}
if (extensionMatcher.match("GL_OES_mapbuffer"))
@@ -419,9 +422,10 @@ static int qt_gl_resolve_extensions()
extensions |= QOpenGLExtensions::GenerateMipmap;
if (format.majorVersion() >= 3 || extensionMatcher.match("GL_ARB_framebuffer_object")) {
- extensions |= QOpenGLExtensions::FramebufferMultisample |
- QOpenGLExtensions::FramebufferBlit |
- QOpenGLExtensions::PackedDepthStencil;
+ extensions |= QOpenGLExtensions::FramebufferMultisample
+ | QOpenGLExtensions::FramebufferBlit
+ | QOpenGLExtensions::PackedDepthStencil
+ | QOpenGLExtensions::Sized8Formats;
} else {
// Recognize features by extension name.
if (extensionMatcher.match("GL_EXT_framebuffer_multisample"))