Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2008 VMware, Inc.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28. /**
  29.  * @file
  30.  *
  31.  * Fake WGL API implementation.
  32.  *
  33.  * These functions implement the WGL API, on top of the ICD DDI, so that the
  34.  * resulting DLL can be used as a drop-in replacement for the system's
  35.  * opengl32.dll.
  36.  *
  37.  * These functions never get called for ICD drivers, which use exclusively the
  38.  * ICD DDI, i.e., the Drv* entrypoints.
  39.  */
  40.  
  41. #include <windows.h>
  42.  
  43. #include "util/u_debug.h"
  44. #include "stw_icd.h"
  45. #include "stw_context.h"
  46. #include "stw_pixelformat.h"
  47. #include "stw_wgl.h"
  48. #include "stw_ext_context.h"
  49.  
  50.  
  51. static void
  52. overrideOpenGL32EntryPoints(void);
  53.  
  54. WINGDIAPI BOOL APIENTRY
  55. wglCopyContext(
  56.    HGLRC hglrcSrc,
  57.    HGLRC hglrcDst,
  58.    UINT mask )
  59. {
  60.    return DrvCopyContext( (DHGLRC)(UINT_PTR)hglrcSrc,
  61.                           (DHGLRC)(UINT_PTR)hglrcDst,
  62.                           mask );
  63. }
  64.  
  65. WINGDIAPI HGLRC APIENTRY
  66. wglCreateContext(
  67.    HDC hdc )
  68. {
  69.    overrideOpenGL32EntryPoints();
  70.    return (HGLRC) DrvCreateContext(hdc);
  71. }
  72.  
  73. WINGDIAPI HGLRC APIENTRY
  74. wglCreateLayerContext(
  75.    HDC hdc,
  76.    int iLayerPlane )
  77. {
  78.    overrideOpenGL32EntryPoints();
  79.    return (HGLRC) DrvCreateLayerContext( hdc, iLayerPlane );
  80. }
  81.  
  82. WINGDIAPI BOOL APIENTRY
  83. wglDeleteContext(
  84.    HGLRC hglrc )
  85. {
  86.    return DrvDeleteContext((DHGLRC)(UINT_PTR)hglrc );
  87. }
  88.  
  89.  
  90. WINGDIAPI HGLRC APIENTRY
  91. wglGetCurrentContext( VOID )
  92. {
  93.    return (HGLRC)(UINT_PTR)stw_get_current_context();
  94. }
  95.  
  96. WINGDIAPI HDC APIENTRY
  97. wglGetCurrentDC( VOID )
  98. {
  99.    return stw_get_current_dc();
  100. }
  101.  
  102. WINGDIAPI BOOL APIENTRY
  103. wglMakeCurrent(
  104.    HDC hdc,
  105.    HGLRC hglrc )
  106. {
  107.    return DrvSetContext( hdc, (DHGLRC)(UINT_PTR)hglrc, NULL ) ? TRUE : FALSE;
  108. }
  109.  
  110.  
  111. WINGDIAPI BOOL APIENTRY
  112. wglSwapBuffers(
  113.    HDC hdc )
  114. {
  115.    return DrvSwapBuffers( hdc );
  116. }
  117.  
  118.  
  119. WINGDIAPI DWORD WINAPI
  120. wglSwapMultipleBuffers(UINT n,
  121.                        CONST WGLSWAP *ps)
  122. {
  123.    UINT i;
  124.  
  125.    for (i =0; i < n; ++i)
  126.       wglSwapBuffers(ps->hdc);
  127.  
  128.    return 0;
  129. }
  130.  
  131.  
  132. WINGDIAPI BOOL APIENTRY
  133. wglSwapLayerBuffers(
  134.    HDC hdc,
  135.    UINT fuPlanes )
  136. {
  137.    return DrvSwapLayerBuffers( hdc, fuPlanes );
  138. }
  139.  
  140. WINGDIAPI PROC APIENTRY
  141. wglGetProcAddress(
  142.     LPCSTR lpszProc )
  143. {
  144.    return DrvGetProcAddress( lpszProc );
  145. }
  146.  
  147.  
  148. WINGDIAPI int APIENTRY
  149. wglChoosePixelFormat(
  150.    HDC hdc,
  151.    CONST PIXELFORMATDESCRIPTOR *ppfd )
  152. {
  153.    if (ppfd->nSize != sizeof( PIXELFORMATDESCRIPTOR ) || ppfd->nVersion != 1)
  154.       return 0;
  155.    if (ppfd->iPixelType != PFD_TYPE_RGBA)
  156.       return 0;
  157.    if (!(ppfd->dwFlags & PFD_DRAW_TO_WINDOW))
  158.       return 0;
  159.    if (!(ppfd->dwFlags & PFD_SUPPORT_OPENGL))
  160.       return 0;
  161.    if (ppfd->dwFlags & PFD_DRAW_TO_BITMAP)
  162.       return 0;
  163.    if (ppfd->dwFlags & PFD_SUPPORT_GDI)
  164.       return 0;
  165.    if (!(ppfd->dwFlags & PFD_STEREO_DONTCARE) && (ppfd->dwFlags & PFD_STEREO))
  166.       return 0;
  167.  
  168.    return stw_pixelformat_choose( hdc, ppfd );
  169. }
  170.  
  171. WINGDIAPI int APIENTRY
  172. wglDescribePixelFormat(
  173.    HDC hdc,
  174.    int iPixelFormat,
  175.    UINT nBytes,
  176.    LPPIXELFORMATDESCRIPTOR ppfd )
  177. {
  178.    return DrvDescribePixelFormat( hdc, iPixelFormat, nBytes, ppfd );
  179. }
  180.  
  181. WINGDIAPI int APIENTRY
  182. wglGetPixelFormat(
  183.    HDC hdc )
  184. {
  185.    return stw_pixelformat_get( hdc );
  186. }
  187.  
  188. WINGDIAPI BOOL APIENTRY
  189. wglSetPixelFormat(
  190.    HDC hdc,
  191.    int iPixelFormat,
  192.    const PIXELFORMATDESCRIPTOR *ppfd )
  193. {
  194.     /* SetPixelFormat (hence wglSetPixelFormat) must not touch ppfd, per
  195.      * http://msdn.microsoft.com/en-us/library/dd369049(v=vs.85).aspx
  196.      */
  197.    (void) ppfd;
  198.  
  199.    return DrvSetPixelFormat( hdc, iPixelFormat );
  200. }
  201.  
  202.  
  203. WINGDIAPI BOOL APIENTRY
  204. wglUseFontBitmapsA(
  205.    HDC hdc,
  206.    DWORD first,
  207.    DWORD count,
  208.    DWORD listBase )
  209. {
  210.    (void) hdc;
  211.    (void) first;
  212.    (void) count;
  213.    (void) listBase;
  214.  
  215.    assert( 0 );
  216.  
  217.    return FALSE;
  218. }
  219.  
  220. WINGDIAPI BOOL APIENTRY
  221. wglShareLists(
  222.    HGLRC hglrc1,
  223.    HGLRC hglrc2 )
  224. {
  225.    return DrvShareLists((DHGLRC)(UINT_PTR)hglrc1,
  226.                         (DHGLRC)(UINT_PTR)hglrc2);
  227. }
  228.  
  229. WINGDIAPI BOOL APIENTRY
  230. wglUseFontBitmapsW(
  231.    HDC hdc,
  232.    DWORD first,
  233.    DWORD count,
  234.    DWORD listBase )
  235. {
  236.    (void) hdc;
  237.    (void) first;
  238.    (void) count;
  239.    (void) listBase;
  240.  
  241.    assert( 0 );
  242.  
  243.    return FALSE;
  244. }
  245.  
  246. WINGDIAPI BOOL APIENTRY
  247. wglUseFontOutlinesA(
  248.    HDC hdc,
  249.    DWORD first,
  250.    DWORD count,
  251.    DWORD listBase,
  252.    FLOAT deviation,
  253.    FLOAT extrusion,
  254.    int format,
  255.    LPGLYPHMETRICSFLOAT lpgmf )
  256. {
  257.    (void) hdc;
  258.    (void) first;
  259.    (void) count;
  260.    (void) listBase;
  261.    (void) deviation;
  262.    (void) extrusion;
  263.    (void) format;
  264.    (void) lpgmf;
  265.  
  266.    assert( 0 );
  267.  
  268.    return FALSE;
  269. }
  270.  
  271. WINGDIAPI BOOL APIENTRY
  272. wglUseFontOutlinesW(
  273.    HDC hdc,
  274.    DWORD first,
  275.    DWORD count,
  276.    DWORD listBase,
  277.    FLOAT deviation,
  278.    FLOAT extrusion,
  279.    int format,
  280.    LPGLYPHMETRICSFLOAT lpgmf )
  281. {
  282.    (void) hdc;
  283.    (void) first;
  284.    (void) count;
  285.    (void) listBase;
  286.    (void) deviation;
  287.    (void) extrusion;
  288.    (void) format;
  289.    (void) lpgmf;
  290.  
  291.    assert( 0 );
  292.  
  293.    return FALSE;
  294. }
  295.  
  296. WINGDIAPI BOOL APIENTRY
  297. wglDescribeLayerPlane(
  298.    HDC hdc,
  299.    int iPixelFormat,
  300.    int iLayerPlane,
  301.    UINT nBytes,
  302.    LPLAYERPLANEDESCRIPTOR plpd )
  303. {
  304.    return DrvDescribeLayerPlane(hdc, iPixelFormat, iLayerPlane, nBytes, plpd);
  305. }
  306.  
  307. WINGDIAPI int APIENTRY
  308. wglSetLayerPaletteEntries(
  309.    HDC hdc,
  310.    int iLayerPlane,
  311.    int iStart,
  312.    int cEntries,
  313.    CONST COLORREF *pcr )
  314. {
  315.    return DrvSetLayerPaletteEntries(hdc, iLayerPlane, iStart, cEntries, pcr);
  316. }
  317.  
  318. WINGDIAPI int APIENTRY
  319. wglGetLayerPaletteEntries(
  320.    HDC hdc,
  321.    int iLayerPlane,
  322.    int iStart,
  323.    int cEntries,
  324.    COLORREF *pcr )
  325. {
  326.    return DrvGetLayerPaletteEntries(hdc, iLayerPlane, iStart, cEntries, pcr);
  327. }
  328.  
  329. WINGDIAPI BOOL APIENTRY
  330. wglRealizeLayerPalette(
  331.    HDC hdc,
  332.    int iLayerPlane,
  333.    BOOL bRealize )
  334. {
  335.    (void) hdc;
  336.    (void) iLayerPlane;
  337.    (void) bRealize;
  338.  
  339.    assert( 0 );
  340.  
  341.    return FALSE;
  342. }
  343.  
  344.  
  345. /* When this library is used as a opengl32.dll drop-in replacement, ensure we
  346.  * use the wglCreate/Destroy entrypoints above, and not the true opengl32.dll,
  347.  * which could happen if this library's name is not opengl32.dll exactly.
  348.  *
  349.  * For example, Qt 5.4 bundles this as opengl32sw.dll:
  350.  * https://blog.qt.io/blog/2014/11/27/qt-weekly-21-dynamic-opengl-implementation-loading-in-qt-5-4/
  351.  */
  352. static void
  353. overrideOpenGL32EntryPoints(void)
  354. {
  355.    wglCreateContext_func = &wglCreateContext;
  356.    wglDeleteContext_func = &wglDeleteContext;
  357. }
  358.