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