1 /****************************************************************************
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
6 ** This file is part of the Qt Compositor.
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
14 ** * Redistributions of source code must retain the above copyright
15 ** notice, this list of conditions and the following disclaimer.
16 ** * Redistributions in binary form must reproduce the above copyright
17 ** notice, this list of conditions and the following disclaimer in
18 ** the documentation and/or other materials provided with the
20 ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
21 ** of its contributors may be used to endorse or promote products derived
22 ** from this software without specific prior written permission.
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
39 ****************************************************************************/
41 #ifndef SURFACEBUFFER_H
42 #define SURFACEBUFFER_H
44 #include <QtCore/QRect>
45 #include <QtGui/qopengl.h>
46 #include <qpa/qplatformscreenpageflipper.h>
48 #include <wayland-server.h>
50 class GraphicsHardwareIntegration;
58 struct surface_buffer_destroy_listener
60 struct wl_listener listener;
61 class SurfaceBuffer *surfaceBuffer;
64 class SurfaceBuffer : public QPlatformScreenBuffer
67 SurfaceBuffer(Surface *surface);
71 void initialize(struct wl_buffer *buffer);
72 void destructBufferState();
74 inline int32_t width() const { return m_buffer->width; }
75 inline int32_t height() const { return m_buffer->height; }
77 bool isShmBuffer() const;
79 inline bool isRegisteredWithBuffer() const { return m_is_registered_for_buffer; }
82 void setPageFlipperHasBuffer(bool owns);
83 bool pageFlipperHasBuffer() const { return m_page_flipper_has_buffer; }
85 void scheduledRelease();
90 inline bool isDisplayed() const { return m_is_displayed; }
92 inline QRect damageRect() const { return m_damageRect; }
93 void setDamage(const QRect &rect);
95 inline bool textureCreated() const { return m_texture; }
97 void createTexture(GraphicsHardwareIntegration *hwIntegration, QOpenGLContext *context);
98 inline GLuint texture() const;
99 void destroyTexture();
101 inline struct wl_buffer *waylandBufferHandle() const { return m_buffer; }
103 void handleAboutToBeDisplayed();
104 void handleDisplayed();
106 void *handle() const;
109 Compositor *m_compositor;
110 struct wl_buffer *m_buffer;
111 struct surface_buffer_destroy_listener m_destroy_listener;
113 bool m_is_registered_for_buffer;
114 bool m_surface_has_buffer;
115 bool m_page_flipper_has_buffer;
118 #ifdef QT_COMPOSITOR_WAYLAND_GL
124 bool m_is_shm_resolved;
127 static void destroy_listener_callback(wl_listener *listener, void *data);
130 GLuint SurfaceBuffer::texture() const
139 #endif // SURFACEBUFFER_H