1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2016 The Qt Company Ltd. |
4 | ** Contact: https://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the QtGui module of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at https://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 3 as published by the Free Software |
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
21 | ** packaging of this file. Please review the following information to |
22 | ** ensure the GNU Lesser General Public License version 3 requirements |
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
24 | ** |
25 | ** GNU General Public License Usage |
26 | ** Alternatively, this file may be used under the terms of the GNU |
27 | ** General Public License version 2.0 or (at your option) the GNU General |
28 | ** Public license version 3 or any later version approved by the KDE Free |
29 | ** Qt Foundation. The licenses are as published by the Free Software |
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
31 | ** included in the packaging of this file. Please review the following |
32 | ** information to ensure the GNU General Public License requirements will |
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. |
35 | ** |
36 | ** $QT_END_LICENSE$ |
37 | ** |
38 | ****************************************************************************/ |
39 | |
40 | #include "qplatformsharedgraphicscache.h" |
41 | |
42 | QT_BEGIN_NAMESPACE |
43 | |
44 | /*! |
45 | \class QPlatformSharedGraphicsCache |
46 | \since 5.0 |
47 | \internal |
48 | \preliminary |
49 | \ingroup qpa |
50 | \brief The QPlatformSharedGraphicsCache is an abstraction of a cross-process graphics cache. |
51 | |
52 | If supported, it is possible to retrieve a QPlatformSharedGraphicsCache object from the |
53 | platform integration. This is typically used to store graphical items which should be shared |
54 | between several processes. |
55 | |
56 | Items are requested from the cache by calling requestItems(). If the cache contains the |
57 | requested items in the requested cache, the itemsAvailable() signal is emitted with the ID of |
58 | the graphical buffer and each item's coordinates inside the buffer. Before requesting items |
59 | from a cache, the user must call ensureCacheInitialized() to set the correct parameters for |
60 | the cache. |
61 | |
62 | If the cache does not yet contain the requested items, it will emit a similar itemsMissing() |
63 | signal. The client can then call updateItems() with rasterizations of the items and they will be |
64 | entered into the shared cache. As the items are rendered into the cache, itemsAvailable() signals |
65 | will be emitted for each of the items which have previously been requested and which have not |
66 | yet been reported as ready. |
67 | |
68 | Using beginRequestBatch() and endRequestBatch(), it's possible to batch glyph requests, which |
69 | could improve performance in cases where you have a sequence of requests pending, and you |
70 | do not need the results during this sequence. |
71 | */ |
72 | |
73 | /*! |
74 | \enum QPlatformSharedGraphicsCache::BufferType |
75 | |
76 | Defines how the type of buffer required to contain a cache. |
77 | |
78 | \value OpenGLTexture The buffer will be allocated in graphics memory, and an OpenGL texture |
79 | for a buffer belonging to the cache can be requested using |
80 | textureIdForBuffer(). |
81 | */ |
82 | |
83 | /*! |
84 | \enum QPlatformSharedGraphicsCache::PixelFormat |
85 | |
86 | Defines the pixel format of a cache. |
87 | |
88 | \value Alpha8 The cache will use 8 bits to represent the alpha value of each pixel. If an |
89 | OpenGL texture is created for a buffer belong to the cache, it will have the |
90 | pixel format GL_ALPHA. |
91 | */ |
92 | |
93 | /*! |
94 | \fn void QPlatformSharedGraphicsCache::ensureCacheInitialized(const QByteArray &cacheId, BufferType bufferType, PixelFormat pixelFormat) |
95 | |
96 | Initializes a cache named \a cacheId if it has not yet been initialized. The \a bufferType and |
97 | \a pixelFormat gives the format of the buffers that will be used to contain the items in the |
98 | cache. If a cache with the same \a cacheId has previously been initialized, the call will be |
99 | ignored. The cache will keep its previously set buffer type and pixel format. |
100 | */ |
101 | |
102 | /*! |
103 | \fn void QPlatformSharedGraphicsCache::requestItems(const QByteArray &cacheId, const QVector<quint32> &itemIds) |
104 | |
105 | Requests all the items in \a itemIds from the cache with the name \a cacheId. |
106 | |
107 | If any or all of the items are available in the cache, one or more itemsAvailable() signals will be |
108 | emitted corresponding to the items. If the cache does not contain all of the items in question, |
109 | then an itemsMissing() signal will be emitted corresponding to the missing items. The user |
110 | is at this point expected to call insertItems() to insert the missing items into the cache. If |
111 | the inserted items have previously been requested by the user, at which point an itemsAvailable() |
112 | signal will be emitted corresponding to the items. |
113 | |
114 | Before requesting items from a cache, the user must call ensureCacheInitialized() with the |
115 | correct parameters for the cache. |
116 | */ |
117 | |
118 | /*! |
119 | \fn void QPlatformSharedGraphicsCache::insertItems(const QByteArray &cacheId, const QVector<quint32> &itemIds, const QVector<QImage> &items) |
120 | |
121 | Inserts the items in \a itemIds into the cache named \a cacheId. The appearance of |
122 | each item is stored in \a items. The format of the QImage objects is expected to match the |
123 | pixel format of the cache as it was initialized in ensureCacheInitialized(). |
124 | |
125 | When the items have been successfully entered into the cache, one or more itemsAvailable() signals |
126 | will be emitted for the items. |
127 | |
128 | If the cache already contains the items, the behavior is implementation-specific. The |
129 | implementation may choose to ignore the items or it may overwrite the existing instances in |
130 | the cache. Either way, itemsAvailable() signals corresponding to the inserted items will be |
131 | emitted. |
132 | */ |
133 | |
134 | /*! |
135 | \fn void QPlatformSharedGraphicsCache::releaseItems(const QByteArray &cacheId, const QVector<quint32> &itemIds) |
136 | |
137 | Releases the reference to the items in \a itemIds from the cache named \a cacheId. This should |
138 | only be called when all references to the items have been released by the user, and they are no |
139 | longer needed. |
140 | */ |
141 | |
142 | /*! |
143 | \fn void QPlatformSharedGraphicsCache::itemsMissing(const QByteArray &cacheId, const QVector<quint32> &itemIds) |
144 | |
145 | This signal is emitted when requestItems() has been called for one or more items in the |
146 | cache named \a cacheId which are not yet available in the cache. The user is then expected to |
147 | call insertItems() to update the cache with the respective items, at which point they will |
148 | become available to all clients of the shared cache. |
149 | |
150 | The vector \a itemIds contains the IDs of the items that need to be inserted into the cache. |
151 | |
152 | \sa itemsAvailable(), insertItems(), requestItems() |
153 | */ |
154 | |
155 | /*! |
156 | \fn void QPlatformSharedGraphicsCache::itemsAvailable(const QByteArray &cacheId, void *bufferId, const QVector<quint32> &itemIds, const QVector<QPoint> &positionsInBuffer) |
157 | |
158 | This signal can be emitted at any time when either requestItems() or insertItems() has been |
159 | called by the application for one or more items in the cache named \a cacheId, as long as |
160 | releaseItems() has not subsequently been called for the same items. It instructs the application |
161 | on where to find the items that have been entered into the cache. When the application receives |
162 | a buffer, it is expected to reference it using referenceBuffer() on it if it keeps a reference |
163 | to the buffer. |
164 | |
165 | The \a bufferId is an ID for the buffer that contains the items. The \a bufferId can be |
166 | converted to a format usable by the application depending on which format it was given at |
167 | initialization. If it is a OpenGLTexture, its texture ID can be requested using the |
168 | textureIdForBuffer() function. The dimensions of the buffer are given by \a bufferSize. |
169 | |
170 | The items provided by the cache are identified in the \a itemIds vector. The |
171 | \a positionsInBuffer vector contains the locations inside the buffer of each item. Each entry in |
172 | \a positionsInBuffer corresponds to an item in \a itemIds. |
173 | |
174 | The buffer and the items' locations within the buffer can be considered valid until an |
175 | itemsInvalidated() signal has been emitted for the items, or until releaseItems() is called |
176 | for the items. |
177 | |
178 | \sa itemsMissing(), requestItems(), bufferType() |
179 | */ |
180 | |
181 | /*! |
182 | \fn void QPlatformSharedGraphicsCache::itemsUpdated(const QByteArray &cacheId, void *bufferId, const QVector<quint32> &itemIds, const QVector<QPoint> &positionsInBuffer) |
183 | |
184 | This signal is similar in usage to the itemsAvailable() signal, but will be emitted when |
185 | the location of a previously requested or inserted item has been updated. The application |
186 | must update its data for the respective items and release any references to old buffers held |
187 | by the items. |
188 | |
189 | If the application no longer holds any references to previously referenced items in a given |
190 | cache, it should call releaseItems() for these items, at which point it will no longer receive |
191 | any itemsUpdated() signal for these items. |
192 | |
193 | \sa requestItems(), insertItems(), itemsAvailable() |
194 | */ |
195 | |
196 | /*! |
197 | \fn void QPlatformSharedGraphicsCache::itemsInvalidated(const QByteArray &cacheId, const QVector<quint32> &itemIds) |
198 | |
199 | This signal is emitted when the items given by \a itemIds in the cache named \a cacheId have |
200 | been removed from the cache and the previously reported information about them is considered |
201 | invalid. It will only be emitted for items for which a buffer has previously been identified |
202 | through the itemsAvailable() signal (either as response to a requestItems() call or an |
203 | insertItems() call.) |
204 | |
205 | The application is expected to throw away information about the items in the \a itemIds array |
206 | and drop any references it might have to the memory held by the buffer. If the items are still |
207 | required by the application, it can re-commit them to the cache using the insertItems() function. |
208 | |
209 | If the application no longer holds any references to previously referenced items in a given |
210 | cache, it should call releaseItems() for these items, at which point it will no longer receive |
211 | any itemsInvalidated() signal for these items. |
212 | */ |
213 | |
214 | /*! |
215 | \fn void QPlatformSharedGraphicsCache::beginRequestBatch() |
216 | |
217 | This is a hint to the cache that a burst of requests is pending. In some implementations, this |
218 | will improve performance, as the cache can focus on handling the requests and wait with the |
219 | results until it is done. It should typically be called prior to a sequence of calls to |
220 | requestItems() and releaseItems(). |
221 | |
222 | Any call to beginRequestBatch() must be followed at some point by a call to endRequestBatch(). |
223 | Failing to do this may lead to the results of requests never being emitted. |
224 | |
225 | \note beginRequestBatch() and endRequestBatch() have no stacking logic. Calling |
226 | beginRequestBatch() twice in a row has no effect, and the single existing batch will be ended |
227 | by the earliest call to endRequestBatch(). |
228 | |
229 | \sa endRequestBatch(), requestBatchStarted() |
230 | */ |
231 | |
232 | /*! |
233 | \fn void QPlatformSharedGraphicsCache::endRequestBatch() |
234 | |
235 | Signals to the cache that the request sequence which has previously been commenced using |
236 | beginRequestBatch() has now finished. |
237 | |
238 | \sa beginRequestBatch(), requestBatchStarted() |
239 | */ |
240 | |
241 | /*! |
242 | \fn bool QPlatformSharedGraphicsCache::requestBatchStarted() const |
243 | |
244 | Returns \c true if a request batch has previously been started using beginRequestBatch() |
245 | and not yet stopped using endRequestBatch(). |
246 | |
247 | \sa beginRequestBatch(), endRequestBatch() |
248 | */ |
249 | |
250 | /*! |
251 | \fn uint QPlatformSharedGraphicsCache::textureIdForBuffer(void *bufferId) |
252 | |
253 | Returns an OpenGL texture ID corresponding to the buffer \a bufferId, which has previously |
254 | been passed through signals itemsAvailable() or itemsUpdated(). The relevant OpenGL context |
255 | should be current when calling this function. |
256 | |
257 | \sa eglImageForBuffer(), sizeOfBuffer() |
258 | */ |
259 | |
260 | /*! |
261 | \fn void *QPlatformSharedGraphicsCache::eglImageForBuffer(void *bufferId) |
262 | |
263 | Returns an EGLImageKHR image corresponding to the buffer \a bufferId. |
264 | |
265 | \sa textureIdForBuffer(), sizeOfBuffer() |
266 | */ |
267 | |
268 | /*! |
269 | \fn void QPlatformSharedGraphicsCache::referenceBuffer(void *bufferId) |
270 | |
271 | Registers a reference to the buffer \a bufferId. |
272 | |
273 | \sa dereferenceBuffer() |
274 | */ |
275 | |
276 | /*! |
277 | \fn bool QPlatformSharedGraphicsCache::dereferenceBuffer(void *bufferId) |
278 | |
279 | Removed a previously registered reference to the buffer \a bufferId. Returns \c true if there |
280 | are still more references to the buffer in question, or false if this was the last reference |
281 | (in which case the buffer may have been deleted in the cache.) |
282 | |
283 | \sa dereferenceBuffer() |
284 | */ |
285 | |
286 | /*! |
287 | \fn QSize QPlatformSharedGraphicsCache::sizeOfBuffer(void *bufferId) |
288 | |
289 | Returns the size of the buffer \a bufferId. |
290 | |
291 | \sa textureIdForBuffer(), eglImageForBuffer() |
292 | */ |
293 | |
294 | QT_END_NAMESPACE |
295 | |