1 /*
2  * Mesa 3-D graphics library
3  * Version:  7.11
4  *
5  * Copyright (C) 2011 Morgan Armand <morgan.devel@gmail.com>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11  * and/or sell copies of the Software, and to permit persons to whom the
12  * Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included
15  * in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 #include <windows.h>
26 
27 #define WGL_WGLEXT_PROTOTYPES
28 
29 #include <GL/gl.h>
30 #include <GL/wglext.h>
31 
32 #include "stw_icd.h"
33 #include "stw_context.h"
34 
35 HGLRC WINAPI
wglCreateContextAttribsARB(HDC hDC,HGLRC hShareContext,const int * attribList)36 wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList)
37 {
38    int majorVersion = 1, minorVersion = 0, layerPlane = 0;
39    int contextFlags = 0x0;
40    int profileMask = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
41    int i;
42    BOOL done = FALSE;
43 
44    /* parse attrib_list */
45    if (attribList) {
46       for (i = 0; !done && attribList[i]; i++) {
47          switch (attribList[i]) {
48          case WGL_CONTEXT_MAJOR_VERSION_ARB:
49             majorVersion = attribList[++i];
50             break;
51          case WGL_CONTEXT_MINOR_VERSION_ARB:
52             minorVersion = attribList[++i];
53             break;
54          case WGL_CONTEXT_LAYER_PLANE_ARB:
55             layerPlane = attribList[++i];
56             break;
57          case WGL_CONTEXT_FLAGS_ARB:
58             contextFlags = attribList[++i];
59             break;
60          case WGL_CONTEXT_PROFILE_MASK_ARB:
61             profileMask = attribList[++i];
62             break;
63          case 0:
64             /* end of list */
65             done = TRUE;
66             break;
67          default:
68             /* bad attribute */
69             SetLastError(ERROR_INVALID_PARAMETER);
70             return NULL;
71          }
72       }
73    }
74 
75    /* check version (generate ERROR_INVALID_VERSION_ARB if bad) */
76    switch (majorVersion) {
77    case 1:
78       if (minorVersion < 0 || minorVersion > 5) {
79          SetLastError(ERROR_INVALID_VERSION_ARB);
80          return NULL;
81       }
82       break;
83    case 2:
84       if (minorVersion < 0 || minorVersion > 1) {
85          SetLastError(ERROR_INVALID_VERSION_ARB);
86          return NULL;
87       }
88       break;
89    case 3:
90       if (minorVersion < 0 || minorVersion > 3) {
91          SetLastError(ERROR_INVALID_VERSION_ARB);
92          return NULL;
93       }
94       break;
95    case 4:
96       if (minorVersion < 0 || minorVersion > 2) {
97          SetLastError(ERROR_INVALID_VERSION_ARB);
98          return NULL;
99       }
100       break;
101    default:
102       return NULL;
103    }
104 
105    if ((contextFlags & WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB) &&
106        majorVersion < 3) {
107       SetLastError(ERROR_INVALID_VERSION_ARB);
108       return NULL;
109    }
110 
111    /* check profileMask */
112    if (profileMask != WGL_CONTEXT_CORE_PROFILE_BIT_ARB &&
113        profileMask != WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) {
114       SetLastError(ERROR_INVALID_PROFILE_ARB);
115       return NULL;
116    }
117 
118    return (HGLRC) stw_create_context_attribs(hDC, layerPlane,
119                                              (DHGLRC) (UINT_PTR) hShareContext,
120                                              majorVersion, minorVersion,
121                                              contextFlags, profileMask);
122 }
123