Qt 4.8
qglpixelbuffer_win.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtOpenGL 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 Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights. These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file. Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #include <qglpixelbuffer.h>
43 #include <qgl.h>
44 #include <private/qgl_p.h>
45 
46 #include <private/qglpixelbuffer_p.h>
47 
48 #include <qimage.h>
49 #include <qdebug.h>
50 
52 
53 /* WGL_WGLEXT_PROTOTYPES */
54 typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
55 typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
56 typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
57 typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
58 typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
59 typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
60 typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
61 typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
62 typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
63 typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
64 typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
65 typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int * piAttribList);
66 
67 #ifndef WGL_ARB_pbuffer
68 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D
69 #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
70 #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
71 #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
72 #define WGL_PBUFFER_LARGEST_ARB 0x2033
73 #define WGL_PBUFFER_WIDTH_ARB 0x2034
74 #define WGL_PBUFFER_HEIGHT_ARB 0x2035
75 #define WGL_PBUFFER_LOST_ARB 0x2036
76 #endif
77 
78 #ifndef WGL_ARB_pixel_format
79 #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
80 #define WGL_DRAW_TO_WINDOW_ARB 0x2001
81 #define WGL_DRAW_TO_BITMAP_ARB 0x2002
82 #define WGL_ACCELERATION_ARB 0x2003
83 #define WGL_NEED_PALETTE_ARB 0x2004
84 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
85 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
86 #define WGL_SWAP_METHOD_ARB 0x2007
87 #define WGL_NUMBER_OVERLAYS_ARB 0x2008
88 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009
89 #define WGL_TRANSPARENT_ARB 0x200A
90 #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
91 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
92 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
93 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
94 #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
95 #define WGL_SHARE_DEPTH_ARB 0x200C
96 #define WGL_SHARE_STENCIL_ARB 0x200D
97 #define WGL_SHARE_ACCUM_ARB 0x200E
98 #define WGL_SUPPORT_GDI_ARB 0x200F
99 #define WGL_SUPPORT_OPENGL_ARB 0x2010
100 #define WGL_DOUBLE_BUFFER_ARB 0x2011
101 #define WGL_STEREO_ARB 0x2012
102 #define WGL_PIXEL_TYPE_ARB 0x2013
103 #define WGL_COLOR_BITS_ARB 0x2014
104 #define WGL_RED_BITS_ARB 0x2015
105 #define WGL_RED_SHIFT_ARB 0x2016
106 #define WGL_GREEN_BITS_ARB 0x2017
107 #define WGL_GREEN_SHIFT_ARB 0x2018
108 #define WGL_BLUE_BITS_ARB 0x2019
109 #define WGL_BLUE_SHIFT_ARB 0x201A
110 #define WGL_ALPHA_BITS_ARB 0x201B
111 #define WGL_ALPHA_SHIFT_ARB 0x201C
112 #define WGL_ACCUM_BITS_ARB 0x201D
113 #define WGL_ACCUM_RED_BITS_ARB 0x201E
114 #define WGL_ACCUM_GREEN_BITS_ARB 0x201F
115 #define WGL_ACCUM_BLUE_BITS_ARB 0x2020
116 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
117 #define WGL_DEPTH_BITS_ARB 0x2022
118 #define WGL_STENCIL_BITS_ARB 0x2023
119 #define WGL_AUX_BUFFERS_ARB 0x2024
120 #define WGL_NO_ACCELERATION_ARB 0x2025
121 #define WGL_GENERIC_ACCELERATION_ARB 0x2026
122 #define WGL_FULL_ACCELERATION_ARB 0x2027
123 #define WGL_SWAP_EXCHANGE_ARB 0x2028
124 #define WGL_SWAP_COPY_ARB 0x2029
125 #define WGL_SWAP_UNDEFINED_ARB 0x202A
126 #define WGL_TYPE_RGBA_ARB 0x202B
127 #define WGL_TYPE_COLORINDEX_ARB 0x202C
128 #endif
129 
130 #ifndef WGL_ARB_render_texture
131 #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
132 #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
133 #define WGL_TEXTURE_FORMAT_ARB 0x2072
134 #define WGL_TEXTURE_TARGET_ARB 0x2073
135 #define WGL_MIPMAP_TEXTURE_ARB 0x2074
136 #define WGL_TEXTURE_RGB_ARB 0x2075
137 #define WGL_TEXTURE_RGBA_ARB 0x2076
138 #define WGL_NO_TEXTURE_ARB 0x2077
139 #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
140 #define WGL_TEXTURE_1D_ARB 0x2079
141 #define WGL_TEXTURE_2D_ARB 0x207A
142 #define WGL_MIPMAP_LEVEL_ARB 0x207B
143 #define WGL_CUBE_MAP_FACE_ARB 0x207C
144 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
145 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
146 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
147 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
148 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
149 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
150 #define WGL_FRONT_LEFT_ARB 0x2083
151 #define WGL_FRONT_RIGHT_ARB 0x2084
152 #define WGL_BACK_LEFT_ARB 0x2085
153 #define WGL_BACK_RIGHT_ARB 0x2086
154 #define WGL_AUX0_ARB 0x2087
155 #define WGL_AUX1_ARB 0x2088
156 #define WGL_AUX2_ARB 0x2089
157 #define WGL_AUX3_ARB 0x208A
158 #define WGL_AUX4_ARB 0x208B
159 #define WGL_AUX5_ARB 0x208C
160 #define WGL_AUX6_ARB 0x208D
161 #define WGL_AUX7_ARB 0x208E
162 #define WGL_AUX8_ARB 0x208F
163 #define WGL_AUX9_ARB 0x2090
164 #endif
165 
166 #ifndef WGL_FLOAT_COMPONENTS_NV
167 #define WGL_FLOAT_COMPONENTS_NV 0x20B0
168 #endif
169 
170 #ifndef WGL_ARB_multisample
171 #define WGL_SAMPLE_BUFFERS_ARB 0x2041
172 #define WGL_SAMPLES_ARB 0x2042
173 #endif
174 
175 #ifndef GL_SAMPLES_ARB
176 #define GL_SAMPLES_ARB 0x80A9
177 #endif
178 
179 QGLFormat pfiToQGLFormat(HDC hdc, int pfi);
180 
181 static void qt_format_to_attrib_list(bool has_render_texture, const QGLFormat &f, int attribs[])
182 {
183  int i = 0;
184  attribs[i++] = WGL_SUPPORT_OPENGL_ARB;
185  attribs[i++] = TRUE;
186  attribs[i++] = WGL_DRAW_TO_PBUFFER_ARB;
187  attribs[i++] = TRUE;
188 
189  if (has_render_texture) {
190  attribs[i++] = WGL_BIND_TO_TEXTURE_RGBA_ARB;
191  attribs[i++] = TRUE;
192  }
193 
194  attribs[i++] = WGL_COLOR_BITS_ARB;
195  attribs[i++] = 32;
196  attribs[i++] = WGL_DOUBLE_BUFFER_ARB;
197  attribs[i++] = FALSE;
198 
199  if (f.stereo()) {
200  attribs[i++] = WGL_STEREO_ARB;
201  attribs[i++] = TRUE;
202  }
203  if (f.depth()) {
204  attribs[i++] = WGL_DEPTH_BITS_ARB;
205  attribs[i++] = f.depthBufferSize() == -1 ? 24 : f.depthBufferSize();
206  }
207  if (f.redBufferSize() != -1) {
208  attribs[i++] = WGL_RED_BITS_ARB;
209  attribs[i++] = f.redBufferSize();
210  }
211  if (f.greenBufferSize() != -1) {
212  attribs[i++] = WGL_GREEN_BITS_ARB;
213  attribs[i++] = f.greenBufferSize();
214  }
215  if (f.blueBufferSize() != -1) {
216  attribs[i++] = WGL_BLUE_BITS_ARB;
217  attribs[i++] = f.blueBufferSize();
218  }
219  if (f.alpha()) {
220  attribs[i++] = WGL_ALPHA_BITS_ARB;
221  attribs[i++] = f.alphaBufferSize() == -1 ? 8 : f.alphaBufferSize();
222  }
223  if (f.accum()) {
224  attribs[i++] = WGL_ACCUM_BITS_ARB;
225  attribs[i++] = f.accumBufferSize() == -1 ? 16 : f.accumBufferSize();
226  }
227  if (f.stencil()) {
228  attribs[i++] = WGL_STENCIL_BITS_ARB;
229  attribs[i++] = f.stencilBufferSize() == -1 ? 8 : f.stencilBufferSize();
230  }
231  if ((f.redBufferSize() > 8 || f.greenBufferSize() > 8
232  || f.blueBufferSize() > 8 || f.alphaBufferSize() > 8)
234  {
235  attribs[i++] = WGL_FLOAT_COMPONENTS_NV;
236  attribs[i++] = TRUE;
237  }
238  if (f.sampleBuffers()) {
239  attribs[i++] = WGL_SAMPLE_BUFFERS_ARB;
240  attribs[i++] = 1;
241  attribs[i++] = WGL_SAMPLES_ARB;
242  attribs[i++] = f.samples() == -1 ? 16 : f.samples();
243  }
244  attribs[i] = 0;
245 }
246 
247 bool QGLPixelBufferPrivate::init(const QSize &size, const QGLFormat &f, QGLWidget *shareWidget)
248 {
249  QGLTemporaryContext tempContext;
250 
251  PFNWGLCREATEPBUFFERARBPROC wglCreatePbufferARB =
252  (PFNWGLCREATEPBUFFERARBPROC) wglGetProcAddress("wglCreatePbufferARB");
253  PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDCARB =
254  (PFNWGLGETPBUFFERDCARBPROC) wglGetProcAddress("wglGetPbufferDCARB");
255  PFNWGLQUERYPBUFFERARBPROC wglQueryPbufferARB =
256  (PFNWGLQUERYPBUFFERARBPROC) wglGetProcAddress("wglQueryPbufferARB");
257  PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB =
258  (PFNWGLCHOOSEPIXELFORMATARBPROC) wglGetProcAddress("wglChoosePixelFormatARB");
259 
260  if (!wglCreatePbufferARB) // assumes that if one can be resolved, all of them can
261  return false;
262 
263  dc = wglGetCurrentDC();
264  Q_ASSERT(dc);
265  has_render_texture = false;
266 
267  // sample buffers doesn't work in conjunction with the render_texture extension
268  if (!f.sampleBuffers()) {
269  PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB =
270  (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB");
271 
272  if (wglGetExtensionsStringARB) {
273  QString extensions(QLatin1String(wglGetExtensionsStringARB(dc)));
274  has_render_texture = extensions.contains(QLatin1String("WGL_ARB_render_texture"));
275  }
276  }
277 
278  int attribs[40];
280 
281  // Find pbuffer capable pixel format.
282  unsigned int num_formats = 0;
283  int pixel_format;
284  wglChoosePixelFormatARB(dc, attribs, 0, 1, &pixel_format, &num_formats);
285 
286  // some GL implementations don't support pbuffers with accum
287  // buffers, so try that before we give up
288  if (num_formats == 0 && f.accum()) {
289  QGLFormat tmp = f;
290  tmp.setAccum(false);
292  wglChoosePixelFormatARB(dc, attribs, 0, 1, &pixel_format, &num_formats);
293  }
294 
295  if (num_formats == 0) {
296  qWarning("QGLPixelBuffer: Unable to find a pixel format with pbuffer - giving up.");
297  return false;
298  }
299  format = pfiToQGLFormat(dc, pixel_format);
300 
301  // NB! The below ONLY works if the width/height are powers of 2.
302  // Set some pBuffer attributes so that we can use this pBuffer as
303  // a 2D RGBA texture target.
304  int pb_attribs[] = {WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB,
306  int pb_attribs_null[] = {0};
307 
308  pbuf = wglCreatePbufferARB(dc, pixel_format, size.width(), size.height(),
309  has_render_texture ? pb_attribs : pb_attribs_null);
310  if (!pbuf) {
311  // try again without the render_texture extension
312  pbuf = wglCreatePbufferARB(dc, pixel_format, size.width(), size.height(), pb_attribs_null);
313  has_render_texture = false;
314  if (!pbuf) {
315  qWarning("QGLPixelBuffer: Unable to create pbuffer [w=%d, h=%d] - giving up.", size.width(), size.height());
316  return false;
317  }
318  }
319 
320  dc = wglGetPbufferDCARB(pbuf);
321  ctx = wglCreateContext(dc);
322  if (!dc || !ctx) {
323  qWarning("QGLPixelBuffer: Unable to create pbuffer context - giving up.");
324  return false;
325  }
326 
327  // Explicitly disable the render_texture extension if we have a
328  // multi-sampled pbuffer context. This seems to be a problem only with
329  // ATI cards if multi-sampling is forced globally in the driver.
330  wglMakeCurrent(dc, ctx);
331  GLint samples = 0;
332  glGetIntegerv(GL_SAMPLES_ARB, &samples);
333  if (has_render_texture && samples != 0)
334  has_render_texture = false;
335 
336  HGLRC share_ctx = shareWidget ? shareWidget->d_func()->glcx->d_func()->rc : 0;
337  if (share_ctx && !wglShareLists(share_ctx, ctx))
338  qWarning("QGLPixelBuffer: Unable to share display lists - with share widget.");
339 
340  int width, height;
341  wglQueryPbufferARB(pbuf, WGL_PBUFFER_WIDTH_ARB, &width);
342  wglQueryPbufferARB(pbuf, WGL_PBUFFER_HEIGHT_ARB, &height);
343  return true;
344 }
345 
347 {
348  PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB =
349  (PFNWGLRELEASEPBUFFERDCARBPROC) wglGetProcAddress("wglReleasePbufferDCARB");
350  PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB =
351  (PFNWGLDESTROYPBUFFERARBPROC) wglGetProcAddress("wglDestroyPbufferARB");
352  if (!invalid && wglReleasePbufferDCARB && wglDestroyPbufferARB) {
353  wglReleasePbufferDCARB(pbuf, dc);
354  wglDestroyPbufferARB(pbuf);
355  }
356  return true;
357 }
358 
359 bool QGLPixelBuffer::bindToDynamicTexture(GLuint texture_id)
360 {
362  if (d->invalid || !d->has_render_texture)
363  return false;
364  PFNWGLBINDTEXIMAGEARBPROC wglBindTexImageARB =
365  (PFNWGLBINDTEXIMAGEARBPROC) wglGetProcAddress("wglBindTexImageARB");
366  if (wglBindTexImageARB) {
367  glBindTexture(GL_TEXTURE_2D, texture_id);
368  return wglBindTexImageARB(d->pbuf, WGL_FRONT_LEFT_ARB);
369  }
370  return false;
371 }
372 
374 {
376  if (d->invalid || !d->has_render_texture)
377  return;
378  PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImageARB =
379  (PFNWGLRELEASETEXIMAGEARBPROC) wglGetProcAddress("wglReleaseTexImageARB");
380  if (wglReleaseTexImageARB)
381  wglReleaseTexImageARB(d->pbuf, WGL_FRONT_LEFT_ARB);
382 }
383 
385 {
386  bool ret = false;
387  QGLTemporaryContext *tmpContext = 0;
389  tmpContext = new QGLTemporaryContext;
390  PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB =
391  (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB");
392  if (wglGetExtensionsStringARB) {
393  QString extensions(QLatin1String(wglGetExtensionsStringARB(wglGetCurrentDC())));
394  if (extensions.contains(QLatin1String("WGL_ARB_pbuffer"))
395  && extensions.contains(QLatin1String("WGL_ARB_pixel_format"))) {
396  ret = true;
397  }
398  }
399  if (tmpContext)
400  delete tmpContext;
401  return ret;
402 }
403 
QBool contains(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition: qstring.h:904
double d
Definition: qnumeric_p.h:62
#define QT_END_NAMESPACE
This macro expands to.
Definition: qglobal.h:90
BOOL(WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC)(HPBUFFERARB hPbuffer, const int *piAttribList)
#define WGL_ALPHA_BITS_ARB
int greenBufferSize() const
Returns the green buffer size.
Definition: qgl.cpp:1070
#define WGL_RED_BITS_ARB
HPBUFFERARB(WINAPI * PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList)
QLatin1String(DBUS_INTERFACE_DBUS))) Q_GLOBAL_STATIC_WITH_ARGS(QString
static void qt_format_to_attrib_list(bool has_render_texture, const QGLFormat &f, int attribs[])
static bool hasOpenGLPbuffers()
Returns true if the OpenGL pbuffer extension is present on this system; otherwise returns false...
#define WGL_SAMPLE_BUFFERS_ARB
The QString class provides a Unicode character string.
Definition: qstring.h:83
BOOL(WINAPI * PFNWGLRELEASETEXIMAGEARBPROC)(HPBUFFERARB hPbuffer, int iBuffer)
#define Q_ASSERT(cond)
Definition: qglobal.h:1823
int redBufferSize() const
Returns the red buffer size.
Definition: qgl.cpp:1035
Q_GUI_EXPORT QString extensions()
Definition: qegl.cpp:785
#define Q_D(Class)
Definition: qglobal.h:2482
BOOL(WINAPI * PFNWGLBINDTEXIMAGEARBPROC)(HPBUFFERARB hPbuffer, int iBuffer)
#define GL_TEXTURE_2D
#define WGL_TEXTURE_RGBA_ARB
#define WGL_BLUE_BITS_ARB
static const QGLContext * currentContext()
Returns the current context, i.e.
Definition: qgl.cpp:3545
bool sampleBuffers() const
Returns true if multisample buffer support is enabled; otherwise returns false.
Definition: qgl.h:658
#define WGL_PBUFFER_HEIGHT_ARB
int width() const
Returns the width.
Definition: qsize.h:126
#define WGL_ACCUM_BITS_ARB
int alphaBufferSize() const
Returns the alpha buffer size.
Definition: qgl.cpp:1132
#define QT_BEGIN_NAMESPACE
This macro expands to.
Definition: qglobal.h:89
bool depth() const
Returns true if the depth buffer is enabled; otherwise returns false.
Definition: qgl.h:618
int accumBufferSize() const
Returns the accumulation buffer size.
Definition: qgl.cpp:1159
The QGLFormat class specifies the display format of an OpenGL rendering context.
Definition: qgl.h:175
#define WGL_PBUFFER_WIDTH_ARB
int depthBufferSize() const
Returns the depth buffer size.
Definition: qgl.cpp:1000
#define WGL_COLOR_BITS_ARB
#define WGL_FLOAT_COMPONENTS_NV
BOOL(WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats)
bool stencil() const
Returns true if the stencil buffer is enabled; otherwise returns false.
Definition: qgl.h:638
Q_CORE_EXPORT void qWarning(const char *,...)
The QLatin1String class provides a thin wrapper around an US-ASCII/Latin-1 encoded string literal...
Definition: qstring.h:654
int(WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC)
#define FALSE
Synonym for false.
Definition: qglobal.h:1019
QGLFormat pfiToQGLFormat(HDC hdc, int pfi)
Definition: qgl_win.cpp:572
The QGLPixelBuffer class encapsulates an OpenGL pbuffer.
bool accum() const
Returns true if the accumulation buffer is enabled; otherwise returns false.
Definition: qgl.h:633
#define WGL_BIND_TO_TEXTURE_RGBA_ARB
#define WGL_STENCIL_BITS_ARB
const char *(WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc)
#define TRUE
Synonym for true.
Definition: qglobal.h:1018
#define WGL_FRONT_LEFT_ARB
BOOL(WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues)
bool bindToDynamicTexture(GLuint texture)
Generates and binds a 2D GL texture that is the same size as the pbuffer, and returns the texture&#39;s I...
#define WGL_GREEN_BITS_ARB
The QGLWidget class is a widget for rendering OpenGL graphics.
Definition: qgl.h:474
HDC(WINAPI * PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer)
#define WGL_DOUBLE_BUFFER_ARB
#define WGL_SAMPLES_ARB
BOOL(WINAPI * PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int *piValue)
#define WGL_DRAW_TO_PBUFFER_ARB
BOOL(WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues)
#define WGL_TEXTURE_2D_ARB
#define WGL_DEPTH_BITS_ARB
#define GL_SAMPLES_ARB
bool alpha() const
Returns true if the alpha buffer in the framebuffer is enabled; otherwise returns false...
Definition: qgl.h:628
#define WGL_SUPPORT_OPENGL_ARB
int height() const
Returns the height.
Definition: qsize.h:129
#define WGL_STEREO_ARB
int blueBufferSize() const
Returns the blue buffer size.
Definition: qgl.cpp:1105
static Extensions glExtensions()
Definition: qgl.cpp:5781
bool init(const QSize &size, const QGLFormat &f, QGLWidget *shareWidget)
typedef GLint
Definition: glfunctions.h:67
The QSize class defines the size of a two-dimensional object using integer point precision.
Definition: qsize.h:53
int stencilBufferSize() const
Returns the stencil buffer size.
Definition: qgl.cpp:1185
BOOL(WINAPI * PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer)
bool stereo() const
Returns true if stereo buffering is enabled; otherwise returns false.
Definition: qgl.h:643
int samples() const
Returns the number of samples per pixel when multisampling is enabled.
Definition: qgl.cpp:824
void releaseFromDynamicTexture()
Releases the pbuffer from any previously bound texture.
#define WGL_TEXTURE_FORMAT_ARB
#define WGL_TEXTURE_TARGET_ARB
void setAccum(bool enable)
If enable is true enables the accumulation buffer; otherwise disables the accumulation buffer...
Definition: qgl.cpp:694