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