qglframebufferobject.cpp

Switch to Source codePreprocessed file
LineSource CodeCoverage
1 -
2 -
3 -
4 -
5 -
6extern QImage qt_gl_read_frame_buffer(const QSize&, bool, bool); -
7void QGLFramebufferObjectFormat::detach() -
8{ -
9 if (d->ref.load() != 1) {
never evaluated: d->ref.load() != 1
0
10 QGLFramebufferObjectFormatPrivate *newd -
11 = new QGLFramebufferObjectFormatPrivate(d); -
12 if (!d->ref.deref())
never evaluated: !d->ref.deref()
0
13 delete d;
never executed: delete d;
0
14 d = newd; -
15 }
never executed: }
0
16}
never executed: }
0
17QGLFramebufferObjectFormat::QGLFramebufferObjectFormat() -
18{ -
19 d = new QGLFramebufferObjectFormatPrivate; -
20}
never executed: }
0
21 -
22 -
23 -
24 -
25 -
26QGLFramebufferObjectFormat::QGLFramebufferObjectFormat(const QGLFramebufferObjectFormat &other) -
27{ -
28 d = other.d; -
29 d->ref.ref(); -
30}
never executed: }
0
31 -
32 -
33 -
34 -
35 -
36QGLFramebufferObjectFormat &QGLFramebufferObjectFormat::operator=(const QGLFramebufferObjectFormat &other) -
37{ -
38 if (d != other.d) {
never evaluated: d != other.d
0
39 other.d->ref.ref(); -
40 if (!d->ref.deref())
never evaluated: !d->ref.deref()
0
41 delete d;
never executed: delete d;
0
42 d = other.d; -
43 }
never executed: }
0
44 return *this;
never executed: return *this;
0
45} -
46 -
47 -
48 -
49 -
50QGLFramebufferObjectFormat::~QGLFramebufferObjectFormat() -
51{ -
52 if (!d->ref.deref())
never evaluated: !d->ref.deref()
0
53 delete d;
never executed: delete d;
0
54}
never executed: }
0
55void QGLFramebufferObjectFormat::setSamples(int samples) -
56{ -
57 detach(); -
58 d->samples = samples; -
59}
never executed: }
0
60int QGLFramebufferObjectFormat::samples() const -
61{ -
62 return d->samples;
never executed: return d->samples;
0
63} -
64void QGLFramebufferObjectFormat::setMipmap(bool enabled) -
65{ -
66 detach(); -
67 d->mipmap = enabled; -
68}
never executed: }
0
69bool QGLFramebufferObjectFormat::mipmap() const -
70{ -
71 return d->mipmap;
never executed: return d->mipmap;
0
72} -
73 -
74 -
75 -
76 -
77 -
78 -
79void QGLFramebufferObjectFormat::setAttachment(QGLFramebufferObject::Attachment attachment) -
80{ -
81 detach(); -
82 d->attachment = attachment; -
83}
never executed: }
0
84 -
85 -
86 -
87 -
88 -
89 -
90 -
91QGLFramebufferObject::Attachment QGLFramebufferObjectFormat::attachment() const -
92{ -
93 return d->attachment;
never executed: return d->attachment;
0
94} -
95 -
96 -
97 -
98 -
99 -
100 -
101 -
102void QGLFramebufferObjectFormat::setTextureTarget(GLenum target) -
103{ -
104 detach(); -
105 d->target = target; -
106}
never executed: }
0
107GLenum QGLFramebufferObjectFormat::textureTarget() const -
108{ -
109 return d->target;
never executed: return d->target;
0
110} -
111void QGLFramebufferObjectFormat::setInternalTextureFormat(GLenum internalTextureFormat) -
112{ -
113 detach(); -
114 d->internal_format = internalTextureFormat; -
115}
never executed: }
0
116GLenum QGLFramebufferObjectFormat::internalTextureFormat() const -
117{ -
118 return d->internal_format;
never executed: return d->internal_format;
0
119} -
120 -
121 -
122 -
123 -
124 -
125bool QGLFramebufferObjectFormat::operator==(const QGLFramebufferObjectFormat& other) const -
126{ -
127 if (d == other.d)
never evaluated: d == other.d
0
128 return true;
never executed: return true;
0
129 else -
130 return d->equals(other.d);
never executed: return d->equals(other.d);
0
131} -
132 -
133 -
134 -
135 -
136 -
137bool QGLFramebufferObjectFormat::operator!=(const QGLFramebufferObjectFormat& other) const -
138{ -
139 return !(*this == other);
never executed: return !(*this == other);
0
140} -
141 -
142void QGLFBOGLPaintDevice::setFBO(QGLFramebufferObject* f, -
143 QGLFramebufferObject::Attachment attachment) -
144{ -
145 fbo = f; -
146 m_thisFBO = fbo->d_func()->fbo(); -
147 -
148 -
149 -
150 fboFormat = QGLContext::currentContext()->format(); -
151 if (attachment == QGLFramebufferObject::CombinedDepthStencil) {
never evaluated: attachment == QGLFramebufferObject::CombinedDepthStencil
0
152 fboFormat.setDepth(true); -
153 fboFormat.setStencil(true); -
154 } else if (attachment == QGLFramebufferObject::Depth) {
never evaluated: attachment == QGLFramebufferObject::Depth
never executed: }
0
155 fboFormat.setDepth(true); -
156 fboFormat.setStencil(false); -
157 } else {
never executed: }
0
158 fboFormat.setDepth(false); -
159 fboFormat.setStencil(false); -
160 }
never executed: }
0
161 -
162 GLenum format = f->format().internalTextureFormat(); -
163 reqAlpha = (format != 0x1907
never evaluated: format != 0x1907
0
164 -
165 && format != 0x8050 && format != 0x8051
never evaluated: format != 0x8050
never evaluated: format != 0x8051
0
166 -
167 ); -
168}
never executed: }
0
169 -
170QGLContext *QGLFBOGLPaintDevice::context() const -
171{ -
172 return const_cast<QGLContext *>(QGLContext::currentContext());
never executed: return const_cast<QGLContext *>(QGLContext::currentContext());
0
173} -
174 -
175bool QGLFramebufferObjectPrivate::checkFramebufferStatus() const -
176{ -
177 const QGLContext *ctx = QGLContext::currentContext();; -
178 if (!ctx)
never evaluated: !ctx
0
179 return false;
never executed: return false;
0
180 GLenum status = QGLContextPrivate::extensionFuncs(ctx).qt_glCheckFramebufferStatus(0x8D40); -
181 switch(status) { -
182 case 0x0: -
183 case 0x8CD5: -
184 return true;
never executed: return true;
0
185 case 0x8CDD: -
186 QMessageLogger("qglframebufferobject.cpp", 398, __PRETTY_FUNCTION__).debug("QGLFramebufferObject: Unsupported framebuffer format."); -
187 break;
never executed: break;
0
188 case 0x8CD6: -
189 QMessageLogger("qglframebufferobject.cpp", 401, __PRETTY_FUNCTION__).debug("QGLFramebufferObject: Framebuffer incomplete attachment."); -
190 break;
never executed: break;
0
191 case 0x8CD7: -
192 QMessageLogger("qglframebufferobject.cpp", 404, __PRETTY_FUNCTION__).debug("QGLFramebufferObject: Framebuffer incomplete, missing attachment."); -
193 break;
never executed: break;
0
194 case 0x8CDB: -
195 QMessageLogger("qglframebufferobject.cpp", 423, __PRETTY_FUNCTION__).debug("QGLFramebufferObject: Framebuffer incomplete, missing draw buffer."); -
196 break;
never executed: break;
0
197 -
198 -
199 case 0x8CDC: -
200 QMessageLogger("qglframebufferobject.cpp", 428, __PRETTY_FUNCTION__).debug("QGLFramebufferObject: Framebuffer incomplete, missing read buffer."); -
201 break;
never executed: break;
0
202 -
203 -
204 case 0x8D56: -
205 QMessageLogger("qglframebufferobject.cpp", 433, __PRETTY_FUNCTION__).debug("QGLFramebufferObject: Framebuffer incomplete, attachments must have same number of samples per pixel."); -
206 break;
never executed: break;
0
207 -
208 default: -
209 QMessageLogger("qglframebufferobject.cpp", 437, __PRETTY_FUNCTION__).debug() <<"QGLFramebufferObject: An undefined error has occurred: "<< status; -
210 break;
never executed: break;
0
211 } -
212 return false;
never executed: return false;
0
213} -
214 -
215namespace -
216{ -
217 void freeFramebufferFunc(QGLContext *ctx, GLuint id) -
218 { -
219 (void)ctx;; -
220 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteFramebuffers(1, &id); -
221 }
never executed: }
0
222 -
223 void freeRenderbufferFunc(QGLContext *ctx, GLuint id) -
224 { -
225 (void)ctx;; -
226 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &id); -
227 }
never executed: }
0
228 -
229 void freeTextureFunc(QGLContext *ctx, GLuint id) -
230 { -
231 (void)ctx;; -
232 glDeleteTextures(1, &id); -
233 }
never executed: }
0
234} -
235 -
236void QGLFramebufferObjectPrivate::init(QGLFramebufferObject *q, const QSize &sz, -
237 QGLFramebufferObject::Attachment attachment, -
238 GLenum texture_target, GLenum internal_format, -
239 GLint samples, bool mipmap) -
240{ -
241 QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext()); -
242 -
243 bool ext_detected = (QGLExtensions::glExtensions() & QGLExtensions::FramebufferObject); -
244 if (!ext_detected || (ext_detected && !qt_resolve_framebufferobject_extensions(ctx)))
never evaluated: !ext_detected
never evaluated: ext_detected
never evaluated: !qt_resolve_framebufferobject_extensions(ctx)
0
245 return;
never executed: return;
0
246 -
247 size = sz; -
248 target = texture_target; -
249 -
250 -
251 {}; -
252 GLuint fbo = 0; -
253 QGLContextPrivate::extensionFuncs(ctx).qt_glGenFramebuffers(1, &fbo); -
254 QGLContextPrivate::extensionFuncs(ctx).qt_glBindFramebuffer(0x8D40, fbo); -
255 -
256 GLuint texture = 0; -
257 GLuint color_buffer = 0; -
258 GLuint depth_buffer = 0; -
259 GLuint stencil_buffer = 0; -
260 -
261 {}; -
262 -
263 if (samples == 0) {
never evaluated: samples == 0
0
264 glGenTextures(1, &texture); -
265 glBindTexture(target, texture); -
266 glTexImage2D(target, 0, internal_format, size.width(), size.height(), 0, -
267 0x1908, 0x1401, __null); -
268 if (mipmap) {
never evaluated: mipmap
0
269 int width = size.width(); -
270 int height = size.height(); -
271 int level = 0; -
272 while (width > 1 || height > 1) {
never evaluated: width > 1
never evaluated: height > 1
0
273 width = qMax(1, width >> 1); -
274 height = qMax(1, height >> 1); -
275 ++level; -
276 glTexImage2D(target, level, internal_format, width, height, 0, -
277 0x1908, 0x1401, __null); -
278 }
never executed: }
0
279 }
never executed: }
0
280 glTexParameteri(target, 0x2801, 0x2600); -
281 glTexParameteri(target, 0x2800, 0x2600); -
282 glTexParameteri(target, 0x2802, 0x812F); -
283 glTexParameteri(target, 0x2803, 0x812F); -
284 QGLContextPrivate::extensionFuncs(ctx).qt_glFramebufferTexture2D(0x8D40, 0x8CE0, -
285 target, texture, 0); -
286 -
287 {}; -
288 valid = checkFramebufferStatus(); -
289 glBindTexture(target, 0); -
290 -
291 color_buffer = 0; -
292 } else {
never executed: }
0
293 mipmap = false; -
294 GLint maxSamples; -
295 glGetIntegerv(0x8D57, &maxSamples); -
296 -
297 samples = qBound(0, int(samples), int(maxSamples)); -
298 -
299 QGLContextPrivate::extensionFuncs(ctx).qt_glGenRenderbuffers(1, &color_buffer); -
300 QGLContextPrivate::extensionFuncs(ctx).qt_glBindRenderbuffer(0x8D41, color_buffer); -
301 if (QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT && samples > 0) {
never evaluated: QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT
never evaluated: samples > 0
0
302 QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT(0x8D41, samples, -
303 internal_format, size.width(), size.height()); -
304 } else {
never executed: }
0
305 samples = 0; -
306 QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorage(0x8D41, internal_format, -
307 size.width(), size.height()); -
308 }
never executed: }
0
309 -
310 QGLContextPrivate::extensionFuncs(ctx).qt_glFramebufferRenderbuffer(0x8D40, 0x8CE0, -
311 0x8D41, color_buffer); -
312 -
313 {}; -
314 valid = checkFramebufferStatus(); -
315 -
316 if (valid)
never evaluated: valid
0
317 QGLContextPrivate::extensionFuncs(ctx).qt_glGetRenderbufferParameteriv(0x8D41, 0x8CAB, &samples);
never executed: QGLContextPrivate::extensionFuncs(ctx).qt_glGetRenderbufferParameteriv(0x8D41, 0x8CAB, &samples);
0
318 }
never executed: }
0
319 -
320 -
321 -
322 -
323 -
324 if (attachment == QGLFramebufferObject::CombinedDepthStencil
never evaluated: attachment == QGLFramebufferObject::CombinedDepthStencil
0
325 && (QGLExtensions::glExtensions() & QGLExtensions::PackedDepthStencil)) {
never evaluated: (QGLExtensions::glExtensions() & QGLExtensions::PackedDepthStencil)
0
326 -
327 QGLContextPrivate::extensionFuncs(ctx).qt_glGenRenderbuffers(1, &depth_buffer); -
328 qt_noop(); -
329 QGLContextPrivate::extensionFuncs(ctx).qt_glBindRenderbuffer(0x8D41, depth_buffer); -
330 qt_noop(); -
331 if (samples != 0 && QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT)
never evaluated: samples != 0
never evaluated: QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT
0
332 QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT(0x8D41, samples, 0
333 0x88F0, size.width(), size.height());
never executed: QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT(0x8D41, samples, 0x88F0, size.width(), size.height());
0
334 else -
335 QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorage(0x8D41, 0
336 0x88F0, size.width(), size.height());
never executed: QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorage(0x8D41, 0x88F0, size.width(), size.height());
0
337 -
338 stencil_buffer = depth_buffer; -
339 QGLContextPrivate::extensionFuncs(ctx).qt_glFramebufferRenderbuffer(0x8D40, 0x8D00, -
340 0x8D41, depth_buffer); -
341 QGLContextPrivate::extensionFuncs(ctx).qt_glFramebufferRenderbuffer(0x8D40, 0x8D20, -
342 0x8D41, stencil_buffer); -
343 -
344 valid = checkFramebufferStatus(); -
345 if (!valid) {
never evaluated: !valid
0
346 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &depth_buffer); -
347 stencil_buffer = depth_buffer = 0; -
348 }
never executed: }
0
349 }
never executed: }
0
350 -
351 if (depth_buffer == 0 && (attachment == QGLFramebufferObject::CombinedDepthStencil
never evaluated: depth_buffer == 0
never evaluated: attachment == QGLFramebufferObject::CombinedDepthStencil
0
352 || (attachment == QGLFramebufferObject::Depth)))
never evaluated: (attachment == QGLFramebufferObject::Depth)
0
353 { -
354 QGLContextPrivate::extensionFuncs(ctx).qt_glGenRenderbuffers(1, &depth_buffer); -
355 qt_noop(); -
356 QGLContextPrivate::extensionFuncs(ctx).qt_glBindRenderbuffer(0x8D41, depth_buffer); -
357 qt_noop(); -
358 if (samples != 0 && QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT) {
never evaluated: samples != 0
never evaluated: QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT
0
359 QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT(0x8D41, samples, -
360 0x1902, size.width(), size.height()); -
361 -
362 } else {
never executed: }
0
363 QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorage(0x8D41, 0x1902, size.width(), size.height()); -
364 -
365 }
never executed: }
0
366 QGLContextPrivate::extensionFuncs(ctx).qt_glFramebufferRenderbuffer(0x8D40, 0x8D00, -
367 0x8D41, depth_buffer); -
368 valid = checkFramebufferStatus(); -
369 if (!valid) {
never evaluated: !valid
0
370 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &depth_buffer); -
371 depth_buffer = 0; -
372 }
never executed: }
0
373 }
never executed: }
0
374 -
375 if (stencil_buffer == 0 && (attachment == QGLFramebufferObject::CombinedDepthStencil)) {
never evaluated: stencil_buffer == 0
never evaluated: (attachment == QGLFramebufferObject::CombinedDepthStencil)
0
376 QGLContextPrivate::extensionFuncs(ctx).qt_glGenRenderbuffers(1, &stencil_buffer); -
377 qt_noop(); -
378 QGLContextPrivate::extensionFuncs(ctx).qt_glBindRenderbuffer(0x8D41, stencil_buffer); -
379 qt_noop(); -
380 if (samples != 0 && QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT) {
never evaluated: samples != 0
never evaluated: QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT
0
381 -
382 -
383 -
384 -
385 QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorageMultisampleEXT(0x8D41, samples, -
386 0x1901, size.width(), size.height()); -
387 -
388 } else {
never executed: }
0
389 -
390 -
391 -
392 -
393 QGLContextPrivate::extensionFuncs(ctx).qt_glRenderbufferStorage(0x8D41, 0x1901, -
394 size.width(), size.height()); -
395 -
396 }
never executed: }
0
397 QGLContextPrivate::extensionFuncs(ctx).qt_glFramebufferRenderbuffer(0x8D40, 0x8D20, -
398 0x8D41, stencil_buffer); -
399 valid = checkFramebufferStatus(); -
400 if (!valid) {
never evaluated: !valid
0
401 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &stencil_buffer); -
402 stencil_buffer = 0; -
403 }
never executed: }
0
404 }
never executed: }
0
405 -
406 -
407 valid = checkFramebufferStatus(); -
408 -
409 if (depth_buffer && stencil_buffer) {
never evaluated: depth_buffer
never evaluated: stencil_buffer
0
410 fbo_attachment = QGLFramebufferObject::CombinedDepthStencil; -
411 } else if (depth_buffer) {
never evaluated: depth_buffer
never executed: }
0
412 fbo_attachment = QGLFramebufferObject::Depth; -
413 } else {
never executed: }
0
414 fbo_attachment = QGLFramebufferObject::NoAttachment; -
415 }
never executed: }
0
416 -
417 QGLContextPrivate::extensionFuncs(ctx).qt_glBindFramebuffer(0x8D40, ctx->d_ptr->current_fbo); -
418 if (valid) {
never evaluated: valid
0
419 fbo_guard = createSharedResourceGuard(ctx, fbo, freeFramebufferFunc); -
420 if (color_buffer)
never evaluated: color_buffer
0
421 color_buffer_guard = createSharedResourceGuard(ctx, color_buffer, freeRenderbufferFunc);
never executed: color_buffer_guard = createSharedResourceGuard(ctx, color_buffer, freeRenderbufferFunc);
0
422 else -
423 texture_guard = createSharedResourceGuard(ctx, texture, freeTextureFunc);
never executed: texture_guard = createSharedResourceGuard(ctx, texture, freeTextureFunc);
0
424 if (depth_buffer)
never evaluated: depth_buffer
0
425 depth_buffer_guard = createSharedResourceGuard(ctx, depth_buffer, freeRenderbufferFunc);
never executed: depth_buffer_guard = createSharedResourceGuard(ctx, depth_buffer, freeRenderbufferFunc);
0
426 if (stencil_buffer) {
never evaluated: stencil_buffer
0
427 if (stencil_buffer == depth_buffer)
never evaluated: stencil_buffer == depth_buffer
0
428 stencil_buffer_guard = depth_buffer_guard;
never executed: stencil_buffer_guard = depth_buffer_guard;
0
429 else -
430 stencil_buffer_guard = createSharedResourceGuard(ctx, stencil_buffer, freeRenderbufferFunc);
never executed: stencil_buffer_guard = createSharedResourceGuard(ctx, stencil_buffer, freeRenderbufferFunc);
0
431 } -
432 } else {
never executed: }
0
433 if (color_buffer)
never evaluated: color_buffer
0
434 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &color_buffer);
never executed: QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &color_buffer);
0
435 else -
436 glDeleteTextures(1, &texture);
never executed: glDeleteTextures(1, &texture);
0
437 if (depth_buffer)
never evaluated: depth_buffer
0
438 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &depth_buffer);
never executed: QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &depth_buffer);
0
439 if (stencil_buffer && depth_buffer != stencil_buffer)
never evaluated: stencil_buffer
never evaluated: depth_buffer != stencil_buffer
0
440 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &stencil_buffer);
never executed: QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteRenderbuffers(1, &stencil_buffer);
0
441 QGLContextPrivate::extensionFuncs(ctx).qt_glDeleteFramebuffers(1, &fbo); -
442 }
never executed: }
0
443 {}; -
444 -
445 format.setTextureTarget(target); -
446 format.setSamples(int(samples)); -
447 format.setAttachment(fbo_attachment); -
448 format.setInternalTextureFormat(internal_format); -
449 format.setMipmap(mipmap); -
450 -
451 glDevice.setFBO(q, attachment); -
452}
never executed: }
0
453QGLFramebufferObject::QGLFramebufferObject(const QSize &size, GLenum target) -
454 : d_ptr(new QGLFramebufferObjectPrivate) -
455{ -
456 QGLFramebufferObjectPrivate * const d = d_func(); -
457 d->init(this, size, NoAttachment, target, 0x8058); -
458}
never executed: }
0
459QGLFramebufferObject::QGLFramebufferObject(int width, int height, GLenum target) -
460 : d_ptr(new QGLFramebufferObjectPrivate) -
461{ -
462 QGLFramebufferObjectPrivate * const d = d_func(); -
463 d->init(this, QSize(width, height), NoAttachment, target, 0x8058); -
464}
never executed: }
0
465 -
466 -
467 -
468 -
469 -
470 -
471 -
472QGLFramebufferObject::QGLFramebufferObject(const QSize &size, const QGLFramebufferObjectFormat &format) -
473 : d_ptr(new QGLFramebufferObjectPrivate) -
474{ -
475 QGLFramebufferObjectPrivate * const d = d_func(); -
476 d->init(this, size, format.attachment(), format.textureTarget(), format.internalTextureFormat(), -
477 format.samples(), format.mipmap()); -
478}
never executed: }
0
479 -
480 -
481 -
482 -
483 -
484 -
485 -
486QGLFramebufferObject::QGLFramebufferObject(int width, int height, const QGLFramebufferObjectFormat &format) -
487 : d_ptr(new QGLFramebufferObjectPrivate) -
488{ -
489 QGLFramebufferObjectPrivate * const d = d_func(); -
490 d->init(this, QSize(width, height), format.attachment(), format.textureTarget(), -
491 format.internalTextureFormat(), format.samples(), format.mipmap()); -
492}
never executed: }
0
493QGLFramebufferObject::QGLFramebufferObject(int width, int height, Attachment attachment, -
494 GLenum target, GLenum internal_format) -
495 : d_ptr(new QGLFramebufferObjectPrivate) -
496{ -
497 QGLFramebufferObjectPrivate * const d = d_func(); -
498 d->init(this, QSize(width, height), attachment, target, internal_format); -
499}
never executed: }
0
500QGLFramebufferObject::QGLFramebufferObject(const QSize &size, Attachment attachment, -
501 GLenum target, GLenum internal_format) -
502 : d_ptr(new QGLFramebufferObjectPrivate) -
503{ -
504 QGLFramebufferObjectPrivate * const d = d_func(); -
505 d->init(this, size, attachment, target, internal_format); -
506}
never executed: }
0
507 -
508 -
509 -
510 -
511 -
512 -
513QGLFramebufferObject::~QGLFramebufferObject() -
514{ -
515 QGLFramebufferObjectPrivate * const d = d_func(); -
516 -
517 delete d->engine; -
518 -
519 if (d->texture_guard)
never evaluated: d->texture_guard
0
520 d->texture_guard->free();
never executed: d->texture_guard->free();
0
521 if (d->color_buffer_guard)
never evaluated: d->color_buffer_guard
0
522 d->color_buffer_guard->free();
never executed: d->color_buffer_guard->free();
0
523 if (d->depth_buffer_guard)
never evaluated: d->depth_buffer_guard
0
524 d->depth_buffer_guard->free();
never executed: d->depth_buffer_guard->free();
0
525 if (d->stencil_buffer_guard && d->stencil_buffer_guard != d->depth_buffer_guard)
never evaluated: d->stencil_buffer_guard
never evaluated: d->stencil_buffer_guard != d->depth_buffer_guard
0
526 d->stencil_buffer_guard->free();
never executed: d->stencil_buffer_guard->free();
0
527 if (d->fbo_guard)
never evaluated: d->fbo_guard
0
528 d->fbo_guard->free();
never executed: d->fbo_guard->free();
0
529}
never executed: }
0
530bool QGLFramebufferObject::isValid() const -
531{ -
532 const QGLFramebufferObjectPrivate * const d = d_func(); -
533 return d->valid && d->fbo_guard && d->fbo_guard->id();
never executed: return d->valid && d->fbo_guard && d->fbo_guard->id();
0
534} -
535bool QGLFramebufferObject::bind() -
536{ -
537 if (!isValid())
never evaluated: !isValid()
0
538 return false;
never executed: return false;
0
539 QGLFramebufferObjectPrivate * const d = d_func(); -
540 const QGLContext *ctx = QGLContext::currentContext();; -
541 if (!ctx)
never evaluated: !ctx
0
542 return false;
never executed: return false;
0
543 const QGLContext *current = QGLContext::currentContext(); -
544 -
545 -
546 -
547 -
548 -
549 -
550 -
551 QGLContextPrivate::extensionFuncs(ctx).qt_glBindFramebuffer(0x8D40, d->fbo()); -
552 d->valid = d->checkFramebufferStatus(); -
553 if (d->valid && current)
never evaluated: d->valid
never evaluated: current
0
554 current->d_ptr->current_fbo = d->fbo();
never executed: current->d_ptr->current_fbo = d->fbo();
0
555 return d->valid;
never executed: return d->valid;
0
556} -
557bool QGLFramebufferObject::release() -
558{ -
559 if (!isValid())
never evaluated: !isValid()
0
560 return false;
never executed: return false;
0
561 const QGLContext *ctx = QGLContext::currentContext();; -
562 if (!ctx)
never evaluated: !ctx
0
563 return false;
never executed: return false;
0
564 -
565 const QGLContext *current = QGLContext::currentContext(); -
566 if (current) {
never evaluated: current
0
567 current->d_ptr->current_fbo = current->d_ptr->default_fbo; -
568 QGLContextPrivate::extensionFuncs(ctx).qt_glBindFramebuffer(0x8D40, current->d_ptr->default_fbo); -
569 }
never executed: }
0
570 -
571 return true;
never executed: return true;
0
572} -
573GLuint QGLFramebufferObject::texture() const -
574{ -
575 const QGLFramebufferObjectPrivate * const d = d_func(); -
576 return d->texture_guard ? d->texture_guard->id() : 0;
never executed: return d->texture_guard ? d->texture_guard->id() : 0;
0
577} -
578 -
579 -
580 -
581 -
582 -
583 -
584 -
585QSize QGLFramebufferObject::size() const -
586{ -
587 const QGLFramebufferObjectPrivate * const d = d_func(); -
588 return d->size;
never executed: return d->size;
0
589} -
590 -
591 -
592 -
593 -
594QGLFramebufferObjectFormat QGLFramebufferObject::format() const -
595{ -
596 const QGLFramebufferObjectPrivate * const d = d_func(); -
597 return d->format;
never executed: return d->format;
0
598} -
599 -
600 -
601 -
602 -
603 -
604 -
605QImage QGLFramebufferObject::toImage() const -
606{ -
607 const QGLFramebufferObjectPrivate * const d = d_func(); -
608 if (!d->valid)
never evaluated: !d->valid
0
609 return QImage();
never executed: return QImage();
0
610 -
611 -
612 if (format().samples() != 0) {
never evaluated: format().samples() != 0
0
613 QGLFramebufferObject temp(size(), QGLFramebufferObjectFormat()); -
614 -
615 QRect rect(QPoint(0, 0), size()); -
616 blitFramebuffer(&temp, rect, const_cast<QGLFramebufferObject *>(this), rect); -
617 -
618 return temp.toImage();
never executed: return temp.toImage();
0
619 } -
620 -
621 bool wasBound = isBound(); -
622 if (!wasBound)
never evaluated: !wasBound
0
623 const_cast<QGLFramebufferObject *>(this)->bind();
never executed: const_cast<QGLFramebufferObject *>(this)->bind();
0
624 QImage image = qt_gl_read_frame_buffer(d->size, format().internalTextureFormat() != 0x1907, true); -
625 if (!wasBound)
never evaluated: !wasBound
0
626 const_cast<QGLFramebufferObject *>(this)->release();
never executed: const_cast<QGLFramebufferObject *>(this)->release();
0
627 -
628 return image;
never executed: return image;
0
629} -
630 -
631static QGLEngineThreadStorage<QGL2PaintEngineEx> *qt_buffer_2_engine() { static QGlobalStatic<QGLEngineThreadStorage<QGL2PaintEngineEx> > thisGlobalStatic = { { (0) }, false }; if (!thisGlobalStatic.pointer.load() && !thisGlobalStatic.destroyed) { QGLEngineThreadStorage<QGL2PaintEngineEx> *x = new QGLEngineThreadStorage<QGL2PaintEngineEx>; if (!thisGlobalStatic.pointer.testAndSetOrdered(0, x)) delete x; else static QGlobalStaticDeleter<QGLEngineThreadStorage<QGL2PaintEngineEx> > cleanup(thisGlobalStatic); } return thisGlobalStatic.pointer.load(); }
never executed: delete x;
never executed: return thisGlobalStatic.pointer.load();
never evaluated: !thisGlobalStatic.pointer.testAndSetOrdered(0, x)
never evaluated: !thisGlobalStatic.pointer.load()
never evaluated: !thisGlobalStatic.destroyed
0
632 -
633 -
634QPaintEngine *QGLFramebufferObject::paintEngine() const -
635{ -
636 const QGLFramebufferObjectPrivate * const d = d_func(); -
637 if (d->engine)
never evaluated: d->engine
0
638 return d->engine;
never executed: return d->engine;
0
639 -
640 QPaintEngine *engine = qt_buffer_2_engine()->engine(); -
641 if (engine->isActive() && engine->paintDevice() != this) {
never evaluated: engine->isActive()
never evaluated: engine->paintDevice() != this
0
642 d->engine = new QGL2PaintEngineEx; -
643 return d->engine;
never executed: return d->engine;
0
644 } -
645 return engine;
never executed: return engine;
0
646} -
647bool QGLFramebufferObject::bindDefault() -
648{ -
649 QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext()); -
650 -
651 if (ctx) {
never evaluated: ctx
0
652 bool ext_detected = (QGLExtensions::glExtensions() & QGLExtensions::FramebufferObject); -
653 if (!ext_detected || (ext_detected && !qt_resolve_framebufferobject_extensions(ctx)))
never evaluated: !ext_detected
never evaluated: ext_detected
never evaluated: !qt_resolve_framebufferobject_extensions(ctx)
0
654 return false;
never executed: return false;
0
655 -
656 ctx->d_ptr->current_fbo = ctx->d_ptr->default_fbo; -
657 QGLContextPrivate::extensionFuncs(ctx).qt_glBindFramebuffer(0x8D40, ctx->d_ptr->default_fbo); -
658 -
659 -
660 -
661 -
662 }
never executed: }
0
663 -
664 return ctx != 0;
never executed: return ctx != 0;
0
665} -
666 -
667 -
668 -
669 -
670 -
671 -
672 -
673bool QGLFramebufferObject::hasOpenGLFramebufferObjects() -
674{ -
675 return (QGLExtensions::glExtensions() & QGLExtensions::FramebufferObject);
never executed: return (QGLExtensions::glExtensions() & QGLExtensions::FramebufferObject);
0
676} -
677void QGLFramebufferObject::drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget) -
678{ -
679 const_cast<QGLContext *>(QGLContext::currentContext())->drawTexture(target, textureId, textureTarget); -
680}
never executed: }
0
681void QGLFramebufferObject::drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget) -
682{ -
683 const_cast<QGLContext *>(QGLContext::currentContext())->drawTexture(point, textureId, textureTarget); -
684}
never executed: }
0
685 -
686 -
687int QGLFramebufferObject::metric(PaintDeviceMetric metric) const -
688{ -
689 const QGLFramebufferObjectPrivate * const d = d_func(); -
690 -
691 float dpmx = qt_defaultDpiX()*100./2.54; -
692 float dpmy = qt_defaultDpiY()*100./2.54; -
693 int w = d->size.width(); -
694 int h = d->size.height(); -
695 switch (metric) { -
696 case PdmWidth: -
697 return w;
never executed: return w;
0
698 -
699 case PdmHeight: -
700 return h;
never executed: return h;
0
701 -
702 case PdmWidthMM: -
703 return qRound(w * 1000 / dpmx);
never executed: return qRound(w * 1000 / dpmx);
0
704 -
705 case PdmHeightMM: -
706 return qRound(h * 1000 / dpmy);
never executed: return qRound(h * 1000 / dpmy);
0
707 -
708 case PdmNumColors: -
709 return 0;
never executed: return 0;
0
710 -
711 case PdmDepth: -
712 return 32;
never executed: return 32;
0
713 -
714 case PdmDpiX: -
715 return qRound(dpmx * 0.0254);
never executed: return qRound(dpmx * 0.0254);
0
716 -
717 case PdmDpiY: -
718 return qRound(dpmy * 0.0254);
never executed: return qRound(dpmy * 0.0254);
0
719 -
720 case PdmPhysicalDpiX: -
721 return qRound(dpmx * 0.0254);
never executed: return qRound(dpmx * 0.0254);
0
722 -
723 case PdmPhysicalDpiY: -
724 return qRound(dpmy * 0.0254);
never executed: return qRound(dpmy * 0.0254);
0
725 -
726 default: -
727 QMessageLogger("qglframebufferobject.cpp", 1234, __PRETTY_FUNCTION__).warning("QGLFramebufferObject::metric(), Unhandled metric type: %d.\n", metric); -
728 break;
never executed: break;
0
729 } -
730 return 0;
never executed: return 0;
0
731} -
732GLuint QGLFramebufferObject::handle() const -
733{ -
734 const QGLFramebufferObjectPrivate * const d = d_func(); -
735 return d->fbo();
never executed: return d->fbo();
0
736} -
737QGLFramebufferObject::Attachment QGLFramebufferObject::attachment() const -
738{ -
739 const QGLFramebufferObjectPrivate * const d = d_func(); -
740 if (d->valid)
never evaluated: d->valid
0
741 return d->fbo_attachment;
never executed: return d->fbo_attachment;
0
742 return NoAttachment;
never executed: return NoAttachment;
0
743} -
744bool QGLFramebufferObject::isBound() const -
745{ -
746 const QGLFramebufferObjectPrivate * const d = d_func(); -
747 const QGLContext *current = QGLContext::currentContext(); -
748 return current ? current->d_ptr->current_fbo == d->fbo() : false;
never executed: return current ? current->d_ptr->current_fbo == d->fbo() : false;
0
749} -
750bool QGLFramebufferObject::hasOpenGLFramebufferBlit() -
751{ -
752 return (QGLExtensions::glExtensions() & QGLExtensions::FramebufferBlit);
never executed: return (QGLExtensions::glExtensions() & QGLExtensions::FramebufferBlit);
0
753} -
754void QGLFramebufferObject::blitFramebuffer(QGLFramebufferObject *target, const QRect &targetRect, -
755 QGLFramebufferObject *source, const QRect &sourceRect, -
756 GLbitfield buffers, -
757 GLenum filter) -
758{ -
759 if (!(QGLExtensions::glExtensions() & QGLExtensions::FramebufferBlit))
never evaluated: !(QGLExtensions::glExtensions() & QGLExtensions::FramebufferBlit)
0
760 return;
never executed: return;
0
761 -
762 const QGLContext *ctx = QGLContext::currentContext(); -
763 if (!ctx || !ctx->contextHandle())
never evaluated: !ctx
never evaluated: !ctx->contextHandle()
0
764 return;
never executed: return;
0
765 -
766 QSurface *surface = ctx->contextHandle()->surface(); -
767 -
768 const int height = static_cast<QWindow *>(surface)->height(); -
769 -
770 const int sh = source ? source->height() : height;
never evaluated: source
0
771 const int th = target ? target->height() : height;
never evaluated: target
0
772 -
773 const int sx0 = sourceRect.left(); -
774 const int sx1 = sourceRect.left() + sourceRect.width(); -
775 const int sy0 = sh - (sourceRect.top() + sourceRect.height()); -
776 const int sy1 = sh - sourceRect.top(); -
777 -
778 const int tx0 = targetRect.left(); -
779 const int tx1 = targetRect.left() + targetRect.width(); -
780 const int ty0 = th - (targetRect.top() + targetRect.height()); -
781 const int ty1 = th - targetRect.top(); -
782 -
783 QGLContextPrivate::extensionFuncs(ctx).qt_glBindFramebuffer(0x8CA8, source ? source->handle() : 0); -
784 QGLContextPrivate::extensionFuncs(ctx).qt_glBindFramebuffer(0x8CA9, target ? target->handle() : 0); -
785 -
786 QGLContextPrivate::extensionFuncs(ctx).qt_glBlitFramebufferEXT(sx0, sy0, sx1, sy1, -
787 tx0, ty0, tx1, ty1, -
788 buffers, filter); -
789 -
790 QGLContextPrivate::extensionFuncs(ctx).qt_glBindFramebuffer(0x8D40, ctx->d_ptr->current_fbo); -
791}
never executed: }
0
792 -
793 -
794 -
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial