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 689646762261d976d34bee8c8b1dcda9656cec655cJosé FonsecawglCreatePbufferARB(HDC hCurrentDC, 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; 849646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca int iDisplayablePixelFormat; 859646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca PIXELFORMATDESCRIPTOR pfd; 869646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca BOOL bRet; 8731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 889ffc8ea8f4cfa15115a93039cc7099f0fd597fe3José Fonseca info = stw_pixelformat_get_info(iPixelFormat - 1); 8931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (!info) { 9031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca SetLastError(ERROR_INVALID_PIXEL_FORMAT); 9131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return 0; 9231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 9331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 9431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (iWidth <= 0 || iHeight <= 0) { 9531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca SetLastError(ERROR_INVALID_DATA); 9631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return 0; 9731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 9831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 9931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca for (piAttrib = piAttribList; *piAttrib; piAttrib++) { 10031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca switch (*piAttrib) { 10131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca case WGL_PBUFFER_LARGEST_ARB: 10231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca piAttrib++; 10331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca useLargest = *piAttrib; 10431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca break; 10531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca default: 10631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca SetLastError(ERROR_INVALID_DATA); 10731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return 0; 10831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 10931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 11031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 11131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (iWidth > stw_dev->max_2d_length) { 11231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (useLargest) { 11331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca iWidth = stw_dev->max_2d_length; 11431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } else { 11531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca SetLastError(ERROR_NO_SYSTEM_RESOURCES); 11631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return 0; 11731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 11831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 11931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 12031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (iHeight > stw_dev->max_2d_length) { 12131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (useLargest) { 12231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca iHeight = stw_dev->max_2d_length; 12331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } else { 12431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca SetLastError(ERROR_NO_SYSTEM_RESOURCES); 12531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return 0; 12631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 12731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 12831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 12931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca /* 13031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca * Implement pbuffers through invisible windows 13131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca */ 13231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 13331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (first) { 13431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca WNDCLASS wc; 13531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca memset(&wc, 0, sizeof wc); 13631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); 13731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca wc.hCursor = LoadCursor(NULL, IDC_ARROW); 13831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 1399fbd708932d151b6ababbca1e23d01fb22154446José Fonseca wc.lpfnWndProc = WndProc; 14031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca wc.lpszClassName = "wglpbuffer"; 14131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; 14231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca RegisterClass(&wc); 14331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca first = FALSE; 14431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 14531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 146f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca dwExStyle = 0; 147f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN; 148f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca 149f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca if (0) { 150f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca /* 151f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * Don't hide the window -- useful for debugging what the application is 152f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * drawing 153f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca */ 154f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca 155f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca dwStyle |= WS_VISIBLE | WS_OVERLAPPEDWINDOW; 156f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca } else { 157f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca dwStyle |= WS_POPUPWINDOW; 158f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca } 159f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca 160f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca rect.left = 0; 161f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca rect.top = 0; 162f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca rect.right = rect.left + iWidth; 163f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca rect.bottom = rect.top + iHeight; 164f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca 165f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca /* 166f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * The CreateWindowEx parameters are the total (outside) dimensions of the 167f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * window, which can vary with Windows version and user settings. Use 168f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * AdjustWindowRect to get the required total area for the given client area. 169f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * 170f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * AdjustWindowRectEx does not accept WS_OVERLAPPED style (which is defined 171f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * as 0), which means we need to use some other style instead, e.g., 172f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * WS_OVERLAPPEDWINDOW or WS_POPUPWINDOW as above. 173f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca */ 174f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca 175f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca AdjustWindowRectEx(&rect, dwStyle, FALSE, dwExStyle); 176f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca 177f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca hWnd = CreateWindowEx(dwExStyle, 17831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca "wglpbuffer", /* wc.lpszClassName */ 179f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca NULL, 180f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca dwStyle, 181f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca CW_USEDEFAULT, /* x */ 182f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca CW_USEDEFAULT, /* y */ 183f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca rect.right - rect.left, /* width */ 184f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca rect.bottom - rect.top, /* height */ 18531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca NULL, 18631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca NULL, 18731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca NULL, 18831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca NULL); 18931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (!hWnd) { 19031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return 0; 19131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 19231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 193f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca#ifdef DEBUG 194f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca /* 195f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca * Verify the client area size matches the specified size. 196f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca */ 197f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca 198f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca GetClientRect(hWnd, &rect); 199f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca assert(rect.left == 0); 200f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca assert(rect.top == 0); 201f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca assert(rect.right - rect.left == iWidth); 202f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca assert(rect.bottom - rect.top == iHeight); 203f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca#endif 204f4e392bf8d35a87f84c8a58f9d2bd174ec29ebd9José Fonseca 20531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca hDC = GetDC(hWnd); 20631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (!hDC) { 20731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return 0; 20831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 20931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 2109646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca /* 2119646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca * We can't pass non-displayable pixel formats to GDI, which is why we 2129646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca * create the framebuffer object before calling SetPixelFormat(). 2139646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca */ 21431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca fb = stw_framebuffer_create(hDC, iPixelFormat); 21531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca if (!fb) { 21631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca SetLastError(ERROR_NO_SYSTEM_RESOURCES); 2179646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca return NULL; 21831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 21931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 2209646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca fb->bPbuffer = TRUE; 2219646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca iDisplayablePixelFormat = fb->iDisplayablePixelFormat; 2229646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca 2239646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca stw_framebuffer_release(fb); 2249646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca 2259646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca /* 2269646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca * We need to set a displayable pixel format on the hidden window DC 2279646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca * so that wglCreateContext and wglMakeCurrent are not overruled by GDI. 2289646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca */ 2299646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca bRet = SetPixelFormat(hDC, iDisplayablePixelFormat, &pfd); 2309646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca assert(bRet); 2319646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca 23231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return (HPBUFFERARB)fb; 233c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca} 234c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca 235c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca 236c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecaHDC WINAPI 237c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecawglGetPbufferDCARB(HPBUFFERARB hPbuffer) 238c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{ 23931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca struct stw_framebuffer *fb; 24031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca HDC hDC; 24131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 242be05388ce983face72ca17241f0f2e154c11f435Brian Paul if (!hPbuffer) { 243be05388ce983face72ca17241f0f2e154c11f435Brian Paul SetLastError(ERROR_INVALID_HANDLE); 244be05388ce983face72ca17241f0f2e154c11f435Brian Paul return NULL; 245be05388ce983face72ca17241f0f2e154c11f435Brian Paul } 246be05388ce983face72ca17241f0f2e154c11f435Brian Paul 24731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca fb = (struct stw_framebuffer *)hPbuffer; 24831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 24931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca hDC = GetDC(fb->hWnd); 25090a95f4d2c50b63ffa4c114081a1cfa5cdfa05cbJosé Fonseca 25190a95f4d2c50b63ffa4c114081a1cfa5cdfa05cbJosé Fonseca assert(hDC == fb->hDC); 25231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 25331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return hDC; 254c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca} 255c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca 256c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca 257c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonsecaint WINAPI 258c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecawglReleasePbufferDCARB(HPBUFFERARB hPbuffer, 259c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca HDC hDC) 260c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{ 26131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca struct stw_framebuffer *fb; 26231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 263be05388ce983face72ca17241f0f2e154c11f435Brian Paul if (!hPbuffer) { 264be05388ce983face72ca17241f0f2e154c11f435Brian Paul SetLastError(ERROR_INVALID_HANDLE); 265be05388ce983face72ca17241f0f2e154c11f435Brian Paul return 0; 266be05388ce983face72ca17241f0f2e154c11f435Brian Paul } 267be05388ce983face72ca17241f0f2e154c11f435Brian Paul 26831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca fb = (struct stw_framebuffer *)hPbuffer; 26931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 27031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return ReleaseDC(fb->hWnd, hDC); 271c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca} 272c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca 273c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca 274c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecaBOOL WINAPI 275c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecawglDestroyPbufferARB(HPBUFFERARB hPbuffer) 276c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{ 27731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca struct stw_framebuffer *fb; 27831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 279be05388ce983face72ca17241f0f2e154c11f435Brian Paul if (!hPbuffer) { 280be05388ce983face72ca17241f0f2e154c11f435Brian Paul SetLastError(ERROR_INVALID_HANDLE); 281be05388ce983face72ca17241f0f2e154c11f435Brian Paul return FALSE; 282be05388ce983face72ca17241f0f2e154c11f435Brian Paul } 283be05388ce983face72ca17241f0f2e154c11f435Brian Paul 28431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca fb = (struct stw_framebuffer *)hPbuffer; 28531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 28631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca /* This will destroy all our data */ 28731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return DestroyWindow(fb->hWnd); 288c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca} 289c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca 290c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca 291c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecaBOOL WINAPI 292c4a43873c5f2e39def45eb9ca24f538adf3f9196José FonsecawglQueryPbufferARB(HPBUFFERARB hPbuffer, 293c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca int iAttribute, 294c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca int *piValue) 295c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca{ 29631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca struct stw_framebuffer *fb; 29731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 298be05388ce983face72ca17241f0f2e154c11f435Brian Paul if (!hPbuffer) { 299be05388ce983face72ca17241f0f2e154c11f435Brian Paul SetLastError(ERROR_INVALID_HANDLE); 300be05388ce983face72ca17241f0f2e154c11f435Brian Paul return FALSE; 301be05388ce983face72ca17241f0f2e154c11f435Brian Paul } 302be05388ce983face72ca17241f0f2e154c11f435Brian Paul 30331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca fb = (struct stw_framebuffer *)hPbuffer; 30431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 30531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca switch (iAttribute) { 30631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca case WGL_PBUFFER_WIDTH_ARB: 30731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca *piValue = fb->width; 30831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return TRUE; 30931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca case WGL_PBUFFER_HEIGHT_ARB: 3108a5a28b731efc7e1cddd552c46f015ca328662bdBrian Paul *piValue = fb->height; 31131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return TRUE; 31231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca case WGL_PBUFFER_LOST_ARB: 31331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca /* We assume that no content is ever lost due to display mode change */ 31431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca *piValue = FALSE; 31531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return TRUE; 31631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca default: 31731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca SetLastError(ERROR_INVALID_DATA); 31831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca return FALSE; 31931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca } 320c4a43873c5f2e39def45eb9ca24f538adf3f9196José Fonseca} 321