Fix HDR format in QOpenGLFramebufferObject::toImage()

If the fbo had samples > 0 set, it would use a temporary fbo with
a default configuration losing the HDR precision.

Change-Id: I7e9966165b3100f148c4ad24738f3ee71273f29a
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
bb10
Allan Sandfeld Jensen 2018-05-30 15:51:32 +02:00 committed by Laszlo Agocs
parent afdb675ada
commit 8c33b79823
2 changed files with 23 additions and 2 deletions

View File

@ -1424,14 +1424,17 @@ QImage QOpenGLFramebufferObject::toImage(bool flipped, int colorAttachmentIndex)
// qt_gl_read_framebuffer doesn't work on a multisample FBO
if (format().samples() != 0) {
QRect rect(QPoint(0, 0), size());
QOpenGLFramebufferObjectFormat fmt;
if (extraFuncs->hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets)) {
QOpenGLFramebufferObject temp(d->colorAttachments[colorAttachmentIndex].size, QOpenGLFramebufferObjectFormat());
fmt.setInternalTextureFormat(d->colorAttachments[colorAttachmentIndex].internalFormat);
QOpenGLFramebufferObject temp(d->colorAttachments[colorAttachmentIndex].size, fmt);
blitFramebuffer(&temp, rect, const_cast<QOpenGLFramebufferObject *>(this), rect,
GL_COLOR_BUFFER_BIT, GL_NEAREST,
colorAttachmentIndex, 0);
image = temp.toImage(flipped);
} else {
QOpenGLFramebufferObject temp(size(), QOpenGLFramebufferObjectFormat());
fmt.setInternalTextureFormat(d->colorAttachments[0].internalFormat);
QOpenGLFramebufferObject temp(size(), fmt);
blitFramebuffer(&temp, rect, const_cast<QOpenGLFramebufferObject *>(this), rect);
image = temp.toImage(flipped);
}

View File

@ -39,6 +39,10 @@
#include <algorithm>
#ifndef GL_RGB10
#define GL_RGB10 0x8052
#endif
class tst_Lancelot : public QObject
{
Q_OBJECT
@ -85,6 +89,8 @@ private slots:
#ifndef QT_NO_OPENGL
void testOpenGL_data();
void testOpenGL();
void testOpenGLBGR30_data();
void testOpenGLBGR30();
void testCoreOpenGL_data();
void testCoreOpenGL();
private:
@ -279,6 +285,16 @@ void tst_Lancelot::testOpenGL()
runTestSuite(OpenGL, QImage::Format_RGB32);
}
void tst_Lancelot::testOpenGLBGR30_data()
{
tst_Lancelot::testOpenGL_data();
}
void tst_Lancelot::testOpenGLBGR30()
{
runTestSuite(OpenGL, QImage::Format_BGR30);
}
void tst_Lancelot::testCoreOpenGL_data()
{
if (!checkSystemCoreGLSupport())
@ -329,6 +345,8 @@ void tst_Lancelot::runTestSuite(GraphicsEngine engine, QImage::Format format, co
QOpenGLFramebufferObjectFormat fmt;
fmt.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
fmt.setSamples(4);
if (format == QImage::Format_BGR30)
fmt.setInternalTextureFormat(GL_RGB10);
QOpenGLContext ctx;
ctx.setFormat(contextFormat);
QVERIFY(ctx.create());