summaryrefslogtreecommitdiffstats
path: root/src/opengl
diff options
context:
space:
mode:
Diffstat (limited to 'src/opengl')
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager.cpp44
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager_p.h4
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp10
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h7
-rw-r--r--src/opengl/opengl.pro1
-rw-r--r--src/opengl/qgl.cpp4
-rw-r--r--src/opengl/qgl_p.h2
-rw-r--r--src/opengl/qgl_x11egl.cpp11
-rw-r--r--src/opengl/qglpixmapfilter.cpp21
-rw-r--r--src/opengl/qpixmapdata_gl.cpp6
-rw-r--r--src/opengl/qwindowsurface_gl.cpp2
11 files changed, 55 insertions, 57 deletions
diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
index 2502069..b3458af 100644
--- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
+++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
@@ -282,7 +282,8 @@ QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineS
// We have to bind the vertex attribute names before the program is linked:
cached.program->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- cached.program->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+ if (cached.useTextureCoords)
+ cached.program->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
cached.program->link();
if (!cached.program->isLinked()) {
@@ -331,7 +332,6 @@ QGLEngineShaderManager::QGLEngineShaderManager(QGLContext* context)
srcPixelType(Qt::NoBrush),
useGlobalOpacity(false),
maskType(NoMask),
- useTextureCoords(false),
compositionMode(QPainter::CompositionMode_SourceOver),
customSrcStage(0),
currentShaderProg(0),
@@ -406,15 +406,6 @@ void QGLEngineShaderManager::setSrcPixelType(PixelSrcType type)
shaderProgNeedsChanging = true; //###
}
-void QGLEngineShaderManager::setTextureCoordsEnabled(bool enabled)
-{
- if (useTextureCoords == enabled)
- return;
-
- useTextureCoords = enabled;
- shaderProgNeedsChanging = true; //###
-}
-
void QGLEngineShaderManager::setUseGlobalOpacity(bool useOpacity)
{
if (useGlobalOpacity == useOpacity)
@@ -492,13 +483,7 @@ bool QGLEngineShaderManager::useCorrectShaderProg()
QGLEngineShaderProg requiredProgram;
requiredProgram.program = 0;
- // Choose vertex shader main function
- QGLEngineSharedShaders::ShaderName mainVertexShaderName = QGLEngineSharedShaders::InvalidShaderName;
- if (useTextureCoords)
- mainVertexShaderName = QGLEngineSharedShaders::MainWithTexCoordsVertexShader;
- else
- mainVertexShaderName = QGLEngineSharedShaders::MainVertexShader;
- requiredProgram.mainVertexShader = sharedShaders->compileNamedShader(mainVertexShaderName, QGLShader::PartialVertexShader);
+ bool texCoords = false;
// Choose vertex shader shader position function (which typically also sets
// varyings) and the source pixel (srcPixel) fragment shader function:
@@ -521,14 +506,17 @@ bool QGLEngineShaderManager::useCorrectShaderProg()
case QGLEngineShaderManager::ImageSrc:
srcPixelFragShaderName = QGLEngineSharedShaders::ImageSrcFragmentShader;
positionVertexShaderName = QGLEngineSharedShaders::PositionOnlyVertexShader;
+ texCoords = true;
break;
case QGLEngineShaderManager::NonPremultipliedImageSrc:
srcPixelFragShaderName = QGLEngineSharedShaders::NonPremultipliedImageSrcFragmentShader;
positionVertexShaderName = QGLEngineSharedShaders::PositionOnlyVertexShader;
+ texCoords = true;
break;
case QGLEngineShaderManager::PatternSrc:
srcPixelFragShaderName = QGLEngineSharedShaders::ImageSrcWithPatternFragmentShader;
positionVertexShaderName = QGLEngineSharedShaders::PositionOnlyVertexShader;
+ texCoords = true;
break;
case QGLEngineShaderManager::TextureSrcWithPattern:
srcPixelFragShaderName = QGLEngineSharedShaders::TextureBrushSrcWithPatternFragmentShader;
@@ -596,14 +584,16 @@ bool QGLEngineShaderManager::useCorrectShaderProg()
if (hasMask) {
QGLEngineSharedShaders::ShaderName maskShaderName = QGLEngineSharedShaders::InvalidShaderName;
- if (maskType == PixelMask)
+ if (maskType == PixelMask) {
maskShaderName = QGLEngineSharedShaders::MaskFragmentShader;
- else if (maskType == SubPixelMask)
+ texCoords = true;
+ } else if (maskType == SubPixelMask) {
maskShaderName = QGLEngineSharedShaders::RgbMaskFragmentShader;
- else if (maskType == SubPixelWithGammaMask)
+ } else if (maskType == SubPixelWithGammaMask) {
maskShaderName = QGLEngineSharedShaders::RgbMaskWithGammaFragmentShader;
- else
+ } else {
qCritical("QGLEngineShaderManager::useCorrectShaderProg() - Unknown mask type");
+ }
requiredProgram.maskFragShader = sharedShaders->compileNamedShader(maskShaderName, QGLShader::PartialFragmentShader);
} else {
@@ -654,6 +644,16 @@ bool QGLEngineShaderManager::useCorrectShaderProg()
requiredProgram.compositionFragShader = 0;
}
+ // Choose vertex shader main function
+ QGLEngineSharedShaders::ShaderName mainVertexShaderName = QGLEngineSharedShaders::InvalidShaderName;
+ if (texCoords)
+ mainVertexShaderName = QGLEngineSharedShaders::MainWithTexCoordsVertexShader;
+ else
+ mainVertexShaderName = QGLEngineSharedShaders::MainVertexShader;
+ requiredProgram.mainVertexShader = sharedShaders->compileNamedShader(mainVertexShaderName, QGLShader::PartialVertexShader);
+ requiredProgram.useTextureCoords = texCoords;
+
+
// At this point, requiredProgram is fully populated so try to find the program in the cache
currentShaderProg = sharedShaders->findProgramInCache(requiredProgram);
diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h
index 423df99..3c5a5f5 100644
--- a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h
+++ b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h
@@ -245,6 +245,8 @@ struct QGLEngineShaderProg
QVector<uint> uniformLocations;
+ bool useTextureCoords;
+
bool operator==(const QGLEngineShaderProg& other) {
// We don't care about the program
return ( mainVertexShader == other.mainVertexShader &&
@@ -408,7 +410,6 @@ public:
void optimiseForBrushTransform(const QTransform &transform);
void setSrcPixelType(Qt::BrushStyle);
void setSrcPixelType(PixelSrcType); // For non-brush sources, like pixmaps & images
- void setTextureCoordsEnabled(bool); // For images & text glyphs
void setUseGlobalOpacity(bool);
void setMaskType(MaskType);
void setCompositionMode(QPainter::CompositionMode);
@@ -450,7 +451,6 @@ private:
int srcPixelType;
bool useGlobalOpacity;
MaskType maskType;
- bool useTextureCoords;
QPainter::CompositionMode compositionMode;
QGLCustomShaderStage* customSrcStage;
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
index e41d0b4..837d055 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
@@ -668,7 +668,6 @@ void QGL2PaintEngineExPrivate::drawTexture(const QGLRect& dest, const QGLRect& s
{
// Setup for texture drawing
shaderManager->setSrcPixelType(pattern ? QGLEngineShaderManager::PatternSrc : QGLEngineShaderManager::ImageSrc);
- shaderManager->setTextureCoordsEnabled(true);
if (prepareForDraw(opaque))
shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
@@ -1241,7 +1240,6 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(const QPointF &p, const QTextIte
else if (glyphType == QFontEngineGlyphCache::Raster_RGBMask)
shaderManager->setMaskType(QGLEngineShaderManager::SubPixelMask);
//### TODO: Gamma correction
- shaderManager->setTextureCoordsEnabled(true);
int margin = cache->glyphMargin();
@@ -1769,14 +1767,6 @@ QOpenGL2PaintEngineState::~QOpenGL2PaintEngineState()
{
}
-QPixmapFilter *QGL2PaintEngineEx::createPixmapFilter(int type) const
-{
- const QGLContext *ctx = QGLContext::currentContext();
- if (ctx)
- return ctx->d_func()->createPixmapFilter(type);
- return 0;
-}
-
QT_END_NAMESPACE
#include "qpaintengineex_opengl2.moc"
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
index 34f4eb8..a44be90 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
@@ -59,6 +59,7 @@
#include <private/qglengineshadermanager_p.h>
#include <private/qgl2pexvertexarray_p.h>
#include <private/qglpaintdevice_p.h>
+#include <private/qglpixmapfilter_p.h>
enum EngineMode {
ImageDrawingMode,
@@ -140,7 +141,7 @@ public:
const QGLContext* context();
- QPixmapFilter *createPixmapFilter(int type) const;
+ QPixmapFilter *pixmapFilter(int type, const QPixmapFilter *prototype);
void setRenderTextActive(bool);
@@ -264,6 +265,10 @@ public:
bool inRenderText;
float textureInvertedY;
+
+ QScopedPointer<QPixmapFilter> convolutionFilter;
+ QScopedPointer<QPixmapFilter> colorizeFilter;
+ QScopedPointer<QPixmapFilter> blurFilter;
};
QT_END_NAMESPACE
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index da30e3d..d434725 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -159,4 +159,5 @@ wince*: {
} else {
LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL
+ LIBS += $$QMAKE_LFLAGS_OPENGL
}
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index 1a0957c..fe676ea 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -2560,8 +2560,6 @@ static void qDrawTextureRect(const QRectF &target, GLint textureWidth, GLint tex
Draws the given texture, \a textureId, to the given target rectangle,
\a target, in OpenGL model space. The \a textureTarget should be a 2D
texture target.
-
- Equivalent to the corresponding QGLContext::drawTexture().
*/
void QGLContext::drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget)
{
@@ -2603,8 +2601,6 @@ void QGLContext::drawTexture(const QRectF &target, QMacCompatGLuint textureId, Q
Draws the given texture at the given \a point in OpenGL model
space. The \a textureTarget should be a 2D texture target.
-
- Equivalent to the corresponding QGLContext::drawTexture().
*/
void QGLContext::drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget)
{
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index 2b74e69..7269195 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -352,8 +352,6 @@ public:
#endif
static void setCurrentContext(QGLContext *context);
-
- QPixmapFilter *createPixmapFilter(int type) const;
};
// ### make QGLContext a QObject in 5.0 and remove the proxy stuff
diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp
index 7dfd642..32d8cc2 100644
--- a/src/opengl/qgl_x11egl.cpp
+++ b/src/opengl/qgl_x11egl.cpp
@@ -298,7 +298,7 @@ void QGLWidget::setContext(QGLContext *context, const QGLContext* shareContext,
XRenderPictFormat *format;
format = XRenderFindVisualFormat(x11Info().display(), chosenVisualInfo->visual);
if (format->type == PictTypeDirect && format->direct.alphaMask) {
- qDebug("Using opaque X Visual ID (%d) provided by EGL", (int)vi.visualid);
+// qDebug("Using opaque X Visual ID (%d) provided by EGL", (int)vi.visualid);
vi = *chosenVisualInfo;
}
else {
@@ -309,7 +309,7 @@ void QGLWidget::setContext(QGLContext *context, const QGLContext* shareContext,
} else
#endif
{
- qDebug("Using opaque X Visual ID (%d) provided by EGL", (int)vi.visualid);
+// qDebug("Using opaque X Visual ID (%d) provided by EGL", (int)vi.visualid);
vi = *chosenVisualInfo;
}
XFree(chosenVisualInfo);
@@ -342,7 +342,7 @@ void QGLWidget::setContext(QGLContext *context, const QGLContext* shareContext,
format = XRenderFindVisualFormat(x11Info().display(), matchingVisuals[i].visual);
if (format->type == PictTypeDirect && format->direct.alphaMask) {
vi = matchingVisuals[i];
- qDebug("Using X Visual ID (%d) for ARGB visual as provided by XRender", (int)vi.visualid);
+// qDebug("Using X Visual ID (%d) for ARGB visual as provided by XRender", (int)vi.visualid);
break;
}
}
@@ -365,8 +365,9 @@ void QGLWidget::setContext(QGLContext *context, const QGLContext* shareContext,
return;
} else
qWarning(" - Falling back to X11 suggested depth (%d)", depth);
- } else
- qDebug("Using X Visual ID (%d) for EGL provided depth (%d)", (int)vi.visualid, depth);
+ }
+// else
+// qDebug("Using X Visual ID (%d) for EGL provided depth (%d)", (int)vi.visualid, depth);
// Don't try to use ARGB now unless the visual is 32-bit - even then it might stil fail :-(
if (useArgb)
diff --git a/src/opengl/qglpixmapfilter.cpp b/src/opengl/qglpixmapfilter.cpp
index 43f1990..b48c497 100644
--- a/src/opengl/qglpixmapfilter.cpp
+++ b/src/opengl/qglpixmapfilter.cpp
@@ -123,23 +123,28 @@ private:
extern QGLWidget *qt_gl_share_widget();
-QPixmapFilter *QGLContextPrivate::createPixmapFilter(int type) const
+QPixmapFilter *QGL2PaintEngineEx::pixmapFilter(int type, const QPixmapFilter *prototype)
{
+ Q_D(QGL2PaintEngineEx);
switch (type) {
case QPixmapFilter::ColorizeFilter:
- return new QGLPixmapColorizeFilter;
+ if (!d->colorizeFilter)
+ d->colorizeFilter.reset(new QGLPixmapColorizeFilter);
+ return d->colorizeFilter.data();
case QPixmapFilter::BlurFilter:
- return new QGLPixmapBlurFilter;
+ if (!d->blurFilter)
+ d->blurFilter.reset(new QGLPixmapBlurFilter);
+ return d->blurFilter.data();
case QPixmapFilter::ConvolutionFilter:
- return new QGLPixmapConvolutionFilter;
+ if (!d->convolutionFilter)
+ d->convolutionFilter.reset(new QGLPixmapConvolutionFilter);
+ return d->convolutionFilter.data();
- default:
- return 0;
- break;
+ default: break;
}
- return 0;
+ return QPaintEngineEx::pixmapFilter(type, prototype);
}
extern void qt_add_rect_to_array(const QRectF &r, q_vertexType *array);
diff --git a/src/opengl/qpixmapdata_gl.cpp b/src/opengl/qpixmapdata_gl.cpp
index 3bc0d4f..8cb6c8d 100644
--- a/src/opengl/qpixmapdata_gl.cpp
+++ b/src/opengl/qpixmapdata_gl.cpp
@@ -486,8 +486,12 @@ void QGLPixmapData::copyBackFromRenderFbo(bool keepCurrentFboBound) const
GL_COLOR_BUFFER_BIT,
GL_NEAREST);
- if (keepCurrentFboBound)
+ if (keepCurrentFboBound) {
glBindFramebuffer(GL_FRAMEBUFFER_EXT, ctx->d_ptr->current_fbo);
+ } else {
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER_EXT, m_renderFbo->handle());
+ ctx->d_ptr->current_fbo = m_renderFbo->handle();
+ }
}
bool QGLPixmapData::useFramebufferObjects()
diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index e89352d..b2420ba 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -443,8 +443,6 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &
QRegion dirtyRegion = QRegion(window()->rect()) - d_ptr->paintedRegion;
if (!dirtyRegion.isEmpty()) {
- context()->makeCurrent();
-
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();