glwindrv.cpp revision 92014e4729fedcfc6951c590460b86a585973df7
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * VBox OpenGL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2006-2007 innotek GmbH
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This file is part of VirtualBox Open Source Edition (OSE), as
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * available from http://www.virtualbox.org. This file is free software;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * you can redistribute it and/or modify it under the terms of the GNU
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * General Public License as published by the Free Software Foundation,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * distribution. VirtualBox OSE is distributed in the hope that it will
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * be useful, but WITHOUT ANY WARRANTY of any kind.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If you received this file as part of a commercial VirtualBox
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * distribution, then only the terms of your commercial VirtualBox
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * license agreement apply instead of the previous paragraph.
18c2aff776a775d34a4c9893a4c72e0434d68e36artemLRESULT CALLBACK VBoxOGLWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return DefWindowProc( hWnd, message, wParam, lParam );
18c2aff776a775d34a4c9893a4c72e0434d68e36artemDECLCALLBACK(int) vboxWndThread(RTTHREAD ThreadSelf, void *pvUser)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hwnd = pClient->hwnd= CreateWindow("VBoxOGL", "VirtualBox OpenGL",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 0, 0, 0, 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while(true)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Global init of VBox OpenGL for windows
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @returns VBox error code
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Client connect init
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @returns VBox error code
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param pClient Client context
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Client disconnect cleanup
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @returns VBox error code
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param pClient Client context
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* Driver functions */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvCreateContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSetContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglMakeCurrent(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), hglrc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglMakeCurrent failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvCopyContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine Log(("DrvCopyContext %x %x %x\n", hglrcSrc, hglrcDst, mask));
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine pClient->lastretval = wglCopyContext(hglrcSrc, hglrcDst, mask);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglCopyContext failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvReleaseContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* clear current selection */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglMakeCurrent(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglMakeCurrent failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvDeleteContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglDeleteContext failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvCreateLayerContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvCreateLayerContext %x %d\n", hdc, iLayerPlane));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem glrc = wglCreateLayerContext(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iLayerPlane);
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkinevoid vboxglDrvShareLists(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvRealizeLayerPalette(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvRealizeLayerPalette %x %d %d\n", hdc, iLayerPlane, bRealize));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglRealizeLayerPalette(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iLayerPlane, bRealize);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSwapLayerBuffers(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglSwapLayerBuffers(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), fuPlanes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSetPixelFormat(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem RTThreadCreate(NULL, vboxWndThread, pClient, 0, RTTHREADTYPE_DEFAULT, 0, "OpenGLWnd");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Convert client rectangel to window rectangle */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem AdjustWindowRect(&rect, WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem SetWindowPos(pClient->hwnd, NULL, 0, 0, rect.right - rect.left, rect.top - rect.bottom, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rc = DescribePixelFormat(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iPixelFormat, sizeof(pfd), &pfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = SetPixelFormat(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iPixelFormat, &pfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DescribePixelFormat %d failed with 0 (%d)\n", iPixelFormat, GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvSetPixelFormat %x %d (%d,%d)\n", hdc, iPixelFormat, cx, cy));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSwapBuffers(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = SwapBuffers(VBOX_OGL_GUEST_TO_HOST_HDC(hdc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("SwapBuffers failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /** @todo sync bitmap/screen contents */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvDescribeLayerPlane(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvDescribeLayerPlane %x %d %d %d %x\n", hdc, iPixelFormat, iLayerPlane, nBytes, plpd));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglDescribeLayerPlane(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iPixelFormat, iLayerPlane, nBytes, plpd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglDescribeLayerPlane failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSetLayerPaletteEntries(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvSetLayerPaletteEntries %x %d %d %d %x\n", hdc, iLayerPlane, iStart, cEntries, pcr));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglSetLayerPaletteEntries(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iLayerPlane, iStart, cEntries, pcr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglSetLayerPaletteEntries failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvGetLayerPaletteEntries(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Assert(pClient->cbLastParam == sizeof(COLORREF)*cEntries);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvGetLayerPaletteEntries %x %d %d %d %x\n", hdc, iLayerPlane, iStart, cEntries, pcr));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglGetLayerPaletteEntries(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iLayerPlane, iStart, cEntries, pcr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglGetLayerPaletteEntries failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvDescribePixelFormat(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvDescribePixelFormat %x %d %d %x\n", hdc, iPixelFormat, nBytes, ppfd));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = DescribePixelFormat(hdc, iPixelFormat, nBytes, ppfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DescribePixelFormat failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artembool vboxDrvIsExtensionAvailable(char *pszExtFunctionName)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem bool fAvailable = !!wglGetProcAddress(pszExtFunctionName);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("vboxDrvIsExtensionAvailable %s -> %d\n", pszExtFunctionName, fAvailable));