diff options
author | Christopher Ham <christopher.ham@nokia.com> | 2012-01-19 13:39:53 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-19 09:40:53 +0100 |
commit | 526d51a3b1e0dd7109ec01df5dcbdfd3782cea80 (patch) | |
tree | b75106bc0a312f72856fffe8c20a5326c78e86a1 | |
parent | b164194dc0609e8c64b90148f7a541c3f68aa532 (diff) |
Fix for QTBUG-22693
This fix stops the stack from being unitentionally cleared. It also
ensures that a bound texture has a defined context.
Task-number: QTBUG-22693
Change-Id: I9f5f8d91849a8e63f04094f5fba6c47d9941a67d
Reviewed-by: Alex Wilson <alex.wilson@nokia.com>
-rw-r--r-- | src/imports/threed/viewport.cpp | 3 | ||||
-rw-r--r-- | src/threed/textures/qgltexture2d.cpp | 10 | ||||
-rw-r--r-- | src/threed/textures/qgltexture2d_p.h | 13 | ||||
-rw-r--r-- | src/threed/textures/qgltextureutils.cpp | 48 | ||||
-rw-r--r-- | src/threed/textures/qgltextureutils_p.h | 22 | ||||
-rw-r--r-- | src/threed/textures/textures.pri | 4 |
6 files changed, 48 insertions, 52 deletions
diff --git a/src/imports/threed/viewport.cpp b/src/imports/threed/viewport.cpp index cfa9c6bc1..9c062f1e7 100644 --- a/src/imports/threed/viewport.cpp +++ b/src/imports/threed/viewport.cpp @@ -885,8 +885,7 @@ void Viewport::render(QGLPainter *painter) // boundingRect is in local coordinates. We need to map it to the scene coordinates // in order to render to correct area. QRect viewport = mapRectToScene(boundingRect()).toRect(); - qreal adjust = 1.0f; - ViewportSubsurface surface(painter->currentSurface(), viewport, adjust); + QGLSubsurface surface (painter->currentSurface(), viewport); painter->pushSurface(&surface); // Perform early drawing operations. diff --git a/src/threed/textures/qgltexture2d.cpp b/src/threed/textures/qgltexture2d.cpp index 81022296c..bdfc63171 100644 --- a/src/threed/textures/qgltexture2d.cpp +++ b/src/threed/textures/qgltexture2d.cpp @@ -41,7 +41,6 @@ #include "qgltexture2d.h" #include "qgltexture2d_p.h" -#include "qgltextureutils_p.h" #include "qglpainter_p.h" #include "qglext_p.h" @@ -613,8 +612,8 @@ bool QGLTexture2DPrivate::bind(GLenum target) if (ctx) { - QGLPainter painter(ctx); - if (!painter.hasOpenGLFeature(QOpenGLFunctions::NPOTTextures)) + QOpenGLFunctions functions(ctx); + if (!functions.hasOpenGLFeature(QOpenGLFunctions::NPOTTextures)) { QSize oldSize = size; size = QGL::nextPowerOfTwo(size); @@ -648,9 +647,10 @@ bool QGLTexture2DPrivate::bind(GLenum target) prev = info; info = info->next; } - } else { + } + if (!info) { info = new QGLTexture2DTextureInfo - (ctx, 0, imageGeneration - 1, parameterGeneration - 1); + (0, 0, imageGeneration - 1, parameterGeneration - 1); if (prev) prev->next = info; else diff --git a/src/threed/textures/qgltexture2d_p.h b/src/threed/textures/qgltexture2d_p.h index c7b7a4397..74bea3f56 100644 --- a/src/threed/textures/qgltexture2d_p.h +++ b/src/threed/textures/qgltexture2d_p.h @@ -56,6 +56,7 @@ #include "qgltexture2d.h" #include "qgltextureutils_p.h" #include "qurl.h" +#include <QDebug> #include <QAtomicInt> #include <QImage> @@ -66,15 +67,15 @@ class QGLTexture2DTextureInfo { public: QGLTexture2DTextureInfo - (QOpenGLContext *context, GLuint textureId, uint imageGeneration, - uint parameterGeneration, bool isLiteral = false) + (QOpenGLContext *context, GLuint textureId, uint _imageGeneration, + uint _parameterGeneration, bool _isLiteral = false) + : imageGeneration(_imageGeneration) + , parameterGeneration(_parameterGeneration) + , isLiteral(_isLiteral) + , next(0) { if (textureId) tex.setTextureId(context, textureId); - this->imageGeneration = imageGeneration; - this->parameterGeneration = parameterGeneration; - this->isLiteral = isLiteral; - this->next = 0; } QGLBoundTexture tex; diff --git a/src/threed/textures/qgltextureutils.cpp b/src/threed/textures/qgltextureutils.cpp index ffc11c123..22eac8ca3 100644 --- a/src/threed/textures/qgltextureutils.cpp +++ b/src/threed/textures/qgltextureutils.cpp @@ -54,8 +54,7 @@ inline static bool isPowerOfTwo(int x) } QGLTextureExtensions::QGLTextureExtensions(QOpenGLContext *ctx) - : QOpenGLSharedResource(ctx->shareGroup()) - , npotTextures(false) + : npotTextures(false) , generateMipmap(false) , bgraTextureFormat(false) , ddsTextureCompression(false) @@ -95,6 +94,7 @@ QGLTextureExtensions::QGLTextureExtensions(QOpenGLContext *ctx) struct QGLTEHelper { QGLTextureExtensions *d; +// QGLTEHelper():d(0){qWarning("INITIALISE");} }; Q_GLOBAL_STATIC(QGLTEHelper, qt_qgltehelper) @@ -119,9 +119,10 @@ static void qt_gl_destroyTextureId(GLuint id) } QGLBoundTexture::QGLBoundTexture() - : m_resource(qt_gl_destroyTextureId) - , m_options(QGLTexture2D::DefaultBindOption) + : m_options(QGLTexture2D::DefaultBindOption) , m_hasAlpha(false) + , m_context(0) + , m_resourceId(0) { } @@ -129,7 +130,7 @@ QGLBoundTexture::~QGLBoundTexture() { } -// #define QGL_BIND_TEXTURE_DEBUG +//#define QGL_BIND_TEXTURE_DEBUG void QGLBoundTexture::startUpload(QOpenGLContext *ctx, GLenum target, const QSize &imageSize) { @@ -152,15 +153,14 @@ void QGLBoundTexture::startUpload(QOpenGLContext *ctx, GLenum target, const QSiz // Create the texture id for the target, which should be one of // GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP. - GLuint id = m_resource.id(); - if (id) { + if (m_resourceId) { glBindTexture(target, 0); // Just in case texture is bound. - m_resource.destroy(); + glDeleteTextures(1, &m_resourceId); } - id = 0; - glGenTextures(1, &id); - glBindTexture(target, id); - m_resource.attach(ctx, id); + m_resourceId = 0; + glGenTextures(1, &m_resourceId); + glBindTexture(target, m_resourceId); + m_context = ctx; GLuint filtering = m_options & QGLTexture2D::LinearFilteringBindOption ? GL_LINEAR : GL_NEAREST; @@ -588,17 +588,15 @@ bool QGLBoundTexture::bindCompressedTextureDDS(const char *buf, int len) const GLubyte *pixels = reinterpret_cast<const GLubyte *>(buf + ddsHeader->dwSize + 4); - GLuint id = m_resource.id(); - if (id) { + if (m_resourceId) { glBindTexture(GL_TEXTURE_2D, 0); // Just in case it is bound. - m_resource.destroy(); + glDeleteTextures(1, &m_resourceId); } - id = 0; - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); q_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); q_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - m_resource.attach(QOpenGLContext::currentContext(), id); + m_resourceId = 0; + glGenTextures(1, &m_resourceId); + glBindTexture(GL_TEXTURE_2D, m_resourceId); int size; int offset = 0; @@ -694,15 +692,13 @@ bool QGLBoundTexture::bindCompressedTexturePVR(const char *buf, int len) // Create the texture. glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - GLuint id = m_resource.id(); - if (id) { + if (m_resourceId) { glBindTexture(GL_TEXTURE_2D, 0); // Just in case it is bound. - m_resource.destroy(); + glDeleteTextures(1, &m_resourceId); } - id = 0; - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); - m_resource.attach(QOpenGLContext::currentContext(), id); + m_resourceId = 0; + glGenTextures(1, &m_resourceId); + glBindTexture(GL_TEXTURE_2D, m_resourceId); if (pvrHeader->mipMapCount) { if ((m_options & QGLTexture2D::LinearFilteringBindOption) != 0) { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); diff --git a/src/threed/textures/qgltextureutils_p.h b/src/threed/textures/qgltextureutils_p.h index 962ba52a2..fa819646b 100644 --- a/src/threed/textures/qgltextureutils_p.h +++ b/src/threed/textures/qgltextureutils_p.h @@ -59,7 +59,6 @@ #include "qglnamespace.h" #include "qopenglfunctions.h" -#include "qglsharedresource_p.h" #include "qgltexture2d.h" #include <private/qopenglcontext_p.h> @@ -101,7 +100,7 @@ QT_BEGIN_NAMESPACE typedef void (QOPENGLF_APIENTRYP q_glCompressedTexImage2DARB) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -class QGLTextureExtensions : public QOpenGLSharedResource +class QGLTextureExtensions { public: QGLTextureExtensions(QOpenGLContext *ctx); @@ -116,10 +115,6 @@ public: q_glCompressedTexImage2DARB compressedTexImage2D; static QGLTextureExtensions *extensions(); - - void invalidateResource() {} - void freeResource(QOpenGLContext *) {} - }; class QGLBoundTexture @@ -128,12 +123,16 @@ public: QGLBoundTexture(); ~QGLBoundTexture(); - const QOpenGLContext *context() const { return m_resource.context(); } + QOpenGLContext *context() const { + return m_context; + } - GLuint textureId() const { return m_resource.id(); } + GLuint textureId() const { return m_resourceId; } void setTextureId(QOpenGLContext *ctx, GLuint id) - { m_resource.attach(ctx, id); } - void clearId() { m_resource.clearId(); } + { + m_context = ctx; m_resourceId = id; + } + void clearId() { m_resourceId = 0; m_context = 0; } QGLTexture2D::BindOptions options() const { return m_options; } void setOptions(QGLTexture2D::BindOptions options) { m_options = options; } @@ -158,11 +157,12 @@ public: bool bindCompressedTexturePVR(const char *buf, int len); private: - QGLSharedResource m_resource; QGLTexture2D::BindOptions m_options; QSize m_size; bool m_hasAlpha; QTime time; + QOpenGLContext *m_context; + GLuint m_resourceId; }; QT_END_NAMESPACE diff --git a/src/threed/textures/textures.pri b/src/threed/textures/textures.pri index d4c295794..3bab2a253 100644 --- a/src/threed/textures/textures.pri +++ b/src/threed/textures/textures.pri @@ -6,11 +6,11 @@ HEADERS += \ textures/qareaallocator.h SOURCES += \ qareaallocator.cpp \ - qglsharedresource.cpp \ qgltexture2d.cpp \ qgltexturecube.cpp \ qgltextureutils.cpp PRIVATE_HEADERS += \ - qglsharedresource_p.h \ qgltexture2d_p.h \ qgltextureutils_p.h + + |