stw_ext_pbuffer.c revision 90a95f4d2c50b63ffa4c114081a1cfa5cdfa05cb
1c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca/**************************************************************************
2c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *
3c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * Copyright 2010 VMware, Inc.
4c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * All Rights Reserved.
5c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *
6c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * copy of this software and associated documentation files (the
8c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * "Software"), to deal in the Software without restriction, including
9c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * the following conditions:
13c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *
14c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * The above copyright notice and this permission notice (including the
15c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * next paragraph) shall be included in all copies or substantial portions
16c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * of the Software.
17c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *
18c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca *
26c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca **************************************************************************/
27c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
28c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca#include <windows.h>
29c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
30c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca#define WGL_WGLEXT_PROTOTYPES
31c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
32c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca#include <GL/gl.h>
33c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca#include <GL/wglext.h>
34c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
3531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca#include "pipe/p_defines.h"
3631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca#include "pipe/p_screen.h"
3731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
3831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca#include "stw_device.h"
3931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca#include "stw_pixelformat.h"
4031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca#include "stw_framebuffer.h"
4131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
42c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
439fbd708932d151b6ababbca1e23d01fb22154446José Fonseca#define LARGE_WINDOW_SIZE 60000
449fbd708932d151b6ababbca1e23d01fb22154446José Fonseca
459fbd708932d151b6ababbca1e23d01fb22154446José Fonseca
469fbd708932d151b6ababbca1e23d01fb22154446José Fonsecastatic LRESULT CALLBACK
479fbd708932d151b6ababbca1e23d01fb22154446José FonsecaWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
489fbd708932d151b6ababbca1e23d01fb22154446José Fonseca{
499fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    MINMAXINFO *pMMI;
509fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    switch (uMsg) {
519fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    case WM_GETMINMAXINFO:
529fbd708932d151b6ababbca1e23d01fb22154446José Fonseca        // Allow to create a window bigger than the desktop
539fbd708932d151b6ababbca1e23d01fb22154446José Fonseca        pMMI = (MINMAXINFO *)lParam;
549fbd708932d151b6ababbca1e23d01fb22154446José Fonseca        pMMI->ptMaxSize.x = LARGE_WINDOW_SIZE;
559fbd708932d151b6ababbca1e23d01fb22154446José Fonseca        pMMI->ptMaxSize.y = LARGE_WINDOW_SIZE;
569fbd708932d151b6ababbca1e23d01fb22154446José Fonseca        pMMI->ptMaxTrackSize.x = LARGE_WINDOW_SIZE;
579fbd708932d151b6ababbca1e23d01fb22154446José Fonseca        pMMI->ptMaxTrackSize.y = LARGE_WINDOW_SIZE;
589fbd708932d151b6ababbca1e23d01fb22154446José Fonseca        break;
599fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    default:
609fbd708932d151b6ababbca1e23d01fb22154446José Fonseca        break;
619fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    }
629fbd708932d151b6ababbca1e23d01fb22154446José Fonseca
639fbd708932d151b6ababbca1e23d01fb22154446José Fonseca    return DefWindowProc(hWnd, uMsg, wParam, lParam);
649fbd708932d151b6ababbca1e23d01fb22154446José Fonseca}
659fbd708932d151b6ababbca1e23d01fb22154446José Fonseca
669fbd708932d151b6ababbca1e23d01fb22154446José Fonseca
67c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecaHPBUFFERARB WINAPI
6831aeac5bf91f3b1daacb1aa27505bfb25215da87José FonsecawglCreatePbufferARB(HDC _hDC,
69c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca                    int iPixelFormat,
70c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca                    int iWidth,
71c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca                    int iHeight,
72c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca                    const int *piAttribList)
73c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{
7431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   static boolean first = TRUE;
7531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   const int *piAttrib;
7631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   int useLargest = 0;
7731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   const struct stw_pixelformat_info *info;
7831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   struct stw_framebuffer *fb;
79f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   DWORD dwExStyle;
80f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   DWORD dwStyle;
81f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   RECT rect;
8231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   HWND hWnd;
8331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   HDC hDC;
8431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
850cf554fa9b31dbac1890f496974392001e2df825José Fonseca   info = stw_pixelformat_get_info(iPixelFormat);
8631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   if (!info) {
8731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      SetLastError(ERROR_INVALID_PIXEL_FORMAT);
8831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      return 0;
8931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
9031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
9131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   if (iWidth <= 0 || iHeight <= 0) {
9231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      SetLastError(ERROR_INVALID_DATA);
9331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      return 0;
9431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
9531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
9631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   for (piAttrib = piAttribList; *piAttrib; piAttrib++) {
9731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      switch (*piAttrib) {
9831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      case WGL_PBUFFER_LARGEST_ARB:
9931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         piAttrib++;
10031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         useLargest = *piAttrib;
10131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         break;
10231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      default:
10331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         SetLastError(ERROR_INVALID_DATA);
10431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         return 0;
10531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      }
10631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
10731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
10831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   if (iWidth > stw_dev->max_2d_length) {
10931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      if (useLargest) {
11031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         iWidth = stw_dev->max_2d_length;
11131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      } else {
11231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         SetLastError(ERROR_NO_SYSTEM_RESOURCES);
11331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         return 0;
11431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      }
11531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
11631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
11731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   if (iHeight > stw_dev->max_2d_length) {
11831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      if (useLargest) {
11931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         iHeight = stw_dev->max_2d_length;
12031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      } else {
12131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         SetLastError(ERROR_NO_SYSTEM_RESOURCES);
12231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca         return 0;
12331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      }
12431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
12531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
12631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   /*
12731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    * Implement pbuffers through invisible windows
12831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca    */
12931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
13031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   if (first) {
13131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      WNDCLASS wc;
13231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      memset(&wc, 0, sizeof wc);
13331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
13431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      wc.hCursor = LoadCursor(NULL, IDC_ARROW);
13531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
1369fbd708932d151b6ababbca1e23d01fb22154446José Fonseca      wc.lpfnWndProc = WndProc;
13731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      wc.lpszClassName = "wglpbuffer";
13831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
13931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      RegisterClass(&wc);
14031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      first = FALSE;
14131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
14231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
143f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   dwExStyle = 0;
144f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
145f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca
146f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   if (0) {
147f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca      /*
148f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca       * Don't hide the window -- useful for debugging what the application is
149f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca       * drawing
150f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca       */
151f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca
152f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca      dwStyle |= WS_VISIBLE | WS_OVERLAPPEDWINDOW;
153f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   } else {
154f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca      dwStyle |= WS_POPUPWINDOW;
155f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   }
156f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca
157f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   rect.left = 0;
158f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   rect.top = 0;
159f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   rect.right = rect.left + iWidth;
160f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   rect.bottom = rect.top + iHeight;
161f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca
162f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   /*
163f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    * The CreateWindowEx parameters are the total (outside) dimensions of the
164f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    * window, which can vary with Windows version and user settings.  Use
165f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    * AdjustWindowRect to get the required total area for the given client area.
166f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    *
167f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    * AdjustWindowRectEx does not accept WS_OVERLAPPED style (which is defined
168f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    * as 0), which means we need to use some other style instead, e.g.,
169f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    * WS_OVERLAPPEDWINDOW or WS_POPUPWINDOW as above.
170f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    */
171f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca
172f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   AdjustWindowRectEx(&rect, dwStyle, FALSE, dwExStyle);
173f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca
174f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   hWnd = CreateWindowEx(dwExStyle,
17531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca                         "wglpbuffer", /* wc.lpszClassName */
176f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca                         NULL,
177f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca                         dwStyle,
178f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca                         CW_USEDEFAULT, /* x */
179f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca                         CW_USEDEFAULT, /* y */
180f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca                         rect.right - rect.left, /* width */
181f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca                         rect.bottom - rect.top, /* height */
18231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca                         NULL,
18331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca                         NULL,
18431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca                         NULL,
18531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca                         NULL);
18631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   if (!hWnd) {
18731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      return 0;
18831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
18931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
190f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca#ifdef DEBUG
191f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   /*
192f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    * Verify the client area size matches the specified size.
193f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca    */
194f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca
195f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   GetClientRect(hWnd, &rect);
196f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   assert(rect.left == 0);
197f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   assert(rect.top == 0);
198f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   assert(rect.right - rect.left == iWidth);
199f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca   assert(rect.bottom - rect.top == iHeight);
200f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca#endif
201f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca
20231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   hDC = GetDC(hWnd);
20331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   if (!hDC) {
20431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      return 0;
20531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
20631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
20731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   SetPixelFormat(hDC, iPixelFormat, &info->pfd);
20831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
20931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   fb = stw_framebuffer_create(hDC, iPixelFormat);
21031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   if (!fb) {
21131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      SetLastError(ERROR_NO_SYSTEM_RESOURCES);
2127b09a9428203db5c0c46b9226ba1d5a06f17b2d8Mathias Froehlich   } else {
2137b09a9428203db5c0c46b9226ba1d5a06f17b2d8Mathias Froehlich      stw_framebuffer_release(fb);
21431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
21531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
21631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   return (HPBUFFERARB)fb;
217c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca}
218c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
219c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
220c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecaHDC WINAPI
221c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecawglGetPbufferDCARB(HPBUFFERARB hPbuffer)
222c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{
22331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   struct stw_framebuffer *fb;
22431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   HDC hDC;
22531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
22631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   fb = (struct stw_framebuffer *)hPbuffer;
22731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
22831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   hDC = GetDC(fb->hWnd);
22990a95f4d2c50b63ffa4c114081a1cfa5cdfa05cbJosé Fonseca
23090a95f4d2c50b63ffa4c114081a1cfa5cdfa05cbJosé Fonseca   assert(hDC == fb->hDC);
23131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
23231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   return hDC;
233c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca}
234c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
235c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
236c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonsecaint WINAPI
237c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecawglReleasePbufferDCARB(HPBUFFERARB hPbuffer,
238c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca                       HDC hDC)
239c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{
24031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   struct stw_framebuffer *fb;
24131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
24231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   fb = (struct stw_framebuffer *)hPbuffer;
24331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
24431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   return ReleaseDC(fb->hWnd, hDC);
245c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca}
246c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
247c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
248c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecaBOOL WINAPI
249c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecawglDestroyPbufferARB(HPBUFFERARB hPbuffer)
250c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{
25131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   struct stw_framebuffer *fb;
25231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
25331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   fb = (struct stw_framebuffer *)hPbuffer;
25431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
25531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   /* This will destroy all our data */
25631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   return DestroyWindow(fb->hWnd);
257c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca}
258c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
259c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca
260c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecaBOOL WINAPI
261c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecawglQueryPbufferARB(HPBUFFERARB hPbuffer,
262c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca                   int iAttribute,
263c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca                   int *piValue)
264c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{
26531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   struct stw_framebuffer *fb;
26631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
26731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   fb = (struct stw_framebuffer *)hPbuffer;
26831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
26931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   switch (iAttribute) {
27031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   case WGL_PBUFFER_WIDTH_ARB:
27131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      *piValue = fb->width;
27231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      return TRUE;
27331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   case WGL_PBUFFER_HEIGHT_ARB:
2748a5a28b731efc7e1cddd552c46f015ca328662bdBrian Paul      *piValue = fb->height;
27531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      return TRUE;
27631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   case WGL_PBUFFER_LOST_ARB:
27731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      /* We assume that no content is ever lost due to display mode change */
27831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      *piValue = FALSE;
27931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      return TRUE;
28031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   default:
28131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      SetLastError(ERROR_INVALID_DATA);
28231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      return FALSE;
28331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   }
284c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca}
285