glwindrv.cpp revision 92014e4729fedcfc6951c590460b86a585973df7
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** @file
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * VBox OpenGL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2006-2007 innotek GmbH
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
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 *
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.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <iprt/alloc.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <iprt/string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <iprt/assert.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <iprt/thread.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <VBox/err.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "vboxgl.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#define LOG_GROUP LOG_GROUP_SHARED_OPENGL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <VBox/log.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "gldrv.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef VBOX_OGL_DEBUG_WINDOW_OUTPUT
18c2aff776a775d34a4c9893a4c72e0434d68e36artemLRESULT CALLBACK VBoxOGLWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (message)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case WM_CREATE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case WM_CLOSE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PostQuitMessage( 0 );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case WM_DESTROY:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return DefWindowProc( hWnd, message, wParam, lParam );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemDECLCALLBACK(int) vboxWndThread(RTTHREAD ThreadSelf, void *pvUser)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvUser;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HWND hwnd;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hwnd = pClient->hwnd= CreateWindow("VBoxOGL", "VirtualBox OpenGL",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 0, 0, 0, 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL, 0, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Assert(hwnd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while(true)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem MSG msg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (msg.message == WM_QUIT)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine TranslateMessage(&msg);
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine DispatchMessage(&msg);
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DestroyWindow(hwnd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return VINF_SUCCESS;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine#endif
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/**
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Global init of VBox OpenGL for windows
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @returns VBox error code
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint vboxglGlobalInit()
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef VBOX_OGL_DEBUG_WINDOW_OUTPUT
18c2aff776a775d34a4c9893a4c72e0434d68e36artem WNDCLASS wc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.style = CS_OWNDC;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.lpfnWndProc = VBoxOGLWndProc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.cbClsExtra = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.cbWndExtra = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.hInstance = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.hCursor = LoadCursor(NULL, IDC_ARROW);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.lpszMenuName = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wc.lpszClassName = "VBoxOGL";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem RegisterClass(&wc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PIXELFORMATDESCRIPTOR pfd;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int iFormat;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HDC hdc = GetDC(0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ZeroMemory(&pfd, sizeof(pfd));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pfd.nSize = sizeof(pfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pfd.nVersion = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pfd.iPixelType = PFD_TYPE_RGBA;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pfd.cColorBits = 24;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pfd.cDepthBits = 16;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pfd.iLayerType = PFD_MAIN_PLANE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem iFormat = ChoosePixelFormat(hdc, &pfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem SetPixelFormat(hdc, iFormat, &pfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HGLRC hRC = wglCreateContext(hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wglMakeCurrent(hdc, hRC);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem vboxInitOpenGLExtensions();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wglMakeCurrent(NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem wglDeleteContext(hRC);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ReleaseDC(0, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return VINF_SUCCESS;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/**
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Client connect init
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @returns VBox error code
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param pClient Client context
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint vboxglConnect(PVBOXOGLCTX pClient)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("vboxglConnect\n"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return VINF_SUCCESS;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/**
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Client disconnect cleanup
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @returns VBox error code
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param pClient Client context
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint vboxglDisconnect(PVBOXOGLCTX pClient)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("vboxglDisconnect\n"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef VBOX_OGL_DEBUG_WINDOW_OUTPUT
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (pClient->hwnd)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (pClient->hdc)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ReleaseDC(pClient->hwnd, pClient->hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PostMessage(pClient->hwnd, WM_CLOSE, 0, 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->hwnd = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return VINF_SUCCESS;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* Driver functions */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvCreateContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HGLRC glrc = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvCreateContext, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvCreateContext %x\n", hdc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Assert(VBOX_OGL_GUEST_TO_HOST_HDC(hdc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem glrc = wglCreateContext(pClient->hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = (uint64_t)glrc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSetContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvSetContext, 2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HGLRC, hglrc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvSetyContext %x %x\n", hdc, hglrc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglMakeCurrent(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), hglrc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglMakeCurrent failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvCopyContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvDeleteContext, 3);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HGLRC, hglrcSrc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HGLRC, hglrcDst);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(UINT, mask);
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine Log(("DrvCopyContext %x %x %x\n", hglrcSrc, hglrcDst, mask));
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine pClient->lastretval = wglCopyContext(hglrcSrc, hglrcDst, mask);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglCopyContext failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvReleaseContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvReleaseContext, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HGLRC, hglrc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvReleaseContext %x\n", hglrc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* clear current selection */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglMakeCurrent(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglMakeCurrent failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvDeleteContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvDeleteContext, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HGLRC, hglrc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvDeleteContext %x\n", hglrc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglDeleteContext(hglrc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglDeleteContext failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvCreateLayerContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HGLRC glrc = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvCreateLayerContext, 2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iLayerPlane);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvCreateLayerContext %x %d\n", hdc, iLayerPlane));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Assert(VBOX_OGL_GUEST_TO_HOST_HDC(hdc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem glrc = wglCreateLayerContext(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iLayerPlane);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine pClient->lastretval = (uint64_t)glrc;
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine pClient->fHasLastError = true;
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine pClient->ulLastError = GetLastError();
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine}
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkinevoid vboxglDrvShareLists(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine{
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine OGL_CMD(DrvShareLists, 3);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HGLRC, hglrc1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HGLRC, hglrc2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvShareLists %x %x\n", hglrc1, hglrc2));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglShareLists(hglrc1, hglrc2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvRealizeLayerPalette(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvRealizeLayerPalette, 3);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iLayerPlane);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(BOOL, bRealize);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvRealizeLayerPalette %x %d %d\n", hdc, iLayerPlane, bRealize));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglRealizeLayerPalette(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iLayerPlane, bRealize);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSwapLayerBuffers(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvSwapLayerBuffers, 2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(UINT, fuPlanes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvSwapLayerBuffers %x %d\n", hdc, fuPlanes));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = wglSwapLayerBuffers(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), fuPlanes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSetPixelFormat(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int rc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PIXELFORMATDESCRIPTOR pfd;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvSetPixelFormat, 4);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iPixelFormat);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(uint32_t, cx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(uint32_t, cy);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef VBOX_OGL_DEBUG_WINDOW_OUTPUT
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!pClient->hwnd)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem RTThreadCreate(NULL, vboxWndThread, pClient, 0, RTTHREADTYPE_DEFAULT, 0, "OpenGLWnd");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (!pClient->hwnd)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem RTThreadSleep(100);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem RECT rect;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rect.bottom = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rect.left = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rect.right = cx;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rect.top = cy;
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
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->hdc = GetDC(pClient->hwnd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rc = DescribePixelFormat(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iPixelFormat, sizeof(pfd), &pfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rc)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = SetPixelFormat(VBOX_OGL_GUEST_TO_HOST_HDC(hdc), iPixelFormat, &pfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DescribePixelFormat %d failed with 0 (%d)\n", iPixelFormat, GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem AssertFailed();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvSetPixelFormat %x %d (%d,%d)\n", hdc, iPixelFormat, cx, cy));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSwapBuffers(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvSwapBuffers, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvSwapBuffers %x\n", hdc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = SwapBuffers(VBOX_OGL_GUEST_TO_HOST_HDC(hdc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("SwapBuffers failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /** @todo sync bitmap/screen contents */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvDescribeLayerPlane(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PLAYERPLANEDESCRIPTOR plpd;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvDescribeLayerPlane, 4);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iPixelFormat);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iLayerPlane);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(UINT, nBytes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Assert(pClient->cbLastParam == nBytes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem plpd = (PLAYERPLANEDESCRIPTOR)pClient->pLastParam;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
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 if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglDescribeLayerPlane failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvSetLayerPaletteEntries(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvSetLayerPaletteEntries, 5);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iLayerPlane);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iStart);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, cEntries);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_MEMPARAM(COLORREF, pcr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
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 if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglSetLayerPaletteEntries failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvGetLayerPaletteEntries(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem COLORREF *pcr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvGetLayerPaletteEntries, 4);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iLayerPlane);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iStart);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, cEntries);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Assert(pClient->cbLastParam == sizeof(COLORREF)*cEntries);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pcr = (COLORREF *)pClient->pLastParam;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
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 if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("wglGetLayerPaletteEntries failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid vboxglDrvDescribePixelFormat(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LPPIXELFORMATDESCRIPTOR ppfd;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_CMD(DrvDescribePixelFormat, 3);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(HDC, hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(int, iPixelFormat);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem OGL_PARAM(UINT, nBytes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Assert(pClient->cbLastParam == nBytes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ppfd = (LPPIXELFORMATDESCRIPTOR)pClient->pLastParam;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hdc = VBOX_OGL_GUEST_TO_HOST_HDC(hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!hdc)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hdc = GetDC(0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DrvDescribePixelFormat %x %d %d %x\n", hdc, iPixelFormat, nBytes, ppfd));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->lastretval = DescribePixelFormat(hdc, iPixelFormat, nBytes, ppfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!pClient->lastretval)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("DescribePixelFormat failed with %d\n", GetLastError()));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->fHasLastError = true;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pClient->ulLastError = GetLastError();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!VBOX_OGL_GUEST_TO_HOST_HDC(hdc))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ReleaseDC(0, pClient->hdc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artembool vboxDrvIsExtensionAvailable(char *pszExtFunctionName)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem bool fAvailable = !!wglGetProcAddress(pszExtFunctionName);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Log(("vboxDrvIsExtensionAvailable %s -> %d\n", pszExtFunctionName, fAvailable));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return fAvailable;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem