summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Ham <christopher.ham@nokia.com>2012-01-19 13:39:53 +1000
committerQt by Nokia <qt-info@nokia.com>2012-01-19 09:40:53 +0100
commit526d51a3b1e0dd7109ec01df5dcbdfd3782cea80 (patch)
treeb75106bc0a312f72856fffe8c20a5326c78e86a1
parentb164194dc0609e8c64b90148f7a541c3f68aa532 (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.cpp3
-rw-r--r--src/threed/textures/qgltexture2d.cpp10
-rw-r--r--src/threed/textures/qgltexture2d_p.h13
-rw-r--r--src/threed/textures/qgltextureutils.cpp48
-rw-r--r--src/threed/textures/qgltextureutils_p.h22
-rw-r--r--src/threed/textures/textures.pri4
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
+
+