Changeset 846 for trunk/src/opengl/qglframebufferobject.cpp
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.7.2 (added) merged: 845 /branches/vendor/nokia/qt/current merged: 844 /branches/vendor/nokia/qt/4.6.3 removed
- Property svn:mergeinfo changed
-
trunk/src/opengl/qglframebufferobject.cpp
r769 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 45 45 #include <qdebug.h> 46 46 #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) 48 48 #include <private/qpaintengineex_opengl2_p.h> 49 49 #endif … … 56 56 #include <qlibrary.h> 57 57 #include <qimage.h> 58 59 #ifdef QT_OPENGL_ES_1_CL60 #include "qgl_cl_p.h"61 #endif62 58 63 59 QT_BEGIN_NAMESPACE … … 133 129 On OpenGL/ES systems, the default internal format is \c GL_RGBA. 134 130 135 \sa samples(), attachment(), target(),internalTextureFormat()131 \sa samples(), attachment(), internalTextureFormat() 136 132 */ 137 133 … … 450 446 glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSamples); 451 447 452 samples = qBound( 1, int(samples), int(maxSamples));448 samples = qBound(0, int(samples), int(maxSamples)); 453 449 454 450 glGenRenderbuffers(1, &color_buffer); 455 451 glBindRenderbuffer(GL_RENDERBUFFER_EXT, color_buffer); 456 if (glRenderbufferStorageMultisampleEXT ) {452 if (glRenderbufferStorageMultisampleEXT && samples > 0) { 457 453 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, 458 454 internal_format, size.width(), size.height()); … … 473 469 } 474 470 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 475 475 if (attachment == QGLFramebufferObject::CombinedDepthStencil 476 476 && (QGLExtensions::glExtensions() & QGLExtensions::PackedDepthStencil)) { 477 477 // 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)); 482 482 if (samples != 0 && glRenderbufferStorageMultisampleEXT) 483 483 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, … … 487 487 GL_DEPTH24_STENCIL8_EXT, size.width(), size.height()); 488 488 489 GLint i = 0; 490 glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_DEPTH_SIZE_EXT, &i); 489 stencil_buffer = depth_buffer; 491 490 glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, 492 GL_RENDERBUFFER_EXT, depth_ stencil_buffer);491 GL_RENDERBUFFER_EXT, depth_buffer); 493 492 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); 496 494 497 495 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))) 502 504 { 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)); 507 509 if (samples != 0 && glRenderbufferStorageMultisampleEXT) { 508 510 #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 } 512 518 #else 513 519 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, … … 516 522 } else { 517 523 #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 } 520 531 #else 521 532 glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, size.width(), size.height()); 522 533 #endif 523 534 } 524 GLint i = 0;525 glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_DEPTH_SIZE_EXT, &i);526 535 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) { 528 581 fbo_attachment = QGLFramebufferObject::Depth; 529 valid = checkFramebufferStatus();530 if (!valid)531 glDeleteRenderbuffers(1, &depth_stencil_buffer);532 582 } else { 533 583 fbo_attachment = QGLFramebufferObject::NoAttachment; … … 540 590 else 541 591 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); 542 596 glDeleteFramebuffers(1, &fbo); 543 597 fbo_guard.setId(0); … … 822 876 if (d->color_buffer) 823 877 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); 826 882 GLuint fbo = d->fbo(); 827 883 glDeleteFramebuffers(1, &fbo); … … 988 1044 } 989 1045 990 #if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)1046 #if !defined(QT_OPENGL_ES_1) 991 1047 Q_GLOBAL_STATIC(QGL2PaintEngineEx, qt_buffer_2_engine) 992 1048 #endif … … 1003 1059 return d->engine; 1004 1060 1005 #if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)1061 #if !defined(QT_OPENGL_ES_1) 1006 1062 #if !defined (QT_OPENGL_ES_2) 1007 1063 if (qt_gl_preferGL2Engine()) { … … 1029 1085 1030 1086 /*! 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 */ 1096 bool 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 /*! 1031 1117 \fn bool QGLFramebufferObject::hasOpenGLFramebufferObjects() 1032 1118 … … 1086 1172 #endif 1087 1173 1088 extern int qt_defaultDpiX();1089 extern int qt_defaultDpiY();1174 Q_DECL_IMPORT extern int qt_defaultDpiX(); 1175 Q_DECL_IMPORT extern int qt_defaultDpiY(); 1090 1176 1091 1177 /*! \reimp */
Note:
See TracChangeset
for help on using the changeset viewer.