graw_gdi.c revision 5e1b31066b44713971e2770b3c8fe9e5eea286bf
129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol/************************************************************************** 229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * 329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * Copyright 2010 VMware, Inc. 429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * All Rights Reserved. 529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * 629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * Permission is hereby granted, free of charge, to any person obtaining a 729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * copy of this software and associated documentation files (the 829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * "Software"), to deal in the Software without restriction, including 929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * without limitation the rights to use, copy, modify, merge, publish, 1029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * distribute, sub license, and/or sell copies of the Software, and to 1129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * permit persons to whom the Software is furnished to do so, subject to 1229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * the following conditions: 1329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * 1429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 1829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 1929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * USE OR OTHER DEALINGS IN THE SOFTWARE. 2129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * 2229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * The above copyright notice and this permission notice (including the 2329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * next paragraph) shall be included in all copies or substantial portions 2429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * of the Software. 2529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * 2629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol * 2729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol **************************************************************************/ 2829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 2929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol#include "gdi/gdi_sw_winsys.h" 3029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol#include "pipe/p_screen.h" 3129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol#include "state_tracker/graw.h" 32b46340c740eb5388e9917fca365a6c3003385dffJakob Bornecrantz#include "target-helpers/inline_debug_helper.h" 3389deebb1af7191e9fd7432c181b166d13c659f15Jakob Bornecrantz#include "target-helpers/inline_sw_helper.h" 3429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol#include <windows.h> 3529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 3629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 3729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolstatic LRESULT CALLBACK 3829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolwindow_proc(HWND hWnd, 3929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol UINT uMsg, 4029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol WPARAM wParam, 4129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol LPARAM lParam) 4229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol{ 4329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol switch (uMsg) { 4429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol case WM_DESTROY: 4529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol PostQuitMessage(0); 4629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol break; 4729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 4829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol default: 4929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol return DefWindowProc(hWnd, uMsg, wParam, lParam); 5029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol } 5129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 5229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol return 0; 5329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol} 5429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 5529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolstatic struct { 5629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol void (* draw)(void); 5729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol} graw; 5829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 5929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolstruct pipe_screen * 6029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolgraw_create_window_and_screen(int x, 6129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol int y, 6229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol unsigned width, 6329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol unsigned height, 6429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol enum pipe_format format, 6529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol void **handle) 6629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol{ 6729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol struct sw_winsys *winsys = NULL; 6829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol struct pipe_screen *screen = NULL; 695e1b31066b44713971e2770b3c8fe9e5eea286bfJosé Fonseca WNDCLASSEX wc; 705d28d2f9d4eb783dbf738e36bf60c6c5275d1db9Michal Krol UINT style = WS_VISIBLE | WS_TILEDWINDOW; 715d28d2f9d4eb783dbf738e36bf60c6c5275d1db9Michal Krol RECT rect; 7229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol HWND hWnd = NULL; 7329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol HDC hDC = NULL; 7429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 7529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (format != PIPE_FORMAT_R8G8B8A8_UNORM) 7629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol goto fail; 7729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 7829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol winsys = gdi_create_sw_winsys(); 7929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (winsys == NULL) 8029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol goto fail; 8129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 8289deebb1af7191e9fd7432c181b166d13c659f15Jakob Bornecrantz screen = sw_screen_create(winsys); 8329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (screen == NULL) 8429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol goto fail; 8529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 865e1b31066b44713971e2770b3c8fe9e5eea286bfJosé Fonseca memset(&wc, 0, sizeof wc); 875e1b31066b44713971e2770b3c8fe9e5eea286bfJosé Fonseca wc.cbSize = sizeof wc; 8829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; 8929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.lpfnWndProc = window_proc; 9029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.lpszClassName = "graw-gdi"; 9129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.hInstance = GetModuleHandle(NULL); 9229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 9329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.hCursor = LoadCursor(NULL, IDC_ARROW); 9429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); 9529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol RegisterClassEx(&wc); 9629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 975d28d2f9d4eb783dbf738e36bf60c6c5275d1db9Michal Krol SetRect(&rect, 0, 0, width, height); 985d28d2f9d4eb783dbf738e36bf60c6c5275d1db9Michal Krol AdjustWindowRectEx(&rect, style, FALSE, 0); 995d28d2f9d4eb783dbf738e36bf60c6c5275d1db9Michal Krol 10029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol hWnd = CreateWindowEx(0, 10129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.lpszClassName, 10229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.lpszClassName, 1035d28d2f9d4eb783dbf738e36bf60c6c5275d1db9Michal Krol style, 10429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol x, 10529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol y, 1065d28d2f9d4eb783dbf738e36bf60c6c5275d1db9Michal Krol rect.right - rect.left, 1075d28d2f9d4eb783dbf738e36bf60c6c5275d1db9Michal Krol rect.bottom - rect.top, 10829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol NULL, 10929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol NULL, 11029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol wc.hInstance, 11129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 0); 11229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (hWnd == NULL) 11329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol goto fail; 11429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 11529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol hDC = GetDC(hWnd); 11629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (hDC == NULL) 11729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol goto fail; 11829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 11929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol *handle = (void *)hDC; 12029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 121b46340c740eb5388e9917fca365a6c3003385dffJakob Bornecrantz return debug_screen_wrap(screen); 12229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 12329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolfail: 12429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (hWnd) 12529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol DestroyWindow(hWnd); 12629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 12729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (screen) 12829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol screen->destroy(screen); 12929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 13029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol return NULL; 13129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol} 13229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 13329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolvoid 13429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolgraw_set_display_func(void (* draw)(void)) 13529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol{ 13629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol graw.draw = draw; 13729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol} 13829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 13929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolvoid 14029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krolgraw_main_loop(void) 14129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol{ 14229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol for (;;) { 14329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol MSG msg; 14429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 14529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { 14629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (msg.message == WM_QUIT) { 14729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol return; 14829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol } 14929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol TranslateMessage(&msg); 15029beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol DispatchMessage(&msg); 15129beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol } 15229beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 15329beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol if (graw.draw) { 15429beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol graw.draw(); 15529beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol } 15629beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol 15729beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol Sleep(0); 15829beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol } 15929beaed6dccce5ccedc72446c8d2011324fc92f4Michal Krol} 160