Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/opengl/qglframebufferobject.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4545#include <qdebug.h>
    4646#include <private/qgl_p.h>
    47 #if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
     47#if !defined(QT_OPENGL_ES_1)
    4848#include <private/qpaintengineex_opengl2_p.h>
    4949#endif
     
    5656#include <qlibrary.h>
    5757#include <qimage.h>
    58 
    59 #ifdef QT_OPENGL_ES_1_CL
    60 #include "qgl_cl_p.h"
    61 #endif
    6258
    6359QT_BEGIN_NAMESPACE
     
    133129    On OpenGL/ES systems, the default internal format is \c GL_RGBA.
    134130
    135     \sa samples(), attachment(), target(), internalTextureFormat()
     131    \sa samples(), attachment(), internalTextureFormat()
    136132*/
    137133
     
    450446        glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSamples);
    451447
    452         samples = qBound(1, int(samples), int(maxSamples));
     448        samples = qBound(0, int(samples), int(maxSamples));
    453449
    454450        glGenRenderbuffers(1, &color_buffer);
    455451        glBindRenderbuffer(GL_RENDERBUFFER_EXT, color_buffer);
    456         if (glRenderbufferStorageMultisampleEXT) {
     452        if (glRenderbufferStorageMultisampleEXT && samples > 0) {
    457453            glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples,
    458454                internal_format, size.width(), size.height());
     
    473469    }
    474470
     471    // In practice, a combined depth-stencil buffer is supported by all desktop platforms, while a
     472    // separate stencil buffer is not. On embedded devices however, a combined depth-stencil buffer
     473    // might not be supported while separate buffers are, according to QTBUG-12861.
     474
    475475    if (attachment == QGLFramebufferObject::CombinedDepthStencil
    476476        && (QGLExtensions::glExtensions() & QGLExtensions::PackedDepthStencil)) {
    477477        // depth and stencil buffer needs another extension
    478         glGenRenderbuffers(1, &depth_stencil_buffer);
    479         Q_ASSERT(!glIsRenderbuffer(depth_stencil_buffer));
    480         glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_stencil_buffer);
    481         Q_ASSERT(glIsRenderbuffer(depth_stencil_buffer));
     478        glGenRenderbuffers(1, &depth_buffer);
     479        Q_ASSERT(!glIsRenderbuffer(depth_buffer));
     480        glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_buffer);
     481        Q_ASSERT(glIsRenderbuffer(depth_buffer));
    482482        if (samples != 0 && glRenderbufferStorageMultisampleEXT)
    483483            glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples,
     
    487487                GL_DEPTH24_STENCIL8_EXT, size.width(), size.height());
    488488
    489         GLint i = 0;
    490         glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_DEPTH_SIZE_EXT, &i);
     489        stencil_buffer = depth_buffer;
    491490        glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
    492                                      GL_RENDERBUFFER_EXT, depth_stencil_buffer);
     491                                     GL_RENDERBUFFER_EXT, depth_buffer);
    493492        glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
    494                                      GL_RENDERBUFFER_EXT, depth_stencil_buffer);
    495         fbo_attachment = QGLFramebufferObject::CombinedDepthStencil;
     493                                     GL_RENDERBUFFER_EXT, stencil_buffer);
    496494
    497495        valid = checkFramebufferStatus();
    498         if (!valid)
    499             glDeleteRenderbuffers(1, &depth_stencil_buffer);
    500     } else if (attachment == QGLFramebufferObject::Depth
    501                || attachment == QGLFramebufferObject::CombinedDepthStencil)
     496        if (!valid) {
     497            glDeleteRenderbuffers(1, &depth_buffer);
     498            stencil_buffer = depth_buffer = 0;
     499        }
     500    }
     501
     502    if (depth_buffer == 0 && (attachment == QGLFramebufferObject::CombinedDepthStencil
     503        || (attachment == QGLFramebufferObject::Depth)))
    502504    {
    503         glGenRenderbuffers(1, &depth_stencil_buffer);
    504         Q_ASSERT(!glIsRenderbuffer(depth_stencil_buffer));
    505         glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_stencil_buffer);
    506         Q_ASSERT(glIsRenderbuffer(depth_stencil_buffer));
     505        glGenRenderbuffers(1, &depth_buffer);
     506        Q_ASSERT(!glIsRenderbuffer(depth_buffer));
     507        glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_buffer);
     508        Q_ASSERT(glIsRenderbuffer(depth_buffer));
    507509        if (samples != 0 && glRenderbufferStorageMultisampleEXT) {
    508510#ifdef QT_OPENGL_ES
    509 #define GL_DEPTH_COMPONENT16 0x81A5
    510             glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples,
    511                 GL_DEPTH_COMPONENT16, size.width(), size.height());
     511            if (QGLExtensions::glExtensions() & QGLExtensions::Depth24) {
     512                glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples,
     513                    GL_DEPTH_COMPONENT24_OES, size.width(), size.height());
     514            } else {
     515                glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples,
     516                    GL_DEPTH_COMPONENT16, size.width(), size.height());
     517            }
    512518#else
    513519            glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples,
     
    516522        } else {
    517523#ifdef QT_OPENGL_ES
    518 #define GL_DEPTH_COMPONENT16 0x81A5
    519             glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16, size.width(), size.height());
     524            if (QGLExtensions::glExtensions() & QGLExtensions::Depth24) {
     525                glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24_OES,
     526                                        size.width(), size.height());
     527            } else {
     528                glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16,
     529                                        size.width(), size.height());
     530            }
    520531#else
    521532            glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, size.width(), size.height());
    522533#endif
    523534        }
    524         GLint i = 0;
    525         glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_DEPTH_SIZE_EXT, &i);
    526535        glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
    527                                      GL_RENDERBUFFER_EXT, depth_stencil_buffer);
     536                                     GL_RENDERBUFFER_EXT, depth_buffer);
     537        valid = checkFramebufferStatus();
     538        if (!valid) {
     539            glDeleteRenderbuffers(1, &depth_buffer);
     540            depth_buffer = 0;
     541        }
     542    }
     543
     544    if (stencil_buffer == 0 && (attachment == QGLFramebufferObject::CombinedDepthStencil)) {
     545        glGenRenderbuffers(1, &stencil_buffer);
     546        Q_ASSERT(!glIsRenderbuffer(stencil_buffer));
     547        glBindRenderbuffer(GL_RENDERBUFFER_EXT, stencil_buffer);
     548        Q_ASSERT(glIsRenderbuffer(stencil_buffer));
     549        if (samples != 0 && glRenderbufferStorageMultisampleEXT) {
     550#ifdef QT_OPENGL_ES
     551            glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples,
     552                GL_STENCIL_INDEX8_EXT, size.width(), size.height());
     553#else
     554            glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples,
     555                GL_STENCIL_INDEX, size.width(), size.height());
     556#endif
     557        } else {
     558#ifdef QT_OPENGL_ES
     559            glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX8_EXT,
     560                                  size.width(), size.height());
     561#else
     562            glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX,
     563                                  size.width(), size.height());
     564#endif
     565        }
     566        glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
     567                                  GL_RENDERBUFFER_EXT, stencil_buffer);
     568        valid = checkFramebufferStatus();
     569        if (!valid) {
     570            glDeleteRenderbuffers(1, &stencil_buffer);
     571            stencil_buffer = 0;
     572        }
     573    }
     574
     575    // The FBO might have become valid after removing the depth or stencil buffer.
     576    valid = checkFramebufferStatus();
     577
     578    if (depth_buffer && stencil_buffer) {
     579        fbo_attachment = QGLFramebufferObject::CombinedDepthStencil;
     580    } else if (depth_buffer) {
    528581        fbo_attachment = QGLFramebufferObject::Depth;
    529         valid = checkFramebufferStatus();
    530         if (!valid)
    531             glDeleteRenderbuffers(1, &depth_stencil_buffer);
    532582    } else {
    533583        fbo_attachment = QGLFramebufferObject::NoAttachment;
     
    540590        else
    541591            glDeleteTextures(1, &texture);
     592        if (depth_buffer)
     593            glDeleteRenderbuffers(1, &depth_buffer);
     594        if (stencil_buffer && depth_buffer != stencil_buffer)
     595            glDeleteRenderbuffers(1, &stencil_buffer);
    542596        glDeleteFramebuffers(1, &fbo);
    543597        fbo_guard.setId(0);
     
    822876        if (d->color_buffer)
    823877            glDeleteRenderbuffers(1, &d->color_buffer);
    824         if (d->depth_stencil_buffer)
    825             glDeleteRenderbuffers(1, &d->depth_stencil_buffer);
     878        if (d->depth_buffer)
     879            glDeleteRenderbuffers(1, &d->depth_buffer);
     880        if (d->stencil_buffer && d->stencil_buffer != d->depth_buffer)
     881            glDeleteRenderbuffers(1, &d->stencil_buffer);
    826882        GLuint fbo = d->fbo();
    827883        glDeleteFramebuffers(1, &fbo);
     
    9881044}
    9891045
    990 #if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
     1046#if !defined(QT_OPENGL_ES_1)
    9911047Q_GLOBAL_STATIC(QGL2PaintEngineEx, qt_buffer_2_engine)
    9921048#endif
     
    10031059        return d->engine;
    10041060
    1005 #if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
     1061#if !defined(QT_OPENGL_ES_1)
    10061062#if !defined (QT_OPENGL_ES_2)
    10071063    if (qt_gl_preferGL2Engine()) {
     
    10291085
    10301086/*!
     1087    \fn bool QGLFramebufferObject::bindDefault()
     1088    \internal
     1089
     1090    Switches rendering back to the default, windowing system provided
     1091    framebuffer.
     1092    Returns true upon success, false otherwise.
     1093
     1094    \sa bind(), release()
     1095*/
     1096bool QGLFramebufferObject::bindDefault()
     1097{
     1098    QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
     1099
     1100    if (ctx) {
     1101        bool ext_detected = (QGLExtensions::glExtensions() & QGLExtensions::FramebufferObject);
     1102        if (!ext_detected || (ext_detected && !qt_resolve_framebufferobject_extensions(ctx)))
     1103            return false;
     1104
     1105        ctx->d_ptr->current_fbo = ctx->d_ptr->default_fbo;
     1106        glBindFramebuffer(GL_FRAMEBUFFER_EXT, ctx->d_ptr->default_fbo);
     1107#ifdef QT_DEBUG
     1108    } else {
     1109        qWarning("QGLFramebufferObject::bindDefault() called without current context.");
     1110#endif
     1111    }
     1112
     1113    return ctx != 0;
     1114}
     1115
     1116/*!
    10311117    \fn bool QGLFramebufferObject::hasOpenGLFramebufferObjects()
    10321118
     
    10861172#endif
    10871173
    1088 extern int qt_defaultDpiX();
    1089 extern int qt_defaultDpiY();
     1174Q_DECL_IMPORT extern int qt_defaultDpiX();
     1175Q_DECL_IMPORT extern int qt_defaultDpiY();
    10901176
    10911177/*! \reimp */
Note: See TracChangeset for help on using the changeset viewer.