summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-01-06 12:26:28 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-06 13:12:32 +0100
commitcd1e9d036ff1354c65b016ba8af0d6d6bd7cea92 (patch)
treefc7ff2a2fc5c3f2862b3c0e46589fc44ee1f1a9f /src
parentb2bfcec54cb46fa9e6555d3cb77ae6b995392ac6 (diff)
Revised createTextureFromBuffer
The context is not passed anymore to texture() and similar functions since they have to use the current context anyhow. createTextureFromBuffer() becomes bindTextureToBuffer() which is called with the texture bound. The integration can also provide its own texture in case the one created and managed by the surfacebuffer is not suitable. Change-Id: I1bfc4fe35c0e3db6081b47c551f20f4bca9aa04e Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.cpp6
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.h5
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.cpp3
-rw-r--r--src/compositor/hardware_integration/qwaylandclientbufferintegration.h12
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface.cpp5
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface_p.h3
-rw-r--r--src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp25
-rw-r--r--src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h3
-rw-r--r--src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.cpp15
-rw-r--r--src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.h2
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp13
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h2
-rw-r--r--src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp10
-rw-r--r--src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h2
-rw-r--r--src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp6
-rw-r--r--src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.h2
16 files changed, 50 insertions, 64 deletions
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp
index 290febdf9..293ff932e 100644
--- a/src/compositor/compositor_api/qwaylandsurface.cpp
+++ b/src/compositor/compositor_api/qwaylandsurface.cpp
@@ -208,13 +208,13 @@ QImage QWaylandSurface::image() const
}
#ifdef QT_COMPOSITOR_WAYLAND_GL
-GLuint QWaylandSurface::texture(QOpenGLContext *context) const
+GLuint QWaylandSurface::texture() const
{
Q_D(const QWaylandSurface);
- return d->surface->textureId(context);
+ return d->surface->textureId();
}
#else //QT_COMPOSITOR_WAYLAND_GL
-uint QWaylandSurface::texture(QOpenGLContext *) const
+uint QWaylandSurface::texture() const
{
return 0;
}
diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h
index fee299fce..18d4e7e75 100644
--- a/src/compositor/compositor_api/qwaylandsurface.h
+++ b/src/compositor/compositor_api/qwaylandsurface.h
@@ -48,7 +48,6 @@
#include <QtGui/QWindow>
#include <QtCore/QVariantMap>
-#include <QtGui/QOpenGLContext>
#ifdef QT_COMPOSITOR_WAYLAND_GL
#include <QtGui/qopengl.h>
#endif
@@ -136,9 +135,9 @@ public:
QImage image() const;
#ifdef QT_COMPOSITOR_WAYLAND_GL
- GLuint texture(QOpenGLContext *context) const;
+ GLuint texture() const;
#else
- uint texture(QOpenGLContext *context) const;
+ uint texture() const;
#endif
QWindow::Visibility visibility() const;
diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
index cc753934b..55765c75c 100644
--- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
+++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
@@ -365,12 +365,11 @@ void QWaylandSurfaceItem::updateTexture()
m_damaged = false;
QSGTexture *oldTexture = texture;
if (m_surface->type() == QWaylandSurface::Texture) {
- QOpenGLContext *context = QOpenGLContext::currentContext();
QQuickWindow::CreateTextureOptions opt = 0;
if (useTextureAlpha()) {
opt |= QQuickWindow::TextureHasAlphaChannel;
}
- texture = window()->createTextureFromId(m_surface->texture(context), m_surface->size(), opt);
+ texture = window()->createTextureFromId(m_surface->texture(), m_surface->size(), opt);
} else {
texture = window()->createTextureFromImage(m_surface->image());
}
diff --git a/src/compositor/hardware_integration/qwaylandclientbufferintegration.h b/src/compositor/hardware_integration/qwaylandclientbufferintegration.h
index 6451f6156..b3f305001 100644
--- a/src/compositor/hardware_integration/qwaylandclientbufferintegration.h
+++ b/src/compositor/hardware_integration/qwaylandclientbufferintegration.h
@@ -63,10 +63,14 @@ public:
virtual void initializeHardware(QtWayland::Display *waylandDisplay) = 0;
- /** Bind the Wayland buffer to the textureId. The correct context is the current context,
- so there is no need to do makeCurrent in this function.
- **/
- virtual GLuint createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *context) = 0;
+ // Used when the hardware integration wants to provide its own texture for a given buffer.
+ // In most cases the compositor creates and manages the texture so this is not needed.
+ virtual GLuint textureForBuffer(struct ::wl_resource *buffer) { Q_UNUSED(buffer); return 0; }
+ virtual void destroyTextureForBuffer(struct ::wl_resource *buffer) { Q_UNUSED(buffer); }
+
+ // Called with the texture bound.
+ virtual void bindTextureToBuffer(struct ::wl_resource *buffer) = 0;
+
virtual bool isYInverted(struct ::wl_resource *) const { return true; }
virtual bool setDirectRenderSurface(QWaylandSurface *) {return false;}
diff --git a/src/compositor/wayland_wrapper/qwlsurface.cpp b/src/compositor/wayland_wrapper/qwlsurface.cpp
index ba1175b04..2b410948c 100644
--- a/src/compositor/wayland_wrapper/qwlsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlsurface.cpp
@@ -204,14 +204,13 @@ QImage Surface::image() const
}
#ifdef QT_COMPOSITOR_WAYLAND_GL
-GLuint Surface::textureId(QOpenGLContext *context) const
+GLuint Surface::textureId() const
{
const SurfaceBuffer *surfacebuffer = currentSurfaceBuffer();
if (m_compositor->clientBufferIntegration() && type() == QWaylandSurface::Texture
&& !surfacebuffer->textureCreated()) {
- QWaylandClientBufferIntegration *hwIntegration = m_compositor->clientBufferIntegration();
- const_cast<SurfaceBuffer *>(surfacebuffer)->createTexture(hwIntegration,context);
+ const_cast<SurfaceBuffer *>(surfacebuffer)->createTexture();
}
return surfacebuffer->texture();
}
diff --git a/src/compositor/wayland_wrapper/qwlsurface_p.h b/src/compositor/wayland_wrapper/qwlsurface_p.h
index 101d8938c..ea2134359 100644
--- a/src/compositor/wayland_wrapper/qwlsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlsurface_p.h
@@ -53,7 +53,6 @@
#include <QtCore/QMetaType>
#ifdef QT_COMPOSITOR_WAYLAND_GL
-#include <QtGui/QOpenGLContext>
#include <QtGui/qopengl.h>
#endif
@@ -102,7 +101,7 @@ public:
QImage image() const;
#ifdef QT_COMPOSITOR_WAYLAND_GL
- GLuint textureId(QOpenGLContext *context) const;
+ GLuint textureId() const;
#endif
void sendFrameCallback();
diff --git a/src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp b/src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp
index cdc7b33ee..905700318 100644
--- a/src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp
+++ b/src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp
@@ -218,12 +218,16 @@ void SurfaceBuffer::destroyTexture()
{
#ifdef QT_COMPOSITOR_WAYLAND_GL
if (m_texture) {
- Q_ASSERT(m_guard);
/* When QOpenGLSharedResourceGuard is freed, destroyTexture might be reentered
- to cause double free. So clear m_texture first. */
+ to cause double free. So clear m_texture first. */
m_texture = 0;
- m_guard->free();
- m_guard = 0;
+ if (m_guard) {
+ m_guard->free();
+ m_guard = 0;
+ } else {
+ QWaylandClientBufferIntegration *hwIntegration = m_compositor->clientBufferIntegration();
+ hwIntegration->destroyTextureForBuffer(m_buffer);
+ }
}
#endif
}
@@ -296,11 +300,18 @@ void freeTexture(QOpenGLFunctions *, GLuint id)
glDeleteTextures(1, &id);
}
-void SurfaceBuffer::createTexture(QWaylandClientBufferIntegration *hwIntegration, QOpenGLContext *context)
+void SurfaceBuffer::createTexture()
{
+ QWaylandClientBufferIntegration *hwIntegration = m_compositor->clientBufferIntegration();
#ifdef QT_COMPOSITOR_WAYLAND_GL
- m_texture = hwIntegration->createTextureFromBuffer(m_buffer, context);
- m_guard = new QOpenGLSharedResourceGuard(QOpenGLContext::currentContext(), m_texture, freeTexture);
+ if (!m_texture)
+ m_texture = hwIntegration->textureForBuffer(m_buffer);
+ if (!m_texture) {
+ glGenTextures(1, &m_texture);
+ m_guard = new QOpenGLSharedResourceGuard(QOpenGLContext::currentContext(), m_texture, freeTexture);
+ }
+ glBindTexture(GL_TEXTURE_2D, m_texture);
+ hwIntegration->bindTextureToBuffer(m_buffer);
#else
Q_UNUSED(hwIntegration);
Q_UNUSED(context);
diff --git a/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h b/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h
index 056303e1d..42c26e7da 100644
--- a/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h
+++ b/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h
@@ -52,7 +52,6 @@
QT_BEGIN_NAMESPACE
class QWaylandClientBufferIntegration;
-class QOpenGLContext;
namespace QtWayland {
@@ -99,7 +98,7 @@ public:
inline bool textureCreated() const { return m_texture; }
- void createTexture(QWaylandClientBufferIntegration *hwIntegration, QOpenGLContext *context);
+ void createTexture();
inline GLuint texture() const;
void destroyTexture();
diff --git a/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.cpp b/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.cpp
index e5975abc3..a0be625dd 100644
--- a/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.cpp
+++ b/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.cpp
@@ -124,30 +124,25 @@ void BrcmEglIntegration::initializeHardware(QtWayland::Display *waylandDisplay)
}
}
-GLuint BrcmEglIntegration::createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *)
+void BrcmEglIntegration::bindTextureToBuffer(struct ::wl_resource *buffer)
{
Q_D(BrcmEglIntegration);
if (!d->valid) {
- qWarning("createTextureFromBuffer() failed\n");
- return 0;
+ qWarning("bindTextureToBuffer failed!");
+ return;
}
BrcmBuffer *brcmBuffer = BrcmBuffer::fromResource(buffer);
if (!d->eglQueryGlobalImageBRCM(brcmBuffer->handle(), brcmBuffer->handle() + 2)) {
qWarning("eglQueryGlobalImageBRCM failed!");
- return 0;
+ return;
}
EGLImageKHR image = d->eglCreateImageKHR(d->egl_display, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, (EGLClientBuffer)brcmBuffer->handle(), NULL);
if (image == EGL_NO_IMAGE_KHR)
qWarning("eglCreateImageKHR() failed: %x\n", eglGetError());
- GLuint textureId;
- glGenTextures(1, &textureId);
-
- glBindTexture(GL_TEXTURE_2D, textureId);
-
d->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -156,8 +151,6 @@ GLuint BrcmEglIntegration::createTextureFromBuffer(struct ::wl_resource *buffer,
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
d->eglDestroyImageKHR(d->egl_display, image);
-
- return textureId;
}
bool BrcmEglIntegration::isYInverted(struct ::wl_resource *) const
diff --git a/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.h b/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.h
index 7d94e315b..f6486ed4b 100644
--- a/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.h
+++ b/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.h
@@ -58,7 +58,7 @@ public:
void initializeHardware(QtWayland::Display *waylandDisplay) Q_DECL_OVERRIDE;
- GLuint createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *context) Q_DECL_OVERRIDE;
+ void udpateTextureFromBuffer(struct ::wl_resource *buffer) Q_DECL_OVERRIDE;
bool isYInverted(struct ::wl_resource *) const Q_DECL_OVERRIDE;
QSize bufferSize(struct ::wl_resource *buffer) const Q_DECL_OVERRIDE;
diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
index bd77db63e..7cc140cd3 100644
--- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
@@ -170,23 +170,18 @@ void WaylandEglClientBufferIntegration::initializeHardware(QtWayland::Display *w
qWarning("EGL Wayland extension successfully initialized.%s\n", !d->display_bound ? " eglBindWaylandDisplayWL ignored" : "");
}
-GLuint WaylandEglClientBufferIntegration::createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *)
+void WaylandEglClientBufferIntegration::bindTextureToBuffer(struct ::wl_resource *buffer)
{
Q_D(WaylandEglClientBufferIntegration);
if (!d->valid) {
- qWarning("createTextureFromBuffer() failed\n");
- return 0;
+ qWarning("bindTextureToBuffer() failed");
+ return;
}
EGLImageKHR image = d->egl_create_image(d->egl_display, EGL_NO_CONTEXT,
EGL_WAYLAND_BUFFER_WL,
buffer, NULL);
- GLuint textureId;
- glGenTextures(1,&textureId);
-
- glBindTexture(GL_TEXTURE_2D, textureId);
-
d->gl_egl_image_target_texture_2d(GL_TEXTURE_2D, image);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -195,8 +190,6 @@ GLuint WaylandEglClientBufferIntegration::createTextureFromBuffer(struct ::wl_re
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
d->egl_destroy_image(d->egl_display, image);
-
- return textureId;
}
bool WaylandEglClientBufferIntegration::isYInverted(struct ::wl_resource *buffer) const
diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h
index 2f93e9052..a289baa0d 100644
--- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h
+++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h
@@ -56,7 +56,7 @@ public:
void initializeHardware(QtWayland::Display *waylandDisplay) Q_DECL_OVERRIDE;
- GLuint createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *context) Q_DECL_OVERRIDE;
+ void bindTextureToBuffer(struct ::wl_resource *buffer) Q_DECL_OVERRIDE;
bool isYInverted(struct ::wl_resource *) const Q_DECL_OVERRIDE;
bool setDirectRenderSurface(QWaylandSurface *) Q_DECL_OVERRIDE;
diff --git a/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp b/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp
index 55b0cc15e..c645b997f 100644
--- a/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp
+++ b/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp
@@ -91,7 +91,7 @@ void XCompositeEglClientBufferIntegration::initializeHardware(QtWayland::Display
new XCompositeHandler(m_compositor->handle(), mDisplay);
}
-GLuint XCompositeEglClientBufferIntegration::createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *)
+void XCompositeEglClientBufferIntegration::bindTextureToBuffer(struct ::wl_resource *buffer)
{
XCompositeBuffer *compositorBuffer = XCompositeBuffer::fromResource(buffer);
Pixmap pixmap = XCompositeNameWindowPixmap(mDisplay, compositorBuffer->window());
@@ -103,7 +103,7 @@ GLuint XCompositeEglClientBufferIntegration::createTextureFromBuffer(struct ::wl
bool matched = eglChooseConfig(mEglDisplay,eglConfigSpec.constData(),&config,1,&matching);
if (!matched || !matching) {
qWarning("Could not retrieve a suitable EGL config");
- return 0;
+ return;
}
QVector<EGLint> attribList;
@@ -121,17 +121,11 @@ GLuint XCompositeEglClientBufferIntegration::createTextureFromBuffer(struct ::wl
compositorBuffer->setInvertedY(true);
- GLuint textureId;
- glGenTextures(1,&textureId);
- glBindTexture(GL_TEXTURE_2D, textureId);
-
if (!eglBindTexImage(mEglDisplay,surface,EGL_BACK_BUFFER)) {
qDebug() << "Failed to bind";
}
// eglDestroySurface(mEglDisplay,surface);
-
- return textureId;
}
bool XCompositeEglClientBufferIntegration::isYInverted(struct ::wl_resource *buffer) const
diff --git a/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h b/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h
index 65a574d1e..5497daed4 100644
--- a/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h
+++ b/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h
@@ -56,7 +56,7 @@ public:
void initializeHardware(QtWayland::Display *waylandDisplay) Q_DECL_OVERRIDE;
- GLuint createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *context) Q_DECL_OVERRIDE;
+ void bindTextureToBuffer(struct ::wl_resource *buffer) Q_DECL_OVERRIDE;
bool isYInverted(struct ::wl_resource *) const Q_DECL_OVERRIDE;
QSize bufferSize(struct ::wl_resource *buffer) const Q_DECL_OVERRIDE;
diff --git a/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp b/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp
index 1df6a4c99..a58827cee 100644
--- a/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp
+++ b/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp
@@ -112,7 +112,7 @@ void XCompositeGLXClientBufferIntegration::initializeHardware(QtWayland::Display
delete glContext;
}
-GLuint XCompositeGLXClientBufferIntegration::createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *)
+void XCompositeGLXClientBufferIntegration::updateTextureFromBuffer(struct ::wl_resource *buffer)
{
XCompositeBuffer *compositorBuffer = XCompositeBuffer::fromResource(buffer);
Pixmap pixmap = XCompositeNameWindowPixmap(mDisplay, compositorBuffer->window());
@@ -135,14 +135,10 @@ GLuint XCompositeGLXClientBufferIntegration::createTextureFromBuffer(struct ::wl
XFree(configs);
- GLuint textureId;
- glGenTextures(1,&textureId);
- glBindTexture(GL_TEXTURE_2D, textureId);
m_glxBindTexImageEXT(mDisplay,glxPixmap,GLX_FRONT_EXT, 0);
//Do we need to change the api so that we do bind and release in the painevent?
//The specification states that when deleting the texture the color buffer is deleted
// m_glxReleaseTexImageEXT(mDisplay,glxPixmap,GLX_FRONT_EXT);
- return textureId;
}
bool XCompositeGLXClientBufferIntegration::isYInverted(struct ::wl_resource *buffer) const
diff --git a/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.h b/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.h
index be6b02028..5a724eedf 100644
--- a/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.h
+++ b/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.h
@@ -61,7 +61,7 @@ public:
void initializeHardware(QtWayland::Display *waylandDisplay) Q_DECL_OVERRIDE;
- GLuint createTextureFromBuffer(struct ::wl_resource *buffer, QOpenGLContext *context) Q_DECL_OVERRIDE;
+ void bindTextureToBuffer(struct ::wl_resource *buffer) Q_DECL_OVERRIDE;
bool isYInverted(struct ::wl_resource *) const Q_DECL_OVERRIDE;
QSize bufferSize(struct ::wl_resource *buffer) const Q_DECL_OVERRIDE;