1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 VMware, Inc. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <windows.h> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WGL_WGLEXT_PROTOTYPES 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/gl.h> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/wglext.h> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "stw_device.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "stw_pixelformat.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "stw_framebuffer.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LARGE_WINDOW_SIZE 60000 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LRESULT CALLBACK 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MINMAXINFO *pMMI; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (uMsg) { 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_GETMINMAXINFO: 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Allow to create a window bigger than the desktop 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pMMI = (MINMAXINFO *)lParam; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pMMI->ptMaxSize.x = LARGE_WINDOW_SIZE; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pMMI->ptMaxSize.y = LARGE_WINDOW_SIZE; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pMMI->ptMaxTrackSize.x = LARGE_WINDOW_SIZE; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pMMI->ptMaxTrackSize.y = LARGE_WINDOW_SIZE; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return DefWindowProc(hWnd, uMsg, wParam, lParam); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgHPBUFFERARB WINAPI 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwglCreatePbufferARB(HDC hCurrentDC, 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int iPixelFormat, 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int iWidth, 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int iHeight, 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *piAttribList) 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static boolean first = TRUE; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *piAttrib; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int useLargest = 0; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct stw_pixelformat_info *info; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct stw_framebuffer *fb; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DWORD dwExStyle; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DWORD dwStyle; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RECT rect; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HWND hWnd; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HDC hDC; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int iDisplayablePixelFormat; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIXELFORMATDESCRIPTOR pfd; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BOOL bRet; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info = stw_pixelformat_get_info(iPixelFormat - 1); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!info) { 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_INVALID_PIXEL_FORMAT); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iWidth <= 0 || iHeight <= 0) { 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_INVALID_DATA); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (piAttrib = piAttribList; *piAttrib; piAttrib++) { 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (*piAttrib) { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WGL_PBUFFER_LARGEST_ARB: 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org piAttrib++; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org useLargest = *piAttrib; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_INVALID_DATA); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iWidth > stw_dev->max_2d_length) { 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (useLargest) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iWidth = stw_dev->max_2d_length; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_NO_SYSTEM_RESOURCES); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iHeight > stw_dev->max_2d_length) { 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (useLargest) { 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iHeight = stw_dev->max_2d_length; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_NO_SYSTEM_RESOURCES); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Implement pbuffers through invisible windows 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (first) { 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WNDCLASS wc; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&wc, 0, sizeof wc); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wc.hCursor = LoadCursor(NULL, IDC_ARROW); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wc.lpfnWndProc = WndProc; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wc.lpszClassName = "wglpbuffer"; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RegisterClass(&wc); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first = FALSE; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwExStyle = 0; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Don't hide the window -- useful for debugging what the application is 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * drawing 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwStyle |= WS_VISIBLE | WS_OVERLAPPEDWINDOW; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwStyle |= WS_POPUPWINDOW; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect.left = 0; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect.top = 0; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect.right = rect.left + iWidth; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect.bottom = rect.top + iHeight; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The CreateWindowEx parameters are the total (outside) dimensions of the 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * window, which can vary with Windows version and user settings. Use 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AdjustWindowRect to get the required total area for the given client area. 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AdjustWindowRectEx does not accept WS_OVERLAPPED style (which is defined 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as 0), which means we need to use some other style instead, e.g., 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WS_OVERLAPPEDWINDOW or WS_POPUPWINDOW as above. 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org AdjustWindowRectEx(&rect, dwStyle, FALSE, dwExStyle); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hWnd = CreateWindowEx(dwExStyle, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "wglpbuffer", /* wc.lpszClassName */ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwStyle, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CW_USEDEFAULT, /* x */ 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CW_USEDEFAULT, /* y */ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect.right - rect.left, /* width */ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect.bottom - rect.top, /* height */ 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!hWnd) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verify the client area size matches the specified size. 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetClientRect(hWnd, &rect); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rect.left == 0); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rect.top == 0); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rect.right - rect.left == iWidth); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rect.bottom - rect.top == iHeight); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hDC = GetDC(hWnd); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!hDC) { 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We can't pass non-displayable pixel formats to GDI, which is why we 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * create the framebuffer object before calling SetPixelFormat(). 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb = stw_framebuffer_create(hDC, iPixelFormat); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fb) { 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_NO_SYSTEM_RESOURCES); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb->bPbuffer = TRUE; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iDisplayablePixelFormat = fb->iDisplayablePixelFormat; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stw_framebuffer_release(fb); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We need to set a displayable pixel format on the hidden window DC 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so that wglCreateContext and wglMakeCurrent are not overruled by GDI. 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bRet = SetPixelFormat(hDC, iDisplayablePixelFormat, &pfd); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(bRet); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (HPBUFFERARB)fb; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgHDC WINAPI 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwglGetPbufferDCARB(HPBUFFERARB hPbuffer) 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct stw_framebuffer *fb; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HDC hDC; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!hPbuffer) { 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_INVALID_HANDLE); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb = (struct stw_framebuffer *)hPbuffer; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hDC = GetDC(fb->hWnd); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(hDC == fb->hDC); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return hDC; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint WINAPI 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwglReleasePbufferDCARB(HPBUFFERARB hPbuffer, 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HDC hDC) 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct stw_framebuffer *fb; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!hPbuffer) { 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_INVALID_HANDLE); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb = (struct stw_framebuffer *)hPbuffer; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ReleaseDC(fb->hWnd, hDC); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBOOL WINAPI 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwglDestroyPbufferARB(HPBUFFERARB hPbuffer) 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct stw_framebuffer *fb; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!hPbuffer) { 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_INVALID_HANDLE); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb = (struct stw_framebuffer *)hPbuffer; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This will destroy all our data */ 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return DestroyWindow(fb->hWnd); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBOOL WINAPI 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwglQueryPbufferARB(HPBUFFERARB hPbuffer, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int iAttribute, 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *piValue) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct stw_framebuffer *fb; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!hPbuffer) { 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_INVALID_HANDLE); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb = (struct stw_framebuffer *)hPbuffer; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (iAttribute) { 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WGL_PBUFFER_WIDTH_ARB: 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *piValue = fb->width; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WGL_PBUFFER_HEIGHT_ARB: 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *piValue = fb->height; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WGL_PBUFFER_LOST_ARB: 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We assume that no content is ever lost due to display mode change */ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *piValue = FALSE; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetLastError(ERROR_INVALID_DATA); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 321