ReactOS 0.4.17-dev-923-g4c9a150
adapter_gl.c
Go to the documentation of this file.
1/*
2 * Copyright 2002-2004 Jason Edmeades
3 * Copyright 2003-2004 Raphael Junqueira
4 * Copyright 2004 Christian Costa
5 * Copyright 2005 Oliver Stieber
6 * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
7 * Copyright 2009-2011, 2018 Henri Verbeet for CodeWeavers
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <stdio.h>
25
26#include "wined3d_private.h"
27#include "wined3d_gl.h"
28
32
34{
40};
41
43{
44 const char *extension_string;
46};
47
49{
50 /* APPLE */
51 {"GL_APPLE_fence", APPLE_FENCE },
52 {"GL_APPLE_float_pixels", APPLE_FLOAT_PIXELS },
53 {"GL_APPLE_flush_buffer_range", APPLE_FLUSH_BUFFER_RANGE },
54 {"GL_APPLE_flush_render", APPLE_FLUSH_RENDER },
55 {"GL_APPLE_rgb_422", APPLE_RGB_422 },
56 {"GL_APPLE_ycbcr_422", APPLE_YCBCR_422 },
57
58 /* ARB */
59 {"GL_ARB_base_instance", ARB_BASE_INSTANCE },
60 {"GL_ARB_blend_func_extended", ARB_BLEND_FUNC_EXTENDED },
61 {"GL_ARB_buffer_storage", ARB_BUFFER_STORAGE },
62 {"GL_ARB_clear_buffer_object", ARB_CLEAR_BUFFER_OBJECT },
63 {"GL_ARB_clear_texture", ARB_CLEAR_TEXTURE },
64 {"GL_ARB_clip_control", ARB_CLIP_CONTROL },
65 {"GL_ARB_color_buffer_float", ARB_COLOR_BUFFER_FLOAT },
66 {"GL_ARB_compute_shader", ARB_COMPUTE_SHADER },
67 {"GL_ARB_conservative_depth", ARB_CONSERVATIVE_DEPTH },
68 {"GL_ARB_copy_buffer", ARB_COPY_BUFFER },
69 {"GL_ARB_copy_image", ARB_COPY_IMAGE },
70 {"GL_ARB_cull_distance", ARB_CULL_DISTANCE },
71 {"GL_ARB_debug_output", ARB_DEBUG_OUTPUT },
72 {"GL_ARB_depth_buffer_float", ARB_DEPTH_BUFFER_FLOAT },
73 {"GL_ARB_depth_clamp", ARB_DEPTH_CLAMP },
74 {"GL_ARB_depth_texture", ARB_DEPTH_TEXTURE },
75 {"GL_ARB_derivative_control", ARB_DERIVATIVE_CONTROL },
76 {"GL_ARB_draw_buffers", ARB_DRAW_BUFFERS },
77 {"GL_ARB_draw_buffers_blend", ARB_DRAW_BUFFERS_BLEND },
78 {"GL_ARB_draw_elements_base_vertex", ARB_DRAW_ELEMENTS_BASE_VERTEX },
79 {"GL_ARB_draw_indirect", ARB_DRAW_INDIRECT },
80 {"GL_ARB_draw_instanced", ARB_DRAW_INSTANCED },
81 {"GL_ARB_ES2_compatibility", ARB_ES2_COMPATIBILITY },
82 {"GL_ARB_ES3_compatibility", ARB_ES3_COMPATIBILITY },
83 {"GL_ARB_explicit_attrib_location", ARB_EXPLICIT_ATTRIB_LOCATION },
84 {"GL_ARB_fragment_coord_conventions", ARB_FRAGMENT_COORD_CONVENTIONS},
85 {"GL_ARB_fragment_layer_viewport", ARB_FRAGMENT_LAYER_VIEWPORT },
86 {"GL_ARB_fragment_program", ARB_FRAGMENT_PROGRAM },
87 {"GL_ARB_fragment_program_shadow", ARB_FRAGMENT_PROGRAM_SHADOW },
88 {"GL_ARB_fragment_shader", ARB_FRAGMENT_SHADER },
89 {"GL_ARB_framebuffer_no_attachments", ARB_FRAMEBUFFER_NO_ATTACHMENTS},
90 {"GL_ARB_framebuffer_object", ARB_FRAMEBUFFER_OBJECT },
91 {"GL_ARB_framebuffer_sRGB", ARB_FRAMEBUFFER_SRGB },
92 {"GL_ARB_geometry_shader4", ARB_GEOMETRY_SHADER4 },
93 {"GL_ARB_gpu_shader5", ARB_GPU_SHADER5 },
94 {"GL_ARB_half_float_pixel", ARB_HALF_FLOAT_PIXEL },
95 {"GL_ARB_half_float_vertex", ARB_HALF_FLOAT_VERTEX },
96 {"GL_ARB_instanced_arrays", ARB_INSTANCED_ARRAYS },
97 {"GL_ARB_internalformat_query", ARB_INTERNALFORMAT_QUERY },
98 {"GL_ARB_internalformat_query2", ARB_INTERNALFORMAT_QUERY2 },
99 {"GL_ARB_map_buffer_alignment", ARB_MAP_BUFFER_ALIGNMENT },
100 {"GL_ARB_map_buffer_range", ARB_MAP_BUFFER_RANGE },
101 {"GL_ARB_multisample", ARB_MULTISAMPLE },
102 {"GL_ARB_multitexture", ARB_MULTITEXTURE },
103 {"GL_ARB_occlusion_query", ARB_OCCLUSION_QUERY },
104 {"GL_ARB_pipeline_statistics_query", ARB_PIPELINE_STATISTICS_QUERY },
105 {"GL_ARB_pixel_buffer_object", ARB_PIXEL_BUFFER_OBJECT },
106 {"GL_ARB_point_parameters", ARB_POINT_PARAMETERS },
107 {"GL_ARB_point_sprite", ARB_POINT_SPRITE },
108 {"GL_ARB_polygon_offset_clamp", ARB_POLYGON_OFFSET_CLAMP },
109 {"GL_ARB_provoking_vertex", ARB_PROVOKING_VERTEX },
110 {"GL_ARB_query_buffer_object", ARB_QUERY_BUFFER_OBJECT },
111 {"GL_ARB_sample_shading", ARB_SAMPLE_SHADING },
112 {"GL_ARB_sampler_objects", ARB_SAMPLER_OBJECTS },
113 {"GL_ARB_seamless_cube_map", ARB_SEAMLESS_CUBE_MAP },
114 {"GL_ARB_shader_atomic_counters", ARB_SHADER_ATOMIC_COUNTERS },
115 {"GL_ARB_shader_bit_encoding", ARB_SHADER_BIT_ENCODING },
116 {"GL_ARB_shader_image_load_store", ARB_SHADER_IMAGE_LOAD_STORE },
117 {"GL_ARB_shader_image_size", ARB_SHADER_IMAGE_SIZE },
118 {"GL_ARB_shader_stencil_export", ARB_SHADER_STENCIL_EXPORT },
119 {"GL_ARB_shader_storage_buffer_object", ARB_SHADER_STORAGE_BUFFER_OBJECT},
120 {"GL_ARB_shader_texture_image_samples", ARB_SHADER_TEXTURE_IMAGE_SAMPLES},
121 {"GL_ARB_shader_texture_lod", ARB_SHADER_TEXTURE_LOD },
122 {"GL_ARB_shader_viewport_layer_array", ARB_SHADER_VIEWPORT_LAYER_ARRAY},
123 {"GL_ARB_shading_language_100", ARB_SHADING_LANGUAGE_100 },
124 {"GL_ARB_shading_language_420pack", ARB_SHADING_LANGUAGE_420PACK },
125 {"GL_ARB_shading_language_packing", ARB_SHADING_LANGUAGE_PACKING },
126 {"GL_ARB_shadow", ARB_SHADOW },
127 {"GL_ARB_stencil_texturing", ARB_STENCIL_TEXTURING },
128 {"GL_ARB_sync", ARB_SYNC },
129 {"GL_ARB_tessellation_shader", ARB_TESSELLATION_SHADER },
130 {"GL_ARB_texture_border_clamp", ARB_TEXTURE_BORDER_CLAMP },
131 {"GL_ARB_texture_buffer_object", ARB_TEXTURE_BUFFER_OBJECT },
132 {"GL_ARB_texture_buffer_range", ARB_TEXTURE_BUFFER_RANGE },
133 {"GL_ARB_texture_compression", ARB_TEXTURE_COMPRESSION },
134 {"GL_ARB_texture_compression_bptc", ARB_TEXTURE_COMPRESSION_BPTC },
135 {"GL_ARB_texture_compression_rgtc", ARB_TEXTURE_COMPRESSION_RGTC },
136 {"GL_ARB_texture_cube_map", ARB_TEXTURE_CUBE_MAP },
137 {"GL_ARB_texture_cube_map_array", ARB_TEXTURE_CUBE_MAP_ARRAY },
138 {"GL_ARB_texture_env_combine", ARB_TEXTURE_ENV_COMBINE },
139 {"GL_ARB_texture_env_dot3", ARB_TEXTURE_ENV_DOT3 },
140 {"GL_ARB_texture_filter_anisotropic", ARB_TEXTURE_FILTER_ANISOTROPIC},
141 {"GL_ARB_texture_float", ARB_TEXTURE_FLOAT },
142 {"GL_ARB_texture_gather", ARB_TEXTURE_GATHER },
143 {"GL_ARB_texture_mirrored_repeat", ARB_TEXTURE_MIRRORED_REPEAT },
144 {"GL_ARB_texture_mirror_clamp_to_edge", ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE},
145 {"GL_ARB_texture_multisample", ARB_TEXTURE_MULTISAMPLE },
146 {"GL_ARB_texture_non_power_of_two", ARB_TEXTURE_NON_POWER_OF_TWO },
147 {"GL_ARB_texture_query_levels", ARB_TEXTURE_QUERY_LEVELS },
148 {"GL_ARB_texture_rg", ARB_TEXTURE_RG },
149 {"GL_ARB_texture_rgb10_a2ui", ARB_TEXTURE_RGB10_A2UI },
150 {"GL_ARB_texture_storage", ARB_TEXTURE_STORAGE },
151 {"GL_ARB_texture_storage_multisample", ARB_TEXTURE_STORAGE_MULTISAMPLE},
152 {"GL_ARB_texture_swizzle", ARB_TEXTURE_SWIZZLE },
153 {"GL_ARB_texture_view", ARB_TEXTURE_VIEW },
154 {"GL_ARB_timer_query", ARB_TIMER_QUERY },
155 {"GL_ARB_transform_feedback2", ARB_TRANSFORM_FEEDBACK2 },
156 {"GL_ARB_transform_feedback3", ARB_TRANSFORM_FEEDBACK3 },
157 {"GL_ARB_uniform_buffer_object", ARB_UNIFORM_BUFFER_OBJECT },
158 {"GL_ARB_vertex_array_bgra", ARB_VERTEX_ARRAY_BGRA },
159 {"GL_ARB_vertex_buffer_object", ARB_VERTEX_BUFFER_OBJECT },
160 {"GL_ARB_vertex_program", ARB_VERTEX_PROGRAM },
161 {"GL_ARB_vertex_shader", ARB_VERTEX_SHADER },
162 {"GL_ARB_vertex_type_10f_11f_11f_rev", ARB_VERTEX_TYPE_10F_11F_11F_REV},
163 {"GL_ARB_vertex_type_2_10_10_10_rev", ARB_VERTEX_TYPE_2_10_10_10_REV},
164 {"GL_ARB_viewport_array", ARB_VIEWPORT_ARRAY },
165 {"GL_ARB_texture_barrier", ARB_TEXTURE_BARRIER },
166
167 /* ATI */
168 {"GL_ATI_fragment_shader", ATI_FRAGMENT_SHADER },
169 {"GL_ATI_separate_stencil", ATI_SEPARATE_STENCIL },
170 {"GL_ATI_texture_compression_3dc", ATI_TEXTURE_COMPRESSION_3DC },
171 {"GL_ATI_texture_env_combine3", ATI_TEXTURE_ENV_COMBINE3 },
172 {"GL_ATI_texture_mirror_once", ATI_TEXTURE_MIRROR_ONCE },
173
174 /* EXT */
175 {"GL_EXT_blend_color", EXT_BLEND_COLOR },
176 {"GL_EXT_blend_equation_separate", EXT_BLEND_EQUATION_SEPARATE },
177 {"GL_EXT_blend_func_separate", EXT_BLEND_FUNC_SEPARATE },
178 {"GL_EXT_blend_minmax", EXT_BLEND_MINMAX },
179 {"GL_EXT_blend_subtract", EXT_BLEND_SUBTRACT },
180 {"GL_EXT_depth_bounds_test", EXT_DEPTH_BOUNDS_TEST },
181 {"GL_EXT_draw_buffers2", EXT_DRAW_BUFFERS2 },
182 {"GL_EXT_fog_coord", EXT_FOG_COORD },
183 {"GL_EXT_framebuffer_blit", EXT_FRAMEBUFFER_BLIT },
184 {"GL_EXT_framebuffer_multisample", EXT_FRAMEBUFFER_MULTISAMPLE },
185 {"GL_EXT_framebuffer_multisample_blit_scaled",
187 {"GL_EXT_framebuffer_object", EXT_FRAMEBUFFER_OBJECT },
188 {"GL_EXT_memory_object", EXT_MEMORY_OBJECT },
189 {"GL_EXT_gpu_program_parameters", EXT_GPU_PROGRAM_PARAMETERS },
190 {"GL_EXT_gpu_shader4", EXT_GPU_SHADER4 },
191 {"GL_EXT_packed_depth_stencil", EXT_PACKED_DEPTH_STENCIL },
192 {"GL_EXT_packed_float", EXT_PACKED_FLOAT },
193 {"GL_EXT_point_parameters", EXT_POINT_PARAMETERS },
194 {"GL_EXT_polygon_offset_clamp", ARB_POLYGON_OFFSET_CLAMP },
195 {"GL_EXT_provoking_vertex", EXT_PROVOKING_VERTEX },
196 {"GL_EXT_secondary_color", EXT_SECONDARY_COLOR },
197 {"GL_EXT_shader_integer_mix", EXT_SHADER_INTEGER_MIX },
198 {"GL_EXT_stencil_two_side", EXT_STENCIL_TWO_SIDE },
199 {"GL_EXT_stencil_wrap", EXT_STENCIL_WRAP },
200 {"GL_EXT_texture3D", EXT_TEXTURE3D },
201 {"GL_EXT_texture_array", EXT_TEXTURE_ARRAY },
202 {"GL_EXT_texture_compression_rgtc", EXT_TEXTURE_COMPRESSION_RGTC },
203 {"GL_EXT_texture_compression_s3tc", EXT_TEXTURE_COMPRESSION_S3TC },
204 {"GL_EXT_texture_env_combine", EXT_TEXTURE_ENV_COMBINE },
205 {"GL_EXT_texture_env_dot3", EXT_TEXTURE_ENV_DOT3 },
206 {"GL_EXT_texture_filter_anisotropic", ARB_TEXTURE_FILTER_ANISOTROPIC},
207 {"GL_EXT_texture_integer", EXT_TEXTURE_INTEGER },
208 {"GL_EXT_texture_lod_bias", EXT_TEXTURE_LOD_BIAS },
209 {"GL_EXT_texture_mirror_clamp", EXT_TEXTURE_MIRROR_CLAMP },
210 {"GL_EXT_texture_shadow_lod", EXT_TEXTURE_SHADOW_LOD },
211 {"GL_EXT_texture_shared_exponent", EXT_TEXTURE_SHARED_EXPONENT },
212 {"GL_EXT_texture_snorm", EXT_TEXTURE_SNORM },
213 {"GL_EXT_texture_sRGB", EXT_TEXTURE_SRGB },
214 {"GL_EXT_texture_sRGB_decode", EXT_TEXTURE_SRGB_DECODE },
215 {"GL_EXT_texture_swizzle", ARB_TEXTURE_SWIZZLE },
216 {"GL_EXT_vertex_array_bgra", ARB_VERTEX_ARRAY_BGRA },
217
218 /* NV */
219 {"GL_NV_fence", NV_FENCE },
220 {"GL_NV_fog_distance", NV_FOG_DISTANCE },
221 {"GL_NV_fragment_program", NV_FRAGMENT_PROGRAM },
222 {"GL_NV_fragment_program2", NV_FRAGMENT_PROGRAM2 },
223 {"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION },
224 {"GL_NV_half_float", NV_HALF_FLOAT },
225 {"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT },
226 {"GL_NV_point_sprite", NV_POINT_SPRITE },
227 {"GL_NV_register_combiners", NV_REGISTER_COMBINERS },
228 {"GL_NV_register_combiners2", NV_REGISTER_COMBINERS2 },
229 {"GL_NV_texgen_reflection", NV_TEXGEN_REFLECTION },
230 {"GL_NV_texture_env_combine4", NV_TEXTURE_ENV_COMBINE4 },
231 {"GL_NV_texture_shader", NV_TEXTURE_SHADER },
232 {"GL_NV_texture_shader2", NV_TEXTURE_SHADER2 },
233 {"GL_NV_vertex_program", NV_VERTEX_PROGRAM },
234 {"GL_NV_vertex_program1_1", NV_VERTEX_PROGRAM1_1 },
235 {"GL_NV_vertex_program2", NV_VERTEX_PROGRAM2 },
236 {"GL_NV_vertex_program2_option", NV_VERTEX_PROGRAM2_OPTION },
237 {"GL_NV_vertex_program3", NV_VERTEX_PROGRAM3 },
238 {"GL_NV_texture_barrier", NV_TEXTURE_BARRIER },
239};
240
242{
243 {"WGL_ARB_pixel_format", WGL_ARB_PIXEL_FORMAT },
244 {"WGL_EXT_swap_control", WGL_EXT_SWAP_CONTROL },
245 {"WGL_WINE_pixel_format_passthrough", WGL_WINE_PIXEL_FORMAT_PASSTHROUGH},
246 {"WGL_WINE_query_renderer", WGL_WINE_QUERY_RENDERER },
247};
248
250{
251 const struct wined3d_gl_info *gl_info = ctx->gl_info;
252
253 TRACE("Destroying caps GL context.\n");
254
255 /* Both glDeleteProgram and glDeleteBuffers silently ignore 0 IDs but
256 * this function might be called before the relevant function pointers
257 * in gl_info are initialized. */
258 if (ctx->test_program_id || ctx->test_vbo)
259 {
260 GL_EXTCALL(glDeleteProgram(ctx->test_program_id));
261 GL_EXTCALL(glDeleteBuffers(1, &ctx->test_vbo));
262 }
263
264 if (!wglMakeCurrent(NULL, NULL))
265 ERR("Failed to disable caps GL context.\n");
266
267 if (!wglDeleteContext(ctx->gl_ctx))
268 {
269 unsigned int err = GetLastError();
270 ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx->gl_ctx, err);
271 }
272
273 wined3d_release_dc(ctx->wnd, ctx->dc);
274 DestroyWindow(ctx->wnd);
275
276 if (ctx->restore_gl_ctx && !wglMakeCurrent(ctx->restore_dc, ctx->restore_gl_ctx))
277 ERR("Failed to restore previous GL context.\n");
278}
279
281 struct wined3d_gl_info *gl_info)
282{
283 HGLRC new_ctx;
284
285 if (!(gl_info->p_wglCreateContextAttribsARB = (void *)wglGetProcAddress("wglCreateContextAttribsARB")))
286 return TRUE;
287
288 if (!(new_ctx = context_create_wgl_attribs(gl_info, caps_gl_ctx->dc, NULL)))
289 {
290 gl_info->p_wglCreateContextAttribsARB = NULL;
291 return FALSE;
292 }
293
294 if (!wglMakeCurrent(caps_gl_ctx->dc, new_ctx))
295 {
296 ERR("Failed to make new context current, last error %#lx.\n", GetLastError());
297 if (!wglDeleteContext(new_ctx))
298 ERR("Failed to delete new context, last error %#lx.\n", GetLastError());
299 gl_info->p_wglCreateContextAttribsARB = NULL;
300 return TRUE;
301 }
302
303 if (!wglDeleteContext(caps_gl_ctx->gl_ctx))
304 ERR("Failed to delete old context, last error %#lx.\n", GetLastError());
305 caps_gl_ctx->gl_ctx = new_ctx;
306
307 return TRUE;
308}
309
311{
313 int iPixelFormat;
314
315 TRACE("getting context...\n");
316
317 ctx->restore_dc = wglGetCurrentDC();
318 ctx->restore_gl_ctx = wglGetCurrentContext();
319
320 /* We need a fake window as a hdc retrieved using GetDC(0) can't be used for much GL purposes. */
321 ctx->wnd = CreateWindowA(WINED3D_OPENGL_WINDOW_CLASS_NAME, "WineD3D fake window",
322 WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL);
323 if (!ctx->wnd)
324 {
325 ERR("Failed to create a window.\n");
326 goto fail;
327 }
328
329 ctx->dc = GetDC(ctx->wnd);
330 if (!ctx->dc)
331 {
332 ERR("Failed to get a DC.\n");
333 goto fail;
334 }
335
336 /* PixelFormat selection */
337 ZeroMemory(&pfd, sizeof(pfd));
338 pfd.nSize = sizeof(pfd);
339 pfd.nVersion = 1;
340 pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW; /* PFD_GENERIC_ACCELERATED */
342 pfd.cColorBits = 32;
344
345 if (!(iPixelFormat = ChoosePixelFormat(ctx->dc, &pfd)))
346 {
347 /* If this happens something is very wrong as ChoosePixelFormat barely fails. */
348 ERR("Failed to find a suitable pixel format.\n");
349 goto fail;
350 }
351 DescribePixelFormat(ctx->dc, iPixelFormat, sizeof(pfd), &pfd);
353
354 /* Create a GL context. */
355 if (!(ctx->gl_ctx = wglCreateContext(ctx->dc)))
356 {
357 WARN("Failed to create default context for capabilities initialization.\n");
358 goto fail;
359 }
360
361 /* Make it the current GL context. */
362 if (!wglMakeCurrent(ctx->dc, ctx->gl_ctx))
363 {
364 ERR("Failed to make caps GL context current.\n");
365 goto fail;
366 }
367
368 ctx->gl_info = &adapter_gl->gl_info;
369 return TRUE;
370
371fail:
372 if (ctx->gl_ctx) wglDeleteContext(ctx->gl_ctx);
373 ctx->gl_ctx = NULL;
374 if (ctx->dc) ReleaseDC(ctx->wnd, ctx->dc);
375 ctx->dc = NULL;
376 if (ctx->wnd) DestroyWindow(ctx->wnd);
377 ctx->wnd = NULL;
378 if (ctx->restore_gl_ctx && !wglMakeCurrent(ctx->restore_dc, ctx->restore_gl_ctx))
379 ERR("Failed to restore previous GL context.\n");
380
381 return FALSE;
382}
383
384/* Context activation is done by the caller. */
385static BOOL test_arb_vs_offset_limit(const struct wined3d_gl_info *gl_info)
386{
387 GLuint prog;
388 BOOL ret = FALSE;
389 static const char testcode[] =
390 "!!ARBvp1.0\n"
391 "PARAM C[66] = { program.env[0..65] };\n"
392 "ADDRESS A0;"
393 "PARAM zero = {0.0, 0.0, 0.0, 0.0};\n"
394 "ARL A0.x, zero.x;\n"
395 "MOV result.position, C[A0.x + 65];\n"
396 "END\n";
397
398 while (gl_info->gl_ops.gl.p_glGetError());
399 GL_EXTCALL(glGenProgramsARB(1, &prog));
400 if(!prog) {
401 ERR("Failed to create an ARB offset limit test program\n");
402 }
403 GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog));
405 strlen(testcode), testcode));
406 if (gl_info->gl_ops.gl.p_glGetError())
407 {
408 TRACE("OpenGL implementation does not allow indirect addressing offsets > 63\n");
409 TRACE("error: %s\n", debugstr_a((const char *)gl_info->gl_ops.gl.p_glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
410 ret = TRUE;
411 } else TRACE("OpenGL implementation allows offsets > 63\n");
412
413 GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0));
414 GL_EXTCALL(glDeleteProgramsARB(1, &prog));
415 checkGLcall("ARB vp offset limit test cleanup");
416
417 return ret;
418}
419
421 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
423{
424 return card_vendor == HW_VENDOR_AMD
428}
429
430static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
431 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
433{
438}
439
440static BOOL match_apple(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
441 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
443{
444 /* MacOS has various specialities in the extensions it advertises. Some
445 * have to be loaded from the OpenGL 1.2+ core, while other extensions are
446 * advertised, but software emulated. So try to detect the Apple OpenGL
447 * implementation to apply some extension fixups afterwards.
448 *
449 * Detecting this isn't really easy. The vendor string doesn't mention
450 * Apple. Compile-time checks aren't sufficient either because a Linux
451 * binary may display on a macOS X server via remote X11. So try to detect
452 * the OpenGL implementation by looking at certain Apple extensions. Some
453 * extensions like client storage might be supported on other
454 * implementations too, but GL_APPLE_flush_render is specific to the
455 * macOS X window management, and GL_APPLE_ycbcr_422 is QuickTime
456 * specific. So the chance that other implementations support them is
457 * rather small since Win32 QuickTime uses DirectDraw, not OpenGL.
458 *
459 * This test has been moved into wined3d_guess_gl_vendor(). */
460 return gl_vendor == GL_VENDOR_APPLE;
461}
462
463/* Context activation is done by the caller. */
464static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
465{
466 /* Some OpenGL implementations, namely Apple's Geforce 8 driver, advertises PBOs,
467 * but glTexSubImage from a PBO fails miserably, with the first line repeated over
468 * all the texture. This function detects this bug by its symptom and disables PBOs
469 * if the test fails.
470 *
471 * The test uploads a 4x4 texture via the PBO in the "native" format GL_BGRA,
472 * GL_UNSIGNED_INT_8_8_8_8_REV. This format triggers the bug, and it is what we use
473 * for D3DFMT_A8R8G8B8. Then the texture is read back without any PBO and the data
474 * read back is compared to the original. If they are equal PBOs are assumed to work,
475 * otherwise the PBO extension is disabled. */
477 static const unsigned int pattern[] =
478 {
479 0x00000000, 0x000000ff, 0x0000ff00, 0x40ff0000,
480 0x80ffffff, 0x40ffff00, 0x00ff00ff, 0x0000ffff,
481 0x00ffff00, 0x00ff00ff, 0x0000ffff, 0x000000ff,
482 0x80ff00ff, 0x0000ffff, 0x00ff00ff, 0x40ff00ff
483 };
484 unsigned int check[ARRAY_SIZE(pattern)];
485
486 /* No PBO -> No point in testing them. */
487 if (!gl_info->supported[ARB_PIXEL_BUFFER_OBJECT]) return;
488
489 while (gl_info->gl_ops.gl.p_glGetError());
490 gl_info->gl_ops.gl.p_glGenTextures(1, &texture);
491 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, texture);
492
493 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
494 gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
495 checkGLcall("Specifying the PBO test texture");
496
497 GL_EXTCALL(glGenBuffers(1, &pbo));
498 GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo));
500 checkGLcall("Specifying the PBO test pbo");
501
502 gl_info->gl_ops.gl.p_glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
503 checkGLcall("Loading the PBO test texture");
504
505 GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
506
507 gl_info->gl_ops.gl.p_glFinish(); /* just to be sure */
508
509 memset(check, 0, sizeof(check));
510 gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, check);
511 checkGLcall("Reading back the PBO test texture");
512
513 gl_info->gl_ops.gl.p_glDeleteTextures(1, &texture);
514 GL_EXTCALL(glDeleteBuffers(1, &pbo));
515 checkGLcall("PBO test cleanup");
516
517 if (memcmp(check, pattern, sizeof(check)))
518 {
519 WARN_(d3d_perf)("PBO test failed, read back data doesn't match original.\n"
520 "Disabling PBOs. This may result in slower performance.\n");
522 }
523 else
524 {
525 TRACE("PBO test successful.\n");
526 }
527}
528
529static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
530 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
532{
533 /* Direct3D 9 cards support 40 single float varyings in hardware, most
534 * drivers report 32. ATI misreports 44 varyings. So assume that if we
535 * have more than 44 varyings we have a Direct3D 10+ card. This detection
536 * is for the gl_ClipPos varying quirk. If a Direct3D 9 card really
537 * supports more than 44 varyings and we subtract one in Direct3D 9
538 * shaders it's not going to hurt us because the Direct3D 9 limit is
539 * hardcoded.
540 *
541 * Direct3D 10 cards usually have 64 varyings. */
542 return gl_info->limits.glsl_varyings > 44;
543}
544
546 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
548{
549 return !match_dx10_capable(gl_info, ctx, gl_renderer, gl_vendor, card_vendor, device);
550}
551
552/* A GL context is provided by the caller */
554 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
556{
558 DWORD data[16];
559
561 return FALSE;
562
563 while (gl_info->gl_ops.gl.p_glGetError());
564 GL_EXTCALL(glSecondaryColorPointerEXT)(4, GL_UNSIGNED_BYTE, 4, data);
565 error = gl_info->gl_ops.gl.p_glGetError();
566
567 if (error == GL_NO_ERROR)
568 {
569 TRACE("GL Implementation accepts 4 component specular color pointers\n");
570 return TRUE;
571 }
572 else
573 {
574 TRACE("GL implementation does not accept 4 component specular colors, error %s\n",
576 return FALSE;
577 }
578}
579
580/* A GL context is provided by the caller */
582 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
584{
585 GLuint prog;
586 BOOL ret = FALSE;
587 GLint pos;
588 static const char testcode[] =
589 "!!ARBvp1.0\n"
590 "OPTION NV_vertex_program2;\n"
591 "MOV result.clip[0], 0.0;\n"
592 "MOV result.position, 0.0;\n"
593 "END\n";
594
595 if (!gl_info->supported[NV_VERTEX_PROGRAM2_OPTION]) return FALSE;
596
597 while (gl_info->gl_ops.gl.p_glGetError());
598
599 GL_EXTCALL(glGenProgramsARB(1, &prog));
600 if(!prog)
601 {
602 ERR("Failed to create the NVvp clip test program\n");
603 return FALSE;
604 }
605 GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog));
607 strlen(testcode), testcode));
608 gl_info->gl_ops.gl.p_glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
609 if(pos != -1)
610 {
611 WARN("GL_NV_vertex_program2_option result.clip[] test failed\n");
612 TRACE("error: %s\n", debugstr_a((const char *)gl_info->gl_ops.gl.p_glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
613 ret = TRUE;
614 while (gl_info->gl_ops.gl.p_glGetError());
615 }
616 else TRACE("GL_NV_vertex_program2_option result.clip[] test passed\n");
617
618 GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0));
619 GL_EXTCALL(glDeleteProgramsARB(1, &prog));
620 checkGLcall("GL_NV_vertex_program2_option result.clip[] test cleanup");
621
622 return ret;
623}
624
625/* Context activation is done by the caller. */
627 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
629{
630 char data[4 * 4 * 4];
631 GLuint tex, fbo;
633
634 memset(data, 0xcc, sizeof(data));
635
636 gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
637 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
638 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
639 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
640 gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
641 checkGLcall("glTexImage2D");
642
643 gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
644 gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
645 gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
646 checkGLcall("glFramebufferTexture2D");
647
648 status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
649 if (status != GL_FRAMEBUFFER_COMPLETE) ERR("FBO status %#x\n", status);
650 checkGLcall("glCheckFramebufferStatus");
651
652 memset(data, 0x11, sizeof(data));
653 gl_info->gl_ops.gl.p_glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
654 checkGLcall("glTexSubImage2D");
655
656 gl_info->gl_ops.gl.p_glClearColor(0.996f, 0.729f, 0.745f, 0.792f);
657 gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
658 checkGLcall("glClear");
659
660 gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
661 checkGLcall("glGetTexImage");
662
663 gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
664 gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
665 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
666 checkGLcall("glBindTexture");
667
668 gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
669 gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
670 checkGLcall("glDeleteTextures");
671
672 return *(DWORD *)data == 0x11111111;
673}
674
675/* Context activation is done by the caller. */
676static BOOL match_broken_rgba16(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
677 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
679{
680 /* GL_RGBA16 uses GL_RGBA8 internally on Geforce 7 and older cards.
681 * This leads to graphical bugs in Half Life 2 and Unreal engine games. */
682 GLuint tex;
683 GLint size;
684
685 gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
686 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
687 gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT, NULL);
688 checkGLcall("glTexImage2D");
689
690 gl_info->gl_ops.gl.p_glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_RED_SIZE, &size);
691 checkGLcall("glGetTexLevelParameteriv");
692 TRACE("Real color depth is %d\n", size);
693
694 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
695 checkGLcall("glBindTexture");
696 gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
697 checkGLcall("glDeleteTextures");
698
699 return size < 16;
700}
701
702static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
703 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
705{
706 return gl_vendor == GL_VENDOR_FGLRX;
707}
708
709static BOOL match_r200(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
710 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
712{
713 if (card_vendor != HW_VENDOR_AMD) return FALSE;
714 if (device == CARD_AMD_RADEON_8500) return TRUE;
715 return FALSE;
716}
717
719 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
721{
722 unsigned int data[4];
723 GLuint tex, fbo;
725 float color[4] = {0.0f, 1.0f, 0.0f, 0.0f};
726 GLuint prog;
727 GLint err_pos;
728 static const char program_code[] =
729 "!!ARBfp1.0\n"
730 "OPTION ARB_fog_linear;\n"
731 "MOV result.color, {1.0, 0.0, 0.0, 0.0};\n"
732 "END\n";
733
734 if (!gl_info->supported[ARB_FRAGMENT_PROGRAM])
735 return FALSE;
737 return FALSE;
738
739 gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
740 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
741 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
742 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
743 gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 4, 1, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
744 checkGLcall("glTexImage2D");
745
746 gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
747 gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
748 gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
749 checkGLcall("glFramebufferTexture2D");
750
751 status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
752 if (status != GL_FRAMEBUFFER_COMPLETE) ERR("FBO status %#x\n", status);
753 checkGLcall("glCheckFramebufferStatus");
754
755 gl_info->gl_ops.gl.p_glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
756 gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
757 checkGLcall("glClear");
758 gl_info->gl_ops.gl.p_glViewport(0, 0, 4, 1);
759 checkGLcall("glViewport");
760
761 gl_info->gl_ops.gl.p_glEnable(GL_FOG);
762 gl_info->gl_ops.gl.p_glFogf(GL_FOG_START, 0.5f);
763 gl_info->gl_ops.gl.p_glFogf(GL_FOG_END, 0.5f);
764 gl_info->gl_ops.gl.p_glFogi(GL_FOG_MODE, GL_LINEAR);
765 gl_info->gl_ops.gl.p_glHint(GL_FOG_HINT, GL_NICEST);
766 gl_info->gl_ops.gl.p_glFogfv(GL_FOG_COLOR, color);
767 checkGLcall("fog setup");
768
769 GL_EXTCALL(glGenProgramsARB(1, &prog));
770 GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog));
772 strlen(program_code), program_code));
773 gl_info->gl_ops.gl.p_glEnable(GL_FRAGMENT_PROGRAM_ARB);
774 checkGLcall("Test fragment program setup");
775
776 gl_info->gl_ops.gl.p_glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &err_pos);
777 if (err_pos != -1)
778 {
779 const char *error_str;
780 error_str = (const char *)gl_info->gl_ops.gl.p_glGetString(GL_PROGRAM_ERROR_STRING_ARB);
781 FIXME("Fog test program error at position %d: %s\n\n", err_pos, debugstr_a(error_str));
782 }
783
784 gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
785 gl_info->gl_ops.gl.p_glVertex3f(-1.0f, -1.0f, 0.0f);
786 gl_info->gl_ops.gl.p_glVertex3f( 1.0f, -1.0f, 1.0f);
787 gl_info->gl_ops.gl.p_glVertex3f(-1.0f, 1.0f, 0.0f);
788 gl_info->gl_ops.gl.p_glVertex3f( 1.0f, 1.0f, 1.0f);
789 gl_info->gl_ops.gl.p_glEnd();
790 checkGLcall("ARBfp fog test draw");
791
792 gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
793 checkGLcall("glGetTexImage");
794 data[0] &= 0x00ffffff;
795 data[1] &= 0x00ffffff;
796 data[2] &= 0x00ffffff;
797 data[3] &= 0x00ffffff;
798
799 gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
800 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
801
802 gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
803 gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
804 gl_info->gl_ops.gl.p_glDisable(GL_FOG);
805 GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0));
806 gl_info->gl_ops.gl.p_glDisable(GL_FRAGMENT_PROGRAM_ARB);
807 GL_EXTCALL(glDeleteProgramsARB(1, &prog));
808 checkGLcall("ARBfp fog test teardown");
809
810 TRACE("Fog test data: %08x %08x %08x %08x\n", data[0], data[1], data[2], data[3]);
811 return data[0] != 0x00ff0000 || data[3] != 0x0000ff00;
812}
813
815 struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
817{
818 if (!gl_info->supported[ARB_VIEWPORT_ARRAY])
819 return FALSE;
821}
822
824 struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
826{
827 GLuint tex[2], fbo;
829
830 /* ARB_framebuffer_object allows implementation-dependent internal format
831 * restrictions. The EXT extension explicitly calls out an error in the
832 * relevant case. */
833 if (!gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
834 return TRUE;
835
836 gl_info->gl_ops.gl.p_glGenTextures(2, tex);
837
838 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex[0]);
839 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
840 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
841 gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
842
843 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex[1]);
844 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
845 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
846 gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, 4, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL);
847 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
848
849 gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
850 gl_info->fbo_ops.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
851 gl_info->fbo_ops.glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex[0], 0);
852 gl_info->fbo_ops.glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, tex[1], 0);
853
854 status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
855
856 gl_info->fbo_ops.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
857 gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
858 gl_info->gl_ops.gl.p_glDeleteTextures(2, tex);
859 checkGLcall("testing multiple framebuffer attachments with different bit depths");
860
862}
863
864static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
865{
866 /* MacOS needs uniforms for relative addressing offsets. This can
867 * accumulate to quite a few uniforms. Beyond that the general uniform
868 * isn't optimal, so reserve a number of uniforms. 12 vec4's should allow
869 * 48 different offsets or other helper immediate values. */
870 TRACE("Reserving 12 GLSL constants for compiler private use.\n");
871 gl_info->reserved_glsl_constants = max(gl_info->reserved_glsl_constants, 12);
872}
873
874static void quirk_amd_dx9(struct wined3d_gl_info *gl_info)
875{
876 /* MacOS advertises GL_ARB_texture_non_power_of_two on ATI r500 and
877 * earlier cards, although these cards only support
878 * GL_ARB_texture_rectangle (D3DPTEXTURECAPS_NONPOW2CONDITIONAL).
879 *
880 * If real NP2 textures are used, the driver falls back to software. We
881 * could just disable the extension and use GL_ARB_texture_rectangle
882 * instead, but texture_rectangle is inconvenient due to the
883 * non-normalised texture coordinates. Thus set an internal extension
884 * flag, GL_WINE_normalized_texrect, which signals the code that it can
885 * use non-power-of-two textures as per GL_ARB_texture_non_power_of_two,
886 * but has to stick to the texture_rectangle limits.
887 *
888 * Fglrx doesn't advertise GL_ARB_texture_non_power_of_two, but it
889 * advertises OpenGL 2.0, which has this extension promoted to core. The
890 * extension loading code sets this extension supported due to that, so
891 * this code works on fglrx as well. */
893 {
894 TRACE("GL_ARB_texture_non_power_of_two advertised on R500 or earlier card, removing.\n");
897 }
898}
899
900static void quirk_no_np2(struct wined3d_gl_info *gl_info)
901{
902 /* The NVIDIA GeForce FX series reports OpenGL 2.0 capabilities with the
903 * latest drivers versions, but doesn't explicitly advertise the
904 * ARB_tex_npot extension in the OpenGL extension string. This usually
905 * means that ARB_tex_npot is supported in hardware as long as the
906 * application is staying within the limits enforced by the
907 * ARB_texture_rectangle extension. This however is not true for the
908 * FX series, which instantly falls back to a slower software path as
909 * soon as ARB_tex_npot is used. We therefore completely remove
910 * ARB_tex_npot from the list of supported extensions.
911 *
912 * Note that WINE_normalized_texrect can't be used in this case because
913 * internally it uses ARB_tex_npot, triggering the software fallback. */
914 TRACE("GL_ARB_texture_non_power_of_two advertised through OpenGL 2.0 on NV FX card, removing.\n");
916}
917
918static void quirk_clip_varying(struct wined3d_gl_info *gl_info)
919{
921}
922
924{
926}
927
928static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
929{
931}
932
933static void quirk_fbo_tex_update(struct wined3d_gl_info *gl_info)
934{
936}
937
938static void quirk_broken_rgba16(struct wined3d_gl_info *gl_info)
939{
941}
942
943static void quirk_infolog_spam(struct wined3d_gl_info *gl_info)
944{
946}
947
949{
950 /* NVIDIA GeForce 6xxx and 7xxx support accelerated VTF only on a few
951 * selected texture formats. They are apparently the only Direct3D 9 class
952 * GPUs supporting VTF. Also, Direct3D 9-era GPUs are somewhat limited
953 * with float texture filtering and blending. */
955}
956
957static void quirk_r200_constants(struct wined3d_gl_info *gl_info)
958{
959 /* The Mesa r200 driver (and there is no other driver for this GPU Wine
960 * would run on) loads some fog parameters (start, end, exponent, but not
961 * the colour) into the program.
962 *
963 * Apparently the fog hardware is only able to handle linear fog with a
964 * range of 0.0;1.0, and it is the responsibility of the vertex pipeline
965 * to handle non-linear fog and linear fog with start and end other than
966 * 0.0 and 1.0. */
967 TRACE("Reserving 1 ARB constant for compiler private use.\n");
968 gl_info->reserved_arb_constants = max(gl_info->reserved_arb_constants, 1);
969}
970
971static void quirk_broken_arb_fog(struct wined3d_gl_info *gl_info)
972{
974}
975
977{
978 gl_info->limits.viewport_subpixel_bits = 0;
979 if (gl_info->supported[ARB_CLIP_CONTROL])
980 {
981 TRACE("Disabling ARB_clip_control.\n");
982 gl_info->supported[ARB_CLIP_CONTROL] = FALSE;
983 }
984}
985
987{
989}
990
991static const struct wined3d_gpu_description *query_gpu_description(const struct wined3d_gl_info *gl_info,
992 UINT64 *vram_bytes)
993{
994 const struct wined3d_gpu_description *gpu_description = NULL, *gpu_description_override;
998
1000 {
1001 if (GL_EXTCALL(wglQueryCurrentRendererIntegerWINE(WGL_RENDERER_VENDOR_ID_WINE, &value)))
1002 vendor = value;
1003 if (GL_EXTCALL(wglQueryCurrentRendererIntegerWINE(WGL_RENDERER_DEVICE_ID_WINE, &value)))
1004 device = value;
1005 if (GL_EXTCALL(wglQueryCurrentRendererIntegerWINE(WGL_RENDERER_VIDEO_MEMORY_WINE, &value)))
1006 *vram_bytes = (UINT64)value * 1024 * 1024;
1007
1008 TRACE("Card reports vendor PCI ID 0x%04x, device PCI ID 0x%04x, 0x%s bytes of video memory.\n",
1009 vendor, device, wine_dbgstr_longlong(*vram_bytes));
1010
1011 gpu_description = wined3d_get_gpu_description(vendor, device);
1012 }
1013
1014 if ((gpu_description_override = wined3d_get_user_override_gpu_description(vendor, device)))
1015 gpu_description = gpu_description_override;
1016
1017 return gpu_description;
1018}
1019
1020/* Context activation is done by the caller. */
1021static void fixup_extensions(struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
1022 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor)
1023{
1024 enum wined3d_pci_vendor card_vendor = ctx->gpu_description->vendor;
1025 enum wined3d_pci_device device = ctx->gpu_description->device;
1026 unsigned int i;
1027
1028 static const struct driver_quirk
1029 {
1030 BOOL (*match)(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
1031 const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
1033 void (*apply)(struct wined3d_gl_info *gl_info);
1034 const char *description;
1035 }
1036 quirk_table[] =
1037 {
1038 {
1041 "AMD normalised texrect quirk"
1042 },
1043 {
1046 "Apple GLSL uniform override"
1047 },
1048 {
1051 "Geforce 5 NP2 disable"
1052 },
1053 {
1056 "Reserved varying for gl_ClipPos"
1057 },
1058 {
1059 /* GL_EXT_secondary_color does not allow 4 component secondary
1060 * colours, but most OpenGL implementations accept it. Apple's
1061 * is the only OpenGL implementation known to reject it.
1062 *
1063 * If we can pass 4-component specular colours, do it, because
1064 * (a) we don't have to screw around with the data, and (b) the
1065 * Direct3D fixed-function vertex pipeline passes specular alpha
1066 * to the pixel shader if any is used. Otherwise the specular
1067 * alpha is used to pass the fog coordinate, which we pass to
1068 * OpenGL via GL_EXT_fog_coord. */
1071 "Allow specular alpha quirk"
1072 },
1073 {
1076 "Apple NV_vertex_program clip bug quirk"
1077 },
1078 {
1081 "FBO rebind for attachment updates"
1082 },
1083 {
1086 "True RGBA16 is not available"
1087 },
1088 {
1091 "Not printing GLSL infolog"
1092 },
1093 {
1096 "Texture filtering, blending and VTF support is limited"
1097 },
1098 {
1099 match_r200,
1101 "r200 vertex shader constants"
1102 },
1103 {
1106 "ARBfp fogstart == fogend workaround"
1107 },
1108 {
1111 "NVIDIA viewport subpixel bits bug"
1112 },
1113 {
1116 "No support for MRT with independent bit depths"
1117 },
1118 };
1119
1120#ifdef __REACTOS__
1121 /*
1122 * WINE's timing here is completely broken,
1123 * This allows us to fallback to the NO_3D fallback though.
1124 */
1125 if (!gl_info->supported[EXT_FRAMEBUFFER_OBJECT]
1126 || !gl_info->supported[ARB_VERTEX_SHADER]
1127 || !gl_info->supported[ARB_FRAGMENT_SHADER])
1128 {
1129 ERR("Driver \"%s\" is missing extensions wined3d requires; skipping quirk detection.\n", gl_renderer);
1130 return;
1131 }
1132#endif
1133
1134 for (i = 0; i < ARRAY_SIZE(quirk_table); ++i)
1135 {
1136 if (!quirk_table[i].match(gl_info, ctx, gl_renderer, gl_vendor, card_vendor, device)) continue;
1137 TRACE("Applying driver quirk \"%s\".\n", quirk_table[i].description);
1138 quirk_table[i].apply(gl_info);
1139 }
1140
1141 /* Find out if PBOs work as they are supposed to. */
1142 test_pbo_functionality(gl_info);
1143}
1144
1145static unsigned int wined3d_parse_gl_version(const char *gl_version)
1146{
1147 const char *ptr = gl_version;
1148 int major, minor;
1149
1150 major = atoi(ptr);
1151 if (major <= 0)
1152 ERR("Invalid OpenGL major version %d.\n", major);
1153
1154 while (isdigit(*ptr)) ++ptr;
1155 if (*ptr++ != '.')
1156 ERR("Invalid OpenGL version string %s.\n", debugstr_a(gl_version));
1157
1158 minor = atoi(ptr);
1159
1160 TRACE("Found OpenGL version %d.%d.\n", major, minor);
1161
1162 return MAKEDWORD_VERSION(major, minor);
1163}
1164
1166 const char *gl_vendor_string, const char *gl_renderer, const char *gl_version)
1167{
1168 /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
1169 * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
1170 * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
1171 *
1172 * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
1173 * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
1174 * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
1175 * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
1176 * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
1177 * the chance that other implementations support them is rather small since Win32 QuickTime uses
1178 * DirectDraw, not OpenGL. */
1179 if (gl_info->supported[APPLE_FLUSH_RENDER]
1180 && (gl_info->supported[APPLE_YCBCR_422] || gl_info->supported[APPLE_RGB_422]))
1181 return GL_VENDOR_APPLE;
1182
1183 if (strstr(gl_vendor_string, "NVIDIA"))
1184 return GL_VENDOR_NVIDIA;
1185
1186 if (strstr(gl_vendor_string, "ATI"))
1187 return GL_VENDOR_FGLRX;
1188
1189 if (strstr(gl_vendor_string, "Mesa")
1190 || strstr(gl_vendor_string, "X.Org")
1191 || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
1192 || strstr(gl_vendor_string, "DRI R300 Project")
1193 || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
1194 || strstr(gl_vendor_string, "VMware, Inc.")
1195 || strstr(gl_vendor_string, "Red Hat")
1196 || strstr(gl_vendor_string, "Intel")
1197 || strstr(gl_renderer, "Mesa")
1198 || strstr(gl_renderer, "Gallium")
1199 || strstr(gl_renderer, "Intel")
1200 || strstr(gl_version, "Mesa"))
1201 return GL_VENDOR_MESA;
1202
1203 FIXME("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_UNKNOWN.\n",
1204 debugstr_a(gl_vendor_string));
1205
1206 return GL_VENDOR_UNKNOWN;
1207}
1208
1209static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
1210{
1211 if (strstr(gl_vendor_string, "NVIDIA")
1212 || strstr(gl_vendor_string, "Nouveau")
1213 || strstr(gl_vendor_string, "nouveau"))
1214 return HW_VENDOR_NVIDIA;
1215
1216 if (strstr(gl_vendor_string, "ATI")
1217 || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
1218 || strstr(gl_vendor_string, "X.Org R300 Project")
1219 || strstr(gl_vendor_string, "AMD")
1220 || strstr(gl_renderer, "AMD")
1221 || strstr(gl_renderer, "FirePro")
1222 || strstr(gl_renderer, "Radeon")
1223 || strstr(gl_renderer, "R100")
1224 || strstr(gl_renderer, "R200")
1225 || strstr(gl_renderer, "R300")
1226 || strstr(gl_renderer, "R600")
1227 || strstr(gl_renderer, "R700"))
1228 return HW_VENDOR_AMD;
1229
1230 if (strstr(gl_vendor_string, "Intel(R)")
1231 /* Intel switched from Intel(R) to Intel® recently, so just match Intel. */
1232 || strstr(gl_renderer, "Intel")
1233 || strstr(gl_renderer, "i915")
1234 || strstr(gl_vendor_string, "Intel Inc."))
1235 return HW_VENDOR_INTEL;
1236
1237 if (strstr(gl_vendor_string, "Red Hat")
1238 || strstr(gl_renderer, "virgl"))
1239 return HW_VENDOR_REDHAT;
1240
1241 if (strstr(gl_renderer, "SVGA3D"))
1242 return HW_VENDOR_VMWARE;
1243
1244 if (strstr(gl_vendor_string, "Mesa")
1245 || strstr(gl_vendor_string, "Brian Paul")
1246 || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
1247 || strstr(gl_vendor_string, "VMware, Inc."))
1248 return HW_VENDOR_SOFTWARE;
1249
1250 FIXME("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string));
1251
1252 return HW_VENDOR_NVIDIA;
1253}
1254
1256 const struct shader_caps *shader_caps, const struct fragment_caps *fragment_caps)
1257{
1258 unsigned int shader_model;
1259
1260 shader_model = min(shader_caps->vs_version, shader_caps->ps_version);
1261 shader_model = min(shader_model, max(shader_caps->gs_version, 3));
1262 shader_model = min(shader_model, max(shader_caps->hs_version, 4));
1263 shader_model = min(shader_model, max(shader_caps->ds_version, 4));
1264
1265 if (gl_info->supported[WINED3D_GL_VERSION_3_2]
1267 && gl_info->supported[ARB_SAMPLER_OBJECTS])
1268 {
1269 if (shader_model >= 5
1270 && gl_info->supported[ARB_DRAW_INDIRECT]
1273
1274 if (shader_model >= 4)
1275 {
1277 && gl_info->supported[ARB_DRAW_BUFFERS_BLEND])
1280 }
1281 }
1282
1283 if (shader_model >= 3 && gl_info->limits.texture_size >= 4096 && gl_info->limits.buffers >= 4)
1285 if (shader_model >= 2)
1286 {
1287 if (gl_info->supported[ARB_OCCLUSION_QUERY]
1292
1294 }
1295 if (shader_model >= 1)
1297
1300 if (fragment_caps->max_textures > 1)
1302
1304}
1305
1306static const struct wined3d_renderer_table
1307{
1308 const char *renderer;
1310}
1312{
1313 /* Direct 3D 11 */
1314 {"RTX 4090", CARD_NVIDIA_GEFORCE_RTX4090},
1315 {"RTX 4080 SUPER", CARD_NVIDIA_GEFORCE_RTX4080SUPER},
1316 {"RTX 4080", CARD_NVIDIA_GEFORCE_RTX4080},
1317 {"RTX 4070 Ti SUPER", CARD_NVIDIA_GEFORCE_RTX4070TISUPER},
1318 {"RTX 4070 Ti", CARD_NVIDIA_GEFORCE_RTX4070TI},
1319 {"RTX 4070 SUPER", CARD_NVIDIA_GEFORCE_RTX4070SUPER},
1320 {"RTX 4070", CARD_NVIDIA_GEFORCE_RTX4070},
1321 {"RTX 4060 Ti 16GB", CARD_NVIDIA_GEFORCE_RTX4060TI16G},
1322 {"RTX 4060 Ti 8GB", CARD_NVIDIA_GEFORCE_RTX4060TI8G},
1323 {"RTX 4060", CARD_NVIDIA_GEFORCE_RTX4060},
1324 {"Tesla T4", CARD_NVIDIA_TESLA_T4},
1325 {"Ampere A10", CARD_NVIDIA_AMPERE_A10},
1326 {"RTX 3090 Ti", CARD_NVIDIA_GEFORCE_RTX3090TI},
1327 {"RTX 3090", CARD_NVIDIA_GEFORCE_RTX3090},
1328 {"RTX 3080 Ti", CARD_NVIDIA_GEFORCE_RTX3080TI},
1329 {"RTX 3080 12GB", CARD_NVIDIA_GEFORCE_RTX3080_12GB},
1330 {"RTX 3080 10GB LHR", CARD_NVIDIA_GEFORCE_RTX3080_10GB_LHR},
1331 {"RTX 3080 10GB", CARD_NVIDIA_GEFORCE_RTX3080_10GB},
1332 {"RTX 3070 Ti", CARD_NVIDIA_GEFORCE_RTX3070TI},
1333 {"RTX 3070 mobile", CARD_NVIDIA_GEFORCE_RTX3070_MOBILE},
1334 {"RTX 3070 LHR", CARD_NVIDIA_GEFORCE_RTX3070_LHR},
1335 {"RTX 3070", CARD_NVIDIA_GEFORCE_RTX3070},
1336 {"RTX 3060 Ti GA104 LHR", CARD_NVIDIA_GEFORCE_RTX3060TI_GA104_LHR},
1337 {"RTX 3060 Ti GA104", CARD_NVIDIA_GEFORCE_RTX3060TI_GA104},
1338 {"RTX 3060 Ti GA103", CARD_NVIDIA_GEFORCE_RTX3060TI_GA103},
1339 {"RTX 3060 LHR", CARD_NVIDIA_GEFORCE_RTX3060_LHR},
1340 {"RTX 3060", CARD_NVIDIA_GEFORCE_RTX3060},
1341 {"RTX 3050", CARD_NVIDIA_GEFORCE_RTX3050},
1342 {"RTX 2080 Ti", CARD_NVIDIA_GEFORCE_RTX2080TI}, /* GeForce 2000 - highend */
1343 {"RTX 2080", CARD_NVIDIA_GEFORCE_RTX2080}, /* GeForce 2000 - highend */
1344 {"RTX 2070", CARD_NVIDIA_GEFORCE_RTX2070}, /* GeForce 2000 - highend */
1345 {"RTX 2060", CARD_NVIDIA_GEFORCE_RTX2060}, /* GeForce 2000 - highend */
1346 {"GTX 1660 Ti", CARD_NVIDIA_GEFORCE_GTX1660TI}, /* GeForce 1600 - highend */
1347 {"GTX 1660 SUPER", CARD_NVIDIA_GEFORCE_GTX1660SUPER}, /* GeForce 1600 - highend */
1348 {"GTX 1650 SUPER", CARD_NVIDIA_GEFORCE_GTX1650SUPER}, /* GeForce 1600 - midend high */
1349 {"GTX 1650", CARD_NVIDIA_GEFORCE_GTX1650}, /* GeForce 1600 - midend high */
1350 {"TITAN V", CARD_NVIDIA_TITANV}, /* GeForce 1000 - highend */
1351 {"TITAN X (Pascal)", CARD_NVIDIA_TITANX_PASCAL}, /* GeForce 1000 - highend */
1352 {"GTX 1080 Ti", CARD_NVIDIA_GEFORCE_GTX1080TI}, /* GeForce 1000 - highend */
1353 {"GTX 1080", CARD_NVIDIA_GEFORCE_GTX1080}, /* GeForce 1000 - highend */
1354 {"GTX 1070", CARD_NVIDIA_GEFORCE_GTX1070}, /* GeForce 1000 - highend */
1355 {"GTX 1070M", CARD_NVIDIA_GEFORCE_GTX1070M}, /* GeForce 1000 - highend */
1356 {"GTX 1060 3GB", CARD_NVIDIA_GEFORCE_GTX1060_3GB},/* GeForce 1000 - midend high */
1357 {"GTX 1060", CARD_NVIDIA_GEFORCE_GTX1060}, /* GeForce 1000 - midend high */
1358 {"GTX 1050 Ti", CARD_NVIDIA_GEFORCE_GTX1050TI}, /* GeForce 1000 - midend */
1359 {"GTX 1050", CARD_NVIDIA_GEFORCE_GTX1050}, /* GeForce 1000 - midend */
1360 {"GT 1030", CARD_NVIDIA_GEFORCE_GT1030}, /* GeForce 1000 - lowend */
1361 {"GTX 980 Ti", CARD_NVIDIA_GEFORCE_GTX980TI}, /* GeForce 900 - highend */
1362 {"GTX 980", CARD_NVIDIA_GEFORCE_GTX980}, /* GeForce 900 - highend */
1363 {"GTX 970M", CARD_NVIDIA_GEFORCE_GTX970M}, /* GeForce 900 - highend mobile*/
1364 {"GTX 970", CARD_NVIDIA_GEFORCE_GTX970}, /* GeForce 900 - highend */
1365 {"GTX TITAN X", CARD_NVIDIA_GEFORCE_GTXTITANX}, /* Geforce 900 - highend */
1366 {"GTX 960M", CARD_NVIDIA_GEFORCE_GTX960M}, /* GeForce 900 - midend high mobile */
1367 {"GTX 960", CARD_NVIDIA_GEFORCE_GTX960}, /* GeForce 900 - midend high */
1368 {"GTX 950M", CARD_NVIDIA_GEFORCE_GTX950M}, /* GeForce 900 - midend mobile */
1369 {"GTX 950", CARD_NVIDIA_GEFORCE_GTX950}, /* GeForce 900 - midend */
1370 {"GeForce 940M", CARD_NVIDIA_GEFORCE_940M}, /* GeForce 900 - midend mobile */
1371 {"GTX 880M", CARD_NVIDIA_GEFORCE_GTX880M}, /* GeForce 800 - mobile */
1372 {"GTX 870M", CARD_NVIDIA_GEFORCE_GTX870M}, /* GeForce 800 - mobile */
1373 {"GTX 860M", CARD_NVIDIA_GEFORCE_GTX860M}, /* GeForce 800 - mobile */
1374 {"GTX 850M", CARD_NVIDIA_GEFORCE_GTX850M}, /* GeForce 800 - mobile */
1375 {"GeForce 845M", CARD_NVIDIA_GEFORCE_845M}, /* GeForce 800 - mobile */
1376 {"GeForce 840M", CARD_NVIDIA_GEFORCE_840M}, /* GeForce 800 - mobile */
1377 {"GeForce 830M", CARD_NVIDIA_GEFORCE_830M}, /* GeForce 800 - mobile */
1378 {"GeForce 820M", CARD_NVIDIA_GEFORCE_820M}, /* GeForce 800 - mobile */
1379 {"GTX 780 Ti", CARD_NVIDIA_GEFORCE_GTX780TI}, /* Geforce 700 - highend */
1380 {"GTX TITAN Black", CARD_NVIDIA_GEFORCE_GTXTITANB}, /* Geforce 700 - highend */
1381 {"GTX TITAN Z", CARD_NVIDIA_GEFORCE_GTXTITANZ}, /* Geforce 700 - highend */
1382 {"GTX TITAN", CARD_NVIDIA_GEFORCE_GTXTITAN}, /* Geforce 700 - highend */
1383 {"GTX 780", CARD_NVIDIA_GEFORCE_GTX780}, /* Geforce 700 - highend */
1384 {"GTX 770M", CARD_NVIDIA_GEFORCE_GTX770M}, /* Geforce 700 - midend high mobile */
1385 {"GTX 770", CARD_NVIDIA_GEFORCE_GTX770}, /* Geforce 700 - highend */
1386 {"GTX 765M", CARD_NVIDIA_GEFORCE_GTX765M}, /* Geforce 700 - midend high mobile */
1387 {"GTX 760 Ti", CARD_NVIDIA_GEFORCE_GTX760TI}, /* Geforce 700 - midend high */
1388 {"GTX 760", CARD_NVIDIA_GEFORCE_GTX760}, /* Geforce 700 - midend high */
1389 {"GTX 750 Ti", CARD_NVIDIA_GEFORCE_GTX750TI}, /* Geforce 700 - midend */
1390 {"GTX 750", CARD_NVIDIA_GEFORCE_GTX750}, /* Geforce 700 - midend */
1391 {"GT 750M", CARD_NVIDIA_GEFORCE_GT750M}, /* Geforce 700 - midend mobile */
1392 {"GT 740M", CARD_NVIDIA_GEFORCE_GT740M}, /* Geforce 700 - midend mobile */
1393 {"GT 730M", CARD_NVIDIA_GEFORCE_GT730M}, /* Geforce 700 - midend mobile */
1394 {"GT 730", CARD_NVIDIA_GEFORCE_GT730}, /* Geforce 700 - lowend */
1395 {"GTX 690", CARD_NVIDIA_GEFORCE_GTX690}, /* Geforce 600 - highend */
1396 {"GTX 680", CARD_NVIDIA_GEFORCE_GTX680}, /* Geforce 600 - highend */
1397 {"GTX 675MX", CARD_NVIDIA_GEFORCE_GTX675MX_1},/* Geforce 600 - highend */
1398 {"GTX 670MX", CARD_NVIDIA_GEFORCE_GTX670MX}, /* Geforce 600 - highend */
1399 {"GTX 670", CARD_NVIDIA_GEFORCE_GTX670}, /* Geforce 600 - midend high */
1400 {"GTX 660 Ti", CARD_NVIDIA_GEFORCE_GTX660TI}, /* Geforce 600 - midend high */
1401 {"GTX 660M", CARD_NVIDIA_GEFORCE_GTX660M}, /* Geforce 600 - midend high mobile */
1402 {"GTX 660", CARD_NVIDIA_GEFORCE_GTX660}, /* Geforce 600 - midend high */
1403 {"GTX 650 Ti", CARD_NVIDIA_GEFORCE_GTX650TI}, /* Geforce 600 - lowend */
1404 {"GTX 650", CARD_NVIDIA_GEFORCE_GTX650}, /* Geforce 600 - lowend */
1405 {"GT 650M", CARD_NVIDIA_GEFORCE_GT650M}, /* Geforce 600 - midend mobile */
1406 {"GT 640M", CARD_NVIDIA_GEFORCE_GT640M}, /* Geforce 600 - midend mobile */
1407 {"GT 630M", CARD_NVIDIA_GEFORCE_GT630M}, /* Geforce 600 - midend mobile */
1408 {"GT 630", CARD_NVIDIA_GEFORCE_GT630}, /* Geforce 600 - lowend */
1409 {"GT 610", CARD_NVIDIA_GEFORCE_GT610}, /* Geforce 600 - lowend */
1410 {"GTX 580", CARD_NVIDIA_GEFORCE_GTX580}, /* Geforce 500 - highend */
1411 {"GTX 570", CARD_NVIDIA_GEFORCE_GTX570}, /* Geforce 500 - midend high */
1412 {"GTX 560 Ti", CARD_NVIDIA_GEFORCE_GTX560TI}, /* Geforce 500 - midend */
1413 {"GTX 560M", CARD_NVIDIA_GEFORCE_GTX560M}, /* Geforce 500 - midend mobile */
1414 {"GTX 560", CARD_NVIDIA_GEFORCE_GTX560}, /* Geforce 500 - midend */
1415 {"GT 555M", CARD_NVIDIA_GEFORCE_GT555M}, /* Geforce 500 - midend mobile */
1416 {"GTX 550 Ti", CARD_NVIDIA_GEFORCE_GTX550}, /* Geforce 500 - midend */
1417 {"GT 540M", CARD_NVIDIA_GEFORCE_GT540M}, /* Geforce 500 - midend mobile */
1418 {"GT 525M", CARD_NVIDIA_GEFORCE_GT525M}, /* Geforce 500 - lowend mobile */
1419 {"GT 520", CARD_NVIDIA_GEFORCE_GT520}, /* Geforce 500 - lowend */
1420 {"GTX 480", CARD_NVIDIA_GEFORCE_GTX480}, /* Geforce 400 - highend */
1421 {"GTX 470", CARD_NVIDIA_GEFORCE_GTX470}, /* Geforce 400 - midend high */
1422 /* Direct 3D 10 */
1423 {"GTX 465", CARD_NVIDIA_GEFORCE_GTX465}, /* Geforce 400 - midend */
1424 {"GTX 460M", CARD_NVIDIA_GEFORCE_GTX460M}, /* Geforce 400 - highend mobile */
1425 {"GTX 460", CARD_NVIDIA_GEFORCE_GTX460}, /* Geforce 400 - midend */
1426 {"GTS 450", CARD_NVIDIA_GEFORCE_GTS450}, /* Geforce 400 - midend low */
1427 {"GT 440", CARD_NVIDIA_GEFORCE_GT440}, /* Geforce 400 - lowend */
1428 {"GT 430", CARD_NVIDIA_GEFORCE_GT430}, /* Geforce 400 - lowend */
1429 {"GT 425M", CARD_NVIDIA_GEFORCE_GT425M}, /* Geforce 400 - lowend mobile */
1430 {"GT 420", CARD_NVIDIA_GEFORCE_GT420}, /* Geforce 400 - lowend */
1431 {"410M", CARD_NVIDIA_GEFORCE_410M}, /* Geforce 400 - lowend mobile */
1432 {"GT 330", CARD_NVIDIA_GEFORCE_GT330}, /* Geforce 300 - highend */
1433 {"GTS 360M", CARD_NVIDIA_GEFORCE_GTS350M}, /* Geforce 300 - highend mobile */
1434 {"GTS 350M", CARD_NVIDIA_GEFORCE_GTS350M}, /* Geforce 300 - highend mobile */
1435 {"GT 330M", CARD_NVIDIA_GEFORCE_GT325M}, /* Geforce 300 - midend mobile */
1436 {"GT 325M", CARD_NVIDIA_GEFORCE_GT325M}, /* Geforce 300 - midend mobile */
1437 {"GT 320M", CARD_NVIDIA_GEFORCE_GT320M}, /* Geforce 300 - midend mobile */
1438 {"320M", CARD_NVIDIA_GEFORCE_320M}, /* Geforce 300 - midend mobile */
1439 {"315M", CARD_NVIDIA_GEFORCE_315M}, /* Geforce 300 - midend mobile */
1440 {"GTX 295", CARD_NVIDIA_GEFORCE_GTX280}, /* Geforce 200 - highend */
1441 {"GTX 285", CARD_NVIDIA_GEFORCE_GTX280}, /* Geforce 200 - highend */
1442 {"GTX 280", CARD_NVIDIA_GEFORCE_GTX280}, /* Geforce 200 - highend */
1443 {"GTX 275", CARD_NVIDIA_GEFORCE_GTX275}, /* Geforce 200 - midend high */
1444 {"GTX 260", CARD_NVIDIA_GEFORCE_GTX260}, /* Geforce 200 - midend */
1445 {"GTS 250", CARD_NVIDIA_GEFORCE_GTS250}, /* Geforce 200 - midend */
1446 {"GT 240", CARD_NVIDIA_GEFORCE_GT240}, /* Geforce 200 - midend */
1447 {"GT 220", CARD_NVIDIA_GEFORCE_GT220}, /* Geforce 200 - lowend */
1448 {"GeForce 310", CARD_NVIDIA_GEFORCE_210}, /* Geforce 200 - lowend */
1449 {"GeForce 305", CARD_NVIDIA_GEFORCE_210}, /* Geforce 200 - lowend */
1450 {"GeForce 210", CARD_NVIDIA_GEFORCE_210}, /* Geforce 200 - lowend */
1451 {"G 210", CARD_NVIDIA_GEFORCE_210}, /* Geforce 200 - lowend */
1452 {"GTS 150", CARD_NVIDIA_GEFORCE_9800GT}, /* Geforce 9 - highend / Geforce 200 - midend */
1453 {"9800", CARD_NVIDIA_GEFORCE_9800GT}, /* Geforce 9 - highend / Geforce 200 - midend */
1454 {"9700M GT", CARD_NVIDIA_GEFORCE_9700MGT}, /* Geforce 9 - midend */
1455 {"GT 140", CARD_NVIDIA_GEFORCE_9600GT}, /* Geforce 9 - midend */
1456 {"9600", CARD_NVIDIA_GEFORCE_9600GT}, /* Geforce 9 - midend */
1457 {"GT 130", CARD_NVIDIA_GEFORCE_9500GT}, /* Geforce 9 - midend low / Geforce 200 - low */
1458 {"GT 120", CARD_NVIDIA_GEFORCE_9500GT}, /* Geforce 9 - midend low / Geforce 200 - low */
1459 {"9500", CARD_NVIDIA_GEFORCE_9500GT}, /* Geforce 9 - midend low / Geforce 200 - low */
1460 {"9400M", CARD_NVIDIA_GEFORCE_9400M}, /* Geforce 9 - lowend */
1461 {"9400", CARD_NVIDIA_GEFORCE_9400GT}, /* Geforce 9 - lowend */
1462 {"9300", CARD_NVIDIA_GEFORCE_9300}, /* Geforce 9 - lowend low */
1463 {"9200", CARD_NVIDIA_GEFORCE_9200}, /* Geforce 9 - lowend low */
1464 {"9100", CARD_NVIDIA_GEFORCE_9200}, /* Geforce 9 - lowend low */
1465 {"G 100", CARD_NVIDIA_GEFORCE_9200}, /* Geforce 9 - lowend low */
1466 {"8800 GTX", CARD_NVIDIA_GEFORCE_8800GTX}, /* Geforce 8 - highend high */
1467 {"8800", CARD_NVIDIA_GEFORCE_8800GTS}, /* Geforce 8 - highend */
1468 {"8600M", CARD_NVIDIA_GEFORCE_8600MGT}, /* Geforce 8 - midend mobile */
1469 {"8600 M", CARD_NVIDIA_GEFORCE_8600MGT}, /* Geforce 8 - midend mobile */
1470 {"8700", CARD_NVIDIA_GEFORCE_8600GT}, /* Geforce 8 - midend */
1471 {"8600", CARD_NVIDIA_GEFORCE_8600GT}, /* Geforce 8 - midend */
1472 {"8500", CARD_NVIDIA_GEFORCE_8500GT}, /* Geforce 8 - mid-lowend */
1473 {"8400", CARD_NVIDIA_GEFORCE_8400GS}, /* Geforce 8 - mid-lowend */
1474 {"8300", CARD_NVIDIA_GEFORCE_8300GS}, /* Geforce 8 - lowend */
1475 {"8200", CARD_NVIDIA_GEFORCE_8200}, /* Geforce 8 - lowend */
1476 {"8100", CARD_NVIDIA_GEFORCE_8200}, /* Geforce 8 - lowend */
1477 /* Direct 3D 9 SM3 */
1478 {"Quadro FX 5", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
1479 {"Quadro FX 4", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
1480 {"7950", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
1481 {"7900", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
1482 {"7800", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
1483 {"7700", CARD_NVIDIA_GEFORCE_7600}, /* Geforce 7 - midend */
1484 {"7600", CARD_NVIDIA_GEFORCE_7600}, /* Geforce 7 - midend */
1485 {"7400", CARD_NVIDIA_GEFORCE_7400}, /* Geforce 7 - lower medium */
1486 {"7300", CARD_NVIDIA_GEFORCE_7300}, /* Geforce 7 - lowend */
1487 {"6800", CARD_NVIDIA_GEFORCE_6800}, /* Geforce 6 - highend */
1488 {"6700", CARD_NVIDIA_GEFORCE_6600GT}, /* Geforce 6 - midend */
1489 {"6610", CARD_NVIDIA_GEFORCE_6600GT}, /* Geforce 6 - midend */
1490 {"6600", CARD_NVIDIA_GEFORCE_6600GT}, /* Geforce 6 - midend */
1491 /* Direct 3D 9 SM2 */
1492 {"Quadro FX", CARD_NVIDIA_GEFORCEFX_5800}, /* GeforceFX - highend */
1493 {"5950", CARD_NVIDIA_GEFORCEFX_5800}, /* GeforceFX - highend */
1494 {"5900", CARD_NVIDIA_GEFORCEFX_5800}, /* GeforceFX - highend */
1495 {"5800", CARD_NVIDIA_GEFORCEFX_5800}, /* GeforceFX - highend */
1496 {"5750", CARD_NVIDIA_GEFORCEFX_5600}, /* GeforceFX - midend */
1497 {"5700", CARD_NVIDIA_GEFORCEFX_5600}, /* GeforceFX - midend */
1498 {"5650", CARD_NVIDIA_GEFORCEFX_5600}, /* GeforceFX - midend */
1499 {"5600", CARD_NVIDIA_GEFORCEFX_5600}, /* GeforceFX - midend */
1500 {"5500", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
1501 {"5300", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
1502 {"5250", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
1503 {"5200", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
1504 {"5100", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
1505 /* Direct 3D 8 */
1506 {"Quadro4", CARD_NVIDIA_GEFORCE4_TI4200},
1507 {"GeForce4 Ti", CARD_NVIDIA_GEFORCE4_TI4200}, /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800 */
1508 /* Direct 3D 7 */
1509 {"GeForce4 MX", CARD_NVIDIA_GEFORCE4_MX}, /* MX420/MX440/MX460/MX4000 */
1510 {"Quadro2 MXR", CARD_NVIDIA_GEFORCE2_MX},
1511 {"GeForce2 MX", CARD_NVIDIA_GEFORCE2_MX}, /* Geforce2 standard/MX100/MX200/MX400 */
1512 {"Quadro2", CARD_NVIDIA_GEFORCE2},
1513 {"GeForce2", CARD_NVIDIA_GEFORCE2}, /* Geforce2 GTS/Pro/Ti/Ultra */
1514 /* Direct 3D 6 */
1515 {"TNT2", CARD_NVIDIA_RIVA_TNT2}, /* Riva TNT2 standard/M64/Pro/Ultra */
1517/* See http://developer.amd.com/resources/hardware-drivers/ati-catalyst-pc-vendor-id-1002-li/
1518 *
1519 * Beware: renderer string do not match exact card model,
1520 * e.g. HD 4800 is returned for multiple cards, even for RV790 based ones. */
1522{
1523 {"RX 480", CARD_AMD_RADEON_RX_480},
1524 {"RX 460", CARD_AMD_RADEON_RX_460},
1525 {"R9 Fury Series", CARD_AMD_RADEON_R9_FURY},
1526 /* Southern Islands */
1527 {"HD 7900", CARD_AMD_RADEON_HD7900},
1528 {"HD 7800", CARD_AMD_RADEON_HD7800},
1529 {"HD 7700", CARD_AMD_RADEON_HD7700},
1530 /* Northern Islands */
1531 {"HD 6970", CARD_AMD_RADEON_HD6900},
1532 {"HD 6900", CARD_AMD_RADEON_HD6900},
1533 {"HD 6800", CARD_AMD_RADEON_HD6800},
1534 {"HD 6770M", CARD_AMD_RADEON_HD6600M},
1535 {"HD 6750M", CARD_AMD_RADEON_HD6600M},
1536 {"HD 6700", CARD_AMD_RADEON_HD6700},
1537 {"HD 6670", CARD_AMD_RADEON_HD6600},
1538 {"HD 6630M", CARD_AMD_RADEON_HD6600M},
1539 {"HD 6600M", CARD_AMD_RADEON_HD6600M},
1540 {"HD 6600", CARD_AMD_RADEON_HD6600},
1541 {"HD 6570", CARD_AMD_RADEON_HD6600},
1542 {"HD 6500M", CARD_AMD_RADEON_HD6600M},
1543 {"HD 6500", CARD_AMD_RADEON_HD6600},
1544 {"HD 6480G", CARD_AMD_RADEON_HD6480G},
1545 {"HD 6400", CARD_AMD_RADEON_HD6400},
1546 {"HD 6300", CARD_AMD_RADEON_HD6300},
1547 {"HD 6200", CARD_AMD_RADEON_HD6300},
1548 /* Evergreen */
1549 {"HD 5870", CARD_AMD_RADEON_HD5800}, /* Radeon EG CYPRESS PRO */
1550 {"HD 5850", CARD_AMD_RADEON_HD5800}, /* Radeon EG CYPRESS XT */
1551 {"HD 5800", CARD_AMD_RADEON_HD5800}, /* Radeon EG CYPRESS HD58xx generic renderer string */
1552 {"HD 5770", CARD_AMD_RADEON_HD5700}, /* Radeon EG JUNIPER XT */
1553 {"HD 5750", CARD_AMD_RADEON_HD5700}, /* Radeon EG JUNIPER LE */
1554 {"HD 5700", CARD_AMD_RADEON_HD5700}, /* Radeon EG JUNIPER HD57xx generic renderer string */
1555 {"HD 5670", CARD_AMD_RADEON_HD5600}, /* Radeon EG REDWOOD XT */
1556 {"HD 5570", CARD_AMD_RADEON_HD5600}, /* Radeon EG REDWOOD PRO mapped to HD5600 series */
1557 {"HD 5550", CARD_AMD_RADEON_HD5600}, /* Radeon EG REDWOOD LE mapped to HD5600 series */
1558 {"HD 5450", CARD_AMD_RADEON_HD5400}, /* Radeon EG CEDAR PRO */
1559 {"HD 5000", CARD_AMD_RADEON_HD5600}, /* Defaulting to HD 5600 */
1560 /* R700 */
1561 {"HD 4890", CARD_AMD_RADEON_HD4800}, /* Radeon RV790 */
1562 {"HD 4870", CARD_AMD_RADEON_HD4800}, /* Radeon RV770 */
1563 {"HD 4850", CARD_AMD_RADEON_HD4800}, /* Radeon RV770 */
1564 {"HD 4830", CARD_AMD_RADEON_HD4800}, /* Radeon RV770 */
1565 {"HD 4800", CARD_AMD_RADEON_HD4800}, /* Radeon RV7xx HD48xx generic renderer string */
1566 {"HD 4770", CARD_AMD_RADEON_HD4700}, /* Radeon RV740 */
1567 {"HD 4700", CARD_AMD_RADEON_HD4700}, /* Radeon RV7xx HD47xx generic renderer string */
1568 {"HD 4670", CARD_AMD_RADEON_HD4600}, /* Radeon RV730 */
1569 {"HD 4650", CARD_AMD_RADEON_HD4600}, /* Radeon RV730 */
1570 {"HD 4600", CARD_AMD_RADEON_HD4600}, /* Radeon RV730 */
1571 {"HD 4550", CARD_AMD_RADEON_HD4350}, /* Radeon RV710 */
1572 {"HD 4350", CARD_AMD_RADEON_HD4350}, /* Radeon RV710 */
1573 /* R600/R700 integrated */
1574 {"HD 4200M", CARD_AMD_RADEON_HD4200M},
1575 {"HD 3300", CARD_AMD_RADEON_HD3200},
1576 {"HD 3200", CARD_AMD_RADEON_HD3200},
1577 {"HD 3100", CARD_AMD_RADEON_HD3200},
1578 /* R600 */
1579 {"HD 3870", CARD_AMD_RADEON_HD2900}, /* HD2900/HD3800 - highend */
1580 {"HD 3850", CARD_AMD_RADEON_HD2900}, /* HD2900/HD3800 - highend */
1581 {"HD 2900", CARD_AMD_RADEON_HD2900}, /* HD2900/HD3800 - highend */
1582 {"HD 3830", CARD_AMD_RADEON_HD2600}, /* China-only midend */
1583 {"HD 3690", CARD_AMD_RADEON_HD2600}, /* HD2600/HD3600 - midend */
1584 {"HD 3650", CARD_AMD_RADEON_HD2600}, /* HD2600/HD3600 - midend */
1585 {"HD 2600", CARD_AMD_RADEON_HD2600}, /* HD2600/HD3600 - midend */
1586 {"HD 3470", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
1587 {"HD 3450", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
1588 {"HD 3430", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
1589 {"HD 3400", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
1590 {"HD 2400", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
1591 {"HD 2350", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
1592 /* Radeon R5xx */
1593 {"X1950", CARD_AMD_RADEON_X1600},
1594 {"X1900", CARD_AMD_RADEON_X1600},
1595 {"X1800", CARD_AMD_RADEON_X1600},
1596 {"X1650", CARD_AMD_RADEON_X1600},
1597 {"X1600", CARD_AMD_RADEON_X1600},
1598 /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300/X2500/HD2300 (lowend R5xx)
1599 * Note X2300/X2500/HD2300 are R5xx GPUs with a 2xxx naming but they are still DX9-only */
1600 {"HD 2300", CARD_AMD_RADEON_X700},
1601 {"X2500", CARD_AMD_RADEON_X700},
1602 {"X2300", CARD_AMD_RADEON_X700},
1603 {"X1550", CARD_AMD_RADEON_X700},
1604 {"X1450", CARD_AMD_RADEON_X700},
1605 {"X1400", CARD_AMD_RADEON_X700},
1606 {"X1300", CARD_AMD_RADEON_X700},
1607 {"X850", CARD_AMD_RADEON_X700},
1608 {"X800", CARD_AMD_RADEON_X700},
1609 {"X700", CARD_AMD_RADEON_X700},
1610 /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400 MHz */
1611 {"Radeon Xpress", CARD_AMD_RADEON_XPRESS_200M},
1613cards_intel[] =
1614{
1615 /* Skylake */
1616 {"Iris Pro Graphics P580", CARD_INTEL_IPP580_1},
1617 {"Skylake", CARD_INTEL_HD520_1},
1618 /* Broadwell */
1619 {"Iris Pro P6300", CARD_INTEL_IPP6300},
1620 {"Iris Pro 6200", CARD_INTEL_IP6200},
1621 {"Iris 6100", CARD_INTEL_I6100},
1622 {"Iris(TM) Graphics 6100", CARD_INTEL_I6100}, /* MacOS */
1623 /* Haswell */
1624 {"Iris Pro 5200", CARD_INTEL_IP5200_1},
1625 {"Iris 5100", CARD_INTEL_I5100_1},
1626 {"HD Graphics 5000", CARD_INTEL_HD5000_1}, /* MacOS */
1627 {"Haswell Mobile", CARD_INTEL_HWM},
1628 {"Iris OpenGL Engine", CARD_INTEL_HWM}, /* MacOS */
1629 /* Ivybridge */
1630 {"Ivybridge Server", CARD_INTEL_IVBS},
1631 {"Ivybridge Mobile", CARD_INTEL_IVBM},
1632 {"Ivybridge Desktop", CARD_INTEL_IVBD},
1633 {"HD Graphics 4000", CARD_INTEL_IVBD}, /* MacOS */
1634 /* Sandybridge */
1635 {"Sandybridge Server", CARD_INTEL_SNBS},
1636 {"Sandybridge Mobile", CARD_INTEL_SNBM},
1637 {"Sandybridge Desktop", CARD_INTEL_SNBD},
1638 /* Ironlake */
1639 {"Ironlake Mobile", CARD_INTEL_ILKM},
1640 {"Ironlake Desktop", CARD_INTEL_ILKD},
1641 /* G4x */
1642 {"B43", CARD_INTEL_B43},
1643 {"G41", CARD_INTEL_G41},
1644 {"G45", CARD_INTEL_G45},
1645 {"Q45", CARD_INTEL_Q45},
1646 {"Integrated Graphics Device", CARD_INTEL_IGD},
1647 {"GM45", CARD_INTEL_GM45},
1648 /* i965 */
1649 {"965GME", CARD_INTEL_965GME},
1650 {"965GM", CARD_INTEL_965GM},
1651 {"X3100", CARD_INTEL_965GM}, /* MacOS */
1652 {"946GZ", CARD_INTEL_946GZ},
1653 {"965G", CARD_INTEL_965G},
1654 {"965Q", CARD_INTEL_965Q},
1655 /* i945 */
1656 {"Pineview M", CARD_INTEL_PNVM},
1657 {"Pineview G", CARD_INTEL_PNVG},
1658 {"IGD", CARD_INTEL_PNVG},
1659 {"Q33", CARD_INTEL_Q33},
1660 {"G33", CARD_INTEL_G33},
1661 {"Q35", CARD_INTEL_Q35},
1662 {"945GME", CARD_INTEL_945GME},
1663 {"945GM", CARD_INTEL_945GM},
1664 {"GMA 950", CARD_INTEL_945GM}, /* MacOS */
1665 {"945G", CARD_INTEL_945G},
1666 /* i915 */
1667 {"915GM", CARD_INTEL_915GM},
1668 {"E7221G", CARD_INTEL_E7221G},
1669 {"915G", CARD_INTEL_915G},
1670 /* i8xx */
1671 {"865G", CARD_INTEL_865G},
1672 {"845G", CARD_INTEL_845G},
1673 {"855GM", CARD_INTEL_855GM},
1674 {"830M", CARD_INTEL_830M},
1676/* 20101109 - These are never returned by current Gallium radeon
1677 * drivers: R700, RV790, R680, RV535, RV516, R410, RS485, RV360, RV351. */
1679{
1680 /* Navi 10/14 */
1681 {"NAVI10", CARD_AMD_RADEON_RX_NAVI_10},
1682 {"NAVI14", CARD_AMD_RADEON_RX_NAVI_14},
1683 /* Polaris 10/11 */
1684 {"POLARIS10", CARD_AMD_RADEON_RX_480},
1685 {"POLARIS11", CARD_AMD_RADEON_RX_460},
1686 /* Volcanic Islands */
1687 {"FIJI", CARD_AMD_RADEON_R9_FURY},
1688 {"TONGA", CARD_AMD_RADEON_R9_285},
1689 /* Sea Islands */
1690 {"HAWAII", CARD_AMD_RADEON_R9_290},
1691 {"KAVERI", CARD_AMD_RADEON_R7 },
1692 {"KABINI", CARD_AMD_RADEON_R3 },
1693 {"BONAIRE", CARD_AMD_RADEON_HD8770},
1694 /* Southern Islands */
1695 {"OLAND", CARD_AMD_RADEON_HD8670},
1696 {"HAINAN", CARD_AMD_RADEON_HD8600M},
1697 {"TAHITI", CARD_AMD_RADEON_HD7900},
1698 {"PITCAIRN", CARD_AMD_RADEON_HD7800},
1699 {"CAPE VERDE", CARD_AMD_RADEON_HD7700},
1700 /* Northern Islands */
1701 {"ARUBA", CARD_AMD_RADEON_HD7660D},
1702 {"CAYMAN", CARD_AMD_RADEON_HD6900},
1703 {"BARTS", CARD_AMD_RADEON_HD6800},
1704 {"TURKS", CARD_AMD_RADEON_HD6600},
1705 {"SUMO2", CARD_AMD_RADEON_HD6410D}, /* SUMO2 first, because we do a strstr(). */
1706 {"SUMO", CARD_AMD_RADEON_HD6550D},
1707 {"CAICOS", CARD_AMD_RADEON_HD6400},
1708 {"PALM", CARD_AMD_RADEON_HD6300},
1709 /* Evergreen */
1710 {"HEMLOCK", CARD_AMD_RADEON_HD5900},
1711 {"CYPRESS", CARD_AMD_RADEON_HD5800},
1712 {"JUNIPER", CARD_AMD_RADEON_HD5700},
1713 {"REDWOOD", CARD_AMD_RADEON_HD5600},
1714 {"CEDAR", CARD_AMD_RADEON_HD5400},
1715 /* R700 */
1716 {"R700", CARD_AMD_RADEON_HD4800},
1717 {"RV790", CARD_AMD_RADEON_HD4800},
1718 {"RV770", CARD_AMD_RADEON_HD4800},
1719 {"RV740", CARD_AMD_RADEON_HD4700},
1720 {"RV730", CARD_AMD_RADEON_HD4600},
1721 {"RV710", CARD_AMD_RADEON_HD4350},
1722 /* R600/R700 integrated */
1723 {"RS880", CARD_AMD_RADEON_HD4200M},
1724 {"RS780", CARD_AMD_RADEON_HD3200},
1725 /* R600 */
1726 {"R680", CARD_AMD_RADEON_HD2900},
1727 {"R600", CARD_AMD_RADEON_HD2900},
1728 {"RV670", CARD_AMD_RADEON_HD3850},
1729 {"RV635", CARD_AMD_RADEON_HD2600},
1730 {"RV630", CARD_AMD_RADEON_HD2600},
1731 {"RV620", CARD_AMD_RADEON_HD2350},
1732 {"RV610", CARD_AMD_RADEON_HD2350},
1733 /* R500 */
1734 {"R580", CARD_AMD_RADEON_X1600},
1735 {"R520", CARD_AMD_RADEON_X1600},
1736 {"RV570", CARD_AMD_RADEON_X1600},
1737 {"RV560", CARD_AMD_RADEON_X1600},
1738 {"RV535", CARD_AMD_RADEON_X1600},
1739 {"RV530", CARD_AMD_RADEON_X1600},
1740 {"RV516", CARD_AMD_RADEON_X700},
1741 {"RV515", CARD_AMD_RADEON_X700},
1742 /* R400 */
1743 {"R481", CARD_AMD_RADEON_X700},
1744 {"R480", CARD_AMD_RADEON_X700},
1745 {"R430", CARD_AMD_RADEON_X700},
1746 {"R423", CARD_AMD_RADEON_X700},
1747 {"R420", CARD_AMD_RADEON_X700},
1748 {"R410", CARD_AMD_RADEON_X700},
1749 {"RV410", CARD_AMD_RADEON_X700},
1750 /* Radeon Xpress - onboard, DX9b, Shader 2.0, 300-400 MHz */
1751 {"RS740", CARD_AMD_RADEON_XPRESS_200M},
1752 {"RS690", CARD_AMD_RADEON_XPRESS_200M},
1753 {"RS600", CARD_AMD_RADEON_XPRESS_200M},
1754 {"RS485", CARD_AMD_RADEON_XPRESS_200M},
1755 {"RS482", CARD_AMD_RADEON_XPRESS_200M},
1756 {"RS480", CARD_AMD_RADEON_XPRESS_200M},
1757 {"RS400", CARD_AMD_RADEON_XPRESS_200M},
1758 {"RC410", CARD_AMD_RADEON_XPRESS_200M},
1759 /* R300 */
1760 {"R360", CARD_AMD_RADEON_9500},
1761 {"R350", CARD_AMD_RADEON_9500},
1762 {"R300", CARD_AMD_RADEON_9500},
1763 {"RV380", CARD_AMD_RADEON_9500},
1764 {"RV370", CARD_AMD_RADEON_9500},
1765 {"RV360", CARD_AMD_RADEON_9500},
1766 {"RV351", CARD_AMD_RADEON_9500},
1767 {"RV350", CARD_AMD_RADEON_9500},
1770{
1771 /* Maxwell */
1772 {"NV124", CARD_NVIDIA_GEFORCE_GTX970},
1774 {"NV118", CARD_NVIDIA_GEFORCE_840M},
1775 {"NV117", CARD_NVIDIA_GEFORCE_GTX750},
1776 /* Kepler */
1777 {"NV108", CARD_NVIDIA_GEFORCE_GT740M},
1778 {"NV106", CARD_NVIDIA_GEFORCE_GT720},
1782 {"NVE4", CARD_NVIDIA_GEFORCE_GTX680}, /* 690 / 675MX / 760TI */
1783 /* Fermi */
1784 {"NVD9", CARD_NVIDIA_GEFORCE_GT520},
1785 {"NVD7", CARD_NVIDIA_GEFORCE_820M},
1790 {"NVC3", CARD_NVIDIA_GEFORCE_GT440},
1791 {"NVC1", CARD_NVIDIA_GEFORCE_GT420},
1793 /* Tesla */
1795 {"NVAC", CARD_NVIDIA_GEFORCE_8200},
1796 {"NVAA", CARD_NVIDIA_GEFORCE_8200}, /* 8100 */
1797 {"NVA8", CARD_NVIDIA_GEFORCE_210},
1798 {"NVA5", CARD_NVIDIA_GEFORCE_GT220},
1799 {"NVA3", CARD_NVIDIA_GEFORCE_GT240},
1801 {"NV98", CARD_NVIDIA_GEFORCE_9200},
1808 /* Curie */
1809 {"NV68", CARD_NVIDIA_GEFORCE_6200}, /* 7050 */
1810 {"NV67", CARD_NVIDIA_GEFORCE_6200}, /* 7000M */
1811 {"NV63", CARD_NVIDIA_GEFORCE_6200}, /* 7100 */
1812 {"NV4E", CARD_NVIDIA_GEFORCE_6200}, /* 6100 Go / 6150 Go */
1813 {"NV4C", CARD_NVIDIA_GEFORCE_6200}, /* 6150SE */
1814 {"NV4B", CARD_NVIDIA_GEFORCE_7600},
1815 {"NV4A", CARD_NVIDIA_GEFORCE_6200},
1816 {"NV49", CARD_NVIDIA_GEFORCE_7800GT}, /* 7900 */
1818 {"NV46", CARD_NVIDIA_GEFORCE_7400},
1819 {"NV45", CARD_NVIDIA_GEFORCE_6800},
1820 {"NV44", CARD_NVIDIA_GEFORCE_6200},
1822 {"NV42", CARD_NVIDIA_GEFORCE_6800},
1823 {"NV41", CARD_NVIDIA_GEFORCE_6800},
1824 {"NV40", CARD_NVIDIA_GEFORCE_6800},
1825 /* Rankine */
1826 {"NV38", CARD_NVIDIA_GEFORCEFX_5800}, /* FX 5950 Ultra */
1827 {"NV36", CARD_NVIDIA_GEFORCEFX_5800}, /* FX 5700/5750 */
1828 {"NV35", CARD_NVIDIA_GEFORCEFX_5800}, /* FX 5900 */
1832 /* Kelvin */
1835 {"nv20", CARD_NVIDIA_GEFORCE3},
1836 /* Celsius */
1837 {"nv1F", CARD_NVIDIA_GEFORCE4_MX}, /* GF4 MX IGP */
1838 {"nv1A", CARD_NVIDIA_GEFORCE2}, /* GF2 IGP */
1839 {"nv18", CARD_NVIDIA_GEFORCE4_MX},
1840 {"nv17", CARD_NVIDIA_GEFORCE4_MX},
1841 {"nv16", CARD_NVIDIA_GEFORCE2},
1842 {"nv15", CARD_NVIDIA_GEFORCE2},
1843 {"nv11", CARD_NVIDIA_GEFORCE2_MX},
1844 {"nv10", CARD_NVIDIA_GEFORCE},
1845 /* Fahrenheit */
1846 {"nv05", CARD_NVIDIA_RIVA_TNT2},
1847 {"nv04", CARD_NVIDIA_RIVA_TNT},
1848 {"nv03", CARD_NVIDIA_RIVA_128},
1850cards_redhat[] =
1851{
1852 {"virgl", CARD_REDHAT_VIRGL},
1854cards_vmware[] =
1855{
1856 {"SVGA3D", CARD_VMWARE_SVGA3D},
1858
1859static const struct gl_vendor_selection
1860{
1862 const char *description; /* Description of the card selector i.e. Apple OS/X Intel */
1863 const struct wined3d_renderer_table *cards; /* To be used as cards[], pointer to the first member in an array */
1864 size_t cards_size; /* Number of entries in the array above */
1865}
1867{
1868 {GL_VENDOR_APPLE, "Apple OSX AMD/ATI binary driver", cards_amd_binary, ARRAY_SIZE(cards_amd_binary)},
1869 {GL_VENDOR_FGLRX, "AMD/ATI binary driver", cards_amd_binary, ARRAY_SIZE(cards_amd_binary)},
1870 {GL_VENDOR_MESA, "Mesa AMD/ATI driver", cards_amd_mesa, ARRAY_SIZE(cards_amd_mesa)},
1873{
1874 {GL_VENDOR_APPLE, "Apple OSX NVidia binary driver", cards_nvidia_binary, ARRAY_SIZE(cards_nvidia_binary)},
1879{
1880 {GL_VENDOR_MESA, "Red Hat driver", cards_redhat, ARRAY_SIZE(cards_redhat)},
1883{
1884 {GL_VENDOR_MESA, "VMware driver", cards_vmware, ARRAY_SIZE(cards_vmware)},
1887{
1888 {GL_VENDOR_APPLE, "Apple OSX Intel binary driver", cards_intel, ARRAY_SIZE(cards_intel)},
1889 {GL_VENDOR_MESA, "Mesa Intel driver", cards_intel, ARRAY_SIZE(cards_intel)},
1891
1893 unsigned int table_size, enum wined3d_gl_vendor gl_vendor, const char *gl_renderer)
1894{
1895 unsigned int i, j;
1896
1897 for (i = 0; i < table_size; ++i)
1898 {
1899 if (table[i].gl_vendor != gl_vendor)
1900 continue;
1901
1902 TRACE("Applying card selector \"%s\".\n", table[i].description);
1903
1904 for (j = 0; j < table[i].cards_size; ++j)
1905 {
1906 if (strstr(gl_renderer, table[i].cards[j].renderer))
1907 return table[i].cards[j].id;
1908 }
1909 return PCI_DEVICE_NONE;
1910 }
1911 FIXME("Couldn't find a suitable card selector for GL vendor %04x (using GL_RENDERER %s)\n",
1912 gl_vendor, debugstr_a(gl_renderer));
1913
1914 return PCI_DEVICE_NONE;
1915}
1916
1917static const struct
1918{
1920 const char *description; /* Description of the card selector i.e. Apple OS/X Intel */
1922 unsigned int gl_vendor_count;
1923}
1925{
1932
1934 const char *gl_renderer, enum wined3d_gl_vendor *gl_vendor,
1936{
1937 /* A Direct3D device object contains the PCI id (vendor + device) of the
1938 * videocard which is used for rendering. Various applications use this
1939 * information to get a rough estimation of the features of the card and
1940 * some might use it for enabling 3d effects only on certain types of
1941 * videocards. In some cases games might even use it to work around bugs
1942 * which happen on certain videocards/driver combinations. The problem is
1943 * that OpenGL only exposes a rendering string containing the name of the
1944 * videocard and not the PCI id.
1945 *
1946 * Various games depend on the PCI id, so somehow we need to provide one.
1947 * A simple option is to parse the renderer string and translate this to
1948 * the right PCI id. This is a lot of work because there are more than 200
1949 * GPUs just for NVIDIA. Various cards share the same renderer string, so
1950 * the amount of code might be 'small' but there are quite a number of
1951 * exceptions which would make this a pain to maintain. Another way would
1952 * be to query the PCI id from the operating system (assuming this is the
1953 * videocard which is used for rendering which is not always the case).
1954 * This would work but it is not very portable. Second it would not work
1955 * well in, let's say, a remote X situation in which the amount of 3d
1956 * features which can be used is limited.
1957 *
1958 * As said most games only use the PCI id to get an indication of the
1959 * capabilities of the card. It doesn't really matter if the given id is
1960 * the correct one if we return the id of a card with similar 3d features.
1961 *
1962 * The code below checks the OpenGL capabilities of a videocard and matches
1963 * that to a certain level of Direct3D functionality. Once a card passes
1964 * the Direct3D9 check, we know that the card (in case of NVIDIA) is at
1965 * least a GeforceFX. To give a better estimate we do a basic check on the
1966 * renderer string but if that won't pass we return a default card. This
1967 * way is better than maintaining a full card database as even without a
1968 * full database we can return a card with similar features. Second the
1969 * size of the database can be made quite small because when you know what
1970 * type of 3d functionality a card has, you know to which GPU family the
1971 * GPU must belong. Because of this you only have to check a small part of
1972 * the renderer string to distinguish between different models from that
1973 * family.
1974 *
1975 * The code also selects a default amount of video memory which we will
1976 * use for an estimation of the amount of free texture memory. In case of
1977 * real D3D the amount of texture memory includes video memory and system
1978 * memory (to be specific AGP memory or in case of PCIE TurboCache /
1979 * HyperMemory). We don't know how much system memory can be addressed by
1980 * the system but we can make a reasonable estimation about the amount of
1981 * video memory. If the value is slightly wrong it doesn't matter as we
1982 * didn't include AGP-like memory which makes the amount of addressable
1983 * memory higher and second OpenGL isn't that critical it moves to system
1984 * memory behind our backs if really needed. Note that the amount of video
1985 * memory can be overruled using a registry setting. */
1986
1988 unsigned int i;
1989
1990 for (i = 0; i < ARRAY_SIZE(card_vendor_table); ++i)
1991 {
1993 continue;
1994
1995 TRACE("Applying card selector \"%s\".\n", card_vendor_table[i].description);
1998 if (device != PCI_DEVICE_NONE)
1999 return device;
2000
2001 TRACE("Unrecognized renderer %s, falling back to default.\n", debugstr_a(gl_renderer));
2002
2003 return wined3d_gpu_from_feature_level(card_vendor, feature_level);
2004 }
2005
2006 FIXME("No card selector available for card vendor %04x (using GL_RENDERER %s).\n",
2007 *card_vendor, debugstr_a(gl_renderer));
2008
2009 return wined3d_gpu_from_feature_level(card_vendor, feature_level);
2010}
2011
2012static void parse_extension_string(struct wined3d_gl_info *gl_info, const char *extensions,
2013 const struct wined3d_extension_map *map, UINT entry_count)
2014{
2015 while (*extensions)
2016 {
2017 const char *start;
2018 size_t len;
2019 UINT i;
2020
2021 while (isspace(*extensions))
2022 ++extensions;
2023 start = extensions;
2024 while (!isspace(*extensions) && *extensions)
2025 ++extensions;
2026
2027 len = extensions - start;
2028 if (!len)
2029 continue;
2030
2031 TRACE("- %s.\n", debugstr_an(start, len));
2032
2033 for (i = 0; i < entry_count; ++i)
2034 {
2035 if (len == strlen(map[i].extension_string)
2036 && !memcmp(start, map[i].extension_string, len))
2037 {
2038 TRACE(" FOUND: %s support.\n", map[i].extension_string);
2039 gl_info->supported[map[i].extension] = TRUE;
2040 break;
2041 }
2042 }
2043 }
2044}
2045
2046static void enumerate_gl_extensions(struct wined3d_gl_info *gl_info,
2047 const struct wined3d_extension_map *map, unsigned int map_entries_count)
2048{
2049 const char *gl_extension_name;
2050 unsigned int i, j;
2051 GLint extensions_count;
2052
2053 gl_info->gl_ops.gl.p_glGetIntegerv(GL_NUM_EXTENSIONS, &extensions_count);
2054 for (i = 0; i < extensions_count; ++i)
2055 {
2056 gl_extension_name = (const char *)GL_EXTCALL(glGetStringi(GL_EXTENSIONS, i));
2057 TRACE("- %s.\n", debugstr_a(gl_extension_name));
2058 for (j = 0; j < map_entries_count; ++j)
2059 {
2060 if (!strcmp(gl_extension_name, map[j].extension_string))
2061 {
2062 TRACE("FOUND: %s support.\n", map[j].extension_string);
2063 gl_info->supported[map[j].extension] = TRUE;
2064 break;
2065 }
2066 }
2067 }
2068}
2069
2070static void load_gl_funcs(struct wined3d_gl_info *gl_info)
2071{
2072#define USE_GL_FUNC(pfn) gl_info->gl_ops.ext.p_##pfn = (void *)wglGetProcAddress(#pfn);
2073 /* GL_APPLE_fence */
2074 USE_GL_FUNC(glDeleteFencesAPPLE)
2075 USE_GL_FUNC(glFinishFenceAPPLE)
2076 USE_GL_FUNC(glFinishObjectAPPLE)
2077 USE_GL_FUNC(glGenFencesAPPLE)
2078 USE_GL_FUNC(glIsFenceAPPLE)
2079 USE_GL_FUNC(glSetFenceAPPLE)
2080 USE_GL_FUNC(glTestFenceAPPLE)
2081 USE_GL_FUNC(glTestObjectAPPLE)
2082 /* GL_APPLE_flush_buffer_range */
2083 USE_GL_FUNC(glBufferParameteriAPPLE)
2084 USE_GL_FUNC(glFlushMappedBufferRangeAPPLE)
2085 /* GL_ARB_base_instance */
2086 USE_GL_FUNC(glDrawArraysInstancedBaseInstance)
2087 USE_GL_FUNC(glDrawElementsInstancedBaseVertexBaseInstance)
2088 /* GL_ARB_blend_func_extended */
2089 USE_GL_FUNC(glBindFragDataLocationIndexed)
2090 USE_GL_FUNC(glGetFragDataIndex)
2091 /* GL_ARB_buffer_storage */
2092 USE_GL_FUNC(glBufferStorage)
2093 /* GL_ARB_clear_buffer_object */
2094 USE_GL_FUNC(glClearBufferData)
2095 USE_GL_FUNC(glClearBufferSubData)
2096 /* GL_ARB_clear_texture */
2097 USE_GL_FUNC(glClearTexImage)
2098 USE_GL_FUNC(glClearTexSubImage)
2099 /* GL_ARB_clip_control */
2100 USE_GL_FUNC(glClipControl)
2101 /* GL_ARB_color_buffer_float */
2102 USE_GL_FUNC(glClampColorARB)
2103 /* GL_ARB_compute_shader */
2104 USE_GL_FUNC(glDispatchCompute)
2105 USE_GL_FUNC(glDispatchComputeIndirect)
2106 /* GL_ARB_copy_buffer */
2107 USE_GL_FUNC(glCopyBufferSubData)
2108 /* GL_ARB_copy_image */
2109 USE_GL_FUNC(glCopyImageSubData)
2110 /* GL_ARB_debug_output */
2111 USE_GL_FUNC(glDebugMessageCallbackARB)
2112 USE_GL_FUNC(glDebugMessageControlARB)
2113 USE_GL_FUNC(glDebugMessageInsertARB)
2114 USE_GL_FUNC(glGetDebugMessageLogARB)
2115 /* GL_ARB_draw_buffers */
2116 USE_GL_FUNC(glDrawBuffersARB)
2117 /* GL_ARB_draw_buffers_blend */
2118 USE_GL_FUNC(glBlendEquationiARB)
2119 USE_GL_FUNC(glBlendEquationSeparateiARB)
2120 USE_GL_FUNC(glBlendFunciARB)
2121 USE_GL_FUNC(glBlendFuncSeparateiARB)
2122 /* GL_ARB_draw_elements_base_vertex */
2123 USE_GL_FUNC(glDrawElementsBaseVertex)
2124 USE_GL_FUNC(glDrawElementsInstancedBaseVertex)
2125 USE_GL_FUNC(glDrawRangeElementsBaseVertex)
2126 USE_GL_FUNC(glMultiDrawElementsBaseVertex)
2127 /* GL_ARB_draw_indirect */
2128 USE_GL_FUNC(glDrawArraysIndirect)
2129 USE_GL_FUNC(glDrawElementsIndirect)
2130 /* GL_ARB_draw_instanced */
2131 USE_GL_FUNC(glDrawArraysInstancedARB)
2132 USE_GL_FUNC(glDrawElementsInstancedARB)
2133 /* GL_ARB_ES2_compatibility */
2134 USE_GL_FUNC(glReleaseShaderCompiler)
2135 USE_GL_FUNC(glShaderBinary)
2136 USE_GL_FUNC(glGetShaderPrecisionFormat)
2137 USE_GL_FUNC(glDepthRangef)
2138 USE_GL_FUNC(glClearDepthf)
2139 /* GL_ARB_framebuffer_no_attachments */
2140 USE_GL_FUNC(glFramebufferParameteri)
2141 /* GL_ARB_framebuffer_object */
2142 USE_GL_FUNC(glBindFramebuffer)
2143 USE_GL_FUNC(glBindRenderbuffer)
2144 USE_GL_FUNC(glBlitFramebuffer)
2145 USE_GL_FUNC(glCheckFramebufferStatus)
2146 USE_GL_FUNC(glDeleteFramebuffers)
2147 USE_GL_FUNC(glDeleteRenderbuffers)
2148 USE_GL_FUNC(glFramebufferRenderbuffer)
2149 USE_GL_FUNC(glFramebufferTexture)
2150 USE_GL_FUNC(glFramebufferTexture1D)
2151 USE_GL_FUNC(glFramebufferTexture2D)
2152 USE_GL_FUNC(glFramebufferTexture3D)
2153 USE_GL_FUNC(glFramebufferTextureLayer)
2154 USE_GL_FUNC(glGenFramebuffers)
2155 USE_GL_FUNC(glGenRenderbuffers)
2156 USE_GL_FUNC(glGenerateMipmap)
2157 USE_GL_FUNC(glGetFramebufferAttachmentParameteriv)
2158 USE_GL_FUNC(glGetRenderbufferParameteriv)
2159 USE_GL_FUNC(glIsFramebuffer)
2160 USE_GL_FUNC(glIsRenderbuffer)
2161 USE_GL_FUNC(glRenderbufferStorage)
2162 USE_GL_FUNC(glRenderbufferStorageMultisample)
2163 /* GL_ARB_geometry_shader4 */
2164 USE_GL_FUNC(glFramebufferTextureARB)
2165 USE_GL_FUNC(glFramebufferTextureFaceARB)
2166 USE_GL_FUNC(glFramebufferTextureLayerARB)
2167 USE_GL_FUNC(glProgramParameteriARB)
2168 /* GL_ARB_instanced_arrays */
2169 USE_GL_FUNC(glVertexAttribDivisorARB)
2170 /* GL_ARB_internalformat_query */
2171 USE_GL_FUNC(glGetInternalformativ)
2172 /* GL_ARB_internalformat_query2 */
2173 USE_GL_FUNC(glGetInternalformati64v)
2174 /* GL_ARB_map_buffer_range */
2175 USE_GL_FUNC(glFlushMappedBufferRange)
2176 USE_GL_FUNC(glMapBufferRange)
2177 /* GL_ARB_multisample */
2178 USE_GL_FUNC(glSampleCoverageARB)
2179 /* GL_ARB_multitexture */
2192 /* GL_ARB_occlusion_query */
2193 USE_GL_FUNC(glBeginQueryARB)
2194 USE_GL_FUNC(glDeleteQueriesARB)
2195 USE_GL_FUNC(glEndQueryARB)
2196 USE_GL_FUNC(glGenQueriesARB)
2197 USE_GL_FUNC(glGetQueryivARB)
2198 USE_GL_FUNC(glGetQueryObjectivARB)
2199 USE_GL_FUNC(glGetQueryObjectuivARB)
2200 USE_GL_FUNC(glIsQueryARB)
2201 /* GL_ARB_point_parameters */
2202 USE_GL_FUNC(glPointParameterfARB)
2203 USE_GL_FUNC(glPointParameterfvARB)
2204 /* GL_ARB_polgyon_offset_clamp */
2205 USE_GL_FUNC(glPolygonOffsetClamp)
2206 /* GL_ARB_provoking_vertex */
2207 USE_GL_FUNC(glProvokingVertex)
2208 /* GL_ARB_sample_shading */
2209 USE_GL_FUNC(glMinSampleShadingARB)
2210 /* GL_ARB_sampler_objects */
2211 USE_GL_FUNC(glGenSamplers)
2212 USE_GL_FUNC(glDeleteSamplers)
2213 USE_GL_FUNC(glIsSampler)
2214 USE_GL_FUNC(glBindSampler)
2215 USE_GL_FUNC(glSamplerParameteri)
2216 USE_GL_FUNC(glSamplerParameterf)
2217 USE_GL_FUNC(glSamplerParameteriv)
2218 USE_GL_FUNC(glSamplerParameterfv)
2219 USE_GL_FUNC(glSamplerParameterIiv)
2220 USE_GL_FUNC(glSamplerParameterIuiv)
2221 USE_GL_FUNC(glGetSamplerParameteriv)
2222 USE_GL_FUNC(glGetSamplerParameterfv)
2223 USE_GL_FUNC(glGetSamplerParameterIiv)
2224 USE_GL_FUNC(glGetSamplerParameterIuiv)
2225 /* GL_ARB_shader_atomic_counters */
2226 USE_GL_FUNC(glGetActiveAtomicCounterBufferiv)
2227 /* GL_ARB_shader_image_load_store */
2228 USE_GL_FUNC(glBindImageTexture)
2229 USE_GL_FUNC(glMemoryBarrier)
2230 /* GL_ARB_shader_objects */
2231 USE_GL_FUNC(glAttachObjectARB)
2232 USE_GL_FUNC(glBindAttribLocationARB)
2233 USE_GL_FUNC(glCompileShaderARB)
2234 USE_GL_FUNC(glCreateProgramObjectARB)
2235 USE_GL_FUNC(glCreateShaderObjectARB)
2236 USE_GL_FUNC(glDeleteObjectARB)
2237 USE_GL_FUNC(glDetachObjectARB)
2238 USE_GL_FUNC(glGetActiveUniformARB)
2239 USE_GL_FUNC(glGetAttachedObjectsARB)
2240 USE_GL_FUNC(glGetAttribLocationARB)
2241 USE_GL_FUNC(glGetHandleARB)
2242 USE_GL_FUNC(glGetInfoLogARB)
2243 USE_GL_FUNC(glGetObjectParameterfvARB)
2244 USE_GL_FUNC(glGetObjectParameterivARB)
2245 USE_GL_FUNC(glGetShaderSourceARB)
2246 USE_GL_FUNC(glGetUniformLocationARB)
2247 USE_GL_FUNC(glGetUniformfvARB)
2248 USE_GL_FUNC(glGetUniformivARB)
2249 USE_GL_FUNC(glLinkProgramARB)
2250 USE_GL_FUNC(glShaderSourceARB)
2251 USE_GL_FUNC(glUniform1fARB)
2252 USE_GL_FUNC(glUniform1fvARB)
2253 USE_GL_FUNC(glUniform1iARB)
2254 USE_GL_FUNC(glUniform1ivARB)
2255 USE_GL_FUNC(glUniform2fARB)
2256 USE_GL_FUNC(glUniform2fvARB)
2257 USE_GL_FUNC(glUniform2iARB)
2258 USE_GL_FUNC(glUniform2ivARB)
2259 USE_GL_FUNC(glUniform3fARB)
2260 USE_GL_FUNC(glUniform3fvARB)
2261 USE_GL_FUNC(glUniform3iARB)
2262 USE_GL_FUNC(glUniform3ivARB)
2263 USE_GL_FUNC(glUniform4fARB)
2264 USE_GL_FUNC(glUniform4fvARB)
2265 USE_GL_FUNC(glUniform4iARB)
2266 USE_GL_FUNC(glUniform4ivARB)
2267 USE_GL_FUNC(glUniformMatrix2fvARB)
2268 USE_GL_FUNC(glUniformMatrix3fvARB)
2269 USE_GL_FUNC(glUniformMatrix4fvARB)
2270 USE_GL_FUNC(glUseProgramObjectARB)
2271 USE_GL_FUNC(glValidateProgramARB)
2272 /* GL_ARB_shader_storage_buffer_object */
2273 USE_GL_FUNC(glShaderStorageBlockBinding)
2274 /* GL_ARB_sync */
2275 USE_GL_FUNC(glClientWaitSync)
2276 USE_GL_FUNC(glDeleteSync)
2277 USE_GL_FUNC(glFenceSync)
2278 USE_GL_FUNC(glGetInteger64v)
2279 USE_GL_FUNC(glGetSynciv)
2280 USE_GL_FUNC(glIsSync)
2281 USE_GL_FUNC(glWaitSync)
2282 /* GL_ARB_tessellation_shader */
2283 USE_GL_FUNC(glPatchParameteri)
2284 USE_GL_FUNC(glPatchParameterfv)
2285 /* GL_ARB_texture_buffer_object */
2286 USE_GL_FUNC(glTexBufferARB)
2287 /* GL_ARB_texture_buffer_range */
2288 USE_GL_FUNC(glTexBufferRange)
2289 /* GL_ARB_texture_compression */
2290 USE_GL_FUNC(glCompressedTexImage2DARB)
2291 USE_GL_FUNC(glCompressedTexImage3DARB)
2292 USE_GL_FUNC(glCompressedTexSubImage2DARB)
2293 USE_GL_FUNC(glCompressedTexSubImage3DARB)
2294 USE_GL_FUNC(glGetCompressedTexImageARB)
2295 /* GL_ARB_texture_multisample */
2296 USE_GL_FUNC(glGetMultisamplefv);
2297 USE_GL_FUNC(glSampleMaski);
2298 USE_GL_FUNC(glTexImage2DMultisample);
2299 USE_GL_FUNC(glTexImage3DMultisample);
2300 /* GL_ARB_texture_storage */
2301 USE_GL_FUNC(glTexStorage1D)
2302 USE_GL_FUNC(glTexStorage2D)
2303 USE_GL_FUNC(glTexStorage3D)
2304 /* GL_ARB_texture_storage_multisample */
2305 USE_GL_FUNC(glTexStorage2DMultisample);
2306 USE_GL_FUNC(glTexStorage3DMultisample);
2307 /* GL_ARB_texture_view */
2308 USE_GL_FUNC(glTextureView)
2309 /* GL_ARB_timer_query */
2310 USE_GL_FUNC(glQueryCounter)
2311 USE_GL_FUNC(glGetQueryObjectui64v)
2312 /* GL_ARB_transform_feedback2 */
2313 USE_GL_FUNC(glBindTransformFeedback);
2314 USE_GL_FUNC(glDeleteTransformFeedbacks);
2315 USE_GL_FUNC(glDrawTransformFeedback);
2316 USE_GL_FUNC(glGenTransformFeedbacks);
2317 USE_GL_FUNC(glIsTransformFeedback);
2318 USE_GL_FUNC(glPauseTransformFeedback);
2319 USE_GL_FUNC(glResumeTransformFeedback);
2320 /* GL_ARB_transform_feedback3 */
2321 USE_GL_FUNC(glBeginQueryIndexed);
2322 USE_GL_FUNC(glDrawTransformFeedbackStream);
2323 USE_GL_FUNC(glEndQueryIndexed);
2324 USE_GL_FUNC(glGetQueryIndexediv);
2325 /* GL_ARB_uniform_buffer_object */
2326 USE_GL_FUNC(glBindBufferBase)
2327 USE_GL_FUNC(glBindBufferRange)
2328 USE_GL_FUNC(glGetActiveUniformBlockName)
2329 USE_GL_FUNC(glGetActiveUniformBlockiv)
2330 USE_GL_FUNC(glGetActiveUniformName)
2331 USE_GL_FUNC(glGetActiveUniformsiv)
2332 USE_GL_FUNC(glGetIntegeri_v)
2333 USE_GL_FUNC(glGetUniformBlockIndex)
2334 USE_GL_FUNC(glGetUniformIndices)
2335 USE_GL_FUNC(glUniformBlockBinding)
2336 /* GL_ARB_vertex_buffer_object */
2337 USE_GL_FUNC(glBindBufferARB)
2338 USE_GL_FUNC(glBufferDataARB)
2339 USE_GL_FUNC(glBufferSubDataARB)
2340 USE_GL_FUNC(glDeleteBuffersARB)
2341 USE_GL_FUNC(glGenBuffersARB)
2342 USE_GL_FUNC(glGetBufferParameterivARB)
2343 USE_GL_FUNC(glGetBufferPointervARB)
2344 USE_GL_FUNC(glGetBufferSubDataARB)
2345 USE_GL_FUNC(glIsBufferARB)
2346 USE_GL_FUNC(glMapBufferARB)
2347 USE_GL_FUNC(glUnmapBufferARB)
2348 /* GL_ARB_vertex_program */
2349 USE_GL_FUNC(glBindProgramARB)
2350 USE_GL_FUNC(glDeleteProgramsARB)
2351 USE_GL_FUNC(glDisableVertexAttribArrayARB)
2352 USE_GL_FUNC(glEnableVertexAttribArrayARB)
2353 USE_GL_FUNC(glGenProgramsARB)
2354 USE_GL_FUNC(glGetProgramivARB)
2355 USE_GL_FUNC(glProgramEnvParameter4fvARB)
2356 USE_GL_FUNC(glProgramLocalParameter4fvARB)
2357 USE_GL_FUNC(glProgramStringARB)
2358 USE_GL_FUNC(glVertexAttrib1dARB)
2359 USE_GL_FUNC(glVertexAttrib1dvARB)
2360 USE_GL_FUNC(glVertexAttrib1fARB)
2361 USE_GL_FUNC(glVertexAttrib1fvARB)
2362 USE_GL_FUNC(glVertexAttrib1sARB)
2363 USE_GL_FUNC(glVertexAttrib1svARB)
2364 USE_GL_FUNC(glVertexAttrib2dARB)
2365 USE_GL_FUNC(glVertexAttrib2dvARB)
2366 USE_GL_FUNC(glVertexAttrib2fARB)
2367 USE_GL_FUNC(glVertexAttrib2fvARB)
2368 USE_GL_FUNC(glVertexAttrib2sARB)
2369 USE_GL_FUNC(glVertexAttrib2svARB)
2370 USE_GL_FUNC(glVertexAttrib3dARB)
2371 USE_GL_FUNC(glVertexAttrib3dvARB)
2372 USE_GL_FUNC(glVertexAttrib3fARB)
2373 USE_GL_FUNC(glVertexAttrib3fvARB)
2374 USE_GL_FUNC(glVertexAttrib3sARB)
2375 USE_GL_FUNC(glVertexAttrib3svARB)
2376 USE_GL_FUNC(glVertexAttrib4NbvARB)
2377 USE_GL_FUNC(glVertexAttrib4NivARB)
2378 USE_GL_FUNC(glVertexAttrib4NsvARB)
2379 USE_GL_FUNC(glVertexAttrib4NubARB)
2380 USE_GL_FUNC(glVertexAttrib4NubvARB)
2381 USE_GL_FUNC(glVertexAttrib4NuivARB)
2382 USE_GL_FUNC(glVertexAttrib4NusvARB)
2383 USE_GL_FUNC(glVertexAttrib4bvARB)
2384 USE_GL_FUNC(glVertexAttrib4dARB)
2385 USE_GL_FUNC(glVertexAttrib4dvARB)
2386 USE_GL_FUNC(glVertexAttrib4fARB)
2387 USE_GL_FUNC(glVertexAttrib4fvARB)
2388 USE_GL_FUNC(glVertexAttrib4ivARB)
2389 USE_GL_FUNC(glVertexAttrib4sARB)
2390 USE_GL_FUNC(glVertexAttrib4svARB)
2391 USE_GL_FUNC(glVertexAttrib4ubvARB)
2392 USE_GL_FUNC(glVertexAttrib4uivARB)
2393 USE_GL_FUNC(glVertexAttrib4usvARB)
2394 USE_GL_FUNC(glVertexAttribPointerARB)
2395 /* GL_ARB_viewport_array */
2396 USE_GL_FUNC(glDepthRangeArrayv)
2397 USE_GL_FUNC(glDepthRangeIndexed)
2398 USE_GL_FUNC(glGetDoublei_v)
2399 USE_GL_FUNC(glGetFloati_v)
2400 USE_GL_FUNC(glScissorArrayv)
2401 USE_GL_FUNC(glScissorIndexed)
2402 USE_GL_FUNC(glScissorIndexedv)
2403 USE_GL_FUNC(glViewportArrayv)
2404 USE_GL_FUNC(glViewportIndexedf)
2405 USE_GL_FUNC(glViewportIndexedfv)
2406 /* GL_ARB_texture_barrier */
2407 USE_GL_FUNC(glTextureBarrier);
2408 /* GL_ATI_fragment_shader */
2409 USE_GL_FUNC(glAlphaFragmentOp1ATI)
2410 USE_GL_FUNC(glAlphaFragmentOp2ATI)
2411 USE_GL_FUNC(glAlphaFragmentOp3ATI)
2412 USE_GL_FUNC(glBeginFragmentShaderATI)
2413 USE_GL_FUNC(glBindFragmentShaderATI)
2414 USE_GL_FUNC(glColorFragmentOp1ATI)
2415 USE_GL_FUNC(glColorFragmentOp2ATI)
2416 USE_GL_FUNC(glColorFragmentOp3ATI)
2417 USE_GL_FUNC(glDeleteFragmentShaderATI)
2418 USE_GL_FUNC(glEndFragmentShaderATI)
2419 USE_GL_FUNC(glGenFragmentShadersATI)
2420 USE_GL_FUNC(glPassTexCoordATI)
2421 USE_GL_FUNC(glSampleMapATI)
2422 USE_GL_FUNC(glSetFragmentShaderConstantATI)
2423 /* GL_ATI_separate_stencil */
2424 USE_GL_FUNC(glStencilOpSeparateATI)
2425 USE_GL_FUNC(glStencilFuncSeparateATI)
2426 /* GL_EXT_blend_color */
2427 USE_GL_FUNC(glBlendColorEXT)
2428 /* GL_EXT_blend_equation_separate */
2429 USE_GL_FUNC(glBlendFuncSeparateEXT)
2430 /* GL_EXT_blend_func_separate */
2431 USE_GL_FUNC(glBlendEquationSeparateEXT)
2432 /* GL_EXT_blend_minmax */
2433 USE_GL_FUNC(glBlendEquationEXT)
2434 /* GL_EXT_depth_bounds_test */
2435 USE_GL_FUNC(glDepthBoundsEXT)
2436 /* GL_EXT_draw_buffers2 */
2437 USE_GL_FUNC(glColorMaskIndexedEXT)
2438 USE_GL_FUNC(glDisableIndexedEXT)
2439 USE_GL_FUNC(glEnableIndexedEXT)
2440 USE_GL_FUNC(glGetBooleanIndexedvEXT)
2441 USE_GL_FUNC(glGetIntegerIndexedvEXT)
2442 USE_GL_FUNC(glIsEnabledIndexedEXT)
2443 /* GL_EXT_fog_coord */
2444 USE_GL_FUNC(glFogCoordPointerEXT)
2445 USE_GL_FUNC(glFogCoorddEXT)
2446 USE_GL_FUNC(glFogCoorddvEXT)
2447 USE_GL_FUNC(glFogCoordfEXT)
2448 USE_GL_FUNC(glFogCoordfvEXT)
2449 /* GL_EXT_framebuffer_blit */
2450 USE_GL_FUNC(glBlitFramebufferEXT)
2451 /* GL_EXT_framebuffer_multisample */
2452 USE_GL_FUNC(glRenderbufferStorageMultisampleEXT)
2453 /* GL_EXT_framebuffer_object */
2454 USE_GL_FUNC(glBindFramebufferEXT)
2455 USE_GL_FUNC(glBindRenderbufferEXT)
2456 USE_GL_FUNC(glCheckFramebufferStatusEXT)
2457 USE_GL_FUNC(glDeleteFramebuffersEXT)
2458 USE_GL_FUNC(glDeleteRenderbuffersEXT)
2459 USE_GL_FUNC(glFramebufferRenderbufferEXT)
2460 USE_GL_FUNC(glFramebufferTexture1DEXT)
2461 USE_GL_FUNC(glFramebufferTexture2DEXT)
2462 USE_GL_FUNC(glFramebufferTexture3DEXT)
2463 USE_GL_FUNC(glGenFramebuffersEXT)
2464 USE_GL_FUNC(glGenRenderbuffersEXT)
2465 USE_GL_FUNC(glGenerateMipmapEXT)
2466 USE_GL_FUNC(glGetFramebufferAttachmentParameterivEXT)
2467 USE_GL_FUNC(glGetRenderbufferParameterivEXT)
2468 USE_GL_FUNC(glIsFramebufferEXT)
2469 USE_GL_FUNC(glIsRenderbufferEXT)
2470 USE_GL_FUNC(glRenderbufferStorageEXT)
2471 /* GL_EXT_gpu_program_parameters */
2472 USE_GL_FUNC(glProgramEnvParameters4fvEXT)
2473 USE_GL_FUNC(glProgramLocalParameters4fvEXT)
2474 /* GL_EXT_gpu_shader4 */
2475 USE_GL_FUNC(glBindFragDataLocationEXT)
2476 USE_GL_FUNC(glGetFragDataLocationEXT)
2477 USE_GL_FUNC(glGetUniformuivEXT)
2478 USE_GL_FUNC(glGetVertexAttribIivEXT)
2479 USE_GL_FUNC(glGetVertexAttribIuivEXT)
2480 USE_GL_FUNC(glUniform1uiEXT)
2481 USE_GL_FUNC(glUniform1uivEXT)
2482 USE_GL_FUNC(glUniform2uiEXT)
2483 USE_GL_FUNC(glUniform2uivEXT)
2484 USE_GL_FUNC(glUniform3uiEXT)
2485 USE_GL_FUNC(glUniform3uivEXT)
2486 USE_GL_FUNC(glUniform4uiEXT)
2487 USE_GL_FUNC(glUniform4uivEXT)
2488 USE_GL_FUNC(glVertexAttribI1iEXT)
2489 USE_GL_FUNC(glVertexAttribI1ivEXT)
2490 USE_GL_FUNC(glVertexAttribI1uiEXT)
2491 USE_GL_FUNC(glVertexAttribI1uivEXT)
2492 USE_GL_FUNC(glVertexAttribI2iEXT)
2493 USE_GL_FUNC(glVertexAttribI2ivEXT)
2494 USE_GL_FUNC(glVertexAttribI2uiEXT)
2495 USE_GL_FUNC(glVertexAttribI2uivEXT)
2496 USE_GL_FUNC(glVertexAttribI3iEXT)
2497 USE_GL_FUNC(glVertexAttribI3ivEXT)
2498 USE_GL_FUNC(glVertexAttribI3uiEXT)
2499 USE_GL_FUNC(glVertexAttribI3uivEXT)
2500 USE_GL_FUNC(glVertexAttribI4bvEXT)
2501 USE_GL_FUNC(glVertexAttribI4iEXT)
2502 USE_GL_FUNC(glVertexAttribI4ivEXT)
2503 USE_GL_FUNC(glVertexAttribI4svEXT)
2504 USE_GL_FUNC(glVertexAttribI4ubvEXT)
2505 USE_GL_FUNC(glVertexAttribI4uiEXT)
2506 USE_GL_FUNC(glVertexAttribI4uivEXT)
2507 USE_GL_FUNC(glVertexAttribI4usvEXT)
2508 USE_GL_FUNC(glVertexAttribIPointerEXT)
2509 /* GL_EXT_memory_object */
2510 USE_GL_FUNC(glGetUnsignedBytei_vEXT)
2511 USE_GL_FUNC(glGetUnsignedBytevEXT)
2512 /* GL_EXT_point_parameters */
2513 USE_GL_FUNC(glPointParameterfEXT)
2514 USE_GL_FUNC(glPointParameterfvEXT)
2515 /* GL_EXT_polgyon_offset_clamp */
2516 USE_GL_FUNC(glPolygonOffsetClampEXT)
2517 /* GL_EXT_provoking_vertex */
2518 USE_GL_FUNC(glProvokingVertexEXT)
2519 /* GL_EXT_secondary_color */
2520 USE_GL_FUNC(glSecondaryColor3fEXT)
2521 USE_GL_FUNC(glSecondaryColor3fvEXT)
2522 USE_GL_FUNC(glSecondaryColor3ubEXT)
2523 USE_GL_FUNC(glSecondaryColor3ubvEXT)
2524 USE_GL_FUNC(glSecondaryColorPointerEXT)
2525 /* GL_EXT_stencil_two_side */
2526 USE_GL_FUNC(glActiveStencilFaceEXT)
2527 /* GL_EXT_texture3D */
2529 USE_GL_FUNC(glTexImage3DEXT)
2531 USE_GL_FUNC(glTexSubImage3DEXT)
2532 /* GL_NV_fence */
2533 USE_GL_FUNC(glDeleteFencesNV)
2534 USE_GL_FUNC(glFinishFenceNV)
2535 USE_GL_FUNC(glGenFencesNV)
2536 USE_GL_FUNC(glGetFenceivNV)
2537 USE_GL_FUNC(glIsFenceNV)
2538 USE_GL_FUNC(glSetFenceNV)
2539 USE_GL_FUNC(glTestFenceNV)
2540 /* GL_NV_half_float */
2541 USE_GL_FUNC(glColor3hNV)
2542 USE_GL_FUNC(glColor3hvNV)
2543 USE_GL_FUNC(glColor4hNV)
2544 USE_GL_FUNC(glColor4hvNV)
2545 USE_GL_FUNC(glFogCoordhNV)
2546 USE_GL_FUNC(glFogCoordhvNV)
2547 USE_GL_FUNC(glMultiTexCoord1hNV)
2548 USE_GL_FUNC(glMultiTexCoord1hvNV)
2549 USE_GL_FUNC(glMultiTexCoord2hNV)
2550 USE_GL_FUNC(glMultiTexCoord2hvNV)
2551 USE_GL_FUNC(glMultiTexCoord3hNV)
2552 USE_GL_FUNC(glMultiTexCoord3hvNV)
2553 USE_GL_FUNC(glMultiTexCoord4hNV)
2554 USE_GL_FUNC(glMultiTexCoord4hvNV)
2555 USE_GL_FUNC(glNormal3hNV)
2556 USE_GL_FUNC(glNormal3hvNV)
2557 USE_GL_FUNC(glSecondaryColor3hNV)
2558 USE_GL_FUNC(glSecondaryColor3hvNV)
2559 USE_GL_FUNC(glTexCoord1hNV)
2560 USE_GL_FUNC(glTexCoord1hvNV)
2561 USE_GL_FUNC(glTexCoord2hNV)
2562 USE_GL_FUNC(glTexCoord2hvNV)
2563 USE_GL_FUNC(glTexCoord3hNV)
2564 USE_GL_FUNC(glTexCoord3hvNV)
2565 USE_GL_FUNC(glTexCoord4hNV)
2566 USE_GL_FUNC(glTexCoord4hvNV)
2567 USE_GL_FUNC(glVertex2hNV)
2568 USE_GL_FUNC(glVertex2hvNV)
2569 USE_GL_FUNC(glVertex3hNV)
2570 USE_GL_FUNC(glVertex3hvNV)
2571 USE_GL_FUNC(glVertex4hNV)
2572 USE_GL_FUNC(glVertex4hvNV)
2573 USE_GL_FUNC(glVertexAttrib1hNV)
2574 USE_GL_FUNC(glVertexAttrib1hvNV)
2575 USE_GL_FUNC(glVertexAttrib2hNV)
2576 USE_GL_FUNC(glVertexAttrib2hvNV)
2577 USE_GL_FUNC(glVertexAttrib3hNV)
2578 USE_GL_FUNC(glVertexAttrib3hvNV)
2579 USE_GL_FUNC(glVertexAttrib4hNV)
2580 USE_GL_FUNC(glVertexAttrib4hvNV)
2581 USE_GL_FUNC(glVertexAttribs1hvNV)
2582 USE_GL_FUNC(glVertexAttribs2hvNV)
2583 USE_GL_FUNC(glVertexAttribs3hvNV)
2584 USE_GL_FUNC(glVertexAttribs4hvNV)
2585 USE_GL_FUNC(glVertexWeighthNV)
2586 USE_GL_FUNC(glVertexWeighthvNV)
2587 /* GL_NV_point_sprite */
2588 USE_GL_FUNC(glPointParameteriNV)
2589 USE_GL_FUNC(glPointParameterivNV)
2590 /* GL_NV_register_combiners */
2591 USE_GL_FUNC(glCombinerInputNV)
2592 USE_GL_FUNC(glCombinerOutputNV)
2593 USE_GL_FUNC(glCombinerParameterfNV)
2594 USE_GL_FUNC(glCombinerParameterfvNV)
2595 USE_GL_FUNC(glCombinerParameteriNV)
2596 USE_GL_FUNC(glCombinerParameterivNV)
2597 USE_GL_FUNC(glFinalCombinerInputNV)
2598 /* GL_NV_texture_barrier */
2599 USE_GL_FUNC(glTextureBarrierNV);
2600 /* WGL extensions */
2601 USE_GL_FUNC(wglChoosePixelFormatARB)
2602 USE_GL_FUNC(wglGetExtensionsStringARB)
2603 USE_GL_FUNC(wglGetPixelFormatAttribfvARB)
2604 USE_GL_FUNC(wglGetPixelFormatAttribivARB)
2605 USE_GL_FUNC(wglQueryCurrentRendererIntegerWINE)
2606 USE_GL_FUNC(wglQueryCurrentRendererStringWINE)
2607 USE_GL_FUNC(wglQueryRendererIntegerWINE)
2608 USE_GL_FUNC(wglQueryRendererStringWINE)
2609 USE_GL_FUNC(wglSetPixelFormatWINE)
2610 USE_GL_FUNC(wglSwapIntervalEXT)
2611
2612 /* Newer core functions */
2613 USE_GL_FUNC(glActiveTexture) /* OpenGL 1.3 */
2614 USE_GL_FUNC(glAttachShader) /* OpenGL 2.0 */
2615 USE_GL_FUNC(glBeginQuery) /* OpenGL 1.5 */
2616 USE_GL_FUNC(glBeginTransformFeedback) /* OpenGL 3.0 */
2617 USE_GL_FUNC(glBindAttribLocation) /* OpenGL 2.0 */
2618 USE_GL_FUNC(glBindBuffer) /* OpenGL 1.5 */
2619 USE_GL_FUNC(glBindFragDataLocation) /* OpenGL 3.0 */
2620 USE_GL_FUNC(glBindVertexArray) /* OpenGL 3.0 */
2621 USE_GL_FUNC(glBlendColor) /* OpenGL 1.4 */
2622 USE_GL_FUNC(glBlendEquation) /* OpenGL 1.4 */
2623 USE_GL_FUNC(glBlendEquationi) /* OpenGL 4.0 */
2624 USE_GL_FUNC(glBlendEquationSeparate) /* OpenGL 2.0 */
2625 USE_GL_FUNC(glBlendEquationSeparatei) /* OpenGL 4.0 */
2626 USE_GL_FUNC(glBlendFunci) /* OpenGL 4.0 */
2627 USE_GL_FUNC(glBlendFuncSeparate) /* OpenGL 1.4 */
2628 USE_GL_FUNC(glBlendFuncSeparatei) /* OpenGL 4.0 */
2629 USE_GL_FUNC(glBufferData) /* OpenGL 1.5 */
2630 USE_GL_FUNC(glBufferSubData) /* OpenGL 1.5 */
2631 USE_GL_FUNC(glColorMaski) /* OpenGL 3.0 */
2632 USE_GL_FUNC(glCompileShader) /* OpenGL 2.0 */
2633 USE_GL_FUNC(glCompressedTexImage2D) /* OpenGL 1.3 */
2634 USE_GL_FUNC(glCompressedTexImage3D) /* OpenGL 1.3 */
2635 USE_GL_FUNC(glCompressedTexSubImage2D) /* OpenGL 1.3 */
2636 USE_GL_FUNC(glCompressedTexSubImage3D) /* OpenGL 1.3 */
2637 USE_GL_FUNC(glCreateProgram) /* OpenGL 2.0 */
2638 USE_GL_FUNC(glCreateShader) /* OpenGL 2.0 */
2639 USE_GL_FUNC(glDebugMessageCallback) /* OpenGL 4.3 */
2640 USE_GL_FUNC(glDebugMessageControl) /* OpenGL 4.3 */
2641 USE_GL_FUNC(glDebugMessageInsert) /* OpenGL 4.3 */
2642 USE_GL_FUNC(glDeleteBuffers) /* OpenGL 1.5 */
2643 USE_GL_FUNC(glDeleteProgram) /* OpenGL 2.0 */
2644 USE_GL_FUNC(glDeleteQueries) /* OpenGL 1.5 */
2645 USE_GL_FUNC(glDeleteShader) /* OpenGL 2.0 */
2646 USE_GL_FUNC(glDeleteVertexArrays) /* OpenGL 3.0 */
2647 USE_GL_FUNC(glDetachShader) /* OpenGL 2.0 */
2648 USE_GL_FUNC(glDisablei) /* OpenGL 3.0 */
2649 USE_GL_FUNC(glDisableVertexAttribArray) /* OpenGL 2.0 */
2650 USE_GL_FUNC(glDrawArraysInstanced) /* OpenGL 3.1 */
2651 USE_GL_FUNC(glDrawBuffers) /* OpenGL 2.0 */
2652 USE_GL_FUNC(glDrawElementsInstanced) /* OpenGL 3.1 */
2653 USE_GL_FUNC(glEnablei) /* OpenGL 3.0 */
2654 USE_GL_FUNC(glEnableVertexAttribArray) /* OpenGL 2.0 */
2655 USE_GL_FUNC(glEndQuery) /* OpenGL 1.5 */
2656 USE_GL_FUNC(glEndTransformFeedback) /* OpenGL 3.0 */
2657 USE_GL_FUNC(glFramebufferTexture) /* OpenGL 3.2 */
2658 USE_GL_FUNC(glGenBuffers) /* OpenGL 1.5 */
2659 USE_GL_FUNC(glGenQueries) /* OpenGL 1.5 */
2660 USE_GL_FUNC(glGenVertexArrays) /* OpenGL 3.0 */
2661 USE_GL_FUNC(glGetActiveUniform) /* OpenGL 2.0 */
2662 USE_GL_FUNC(glGetAttachedShaders) /* OpenGL 2.0 */
2663 USE_GL_FUNC(glGetAttribLocation) /* OpenGL 2.0 */
2664 USE_GL_FUNC(glGetBooleani_v) /* OpenGL 3.0 */
2665 USE_GL_FUNC(glGetBufferSubData) /* OpenGL 1.5 */
2666 USE_GL_FUNC(glGetCompressedTexImage) /* OpenGL 1.3 */
2667 USE_GL_FUNC(glGetDebugMessageLog) /* OpenGL 4.3 */
2668 USE_GL_FUNC(glGetIntegeri_v) /* OpenGL 3.0 */
2669 USE_GL_FUNC(glGetProgramInfoLog) /* OpenGL 2.0 */
2670 USE_GL_FUNC(glGetProgramiv) /* OpenGL 2.0 */
2671 USE_GL_FUNC(glGetQueryiv) /* OpenGL 1.5 */
2672 USE_GL_FUNC(glGetQueryObjectuiv) /* OpenGL 1.5 */
2673 USE_GL_FUNC(glGetShaderInfoLog) /* OpenGL 2.0 */
2674 USE_GL_FUNC(glGetShaderiv) /* OpenGL 2.0 */
2675 USE_GL_FUNC(glGetShaderSource) /* OpenGL 2.0 */
2676 USE_GL_FUNC(glGetStringi) /* OpenGL 3.0 */
2677 USE_GL_FUNC(glGetTextureLevelParameteriv) /* OpenGL 4.5 */
2678 USE_GL_FUNC(glGetTextureParameteriv) /* OpenGL 4.5 */
2679 USE_GL_FUNC(glGetUniformfv) /* OpenGL 2.0 */
2680 USE_GL_FUNC(glGetUniformiv) /* OpenGL 2.0 */
2681 USE_GL_FUNC(glGetUniformLocation) /* OpenGL 2.0 */
2682 USE_GL_FUNC(glIsEnabledi) /* OpenGL 3.0 */
2683 USE_GL_FUNC(glLinkProgram) /* OpenGL 2.0 */
2684 USE_GL_FUNC(glMapBuffer) /* OpenGL 1.5 */
2685 USE_GL_FUNC(glMinSampleShading) /* OpenGL 4.0 */
2686 USE_GL_FUNC(glPointParameteri) /* OpenGL 1.4 */
2687 USE_GL_FUNC(glPointParameteriv) /* OpenGL 1.4 */
2688 USE_GL_FUNC(glShaderSource) /* OpenGL 2.0 */
2689 USE_GL_FUNC(glStencilFuncSeparate) /* OpenGL 2.0 */
2690 USE_GL_FUNC(glStencilOpSeparate) /* OpenGL 2.0 */
2691 USE_GL_FUNC(glTexBuffer) /* OpenGL 3.1 */
2692 USE_GL_FUNC(glTexImage3D) /* OpenGL 1.2 */
2693 USE_GL_FUNC(glTexSubImage3D) /* OpenGL 1.2 */
2694 USE_GL_FUNC(glTransformFeedbackVaryings) /* OpenGL 3.0 */
2695 USE_GL_FUNC(glUniform1f) /* OpenGL 2.0 */
2696 USE_GL_FUNC(glUniform1fv) /* OpenGL 2.0 */
2697 USE_GL_FUNC(glUniform1i) /* OpenGL 2.0 */
2698 USE_GL_FUNC(glUniform1iv) /* OpenGL 2.0 */
2699 USE_GL_FUNC(glUniform2f) /* OpenGL 2.0 */
2700 USE_GL_FUNC(glUniform2fv) /* OpenGL 2.0 */
2701 USE_GL_FUNC(glUniform2i) /* OpenGL 2.0 */
2702 USE_GL_FUNC(glUniform2iv) /* OpenGL 2.0 */
2703 USE_GL_FUNC(glUniform3f) /* OpenGL 2.0 */
2704 USE_GL_FUNC(glUniform3fv) /* OpenGL 2.0 */
2705 USE_GL_FUNC(glUniform3i) /* OpenGL 2.0 */
2706 USE_GL_FUNC(glUniform3iv) /* OpenGL 2.0 */
2707 USE_GL_FUNC(glUniform4f) /* OpenGL 2.0 */
2708 USE_GL_FUNC(glUniform4fv) /* OpenGL 2.0 */
2709 USE_GL_FUNC(glUniform4i) /* OpenGL 2.0 */
2710 USE_GL_FUNC(glUniform4iv) /* OpenGL 2.0 */
2711 USE_GL_FUNC(glUniformMatrix2fv) /* OpenGL 2.0 */
2712 USE_GL_FUNC(glUniformMatrix3fv) /* OpenGL 2.0 */
2713 USE_GL_FUNC(glUniformMatrix4fv) /* OpenGL 2.0 */
2714 USE_GL_FUNC(glUnmapBuffer) /* OpenGL 1.5 */
2715 USE_GL_FUNC(glUseProgram) /* OpenGL 2.0 */
2716 USE_GL_FUNC(glValidateProgram) /* OpenGL 2.0 */
2717 USE_GL_FUNC(glVertexAttrib1f) /* OpenGL 2.0 */
2718 USE_GL_FUNC(glVertexAttrib1fv) /* OpenGL 2.0 */
2719 USE_GL_FUNC(glVertexAttrib2f) /* OpenGL 2.0 */
2720 USE_GL_FUNC(glVertexAttrib2fv) /* OpenGL 2.0 */
2721 USE_GL_FUNC(glVertexAttrib3f) /* OpenGL 2.0 */
2722 USE_GL_FUNC(glVertexAttrib3fv) /* OpenGL 2.0 */
2723 USE_GL_FUNC(glVertexAttrib4f) /* OpenGL 2.0 */
2724 USE_GL_FUNC(glVertexAttrib4fv) /* OpenGL 2.0 */
2725 USE_GL_FUNC(glVertexAttrib4Nsv) /* OpenGL 2.0 */
2726 USE_GL_FUNC(glVertexAttrib4Nub) /* OpenGL 2.0 */
2727 USE_GL_FUNC(glVertexAttrib4Nubv) /* OpenGL 2.0 */
2728 USE_GL_FUNC(glVertexAttrib4Nusv) /* OpenGL 2.0 */
2729 USE_GL_FUNC(glVertexAttrib4sv) /* OpenGL 2.0 */
2730 USE_GL_FUNC(glVertexAttrib4ubv) /* OpenGL 2.0 */
2731 USE_GL_FUNC(glVertexAttribDivisor) /* OpenGL 3.3 */
2732 USE_GL_FUNC(glVertexAttribIPointer) /* OpenGL 3.0 */
2733 USE_GL_FUNC(glVertexAttribPointer) /* OpenGL 2.0 */
2734#undef USE_GL_FUNC
2735
2736#define MAP_GL_FUNCTION(core_func, ext_func) \
2737 do \
2738 { \
2739 if (!gl_info->gl_ops.ext.p_##core_func) \
2740 gl_info->gl_ops.ext.p_##core_func = gl_info->gl_ops.ext.p_##ext_func; \
2741 } while (0)
2742#define MAP_GL_FUNCTION_CAST(core_func, ext_func) \
2743 do \
2744 { \
2745 if (!gl_info->gl_ops.ext.p_##core_func) \
2746 gl_info->gl_ops.ext.p_##core_func = (void *)gl_info->gl_ops.ext.p_##ext_func; \
2747 } while (0)
2748
2750 MAP_GL_FUNCTION(glAttachShader, glAttachObjectARB);
2751 MAP_GL_FUNCTION(glBeginQuery, glBeginQueryARB);
2752 MAP_GL_FUNCTION(glBindAttribLocation, glBindAttribLocationARB);
2753 MAP_GL_FUNCTION(glBindBuffer, glBindBufferARB);
2754 MAP_GL_FUNCTION(glBindFragDataLocation, glBindFragDataLocationEXT);
2755 MAP_GL_FUNCTION(glBlendColor, glBlendColorEXT);
2756 MAP_GL_FUNCTION(glBlendEquation, glBlendEquationEXT);
2757 MAP_GL_FUNCTION(glBlendEquationi, glBlendEquationiARB);
2758 MAP_GL_FUNCTION(glBlendEquationSeparate, glBlendEquationSeparateEXT);
2759 MAP_GL_FUNCTION(glBlendEquationSeparatei, glBlendEquationSeparateiARB);
2760 MAP_GL_FUNCTION(glBlendFunci, glBlendFunciARB);
2761 MAP_GL_FUNCTION(glBlendFuncSeparate, glBlendFuncSeparateEXT);
2762 MAP_GL_FUNCTION(glBlendFuncSeparatei, glBlendFuncSeparateiARB);
2763 MAP_GL_FUNCTION(glBufferData, glBufferDataARB);
2764 MAP_GL_FUNCTION(glBufferSubData, glBufferSubDataARB);
2765 MAP_GL_FUNCTION(glColorMaski, glColorMaskIndexedEXT);
2766 MAP_GL_FUNCTION(glCompileShader, glCompileShaderARB);
2767 MAP_GL_FUNCTION(glCompressedTexImage2D, glCompressedTexImage2DARB);
2768 MAP_GL_FUNCTION(glCompressedTexImage3D, glCompressedTexImage3DARB);
2769 MAP_GL_FUNCTION(glCompressedTexSubImage2D, glCompressedTexSubImage2DARB);
2770 MAP_GL_FUNCTION(glCompressedTexSubImage3D, glCompressedTexSubImage3DARB);
2771 MAP_GL_FUNCTION(glCreateProgram, glCreateProgramObjectARB);
2772 MAP_GL_FUNCTION(glCreateShader, glCreateShaderObjectARB);
2773 MAP_GL_FUNCTION(glDebugMessageCallback, glDebugMessageCallbackARB);
2774 MAP_GL_FUNCTION(glDebugMessageControl, glDebugMessageControlARB);
2775 MAP_GL_FUNCTION(glDebugMessageInsert, glDebugMessageInsertARB);
2776 MAP_GL_FUNCTION(glDeleteBuffers, glDeleteBuffersARB);
2777 MAP_GL_FUNCTION(glDeleteProgram, glDeleteObjectARB);
2778 MAP_GL_FUNCTION(glDeleteQueries, glDeleteQueriesARB);
2779 MAP_GL_FUNCTION(glDeleteShader, glDeleteObjectARB);
2780 MAP_GL_FUNCTION(glDetachShader, glDetachObjectARB);
2781 MAP_GL_FUNCTION(glDisablei, glDisableIndexedEXT);
2782 MAP_GL_FUNCTION(glDisableVertexAttribArray, glDisableVertexAttribArrayARB);
2783 MAP_GL_FUNCTION(glDrawArraysInstanced, glDrawArraysInstancedARB);
2784 MAP_GL_FUNCTION(glDrawBuffers, glDrawBuffersARB);
2785 MAP_GL_FUNCTION(glDrawElementsInstanced, glDrawElementsInstancedARB);
2786 MAP_GL_FUNCTION(glEnablei, glEnableIndexedEXT);
2787 MAP_GL_FUNCTION(glEnableVertexAttribArray, glEnableVertexAttribArrayARB);
2788 MAP_GL_FUNCTION(glEndQuery, glEndQueryARB);
2789 MAP_GL_FUNCTION(glFramebufferTexture, glFramebufferTextureARB);
2790 MAP_GL_FUNCTION(glGenBuffers, glGenBuffersARB);
2791 MAP_GL_FUNCTION(glGenQueries, glGenQueriesARB);
2792 MAP_GL_FUNCTION(glGetActiveUniform, glGetActiveUniformARB);
2793 MAP_GL_FUNCTION(glGetAttachedShaders, glGetAttachedObjectsARB);
2794 MAP_GL_FUNCTION(glGetAttribLocation, glGetAttribLocationARB);
2795 MAP_GL_FUNCTION(glGetBooleani_v, glGetBooleanIndexedvEXT);
2796 MAP_GL_FUNCTION(glGetBufferSubData, glGetBufferSubDataARB);
2797 MAP_GL_FUNCTION(glGetCompressedTexImage, glGetCompressedTexImageARB);
2798 MAP_GL_FUNCTION(glGetDebugMessageLog, glGetDebugMessageLogARB);
2799 MAP_GL_FUNCTION(glGetIntegeri_v, glGetIntegerIndexedvEXT);
2800 MAP_GL_FUNCTION(glGetProgramInfoLog, glGetInfoLogARB);
2801 MAP_GL_FUNCTION(glGetProgramiv, glGetObjectParameterivARB);
2802 MAP_GL_FUNCTION(glGetQueryiv, glGetQueryivARB);
2803 MAP_GL_FUNCTION(glGetQueryObjectuiv, glGetQueryObjectuivARB);
2804 MAP_GL_FUNCTION(glGetShaderInfoLog, glGetInfoLogARB);
2805 MAP_GL_FUNCTION(glGetShaderiv, glGetObjectParameterivARB);
2806 MAP_GL_FUNCTION(glGetShaderSource, glGetShaderSourceARB);
2807 MAP_GL_FUNCTION(glGetUniformfv, glGetUniformfvARB);
2808 MAP_GL_FUNCTION(glGetUniformiv, glGetUniformivARB);
2809 MAP_GL_FUNCTION(glGetUniformLocation, glGetUniformLocationARB);
2810 MAP_GL_FUNCTION(glIsEnabledi, glIsEnabledIndexedEXT);
2811 MAP_GL_FUNCTION(glLinkProgram, glLinkProgramARB);
2812 MAP_GL_FUNCTION(glMapBuffer, glMapBufferARB);
2813 MAP_GL_FUNCTION(glMinSampleShading, glMinSampleShadingARB);
2814 MAP_GL_FUNCTION(glPolygonOffsetClamp, glPolygonOffsetClampEXT);
2815 MAP_GL_FUNCTION_CAST(glShaderSource, glShaderSourceARB);
2816 MAP_GL_FUNCTION(glTexBuffer, glTexBufferARB);
2817 MAP_GL_FUNCTION_CAST(glTexImage3D, glTexImage3DEXT);
2818 MAP_GL_FUNCTION(glTexSubImage3D, glTexSubImage3DEXT);
2819 MAP_GL_FUNCTION(glUniform1f, glUniform1fARB);
2820 MAP_GL_FUNCTION(glUniform1fv, glUniform1fvARB);
2821 MAP_GL_FUNCTION(glUniform1i, glUniform1iARB);
2822 MAP_GL_FUNCTION(glUniform1iv, glUniform1ivARB);
2823 MAP_GL_FUNCTION(glUniform2f, glUniform2fARB);
2824 MAP_GL_FUNCTION(glUniform2fv, glUniform2fvARB);
2825 MAP_GL_FUNCTION(glUniform2i, glUniform2iARB);
2826 MAP_GL_FUNCTION(glUniform2iv, glUniform2ivARB);
2827 MAP_GL_FUNCTION(glUniform3f, glUniform3fARB);
2828 MAP_GL_FUNCTION(glUniform3fv, glUniform3fvARB);
2829 MAP_GL_FUNCTION(glUniform3i, glUniform3iARB);
2830 MAP_GL_FUNCTION(glUniform3iv, glUniform3ivARB);
2831 MAP_GL_FUNCTION(glUniform4f, glUniform4fARB);
2832 MAP_GL_FUNCTION(glUniform4fv, glUniform4fvARB);
2833 MAP_GL_FUNCTION(glUniform4i, glUniform4iARB);
2834 MAP_GL_FUNCTION(glUniform4iv, glUniform4ivARB);
2835 MAP_GL_FUNCTION(glUniformMatrix2fv, glUniformMatrix2fvARB);
2836 MAP_GL_FUNCTION(glUniformMatrix3fv, glUniformMatrix3fvARB);
2837 MAP_GL_FUNCTION(glUniformMatrix4fv, glUniformMatrix4fvARB);
2838 MAP_GL_FUNCTION(glUnmapBuffer, glUnmapBufferARB);
2839 MAP_GL_FUNCTION(glUseProgram, glUseProgramObjectARB);
2840 MAP_GL_FUNCTION(glValidateProgram, glValidateProgramARB);
2841 MAP_GL_FUNCTION(glVertexAttrib1f, glVertexAttrib1fARB);
2842 MAP_GL_FUNCTION(glVertexAttrib1fv, glVertexAttrib1fvARB);
2843 MAP_GL_FUNCTION(glVertexAttrib2f, glVertexAttrib2fARB);
2844 MAP_GL_FUNCTION(glVertexAttrib2fv, glVertexAttrib2fvARB);
2845 MAP_GL_FUNCTION(glVertexAttrib3f, glVertexAttrib3fARB);
2846 MAP_GL_FUNCTION(glVertexAttrib3fv, glVertexAttrib3fvARB);
2847 MAP_GL_FUNCTION(glVertexAttrib4f, glVertexAttrib4fARB);
2848 MAP_GL_FUNCTION(glVertexAttrib4fv, glVertexAttrib4fvARB);
2849 MAP_GL_FUNCTION(glVertexAttrib4Nsv, glVertexAttrib4NsvARB);
2850 MAP_GL_FUNCTION(glVertexAttrib4Nub, glVertexAttrib4NubARB);
2851 MAP_GL_FUNCTION(glVertexAttrib4Nubv, glVertexAttrib4NubvARB);
2852 MAP_GL_FUNCTION(glVertexAttrib4Nusv, glVertexAttrib4NusvARB);
2853 MAP_GL_FUNCTION(glVertexAttrib4sv, glVertexAttrib4svARB);
2854 MAP_GL_FUNCTION(glVertexAttrib4ubv, glVertexAttrib4ubvARB);
2855 MAP_GL_FUNCTION(glVertexAttribDivisor, glVertexAttribDivisorARB);
2856 MAP_GL_FUNCTION(glVertexAttribIPointer, glVertexAttribIPointerEXT);
2857 MAP_GL_FUNCTION(glVertexAttribPointer, glVertexAttribPointerARB);
2858#undef MAP_GL_FUNCTION
2859#undef MAP_GL_FUNCTION_CAST
2860}
2861
2863{
2864 unsigned int i, sampler_count;
2865 GLint gl_max;
2866
2867 gl_info->limits.buffers = 1;
2868 gl_info->limits.ffp_textures = 0;
2869 gl_info->limits.texture_coords = 0;
2870 for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i)
2871 {
2872 gl_info->limits.uniform_blocks[i] = 0;
2873 gl_info->limits.samplers[i] = 0;
2874 }
2875 gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = 1;
2876 gl_info->limits.combined_samplers = gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL];
2877 gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers;
2878 gl_info->limits.vertex_attribs = 16;
2879 gl_info->limits.texture_buffer_offset_alignment = 1;
2880 gl_info->limits.glsl_vs_float_constants = 0;
2881 gl_info->limits.glsl_ps_float_constants = 0;
2882 gl_info->limits.arb_vs_float_constants = 0;
2883 gl_info->limits.arb_vs_native_constants = 0;
2884 gl_info->limits.arb_vs_instructions = 0;
2885 gl_info->limits.arb_vs_temps = 0;
2886 gl_info->limits.arb_ps_float_constants = 0;
2887 gl_info->limits.arb_ps_local_constants = 0;
2888 gl_info->limits.arb_ps_instructions = 0;
2889 gl_info->limits.arb_ps_temps = 0;
2890
2891 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_CLIP_DISTANCES, &gl_max);
2892 gl_info->limits.user_clip_distances = min(WINED3D_MAX_CLIP_DISTANCES, gl_max);
2893 TRACE("Clip plane support - max planes %d.\n", gl_max);
2894
2896 {
2897 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_LIGHTS, &gl_max);
2898 gl_info->limits.lights = gl_max;
2899 TRACE("Light support - max lights %d.\n", gl_max);
2900 }
2901
2902 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_max);
2903 gl_info->limits.texture_size = gl_max;
2904 TRACE("Maximum texture size support - max texture size %d.\n", gl_max);
2905
2906 if (gl_info->supported[ARB_MAP_BUFFER_ALIGNMENT])
2907 {
2908 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MIN_MAP_BUFFER_ALIGNMENT, &gl_max);
2909 TRACE("Minimum buffer map alignment: %d.\n", gl_max);
2910 }
2911 else
2912 {
2913 WARN_(d3d_perf)("Driver doesn't guarantee a minimum buffer map alignment.\n");
2914 }
2915 if (gl_info->supported[NV_REGISTER_COMBINERS])
2916 {
2917 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &gl_max);
2918 gl_info->limits.general_combiners = gl_max;
2919 TRACE("Max general combiners: %d.\n", gl_max);
2920 }
2921 if (gl_info->supported[ARB_DRAW_BUFFERS])
2922 {
2923 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
2924 gl_info->limits.buffers = min(WINED3D_MAX_RENDER_TARGETS, gl_max);
2925 TRACE("Max draw buffers: %u.\n", gl_max);
2926 }
2927 if (gl_info->supported[ARB_MULTITEXTURE])
2928 {
2930 {
2931 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
2932 gl_info->limits.ffp_textures = min(WINED3D_MAX_FFP_TEXTURES, gl_max);
2933 TRACE("Max textures: %d.\n", gl_info->limits.ffp_textures);
2934
2935 if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
2936 {
2937 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_COORDS_ARB, &gl_max);
2938 gl_info->limits.texture_coords = min(WINED3D_MAX_FFP_TEXTURES, gl_max);
2939 }
2940 else
2941 {
2942 gl_info->limits.texture_coords = gl_info->limits.ffp_textures;
2943 }
2944 TRACE("Max texture coords: %d.\n", gl_info->limits.texture_coords);
2945 }
2946
2948 {
2949 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &gl_max);
2950 gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = gl_max;
2951 }
2952 else
2953 {
2954 gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = gl_info->limits.ffp_textures;
2955 }
2956 TRACE("Max fragment samplers: %d.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL]);
2957
2958 if (gl_info->supported[ARB_VERTEX_SHADER])
2959 {
2960 unsigned int vertex_sampler_count;
2961
2962 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &gl_max);
2963 vertex_sampler_count = gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX] = gl_max;
2964 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, &gl_max);
2965 gl_info->limits.combined_samplers = gl_max;
2966 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &gl_max);
2967 gl_info->limits.vertex_attribs = gl_max;
2968
2969 /* Loading GLSL sampler uniforms is much simpler if we can assume
2970 * that the sampler setup is known at shader link time. In a
2971 * vertex shader + pixel shader combination this isn't an issue
2972 * because then the sampler setup only depends on the two shaders.
2973 * If a pixel shader is used with fixed-function vertex processing
2974 * we're fine too because fixed-function vertex processing doesn't
2975 * use any samplers. If fixed-function fragment processing is used
2976 * we have to make sure that all vertex sampler setups are valid
2977 * together with all possible fixed-function fragment processing
2978 * setups. This is true if vsamplers + WINED3D_MAX_FFP_TEXTURES <= max_samplers.
2979 * This is true on all Direct3D 9 cards that support vertex
2980 * texture fetch (GeForce 6 and GeForce 7 cards). Direct3D 9
2981 * Radeon cards do not support vertex texture fetch. Direct3D 10
2982 * cards have 128 samplers, and Direct3D 9 is limited to 8
2983 * fixed-function texture stages and 4 vertex samplers.
2984 * Direct3D 10 does not have a fixed-function pipeline anymore.
2985 *
2986 * So this is just a check to check that our assumption holds
2987 * true. If not, write a warning and reduce the number of vertex
2988 * samplers or probably disable vertex texture fetch. */
2989 if (vertex_sampler_count && gl_info->limits.combined_samplers < 12
2990 && WINED3D_MAX_FFP_TEXTURES + vertex_sampler_count > gl_info->limits.combined_samplers)
2991 {
2992 FIXME("OpenGL implementation supports %u vertex samplers and %u total samplers.\n",
2993 vertex_sampler_count, gl_info->limits.combined_samplers);
2994 FIXME("Expected vertex samplers + WINED3D_MAX_FFP_TEXTURES(=8) > combined_samplers.\n");
2995 if (gl_info->limits.combined_samplers > WINED3D_MAX_FFP_TEXTURES)
2996 vertex_sampler_count = gl_info->limits.combined_samplers - WINED3D_MAX_FFP_TEXTURES;
2997 else
2998 vertex_sampler_count = 0;
2999 gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX] = vertex_sampler_count;
3000 }
3001 }
3002 else
3003 {
3004 gl_info->limits.combined_samplers = gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL];
3005 }
3006 TRACE("Max vertex samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX]);
3007 TRACE("Max combined samplers: %u.\n", gl_info->limits.combined_samplers);
3008 TRACE("Max vertex attributes: %u.\n", gl_info->limits.vertex_attribs);
3009 }
3010 else
3011 {
3012 gl_info->limits.ffp_textures = 1;
3013 gl_info->limits.texture_coords = 1;
3014 }
3015
3016 if (gl_info->supported[EXT_TEXTURE3D])
3017 {
3018 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE_EXT, &gl_max);
3019 gl_info->limits.texture3d_size = gl_max;
3020 TRACE("Max texture3D size: %d.\n", gl_info->limits.texture3d_size);
3021 }
3023 {
3024 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &gl_max);
3025 gl_info->limits.anisotropy = gl_max;
3026 TRACE("Max anisotropy: %d.\n", gl_info->limits.anisotropy);
3027 }
3028 if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
3029 {
3031 gl_info->limits.arb_ps_float_constants = gl_max;
3032 TRACE("Max ARB_FRAGMENT_PROGRAM float constants: %d.\n", gl_info->limits.arb_ps_float_constants);
3034 gl_info->limits.arb_ps_native_constants = gl_max;
3035 TRACE("Max ARB_FRAGMENT_PROGRAM native float constants: %d.\n",
3036 gl_info->limits.arb_ps_native_constants);
3038 gl_info->limits.arb_ps_temps = gl_max;
3039 TRACE("Max ARB_FRAGMENT_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_ps_temps);
3041 gl_info->limits.arb_ps_instructions = gl_max;
3042 TRACE("Max ARB_FRAGMENT_PROGRAM native instructions: %d.\n", gl_info->limits.arb_ps_instructions);
3044 gl_info->limits.arb_ps_local_constants = gl_max;
3045 TRACE("Max ARB_FRAGMENT_PROGRAM local parameters: %d.\n", gl_info->limits.arb_ps_instructions);
3046 }
3047 if (gl_info->supported[ARB_VERTEX_PROGRAM])
3048 {
3050 gl_info->limits.arb_vs_float_constants = gl_max;
3051 TRACE("Max ARB_VERTEX_PROGRAM float constants: %d.\n", gl_info->limits.arb_vs_float_constants);
3053 gl_info->limits.arb_vs_native_constants = gl_max;
3054 TRACE("Max ARB_VERTEX_PROGRAM native float constants: %d.\n",
3055 gl_info->limits.arb_vs_native_constants);
3057 gl_info->limits.arb_vs_temps = gl_max;
3058 TRACE("Max ARB_VERTEX_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_vs_temps);
3060 gl_info->limits.arb_vs_instructions = gl_max;
3061 TRACE("Max ARB_VERTEX_PROGRAM native instructions: %d.\n", gl_info->limits.arb_vs_instructions);
3062 }
3063 if (gl_info->supported[ARB_VERTEX_SHADER])
3064 {
3065 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max);
3066 gl_info->limits.glsl_vs_float_constants = gl_max / 4;
3067 TRACE("Max ARB_VERTEX_SHADER float constants: %u.\n", gl_info->limits.glsl_vs_float_constants);
3068
3070 {
3071 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_UNIFORM_BLOCKS, &gl_max);
3072 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_VERTEX] = min(gl_max, WINED3D_MAX_CBS);
3073 TRACE("Max vertex uniform blocks: %u (%d).\n",
3074 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_VERTEX], gl_max);
3075 }
3076 }
3077 if (gl_info->supported[ARB_TESSELLATION_SHADER])
3078 {
3079 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS, &gl_max);
3080 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_HULL] = min(gl_max, WINED3D_MAX_CBS);
3081 TRACE("Max hull uniform blocks: %u (%d).\n",
3082 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_HULL], gl_max);
3083 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS, &gl_max);
3084 gl_info->limits.samplers[WINED3D_SHADER_TYPE_HULL] = gl_max;
3085 TRACE("Max hull samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_HULL]);
3086
3087 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS, &gl_max);
3088 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_DOMAIN] = min(gl_max, WINED3D_MAX_CBS);
3089 TRACE("Max domain uniform blocks: %u (%d).\n",
3090 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_DOMAIN], gl_max);
3091 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS, &gl_max);
3092 gl_info->limits.samplers[WINED3D_SHADER_TYPE_DOMAIN] = gl_max;
3093 TRACE("Max domain samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_DOMAIN]);
3094 }
3096 {
3097 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_GEOMETRY_UNIFORM_BLOCKS, &gl_max);
3098 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_GEOMETRY] = min(gl_max, WINED3D_MAX_CBS);
3099 TRACE("Max geometry uniform blocks: %u (%d).\n",
3100 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_GEOMETRY], gl_max);
3101 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, &gl_max);
3102 gl_info->limits.samplers[WINED3D_SHADER_TYPE_GEOMETRY] = gl_max;
3103 TRACE("Max geometry samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_GEOMETRY]);
3104 }
3105 if (gl_info->supported[ARB_FRAGMENT_SHADER])
3106 {
3107 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, &gl_max);
3108 gl_info->limits.glsl_ps_float_constants = gl_max / 4;
3109 TRACE("Max ARB_FRAGMENT_SHADER float constants: %u.\n", gl_info->limits.glsl_ps_float_constants);
3111 {
3112 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &gl_max);
3113 gl_info->limits.glsl_varyings = gl_max;
3114 }
3115 else
3116 {
3117 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAGMENT_INPUT_COMPONENTS, &gl_max);
3118 gl_info->limits.glsl_varyings = gl_max - 4;
3119 }
3120 TRACE("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_info->limits.glsl_varyings,
3121 gl_info->limits.glsl_varyings / 4);
3122
3124 {
3125 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, &gl_max);
3126 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_PIXEL] = min(gl_max, WINED3D_MAX_CBS);
3127 TRACE("Max fragment uniform blocks: %u (%d).\n",
3128 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_PIXEL], gl_max);
3129 }
3130 }
3131 if (gl_info->supported[ARB_COMPUTE_SHADER])
3132 {
3133 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMPUTE_UNIFORM_BLOCKS, &gl_max);
3134 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_COMPUTE] = min(gl_max, WINED3D_MAX_CBS);
3135 TRACE("Max compute uniform blocks: %u (%d).\n",
3136 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_COMPUTE], gl_max);
3137 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS, &gl_max);
3138 gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE] = gl_max;
3139 TRACE("Max compute samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE]);
3140 }
3142 {
3143 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &gl_max);
3144 TRACE("Max combined uniform blocks: %d.\n", gl_max);
3145 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &gl_max);
3146 TRACE("Max uniform buffer bindings: %d.\n", gl_max);
3147 }
3148 if (gl_info->supported[ARB_TEXTURE_BUFFER_RANGE])
3149 {
3150 gl_info->gl_ops.gl.p_glGetIntegerv(GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, &gl_max);
3151 gl_info->limits.texture_buffer_offset_alignment = gl_max;
3152 TRACE("Minimum required texture buffer offset alignment %d.\n", gl_max);
3153 }
3155 {
3156 GLint max_fragment_buffers, max_combined_buffers, max_bindings;
3157 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, &max_fragment_buffers);
3158 TRACE("Max fragment atomic counter buffers: %d.\n", max_fragment_buffers);
3159 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, &max_combined_buffers);
3160 TRACE("Max combined atomic counter buffers: %d.\n", max_combined_buffers);
3161 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &max_bindings);
3162 TRACE("Max atomic counter buffer bindings: %d.\n", max_bindings);
3163 if (max_fragment_buffers < MAX_UNORDERED_ACCESS_VIEWS
3164 || max_combined_buffers < MAX_UNORDERED_ACCESS_VIEWS
3165 || max_bindings < MAX_UNORDERED_ACCESS_VIEWS)
3166 {
3167 WARN("Disabling ARB_shader_atomic_counters.\n");
3169 }
3170 }
3171 if (gl_info->supported[ARB_TRANSFORM_FEEDBACK3])
3172 {
3173 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_STREAMS, &gl_max);
3174 TRACE("Max vertex streams: %d.\n", gl_max);
3175 }
3176
3177 if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
3178 gl_info->gl_ops.gl.p_glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->limits.shininess);
3179 else
3180 gl_info->limits.shininess = 128.0f;
3181
3183 {
3184 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_SAMPLES, &gl_max);
3185 gl_info->limits.samples = gl_max;
3186 }
3187
3189 {
3190 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAMEBUFFER_WIDTH, &gl_max);
3191 gl_info->limits.framebuffer_width = gl_max;
3192 gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAMEBUFFER_HEIGHT, &gl_max);
3193 gl_info->limits.framebuffer_height = gl_max;
3194 }
3195 else
3196 {
3197 gl_info->limits.framebuffer_width = gl_info->limits.texture_size;
3198 gl_info->limits.framebuffer_height = gl_info->limits.texture_size;
3199 }
3200
3201 gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] =
3203 sampler_count = 0;
3204 for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i)
3205 sampler_count += gl_info->limits.samplers[i];
3206 if (gl_info->supported[WINED3D_GL_VERSION_3_2] && gl_info->limits.combined_samplers < sampler_count)
3207 {
3208 /* The minimum value for GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS in OpenGL
3209 * 3.2 is 48 (16 per stage). When tessellation shaders are supported
3210 * the minimum value is increased to 80. */
3211 WARN("Graphics pipeline sampler count %u is greater than combined sampler count %u.\n",
3212 sampler_count, gl_info->limits.combined_samplers);
3213 for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i)
3214 gl_info->limits.samplers[i] = min(gl_info->limits.samplers[i], 16);
3215 }
3216
3217 /* A majority of OpenGL implementations allow us to statically partition
3218 * the set of texture bindings into six separate sets. */
3219 gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers;
3220 sampler_count = 0;
3221 for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i)
3222 sampler_count += gl_info->limits.samplers[i];
3223 if (gl_info->limits.combined_samplers >= sampler_count)
3224 gl_info->limits.graphics_samplers -= gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE];
3225}
3226
3227/* Context activation is done by the caller. */
3229 struct wined3d_caps_gl_ctx *caps_gl_ctx, unsigned int wined3d_creation_flags)
3230{
3231 static const struct
3232 {
3233 enum wined3d_gl_extension extension;
3234 DWORD min_gl_version;
3235 }
3236 core_extensions[] =
3237 {
3279 /* We don't want to enable EXT_GPU_SHADER4: even though similar
3280 * functionality is available in core GL 3.0 / GLSL 1.30, it's different
3281 * enough that reusing the same flag for the new features hurts more
3282 * than it helps. */
3283 /* EXT_framebuffer_object, EXT_framebuffer_blit,
3284 * EXT_framebuffer_multisample and EXT_packed_depth_stencil
3285 * are integrated into ARB_framebuffer_object. */
3286
3292 /* We don't need or want GL_ARB_texture_rectangle (core in 3.1). */
3293
3296 /* ARB_geometry_shader4 exposes a somewhat different API compared to 3.2
3297 * core geometry shaders so it's not really correct to expose the
3298 * extension for core-only support. */
3302 {ARB_SYNC, MAKEDWORD_VERSION(3, 2)},
3305
3315
3325
3328
3339
3355
3361
3368
3372 };
3373 const char *gl_vendor_str, *gl_renderer_str, *gl_version_str;
3374 struct wined3d_gl_info *gl_info = &adapter_gl->gl_info;
3375 struct wined3d_adapter *adapter = &adapter_gl->a;
3376 unsigned int gl_version;
3377 DWORD gl_ext_emul_mask;
3378 const char *WGL_Extensions = NULL;
3379 enum wined3d_gl_vendor gl_vendor;
3380 GLint context_profile = 0;
3381 unsigned int i, j;
3382 HDC hdc;
3383
3384 TRACE("adapter_gl %p.\n", adapter_gl);
3385
3386 gl_renderer_str = (const char *)gl_info->gl_ops.gl.p_glGetString(GL_RENDERER);
3387 TRACE("GL_RENDERER: %s.\n", debugstr_a(gl_renderer_str));
3388 if (!gl_renderer_str)
3389 {
3390 ERR("Received a NULL GL_RENDERER.\n");
3391 return FALSE;
3392 }
3393
3394 gl_vendor_str = (const char *)gl_info->gl_ops.gl.p_glGetString(GL_VENDOR);
3395 TRACE("GL_VENDOR: %s.\n", debugstr_a(gl_vendor_str));
3396 if (!gl_vendor_str)
3397 {
3398 ERR("Received a NULL GL_VENDOR.\n");
3399 return FALSE;
3400 }
3401
3402 /* Parse the GL_VERSION field into major and minor information */
3403 gl_version_str = (const char *)gl_info->gl_ops.gl.p_glGetString(GL_VERSION);
3404 TRACE("GL_VERSION: %s.\n", debugstr_a(gl_version_str));
3405 if (!gl_version_str)
3406 {
3407 ERR("Received a NULL GL_VERSION.\n");
3408 return FALSE;
3409 }
3410 gl_version = wined3d_parse_gl_version(gl_version_str);
3411
3412 load_gl_funcs(gl_info);
3413
3414 memset(gl_info->supported, 0, sizeof(gl_info->supported));
3416
3417 if (gl_version >= MAKEDWORD_VERSION(3, 2))
3418 {
3419 gl_info->gl_ops.gl.p_glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &context_profile);
3420 checkGLcall("Querying context profile");
3421 }
3422 if (context_profile & GL_CONTEXT_CORE_PROFILE_BIT)
3423 TRACE("Got a core profile context.\n");
3424 else
3426
3427 TRACE("GL extensions reported:\n");
3429 {
3430 const char *gl_extensions = (const char *)gl_info->gl_ops.gl.p_glGetString(GL_EXTENSIONS);
3431
3432 if (!gl_extensions)
3433 {
3434 ERR("Received a NULL GL_EXTENSIONS.\n");
3435 return FALSE;
3436 }
3438 }
3439 else
3440 {
3442 }
3443
3444 hdc = wglGetCurrentDC();
3445 /* Not all GL drivers might offer WGL extensions e.g. VirtualBox. */
3446 if (GL_EXTCALL(wglGetExtensionsStringARB))
3447 WGL_Extensions = (const char *)GL_EXTCALL(wglGetExtensionsStringARB(hdc));
3448 if (!WGL_Extensions)
3449 WARN("WGL extensions not supported.\n");
3450 else
3452
3453 for (i = 0; i < ARRAY_SIZE(core_extensions); ++i)
3454 {
3455 if (!gl_info->supported[core_extensions[i].extension]
3456 && gl_version >= core_extensions[i].min_gl_version)
3457 {
3458 for (j = 0; j < ARRAY_SIZE(gl_extension_map); ++j)
3459 if (gl_extension_map[j].extension == core_extensions[i].extension)
3460 break;
3461
3463 {
3464 TRACE("GL CORE: %s support.\n", gl_extension_map[j].extension_string);
3465 gl_info->supported[core_extensions[i].extension] = TRUE;
3466 }
3467 else
3468 {
3469 FIXME("GL extension %u not in the GL extensions map.\n", core_extensions[i].extension);
3470 }
3471 }
3472 }
3473
3474 if (gl_info->supported[EXT_BLEND_MINMAX] || gl_info->supported[EXT_BLEND_SUBTRACT])
3476
3477 if (gl_version >= MAKEDWORD_VERSION(2, 0))
3478 {
3480 /* We want to use the core APIs for two-sided stencil in GL 2.0. */
3482 }
3483 if (gl_version >= MAKEDWORD_VERSION(3, 2))
3485
3486 /* All the points are actually point sprites in core contexts, the APIs from
3487 * ARB_point_sprite are not supported anymore. */
3488 if (!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
3489 gl_info->supported[ARB_POINT_SPRITE] = FALSE;
3490
3491 if (gl_info->supported[APPLE_FENCE])
3492 {
3493 /* GL_NV_fence and GL_APPLE_fence provide the same functionality basically.
3494 * The apple extension interacts with some other apple exts. Disable the NV
3495 * extension if the apple one is support to prevent confusion in other parts
3496 * of the code. */
3497 gl_info->supported[NV_FENCE] = FALSE;
3498 }
3499 if (gl_info->supported[APPLE_FLOAT_PIXELS])
3500 {
3501 /* GL_APPLE_float_pixels == GL_ARB_texture_float + GL_ARB_half_float_pixel
3502 *
3503 * The enums are the same:
3504 * GL_RGBA16F_ARB = GL_RGBA_FLOAT16_APPLE = 0x881a
3505 * GL_RGB16F_ARB = GL_RGB_FLOAT16_APPLE = 0x881b
3506 * GL_RGBA32F_ARB = GL_RGBA_FLOAT32_APPLE = 0x8814
3507 * GL_RGB32F_ARB = GL_RGB_FLOAT32_APPLE = 0x8815
3508 * GL_HALF_FLOAT_ARB = GL_HALF_APPLE = 0x140b
3509 */
3510 if (!gl_info->supported[ARB_TEXTURE_FLOAT])
3511 {
3512 TRACE(" IMPLIED: GL_ARB_texture_float support (by GL_APPLE_float_pixels).\n");
3513 gl_info->supported[ARB_TEXTURE_FLOAT] = TRUE;
3514 }
3515 if (!gl_info->supported[ARB_HALF_FLOAT_PIXEL])
3516 {
3517 TRACE(" IMPLIED: GL_ARB_half_float_pixel support (by GL_APPLE_float_pixels).\n");
3519 }
3520 }
3521 if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
3522 {
3523 /* GL_ARB_map_buffer_range and GL_APPLE_flush_buffer_range provide the same
3524 * functionality. Prefer the ARB extension */
3526 }
3527 if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
3528 {
3529 TRACE(" IMPLIED: NVIDIA (NV) Texture Gen Reflection support.\n");
3531 }
3533 {
3534 TRACE(" IMPLIED: EXT_texture_compression_rgtc support (by ARB_texture_compression_rgtc).\n");
3536 }
3538 {
3539 TRACE(" IMPLIED: ARB_texture_compression_rgtc support (by EXT_texture_compression_rgtc).\n");
3541 }
3543 {
3544 TRACE("ARB_texture_rg not supported, disabling ARB_texture_compression_rgtc.\n");
3546 }
3547 if (gl_info->supported[NV_TEXTURE_SHADER2])
3548 {
3549 if (gl_info->supported[NV_REGISTER_COMBINERS])
3550 {
3551 /* Also disable ATI_FRAGMENT_SHADER if register combiners and texture_shader2
3552 * are supported. The nv extensions provide the same functionality as the
3553 * ATI one, and a bit more(signed pixelformats). */
3555 }
3556 }
3557 if (gl_info->supported[ATI_FRAGMENT_SHADER])
3558 {
3559 /* Disable NV_register_combiners and fragment shader if this is supported.
3560 * generally the NV extensions are preferred over the ATI ones, and this
3561 * extension is disabled if register_combiners and texture_shader2 are both
3562 * supported. So we reach this place only if we have incomplete NV dxlevel 8
3563 * fragment processing support. */
3566 gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
3568 }
3569 if (gl_info->supported[NV_HALF_FLOAT])
3570 {
3571 /* GL_ARB_half_float_vertex is a subset of GL_NV_half_float. */
3573 }
3575 {
3576 /* Current wined3d sRGB infrastructure requires EXT_texture_sRGB_decode
3577 * for GL_ARB_framebuffer_sRGB support (without EXT_texture_sRGB_decode
3578 * we never render to sRGB surfaces). */
3579 TRACE("EXT_texture_sRGB_decode is not supported, disabling ARB_framebuffer_sRGB.\n");
3581 }
3582 if (gl_info->supported[ARB_OCCLUSION_QUERY])
3583 {
3584 GLint counter_bits;
3585
3586 GL_EXTCALL(glGetQueryiv(GL_SAMPLES_PASSED, GL_QUERY_COUNTER_BITS, &counter_bits));
3587 TRACE("Occlusion query counter has %d bits.\n", counter_bits);
3588 if (!counter_bits)
3590 }
3591 if (gl_info->supported[ARB_TIMER_QUERY])
3592 {
3593 GLint counter_bits;
3594
3595 GL_EXTCALL(glGetQueryiv(GL_TIMESTAMP, GL_QUERY_COUNTER_BITS, &counter_bits));
3596 TRACE("Timestamp query counter has %d bits.\n", counter_bits);
3597 if (!counter_bits)
3598 gl_info->supported[ARB_TIMER_QUERY] = FALSE;
3599 }
3600 if (gl_version >= MAKEDWORD_VERSION(3, 0))
3601 {
3602 GLint counter_bits;
3603
3605
3606 GL_EXTCALL(glGetQueryiv(GL_PRIMITIVES_GENERATED, GL_QUERY_COUNTER_BITS, &counter_bits));
3607 TRACE("Primitives query counter has %d bits.\n", counter_bits);
3608 if (!counter_bits)
3610
3612 TRACE("Transform feedback primitives query counter has %d bits.\n", counter_bits);
3613 if (!counter_bits)
3615 }
3616 if (gl_info->supported[ARB_VIEWPORT_ARRAY])
3617 {
3618 GLint subpixel_bits;
3619
3620 gl_info->gl_ops.gl.p_glGetIntegerv(GL_VIEWPORT_SUBPIXEL_BITS, &subpixel_bits);
3621 TRACE("Viewport supports %d subpixel bits.\n", subpixel_bits);
3622 if (subpixel_bits < 8 && gl_info->supported[ARB_CLIP_CONTROL])
3623 {
3624 TRACE("Disabling ARB_clip_control because viewport subpixel bits < 8.\n");
3625 gl_info->supported[ARB_CLIP_CONTROL] = FALSE;
3626 }
3627 gl_info->limits.viewport_subpixel_bits = subpixel_bits;
3628 }
3629 if (gl_info->supported[ARB_CLIP_CONTROL] && !gl_info->supported[ARB_VIEWPORT_ARRAY])
3630 {
3631 /* When using ARB_clip_control we need the float viewport parameters
3632 * introduced by ARB_viewport_array to take care of the shifted pixel
3633 * coordinates. */
3634 TRACE("Disabling ARB_clip_control because ARB_viewport_array is not supported.\n");
3635 gl_info->supported[ARB_CLIP_CONTROL] = FALSE;
3636 }
3638 {
3639 /* The stencil value needs to be placed in the green channel. */
3640 TRACE("Disabling ARB_stencil_texturing because ARB_texture_swizzle is not supported.\n");
3642 }
3644 {
3645 TRACE(" IMPLIED: ATI_texture_mirror_once support (by EXT_texture_mirror_clamp).\n");
3647 }
3649 {
3650 TRACE(" IMPLIED: ARB_texture_mirror_clamp_to_edge support (by ATI_texture_mirror_once).\n");
3652 }
3653 if (gl_info->supported[ARB_TEXTURE_STORAGE] && gl_info->supported[APPLE_YCBCR_422])
3654 {
3655 /* AFAIK APPLE_ycbcr_422 is only available in legacy contexts so we shouldn't ever hit this. */
3656 ERR("Disabling APPLE_ycbcr_422 because of ARB_texture_storage.\n");
3657 gl_info->supported[APPLE_YCBCR_422] = FALSE;
3658 }
3659 if (gl_info->supported[ARB_DRAW_INDIRECT] && !gl_info->supported[ARB_BASE_INSTANCE])
3660 {
3661 /* If ARB_base_instance is not supported the baseInstance field
3662 * in indirect draw parameters must be 0 or behavior is undefined.
3663 */
3664 WARN("Disabling ARB_draw_indirect because ARB_base_instance is not supported.\n");
3665 gl_info->supported[ARB_DRAW_INDIRECT] = FALSE;
3666 }
3670 {
3671 WARN("Disabling ARB_texture_multisample because immutable storage is not supported.\n");
3673 }
3675 {
3676 TRACE(" IMPLIED: GL_EXT_packed_depth_stencil (by GL_ARB_framebuffer_object).\n");
3678 }
3679
3681
3682 if (gl_info->supported[ARB_VERTEX_PROGRAM] && test_arb_vs_offset_limit(gl_info))
3684
3685 if (gl_info->supported[ARB_SHADING_LANGUAGE_100])
3686 {
3687 const char *str = (const char *)gl_info->gl_ops.gl.p_glGetString(GL_SHADING_LANGUAGE_VERSION_ARB);
3688 unsigned int major, minor;
3689
3690 TRACE("GLSL version string: %s.\n", debugstr_a(str));
3691
3692 /* The format of the GLSL version string is "major.minor[.release] [vendor info]". */
3693 sscanf(str, "%u.%u", &major, &minor);
3695 if (gl_info->glsl_version > MAKEDWORD_VERSION(1, 30) && gl_version < MAKEDWORD_VERSION(3, 0))
3696 {
3697 WARN("OpenGL version %u.%u too low, limiting GLSL version to 1.30.\n",
3698 gl_version >> 16, gl_version & 0xffff);
3699 gl_info->glsl_version = MAKEDWORD_VERSION(1, 30);
3700 }
3701 if (gl_info->glsl_version >= MAKEDWORD_VERSION(1, 30))
3702 gl_info->supported[WINED3D_GLSL_130] = TRUE;
3703 }
3704
3705 checkGLcall("extension detection");
3706
3707 adapter->shader_backend = &glsl_shader_backend;
3708 adapter->vertex_pipe = &glsl_vertex_pipe;
3709 adapter->fragment_pipe = &glsl_fragment_pipe;
3710
3711 if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
3712 {
3713 gl_info->fbo_ops.glIsRenderbuffer = gl_info->gl_ops.ext.p_glIsRenderbuffer;
3714 gl_info->fbo_ops.glBindRenderbuffer = gl_info->gl_ops.ext.p_glBindRenderbuffer;
3715 gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->gl_ops.ext.p_glDeleteRenderbuffers;
3716 gl_info->fbo_ops.glGenRenderbuffers = gl_info->gl_ops.ext.p_glGenRenderbuffers;
3717 gl_info->fbo_ops.glRenderbufferStorage = gl_info->gl_ops.ext.p_glRenderbufferStorage;
3718 gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->gl_ops.ext.p_glRenderbufferStorageMultisample;
3719 gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->gl_ops.ext.p_glGetRenderbufferParameteriv;
3720 gl_info->fbo_ops.glIsFramebuffer = gl_info->gl_ops.ext.p_glIsFramebuffer;
3721 gl_info->fbo_ops.glBindFramebuffer = gl_info->gl_ops.ext.p_glBindFramebuffer;
3722 gl_info->fbo_ops.glDeleteFramebuffers = gl_info->gl_ops.ext.p_glDeleteFramebuffers;
3723 gl_info->fbo_ops.glGenFramebuffers = gl_info->gl_ops.ext.p_glGenFramebuffers;
3724 gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->gl_ops.ext.p_glCheckFramebufferStatus;
3725 gl_info->fbo_ops.glFramebufferTexture1D = gl_info->gl_ops.ext.p_glFramebufferTexture1D;
3726 gl_info->fbo_ops.glFramebufferTexture2D = gl_info->gl_ops.ext.p_glFramebufferTexture2D;
3727 gl_info->fbo_ops.glFramebufferTexture3D = gl_info->gl_ops.ext.p_glFramebufferTexture3D;
3728 gl_info->fbo_ops.glFramebufferTextureLayer = gl_info->gl_ops.ext.p_glFramebufferTextureLayer;
3729 gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->gl_ops.ext.p_glFramebufferRenderbuffer;
3730 gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv
3731 = gl_info->gl_ops.ext.p_glGetFramebufferAttachmentParameteriv;
3732 gl_info->fbo_ops.glBlitFramebuffer = gl_info->gl_ops.ext.p_glBlitFramebuffer;
3733 gl_info->fbo_ops.glGenerateMipmap = gl_info->gl_ops.ext.p_glGenerateMipmap;
3734 gl_info->fbo_ops.glFramebufferTexture = gl_info->gl_ops.ext.p_glFramebufferTexture;
3735
3737 }
3738 else
3739 {
3740 if (gl_info->supported[EXT_FRAMEBUFFER_OBJECT])
3741 {
3742 gl_info->fbo_ops.glIsRenderbuffer = gl_info->gl_ops.ext.p_glIsRenderbufferEXT;
3743 gl_info->fbo_ops.glBindRenderbuffer = gl_info->gl_ops.ext.p_glBindRenderbufferEXT;
3744 gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->gl_ops.ext.p_glDeleteRenderbuffersEXT;
3745 gl_info->fbo_ops.glGenRenderbuffers = gl_info->gl_ops.ext.p_glGenRenderbuffersEXT;
3746 gl_info->fbo_ops.glRenderbufferStorage = gl_info->gl_ops.ext.p_glRenderbufferStorageEXT;
3747 gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->gl_ops.ext.p_glGetRenderbufferParameterivEXT;
3748 gl_info->fbo_ops.glIsFramebuffer = gl_info->gl_ops.ext.p_glIsFramebufferEXT;
3749 gl_info->fbo_ops.glBindFramebuffer = gl_info->gl_ops.ext.p_glBindFramebufferEXT;
3750 gl_info->fbo_ops.glDeleteFramebuffers = gl_info->gl_ops.ext.p_glDeleteFramebuffersEXT;
3751 gl_info->fbo_ops.glGenFramebuffers = gl_info->gl_ops.ext.p_glGenFramebuffersEXT;
3752 gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->gl_ops.ext.p_glCheckFramebufferStatusEXT;
3753 gl_info->fbo_ops.glFramebufferTexture1D = gl_info->gl_ops.ext.p_glFramebufferTexture1DEXT;
3754 gl_info->fbo_ops.glFramebufferTexture2D = gl_info->gl_ops.ext.p_glFramebufferTexture2DEXT;
3755 gl_info->fbo_ops.glFramebufferTexture3D = gl_info->gl_ops.ext.p_glFramebufferTexture3DEXT;
3756 gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->gl_ops.ext.p_glFramebufferRenderbufferEXT;
3757 gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv
3758 = gl_info->gl_ops.ext.p_glGetFramebufferAttachmentParameterivEXT;
3759 gl_info->fbo_ops.glGenerateMipmap = gl_info->gl_ops.ext.p_glGenerateMipmapEXT;
3760 }
3761
3762 if (gl_info->supported[ARB_GEOMETRY_SHADER4])
3763 {
3764 gl_info->fbo_ops.glFramebufferTexture = gl_info->gl_ops.ext.p_glFramebufferTextureARB;
3765 gl_info->fbo_ops.glFramebufferTextureLayer = gl_info->gl_ops.ext.p_glFramebufferTextureLayerARB;
3766 }
3767 if (gl_info->supported[EXT_FRAMEBUFFER_BLIT])
3768 {
3769 gl_info->fbo_ops.glBlitFramebuffer = gl_info->gl_ops.ext.p_glBlitFramebufferEXT;
3770 }
3772 {
3773 gl_info->fbo_ops.glRenderbufferStorageMultisample
3774 = gl_info->gl_ops.ext.p_glRenderbufferStorageMultisampleEXT;
3775 }
3776 }
3777
3786
3787 if (!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
3788 {
3789 GLuint vao;
3790
3791 GL_EXTCALL(glGenVertexArrays(1, &vao));
3792 GL_EXTCALL(glBindVertexArray(vao));
3793 checkGLcall("creating VAO");
3794 }
3795
3796 gl_vendor = wined3d_guess_gl_vendor(gl_info, gl_vendor_str, gl_renderer_str, gl_version_str);
3797 TRACE("Guessed GL vendor %#x.\n", gl_vendor);
3798
3799 if (!(caps_gl_ctx->gpu_description = query_gpu_description(gl_info, &caps_gl_ctx->vram_bytes)))
3800 {
3801 enum wined3d_feature_level feature_level;
3805 struct shader_caps shader_caps;
3806
3807 adapter->shader_backend->shader_get_caps(adapter, &shader_caps);
3808 adapter->fragment_pipe->get_caps(adapter, &fragment_caps);
3809 feature_level = feature_level_from_caps(gl_info, &shader_caps, &fragment_caps);
3810
3811 vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str);
3812 TRACE("Guessed vendor PCI ID 0x%04x.\n", vendor);
3813
3814 device = wined3d_guess_card(feature_level, gl_renderer_str, &gl_vendor, &vendor);
3815 TRACE("Guessed device PCI ID 0x%04x.\n", device);
3816
3818 {
3819 ERR("Card %04x:%04x not found in driver DB.\n", vendor, device);
3820 return FALSE;
3821 }
3822 }
3823 fixup_extensions(gl_info, caps_gl_ctx, gl_renderer_str, gl_vendor);
3824
3825 adapter->vram_bytes_used = 0;
3826 TRACE("Emulating 0x%s bytes of video ram.\n", wine_dbgstr_longlong(caps_gl_ctx->vram_bytes));
3827
3828 if (gl_info->supported[EXT_MEMORY_OBJECT])
3829 {
3830 GLint device_count = 0;
3831
3832 gl_info->gl_ops.gl.p_glGetIntegerv(GL_NUM_DEVICE_UUIDS_EXT, &device_count);
3833 if (device_count > 0)
3834 {
3835 if (device_count > 1)
3836 FIXME("A set of %d devices is not supported.\n", device_count);
3837
3838 GL_EXTCALL(glGetUnsignedBytevEXT(GL_DRIVER_UUID_EXT, (GLubyte *)&adapter->driver_uuid));
3839 GL_EXTCALL(glGetUnsignedBytei_vEXT(GL_DEVICE_UUID_EXT, 0, (GLubyte *)&adapter->device_uuid));
3840
3841 TRACE("Driver UUID: %s, device UUID %s.\n",
3842 debugstr_guid(&adapter->driver_uuid), debugstr_guid(&adapter->device_uuid));
3843 }
3844 else
3845 {
3846 WARN("Unexpected device count %d.\n", device_count);
3847 }
3848 }
3849
3850 gl_ext_emul_mask = adapter->vertex_pipe->vp_get_emul_mask(adapter)
3851 | adapter->fragment_pipe->get_emul_mask(adapter);
3852 if (gl_ext_emul_mask & GL_EXT_EMUL_ARB_MULTITEXTURE)
3854 if (gl_ext_emul_mask & GL_EXT_EMUL_EXT_FOG_COORD)
3856
3857 return TRUE;
3858}
3859
3861{
3862 ERR("Invalid attribute function called.\n");
3863 DebugBreak();
3864}
3865
3866static void WINE_GLAPI generic_d3dcolor(GLuint idx, const void *data)
3867{
3868 const struct wined3d_gl_info *gl_info = wined3d_context_gl_get_current()->gl_info;
3869 DWORD color = *((const DWORD *)data);
3870
3871 gl_info->gl_ops.ext.p_glVertexAttrib4Nub(idx,
3874}
3875
3876static void WINE_GLAPI generic_short2n(GLuint idx, const void *data)
3877{
3878 const struct wined3d_gl_info *gl_info = wined3d_context_gl_get_current()->gl_info;
3879 const GLshort s[] = {((const GLshort *)data)[0], ((const GLshort *)data)[1], 0, 1};
3880
3881 gl_info->gl_ops.ext.p_glVertexAttrib4Nsv(idx, s);
3882}
3883
3884static void WINE_GLAPI generic_ushort2n(GLuint idx, const void *data)
3885{
3886 const GLushort s[] = {((const GLushort *)data)[0], ((const GLushort *)data)[1], 0, 1};
3887 const struct wined3d_gl_info *gl_info = wined3d_context_gl_get_current()->gl_info;
3888
3889 gl_info->gl_ops.ext.p_glVertexAttrib4Nusv(idx, s);
3890}
3891
3892static void WINE_GLAPI generic_float16_2(GLuint idx, const void *data)
3893{
3894 const struct wined3d_gl_info *gl_info = wined3d_context_gl_get_current()->gl_info;
3895 float x = float_16_to_32(((const unsigned short *)data) + 0);
3896 float y = float_16_to_32(((const unsigned short *)data) + 1);
3897
3898 gl_info->gl_ops.ext.p_glVertexAttrib2f(idx, x, y);
3899}
3900
3901static void WINE_GLAPI generic_float16_4(GLuint idx, const void *data)
3902{
3903 const struct wined3d_gl_info *gl_info = wined3d_context_gl_get_current()->gl_info;
3904 float x = float_16_to_32(((const unsigned short *)data) + 0);
3905 float y = float_16_to_32(((const unsigned short *)data) + 1);
3906 float z = float_16_to_32(((const unsigned short *)data) + 2);
3907 float w = float_16_to_32(((const unsigned short *)data) + 3);
3908
3909 gl_info->gl_ops.ext.p_glVertexAttrib4f(idx, x, y, z, w);
3910}
3911
3913{
3914 struct wined3d_gl_info *gl_info = &adapter_gl->gl_info;
3915 struct wined3d_ffp_attrib_ops *ops = &gl_info->ffp_attrib_ops;
3916 unsigned int i;
3917
3918 for (i = 0; i < WINED3D_FFP_EMIT_COUNT; ++i)
3920
3921 ops->generic[WINED3D_FFP_EMIT_FLOAT1] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib1fv;
3922 ops->generic[WINED3D_FFP_EMIT_FLOAT2] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib2fv;
3923 ops->generic[WINED3D_FFP_EMIT_FLOAT3] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib3fv;
3924 ops->generic[WINED3D_FFP_EMIT_FLOAT4] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib4fv;
3927 else
3929 (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib4Nubv;
3930 ops->generic[WINED3D_FFP_EMIT_UBYTE4] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib4ubv;
3931 ops->generic[WINED3D_FFP_EMIT_SHORT2] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib2sv;
3932 ops->generic[WINED3D_FFP_EMIT_SHORT4] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib4sv;
3933 ops->generic[WINED3D_FFP_EMIT_UBYTE4N] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib4Nubv;
3935 ops->generic[WINED3D_FFP_EMIT_SHORT4N] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib4Nsv;
3937 ops->generic[WINED3D_FFP_EMIT_USHORT4N] = (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib4Nusv;
3938 if (gl_info->supported[NV_HALF_FLOAT] && gl_info->supported[NV_VERTEX_PROGRAM])
3939 {
3941 (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib2hvNV;
3943 (wined3d_generic_attrib_func)gl_info->gl_ops.ext.p_glVertexAttrib4hvNV;
3944 }
3945 else
3946 {
3949 }
3950}
3951
3953{
3954 const struct wined3d_gl_info *gl_info = &adapter_gl->gl_info;
3955 int i;
3956
3957 if (gl_info->supported[WGL_ARB_PIXEL_FORMAT])
3958 {
3959 UINT attrib_count = 0;
3960 GLint cfg_count;
3961 int attribs[12];
3962 int values[12];
3963 int attribute;
3964
3966 GL_EXTCALL(wglGetPixelFormatAttribivARB(dc, 0, 0, 1, &attribute, &cfg_count));
3967
3968 adapter_gl->pixel_formats = calloc(cfg_count, sizeof(*adapter_gl->pixel_formats));
3969 attribs[attrib_count++] = WGL_RED_BITS_ARB;
3970 attribs[attrib_count++] = WGL_GREEN_BITS_ARB;
3971 attribs[attrib_count++] = WGL_BLUE_BITS_ARB;
3972 attribs[attrib_count++] = WGL_ALPHA_BITS_ARB;
3973 attribs[attrib_count++] = WGL_COLOR_BITS_ARB;
3974 attribs[attrib_count++] = WGL_DEPTH_BITS_ARB;
3975 attribs[attrib_count++] = WGL_STENCIL_BITS_ARB;
3976 attribs[attrib_count++] = WGL_DRAW_TO_WINDOW_ARB;
3977 attribs[attrib_count++] = WGL_PIXEL_TYPE_ARB;
3978 attribs[attrib_count++] = WGL_DOUBLE_BUFFER_ARB;
3979 attribs[attrib_count++] = WGL_AUX_BUFFERS_ARB;
3980 attribs[attrib_count++] = WGL_SWAP_METHOD_ARB;
3981
3982 for (i = 0, adapter_gl->pixel_format_count = 0; i < cfg_count; ++i)
3983 {
3984 struct wined3d_pixel_format *cfg = &adapter_gl->pixel_formats[adapter_gl->pixel_format_count];
3985 int format_id = i + 1;
3986
3987 if (!GL_EXTCALL(wglGetPixelFormatAttribivARB(dc, format_id, 0, attrib_count, attribs, values)))
3988 continue;
3989
3990 cfg->iPixelFormat = format_id;
3991 cfg->redSize = values[0];
3992 cfg->greenSize = values[1];
3993 cfg->blueSize = values[2];
3994 cfg->alphaSize = values[3];
3995 cfg->colorSize = values[4];
3996 cfg->depthSize = values[5];
3997 cfg->stencilSize = values[6];
3998 cfg->windowDrawable = values[7];
3999 cfg->iPixelType = values[8];
4000 cfg->doubleBuffer = values[9];
4001 cfg->auxBuffers = values[10];
4002 cfg->swap_method = values[11];
4003
4004 cfg->numSamples = 0;
4005 /* Check multisample support. */
4006 if (gl_info->supported[ARB_MULTISAMPLE])
4007 {
4009 int values[2];
4010
4011 if (GL_EXTCALL(wglGetPixelFormatAttribivARB(dc, format_id, 0, 2, attribs, values)))
4012 {
4013 /* values[0] = WGL_SAMPLE_BUFFERS_ARB which tells whether
4014 * multisampling is supported. values[1] = number of
4015 * multisample buffers. */
4016 if (values[0])
4017 cfg->numSamples = values[1];
4018 }
4019 }
4020
4021 TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
4022 "depth=%d, stencil=%d, samples=%d, windowDrawable=%d\n",
4023 cfg->iPixelFormat, cfg->iPixelType, cfg->doubleBuffer,
4024 cfg->redSize, cfg->greenSize, cfg->blueSize, cfg->alphaSize,
4025 cfg->depthSize, cfg->stencilSize, cfg->numSamples, cfg->windowDrawable);
4026
4027 ++adapter_gl->pixel_format_count;
4028 }
4029 }
4030 else
4031 {
4032 int cfg_count;
4033
4034 cfg_count = DescribePixelFormat(dc, 0, 0, 0);
4035 adapter_gl->pixel_formats = calloc(cfg_count, sizeof(*adapter_gl->pixel_formats));
4036
4037 for (i = 0, adapter_gl->pixel_format_count = 0; i < cfg_count; ++i)
4038 {
4039 struct wined3d_pixel_format *cfg = &adapter_gl->pixel_formats[adapter_gl->pixel_format_count];
4041 int format_id = i + 1;
4042
4043 if (!DescribePixelFormat(dc, format_id, sizeof(pfd), &pfd))
4044 continue;
4045
4046 /* We only want HW acceleration using an OpenGL ICD driver.
4047 * PFD_GENERIC_FORMAT = slow OpenGL 1.1 GDI software rendering.
4048 * PFD_GENERIC_ACCELERATED = partial hw acceleration using a MCD
4049 * driver (e.g. 3dfx minigl). */
4051 {
4052 TRACE("Skipping format %d because it isn't ICD accelerated.\n", format_id);
4053 continue;
4054 }
4055
4056 cfg->iPixelFormat = format_id;
4057 cfg->redSize = pfd.cRedBits;
4058 cfg->greenSize = pfd.cGreenBits;
4059 cfg->blueSize = pfd.cBlueBits;
4060 cfg->alphaSize = pfd.cAlphaBits;
4061 cfg->colorSize = pfd.cColorBits;
4062 cfg->depthSize = pfd.cDepthBits;
4064 cfg->windowDrawable = (pfd.dwFlags & PFD_DRAW_TO_WINDOW) ? 1 : 0;
4066 cfg->doubleBuffer = (pfd.dwFlags & PFD_DOUBLEBUFFER) ? 1 : 0;
4067 cfg->auxBuffers = pfd.cAuxBuffers;
4069 cfg->numSamples = 0;
4070
4071 TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
4072 "depth=%d, stencil=%d, windowDrawable=%d\n",
4073 cfg->iPixelFormat, cfg->iPixelType, cfg->doubleBuffer,
4074 cfg->redSize, cfg->greenSize, cfg->blueSize, cfg->alphaSize,
4075 cfg->depthSize, cfg->stencilSize, cfg->windowDrawable);
4076
4077 ++adapter_gl->pixel_format_count;
4078 }
4079 }
4080}
4081
4083{
4084 struct wined3d_adapter_gl *adapter_gl = wined3d_adapter_gl(adapter);
4085
4086 free(adapter_gl->pixel_formats);
4088 free(adapter_gl);
4089}
4090
4092 enum wined3d_device_type device_type, HWND focus_window, unsigned int flags, BYTE surface_alignment,
4093 const enum wined3d_feature_level *levels, unsigned int level_count,
4094 struct wined3d_device_parent *device_parent, struct wined3d_device **device)
4095{
4096 struct wined3d_device_gl *device_gl;
4097 HRESULT hr;
4098
4099 if (!(device_gl = calloc(1, sizeof(*device_gl))))
4100 return E_OUTOFMEMORY;
4101
4102 device_gl->current_fence_id = 1;
4103
4104 if (FAILED(hr = wined3d_device_init(&device_gl->d, wined3d, adapter->ordinal, device_type, focus_window,
4105 flags, surface_alignment, levels, level_count,
4106 wined3d_adapter_gl_const(adapter)->gl_info.supported, device_parent)))
4107 {
4108 WARN("Failed to initialize device, hr %#lx.\n", hr);
4109 free(device_gl);
4110 return hr;
4111 }
4112
4113 wined3d_lock_init(&device_gl->allocator_cs, "wined3d_device_gl.allocator_cs");
4114
4115 *device = &device_gl->d;
4116 return WINED3D_OK;
4117}
4118
4120{
4121 struct wined3d_device_gl *device_gl = wined3d_device_gl(device);
4122
4123 wined3d_device_cleanup(&device_gl->d);
4125
4126 free(device_gl->retired_blocks);
4127 free(device_gl);
4128}
4129
4131 struct wined3d_texture *texture, unsigned int sub_resource_idx)
4132{
4134}
4135
4137{
4139}
4140
4141static void adapter_gl_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps)
4142{
4143 const struct wined3d_gl_info *gl_info = &wined3d_adapter_gl_const(adapter)->gl_info;
4144 const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
4145
4146 caps->ddraw_caps.dds_caps |= WINEDDSCAPS_BACKBUFFER
4154
4155 caps->ddraw_caps.caps |= WINEDDCAPS_3D;
4156
4159
4164 if (gl_info->supported[EXT_DRAW_BUFFERS2])
4166 if (gl_info->supported[ARB_FRAMEBUFFER_SRGB])
4170
4173
4175 {
4177
4180 }
4181
4182 if (gl_info->supported[ARB_BLEND_FUNC_EXTENDED])
4184
4185 if (gl_info->supported[EXT_BLEND_COLOR])
4186 {
4189 }
4190
4191 if (gl_info->supported[EXT_TEXTURE3D])
4192 {
4195 if (!d3d_info->unconditional_npot)
4197
4210
4214
4215 if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
4216 {
4218 }
4220 {
4222 }
4224 {
4226 }
4227
4228 caps->MaxVolumeExtent = gl_info->limits.texture3d_size;
4229 }
4230
4231 if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
4232 {
4235 if (!d3d_info->unconditional_npot)
4237
4250
4252 {
4255 }
4256 }
4257
4258 if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
4259 {
4261 }
4263 {
4265 }
4267 {
4269 }
4270
4271 if (gl_info->supported[EXT_STENCIL_WRAP])
4272 {
4275 }
4276
4277 if (gl_info->supported[WINED3D_GL_VERSION_2_0]
4278 || gl_info->supported[EXT_STENCIL_TWO_SIDE]
4279 || gl_info->supported[ATI_SEPARATE_STENCIL])
4280 {
4282 }
4283
4284 caps->MaxAnisotropy = gl_info->limits.anisotropy;
4285
4286 if (caps->VertexShaderVersion >= 3)
4287 {
4289 = max(caps->MaxVertexShader30InstructionSlots, gl_info->limits.arb_vs_instructions);
4290 }
4291 if (caps->VertexShaderVersion >= 2)
4292 {
4293 caps->VS20Caps.temp_count = max(caps->VS20Caps.temp_count, gl_info->limits.arb_vs_temps);
4294
4295 if (gl_info->supported[ARB_HALF_FLOAT_VERTEX])
4297 }
4298
4299 if (caps->PixelShaderVersion >= 3)
4300 {
4302 = max(caps->MaxPixelShader30InstructionSlots, gl_info->limits.arb_ps_instructions);
4303 }
4304 if (caps->PixelShaderVersion >= 2)
4305 {
4306 caps->PS20Caps.temp_count = max(caps->PS20Caps.temp_count, gl_info->limits.arb_ps_temps);
4307 }
4308}
4309
4311 const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format,
4312 const struct wined3d_format *ds_format)
4313{
4314 return TRUE;
4315}
4316
4318{
4319 TRACE("device %p.\n", device);
4320
4323 if (!device->context_count)
4324 return E_FAIL;
4325
4326 return WINED3D_OK;
4327}
4328
4330{
4331 TRACE("device %p.\n", device);
4332
4336}
4337
4339 const struct wined3d_bo_address *data, size_t size, uint32_t map_flags)
4340{
4342}
4343
4345 const struct wined3d_bo_address *data, unsigned int range_count, const struct wined3d_range *ranges)
4346{
4348}
4349
4351 const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src,
4352 unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
4353{
4354 wined3d_context_gl_copy_bo_address(wined3d_context_gl(context), dst, src, range_count, ranges, map_flags);
4355}
4356
4358 const struct wined3d_const_bo_address *data, size_t size)
4359{
4361}
4362
4364 unsigned int sub_resource_idx, struct wined3d_bo_address *addr)
4365{
4366 const struct wined3d_gl_info *gl_info = &wined3d_adapter_gl(device->adapter)->gl_info;
4367 struct wined3d_device_gl *device_gl = wined3d_device_gl(device);
4368 struct wined3d_bo_gl *bo_gl;
4370 bool coherent = true;
4373
4375 assert(device->context_count);
4376
4377 if (resource->type == WINED3D_RTYPE_BUFFER)
4378 {
4379 size = resource->size;
4383 if (resource->usage & WINED3DUSAGE_DYNAMIC)
4384 {
4386 coherent = false;
4387 }
4388 }
4389 else
4390 {
4392
4393 size = texture->sub_resources[sub_resource_idx].size;
4397 }
4398
4399 if (!(bo_gl = malloc(sizeof(*bo_gl))))
4400 return false;
4401
4402 if (!(wined3d_device_gl_create_bo(device_gl, NULL, size, binding, usage, coherent, flags, bo_gl)))
4403 {
4404 free(bo_gl);
4405 return false;
4406 }
4407
4408 if (bo_gl->memory)
4409 {
4411
4413
4414 if ((bo_gl->b.map_ptr = chunk->c.map_ptr))
4415 ++chunk->c.map_count;
4416
4418 }
4419
4420 addr->buffer_object = &bo_gl->b;
4421 addr->addr = NULL;
4422
4423 if (!bo_gl->b.map_ptr)
4424 {
4425 WARN_(d3d_perf)("BO %p (chunk %p) is not persistently mapped.\n",
4426 bo_gl, bo_gl->memory ? bo_gl->memory->chunk : NULL);
4428 }
4429
4430 return true;
4431}
4432
4434{
4436}
4437
4439 const struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent,
4440 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain)
4441{
4442 struct wined3d_swapchain_gl *swapchain_gl;
4443 HRESULT hr;
4444
4445 TRACE("device %p, desc %p, state_parent %p, parent %p, parent_ops %p, swapchain %p.\n",
4446 device, desc, state_parent, parent, parent_ops, swapchain);
4447
4448 if (!(swapchain_gl = calloc(1, sizeof(*swapchain_gl))))
4449 return E_OUTOFMEMORY;
4450
4451 if (FAILED(hr = wined3d_swapchain_gl_init(swapchain_gl, device, desc, state_parent, parent, parent_ops)))
4452 {
4453 WARN("Failed to initialise swapchain, hr %#lx.\n", hr);
4454 free(swapchain_gl);
4455 return hr;
4456 }
4457
4458 TRACE("Created swapchain %p.\n", swapchain_gl);
4459 *swapchain = &swapchain_gl->s;
4460
4461 return hr;
4462}
4463
4465{
4466 struct wined3d_swapchain_gl *swapchain_gl = wined3d_swapchain_gl(swapchain);
4467
4468 wined3d_swapchain_gl_cleanup(swapchain_gl);
4469 free(swapchain_gl);
4470}
4471
4473 const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data,
4474 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_buffer **buffer)
4475{
4476 struct wined3d_buffer_gl *buffer_gl;
4477 HRESULT hr;
4478
4479 TRACE("device %p, desc %p, data %p, parent %p, parent_ops %p, buffer %p.\n",
4480 device, desc, data, parent, parent_ops, buffer);
4481
4482 if (!(buffer_gl = calloc(1, sizeof(*buffer_gl))))
4483 return E_OUTOFMEMORY;
4484
4485 if (FAILED(hr = wined3d_buffer_gl_init(buffer_gl, device, desc, data, parent, parent_ops)))
4486 {
4487 WARN("Failed to initialise buffer, hr %#lx.\n", hr);
4488 free(buffer_gl);
4489 return hr;
4490 }
4491
4492 TRACE("Created buffer %p.\n", buffer_gl);
4493 *buffer = &buffer_gl->b;
4494
4495 return hr;
4496}
4497
4499{
4500 struct wined3d_buffer_gl *buffer_gl = wined3d_buffer_gl(buffer);
4501 struct wined3d_device *device = buffer_gl->b.resource.device;
4502 unsigned int swapchain_count = device->swapchain_count;
4503
4504 TRACE("buffer_gl %p.\n", buffer_gl);
4505
4506 /* Take a reference to the device, in case releasing the buffer would
4507 * cause the device to be destroyed. However, swapchain resources don't
4508 * take a reference to the device, and we wouldn't want to increment the
4509 * refcount on a device that's in the process of being destroyed. */
4510 if (swapchain_count)
4512 wined3d_buffer_cleanup(&buffer_gl->b);
4513 wined3d_cs_destroy_object(device->cs, free, buffer_gl);
4514 if (swapchain_count)
4516}
4517
4519 const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count,
4520 uint32_t flags, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
4521{
4522 struct wined3d_texture_gl *texture_gl;
4523 HRESULT hr;
4524
4525 TRACE("device %p, desc %p, layer_count %u, level_count %u, flags %#x, parent %p, parent_ops %p, texture %p.\n",
4526 device, desc, layer_count, level_count, flags, parent, parent_ops, texture);
4527
4528 if (!(texture_gl = wined3d_texture_allocate_object_memory(sizeof(*texture_gl), level_count, layer_count)))
4529 return E_OUTOFMEMORY;
4530
4531 if (FAILED(hr = wined3d_texture_gl_init(texture_gl, device, desc,
4532 layer_count, level_count, flags, parent, parent_ops)))
4533 {
4534 WARN("Failed to initialise texture, hr %#lx.\n", hr);
4535 free(texture_gl);
4536 return hr;
4537 }
4538
4539 TRACE("Created texture %p.\n", texture_gl);
4540 *texture = &texture_gl->t;
4541
4542 return hr;
4543}
4544
4546{
4547 struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture);
4548 struct wined3d_device *device = texture_gl->t.resource.device;
4549 unsigned int swapchain_count = device->swapchain_count;
4550
4551 TRACE("texture_gl %p.\n", texture_gl);
4552
4553 /* Take a reference to the device, in case releasing the texture would
4554 * cause the device to be destroyed. However, swapchain resources don't
4555 * take a reference to the device, and we wouldn't want to increment the
4556 * refcount on a device that's in the process of being destroyed. */
4557 if (swapchain_count)
4559
4561 texture->resource.parent_ops->wined3d_object_destroyed(texture->resource.parent);
4562
4563 wined3d_texture_cleanup(&texture_gl->t);
4564 wined3d_cs_destroy_object(device->cs, free, texture_gl);
4565
4566 if (swapchain_count)
4568}
4569
4571 struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops,
4573{
4574 struct wined3d_rendertarget_view_gl *view_gl;
4575 HRESULT hr;
4576
4577 TRACE("desc %s, resource %p, parent %p, parent_ops %p, view %p.\n",
4579
4580 if (!(view_gl = calloc(1, sizeof(*view_gl))))
4581 return E_OUTOFMEMORY;
4582
4583 if (FAILED(hr = wined3d_rendertarget_view_gl_init(view_gl, desc, resource, parent, parent_ops)))
4584 {
4585 WARN("Failed to initialise view, hr %#lx.\n", hr);
4586 free(view_gl);
4587 return hr;
4588 }
4589
4590 TRACE("Created render target view %p.\n", view_gl);
4591 *view = &view_gl->v;
4592
4593 return hr;
4594}
4595
4597{
4602 void *object;
4604};
4605
4606static void wined3d_view_gl_destroy_object(void *object)
4607{
4609 const struct wined3d_gl_info *gl_info;
4610 struct wined3d_context *context;
4611 struct wined3d_device *device;
4612 GLuint counter_id;
4613
4614 TRACE("ctx %p.\n", ctx);
4615
4616 device = ctx->device;
4617
4618 counter_id = ctx->counter_bo ? ctx->counter_bo->id : 0;
4619 if (ctx->gl_view->name || counter_id)
4620 {
4623 if (ctx->gl_view->name)
4624 {
4625 context_gl_resource_released(device, ctx->gl_view->name, FALSE);
4626 gl_info->gl_ops.gl.p_glDeleteTextures(1, &ctx->gl_view->name);
4627 }
4628 if (counter_id)
4630 checkGLcall("delete resources");
4632 }
4633 if (ctx->bo_user && ctx->bo_user->valid)
4634 list_remove(&ctx->bo_user->entry);
4635
4636 free(ctx->object);
4637 free(ctx->free);
4638}
4639
4640static void wined3d_view_gl_destroy(struct wined3d_device *device, const struct wined3d_gl_view *gl_view,
4641 struct wined3d_bo_user *bo_user, struct wined3d_bo_gl *counter_bo, void *object)
4642{
4644
4645 if (!(ctx = malloc(sizeof(*ctx))))
4646 ctx = &c;
4647 ctx->device = device;
4648 ctx->gl_view = gl_view;
4649 ctx->bo_user = bo_user;
4650 ctx->counter_bo = counter_bo;
4651 ctx->object = object;
4652 ctx->free = ctx != &c ? ctx : NULL;
4653
4655 if (ctx == &c)
4657}
4658
4660{
4662 struct wined3d_resource *resource = view_gl->v.resource;
4663
4664 TRACE("view_gl %p.\n", view_gl);
4665
4667 wined3d_view_gl_destroy(resource->device, &view_gl->gl_view, NULL, NULL, view_gl);
4668}
4669
4671 struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops,
4673{
4674 struct wined3d_shader_resource_view_gl *view_gl;
4675 HRESULT hr;
4676
4677 TRACE("desc %s, resource %p, parent %p, parent_ops %p, view %p.\n",
4679
4680 if (!(view_gl = calloc(1, sizeof(*view_gl))))
4681 return E_OUTOFMEMORY;
4682
4683 if (FAILED(hr = wined3d_shader_resource_view_gl_init(view_gl, desc, resource, parent, parent_ops)))
4684 {
4685 WARN("Failed to initialise view, hr %#lx.\n", hr);
4686 free(view_gl);
4687 return hr;
4688 }
4689
4690 TRACE("Created shader resource view %p.\n", view_gl);
4691 *view = &view_gl->v;
4692
4693 return hr;
4694}
4695
4697{
4699 struct wined3d_resource *resource = view_gl->v.resource;
4700
4701 TRACE("view_gl %p.\n", view_gl);
4702
4704 wined3d_view_gl_destroy(resource->device, &view_gl->gl_view, &view_gl->bo_user, NULL, view_gl);
4705}
4706
4708 struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops,
4710{
4711 struct wined3d_unordered_access_view_gl *view_gl;
4712 HRESULT hr;
4713
4714 TRACE("desc %s, resource %p, parent %p, parent_ops %p, view %p.\n",
4716
4717 if (!(view_gl = calloc(1, sizeof(*view_gl))))
4718 return E_OUTOFMEMORY;
4719
4720 if (FAILED(hr = wined3d_unordered_access_view_gl_init(view_gl, desc, resource, parent, parent_ops)))
4721 {
4722 WARN("Failed to initialise view, hr %#lx.\n", hr);
4723 free(view_gl);
4724 return hr;
4725 }
4726
4727 TRACE("Created unordered access view %p.\n", view_gl);
4728 *view = &view_gl->v;
4729
4730 return hr;
4731}
4732
4734{
4736 struct wined3d_resource *resource = view_gl->v.resource;
4737
4738 TRACE("view_gl %p.\n", view_gl);
4739
4741 wined3d_view_gl_destroy(resource->device, &view_gl->gl_view, &view_gl->bo_user, &view_gl->counter_bo, view_gl);
4742}
4743
4745 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler)
4746{
4747 struct wined3d_sampler_gl *sampler_gl;
4748
4749 TRACE("device %p, desc %p, parent %p, parent_ops %p, sampler %p.\n",
4750 device, desc, parent, parent_ops, sampler);
4751
4752 if (!(sampler_gl = calloc(1, sizeof(*sampler_gl))))
4753 return E_OUTOFMEMORY;
4754
4755 wined3d_sampler_gl_init(sampler_gl, device, desc, parent, parent_ops);
4756
4757 TRACE("Created sampler %p.\n", sampler_gl);
4758 *sampler = &sampler_gl->s;
4759
4760 return WINED3D_OK;
4761}
4762
4763static void wined3d_sampler_gl_destroy_object(void *object)
4764{
4765 struct wined3d_sampler_gl *sampler_gl = object;
4766 const struct wined3d_gl_info *gl_info;
4767 struct wined3d_context *context;
4768
4769 TRACE("sampler_gl %p.\n", sampler_gl);
4770
4771 if (sampler_gl->name)
4772 {
4773 context = context_acquire(sampler_gl->s.device, NULL, 0);
4775 GL_EXTCALL(glDeleteSamplers(1, &sampler_gl->name));
4777 }
4778
4779 free(sampler_gl);
4780}
4781
4783{
4784 struct wined3d_sampler_gl *sampler_gl = wined3d_sampler_gl(sampler);
4785
4786 TRACE("sampler_gl %p.\n", sampler_gl);
4787
4789}
4790
4792 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
4793{
4794 TRACE("device %p, type %#x, parent %p, parent_ops %p, query %p.\n",
4795 device, type, parent, parent_ops, query);
4796
4797 return wined3d_query_gl_create(device, type, parent, parent_ops, query);
4798}
4799
4800static void wined3d_query_gl_destroy_object(void *object)
4801{
4802 struct wined3d_query *query = object;
4803
4804 TRACE("query %p.\n", query);
4805
4806 if (query->buffer_object)
4807 {
4808 struct wined3d_context *context;
4809
4810 context = context_acquire(query->device, NULL, 0);
4813 }
4814
4815 /* Queries are specific to the GL context that created them. Not
4816 * deleting the query will obviously leak it, but that's still better
4817 * than potentially deleting a different query with the same id in this
4818 * context, and (still) leaking the actual query. */
4819 query->query_ops->query_destroy(query);
4820}
4821
4823{
4824 TRACE("query %p.\n", query);
4825
4827}
4828
4830{
4831 struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
4832
4833 TRACE("context_gl %p.\n", context_gl);
4834
4835 if (context_gl->valid)
4836 context_gl->gl_info->gl_ops.gl.p_glFlush();
4837}
4838
4840 struct wined3d_unordered_access_view *view, const struct wined3d_uvec4 *clear_value, bool fp)
4841{
4842 TRACE("context %p, view %p, clear_value %s.\n", context, view, debug_uvec4(clear_value));
4843
4845 clear_value, wined3d_context_gl(context), fp);
4846}
4847
4849{
4850 TRACE("context %p, view %p.\n", context, view);
4851
4854}
4855
4857{
4858 .adapter_destroy = adapter_gl_destroy,
4859 .adapter_create_device = adapter_gl_create_device,
4860 .adapter_destroy_device = adapter_gl_destroy_device,
4861 .adapter_acquire_context = adapter_gl_acquire_context,
4862 .adapter_release_context = adapter_gl_release_context,
4863 .adapter_get_wined3d_caps = adapter_gl_get_wined3d_caps,
4864 .adapter_check_format = adapter_gl_check_format,
4865 .adapter_init_3d = adapter_gl_init_3d,
4866 .adapter_uninit_3d = adapter_gl_uninit_3d,
4867 .adapter_map_bo_address = adapter_gl_map_bo_address,
4868 .adapter_unmap_bo_address = adapter_gl_unmap_bo_address,
4869 .adapter_copy_bo_address = adapter_gl_copy_bo_address,
4870 .adapter_flush_bo_address = adapter_gl_flush_bo_address,
4871 .adapter_alloc_bo = adapter_gl_alloc_bo,
4872 .adapter_destroy_bo = adapter_gl_destroy_bo,
4873 .adapter_create_swapchain = adapter_gl_create_swapchain,
4874 .adapter_destroy_swapchain = adapter_gl_destroy_swapchain,
4875 .adapter_create_buffer = adapter_gl_create_buffer,
4876 .adapter_destroy_buffer = adapter_gl_destroy_buffer,
4877 .adapter_create_texture = adapter_gl_create_texture,
4878 .adapter_destroy_texture = adapter_gl_destroy_texture,
4879 .adapter_create_rendertarget_view = adapter_gl_create_rendertarget_view,
4880 .adapter_destroy_rendertarget_view = adapter_gl_destroy_rendertarget_view,
4881 .adapter_create_shader_resource_view = adapter_gl_create_shader_resource_view,
4882 .adapter_destroy_shader_resource_view = adapter_gl_destroy_shader_resource_view,
4883 .adapter_create_unordered_access_view = adapter_gl_create_unordered_access_view,
4884 .adapter_destroy_unordered_access_view = adapter_gl_destroy_unordered_access_view,
4885 .adapter_create_sampler = adapter_gl_create_sampler,
4886 .adapter_destroy_sampler = adapter_gl_destroy_sampler,
4887 .adapter_create_query = adapter_gl_create_query,
4888 .adapter_destroy_query = adapter_gl_destroy_query,
4889 .adapter_flush_context = adapter_gl_flush_context,
4890 .adapter_draw_primitive = draw_primitive,
4891 .adapter_dispatch_compute = dispatch_compute,
4892 .adapter_clear_uav = adapter_gl_clear_uav,
4893 .adapter_generate_mipmap = adapter_gl_generate_mipmap,
4894};
4895
4896static void wined3d_adapter_gl_init_d3d_info(struct wined3d_adapter_gl *adapter_gl, uint32_t wined3d_creation_flags)
4897{
4898 const struct wined3d_gl_info *gl_info = &adapter_gl->gl_info;
4899 struct wined3d_d3d_info *d3d_info = &adapter_gl->a.d3d_info;
4900 struct wined3d_vertex_caps vertex_caps;
4901 struct shader_caps shader_caps;
4902 GLfloat f[2];
4903
4904 adapter_gl->a.shader_backend->shader_get_caps(&adapter_gl->a, &shader_caps);
4905 adapter_gl->a.vertex_pipe->vp_get_caps(&adapter_gl->a, &vertex_caps);
4906 adapter_gl->a.misc_state_template = misc_state_template_gl;
4907 adapter_gl->a.fragment_pipe->get_caps(&adapter_gl->a, &d3d_info->ffp_fragment_caps);
4908
4909 d3d_info->limits.vs_version = shader_caps.vs_version;
4910 d3d_info->limits.hs_version = shader_caps.hs_version;
4911 d3d_info->limits.ds_version = shader_caps.ds_version;
4912 d3d_info->limits.gs_version = shader_caps.gs_version;
4913 d3d_info->limits.ps_version = shader_caps.ps_version;
4914 d3d_info->limits.cs_version = shader_caps.cs_version;
4915 d3d_info->limits.vs_uniform_count = shader_caps.vs_uniform_count;
4916 d3d_info->limits.ps_uniform_count = shader_caps.ps_uniform_count;
4917 d3d_info->limits.varying_count = shader_caps.varying_count;
4918 TRACE("Max texture stages: %u.\n", d3d_info->ffp_fragment_caps.max_blend_stages);
4919 d3d_info->limits.ffp_vertex_blend_matrices = vertex_caps.max_vertex_blend_matrices;
4920 d3d_info->limits.active_light_count = vertex_caps.max_active_lights;
4921
4922 d3d_info->limits.max_rt_count = gl_info->limits.buffers;
4923 d3d_info->limits.max_clip_distances = gl_info->limits.user_clip_distances;
4924 d3d_info->limits.texture_size = gl_info->limits.texture_size;
4925 d3d_info->limits.sample_count = gl_info->limits.samples;
4926
4927 gl_info->gl_ops.gl.p_glGetFloatv(gl_info->supported[WINED3D_GL_LEGACY_CONTEXT]
4929 d3d_info->limits.pointsize_max = f[1];
4930 TRACE("Maximum point size support - max point size %.8e.\n", f[1]);
4931
4932 d3d_info->wined3d_creation_flags = wined3d_creation_flags;
4933 d3d_info->emulated_flatshading = vertex_caps.emulated_flatshading;
4934 d3d_info->ffp_alpha_test = !!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT];
4938 d3d_info->stencil_export = !!gl_info->supported[ARB_SHADER_STENCIL_EXPORT];
4941 d3d_info->vertex_bgra = !!gl_info->supported[ARB_VERTEX_ARRAY_BGRA];
4942 d3d_info->texture_swizzle = !!gl_info->supported[ARB_TEXTURE_SWIZZLE];
4943 d3d_info->srgb_read_control = !!gl_info->supported[EXT_TEXTURE_SRGB_DECODE];
4944 d3d_info->srgb_write_control = !!gl_info->supported[ARB_FRAMEBUFFER_SRGB];
4945 d3d_info->clip_control = !!gl_info->supported[ARB_CLIP_CONTROL];
4948 d3d_info->pbo = !!gl_info->supported[ARB_PIXEL_BUFFER_OBJECT];
4949 d3d_info->subpixel_viewport = gl_info->limits.viewport_subpixel_bits >= 8;
4950 d3d_info->fences = wined3d_fence_supported(gl_info);
4951 d3d_info->feature_level = feature_level_from_caps(gl_info, &shader_caps, &d3d_info->ffp_fragment_caps);
4953 d3d_info->persistent_map = !!gl_info->supported[ARB_BUFFER_STORAGE];
4955
4956 if (gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
4958 else
4960}
4961
4963{
4964 static const float test_array[] =
4965 {
4966 0.0f,
4967 -1.0f / 1024.0f,
4968 -1.0f / 512.0f,
4969 -1.0f / 256.0f,
4970 -1.0f / 128.0f,
4971 -1.0f / 64.0f
4972 };
4973 unsigned int upper = ARRAY_SIZE(test_array), lower = 0, test;
4974 float value;
4975
4976 while (upper != lower)
4977 {
4978 test = (upper + lower) / 2;
4979 value = test_array[test];
4980 TRACE("Good %u lower %u, test %u.\n", upper, lower, test);
4982 upper = test;
4983 else
4984 lower = test + 1;
4985 }
4986
4987 if (upper < ARRAY_SIZE(test_array))
4988 {
4989 value = test_array[upper];
4990 if (value)
4991 WARN("Using a filling convention fixup offset of -1/%f.\n", -1.0f / value);
4992 else
4993 TRACE("No need for a filling convention offset.\n");
4994
4995 return value;
4996 }
4997
4998 FIXME("Did not find a way to get the filling convention we want.\n");
4999
5000 /* This value was used unconditionally before the dynamic test function was
5001 * introduced. */
5002 return -1.0f / 64.0f;
5003}
5004
5005#ifdef __REACTOS__
5006static DWORD WINAPI wined3d_no_3d_warning_proc(void *param)
5007{
5009 L"ReactOS DirectX Needs at least OpenGL 2.0 or better\n\n"
5010 L"Install a display driver that provides an OpenGL ICD to enable 3D "
5011 L"acceleration. Or install Mesa3D from RAPPS",
5012 L"ReactOS - no 3D acceleration",
5014 return 0;
5015}
5016
5017static void wined3d_warn_no_3d(void)
5018{
5019 static LONG warned;
5020 HANDLE thread;
5021
5022 /* Only warn once per process */
5023 if (InterlockedCompareExchange(&warned, 1, 0))
5024 return;
5025
5026 if ((thread = CreateThread(NULL, 0, wined3d_no_3d_warning_proc, NULL, 0, NULL)))
5028}
5029#endif /* __REACTOS__ */
5030
5032 unsigned int ordinal, unsigned int wined3d_creation_flags)
5033{
5034 static const unsigned int supported_gl_versions[] =
5035 {
5036 MAKEDWORD_VERSION(4, 4),
5037 MAKEDWORD_VERSION(3, 2),
5038 MAKEDWORD_VERSION(1, 0),
5039 };
5040 struct wined3d_driver_info *driver_info = &adapter_gl->a.driver_info;
5041 struct wined3d_gl_info *gl_info = &adapter_gl->gl_info;
5042 struct wined3d_caps_gl_ctx caps_gl_ctx = {0};
5043 LUID primary_luid, *luid = NULL;
5044 unsigned int i;
5045
5046 static const struct
5047 {
5048 enum wined3d_gl_extension extension;
5049 const char *string;
5050 }
5051 required_extensions[] =
5052 {
5053 {ARB_FRAGMENT_SHADER, "ARB_fragment_shader"},
5054 {ARB_SHADING_LANGUAGE_100, "ARB_shading_language_100"},
5055 {ARB_VERTEX_SHADER, "ARB_vertex_shader"},
5056 {EXT_FRAMEBUFFER_OBJECT, "EXT_framebuffer_object"},
5057 };
5058
5059 TRACE("adapter_gl %p, ordinal %u, wined3d_creation_flags %#x.\n",
5060 adapter_gl, ordinal, wined3d_creation_flags);
5061
5062 if (ordinal == 0 && wined3d_get_primary_adapter_luid(&primary_luid))
5063 luid = &primary_luid;
5064
5065 if (!wined3d_adapter_init(&adapter_gl->a, ordinal, luid, &wined3d_adapter_gl_ops))
5066 return FALSE;
5067
5068 /* Dynamically load all GL core functions */
5069 {
5070 HMODULE mod_gl = GetModuleHandleA("opengl32.dll");
5071#define USE_GL_FUNC(f) gl_info->gl_ops.gl.p_##f = (void *)GetProcAddress(mod_gl, #f);
5073#undef USE_GL_FUNC
5074 gl_info->gl_ops.wgl.p_wglSwapBuffers = (void *)GetProcAddress(mod_gl, "wglSwapBuffers");
5075 gl_info->gl_ops.wgl.p_wglGetPixelFormat = (void *)GetProcAddress(mod_gl, "wglGetPixelFormat");
5076 }
5077
5078 gl_info->p_glEnableWINE = gl_info->gl_ops.gl.p_glEnable;
5079 gl_info->p_glDisableWINE = gl_info->gl_ops.gl.p_glDisable;
5080
5081 if (!wined3d_caps_gl_ctx_create(adapter_gl, &caps_gl_ctx))
5082 {
5083 ERR("Failed to get a GL context for adapter %p.\n", adapter_gl);
5084 return FALSE;
5085 }
5086
5087 for (i = 0; i < ARRAY_SIZE(supported_gl_versions); ++i)
5088 {
5089 if (supported_gl_versions[i] <= wined3d_settings.max_gl_version)
5090 break;
5091 }
5092 if (i == ARRAY_SIZE(supported_gl_versions))
5093 {
5094 ERR_(winediag)("Requested invalid GL version %u.%u.\n",
5096 i = ARRAY_SIZE(supported_gl_versions) - 1;
5097 }
5098
5099 for (; i < ARRAY_SIZE(supported_gl_versions); ++i)
5100 {
5101 gl_info->selected_gl_version = supported_gl_versions[i];
5102
5104 break;
5105
5106 WARN("Couldn't create an OpenGL %u.%u context, trying fallback to a lower version.\n",
5107 supported_gl_versions[i] >> 16, supported_gl_versions[i] & 0xffff);
5108 }
5109
5110 if (!wined3d_adapter_init_gl_caps(adapter_gl, &caps_gl_ctx, wined3d_creation_flags))
5111 {
5112 ERR("Failed to initialize GL caps for adapter %p.\n", adapter_gl);
5113 wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
5114 return FALSE;
5115 }
5116
5117 for (unsigned int i = 0; i < ARRAY_SIZE(required_extensions); ++i)
5118 {
5119 if (!gl_info->supported[required_extensions[i].extension])
5120 {
5121 ERR("Required extension %s is not supported.\n", required_extensions[i].string);
5122#ifdef __REACTOS__
5123 wined3d_warn_no_3d();
5124#endif
5125 wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
5126 return FALSE;
5127 }
5128 }
5129
5131 {
5132 ERR("Required extension ARB_texture_non_power_of_two is not supported.\n");
5133#ifdef __REACTOS__
5134 wined3d_warn_no_3d();
5135#endif
5136 wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
5137 return FALSE;
5138 }
5139
5140 if (gl_info->glsl_version < MAKEDWORD_VERSION(1, 20))
5141 {
5142 ERR("GLSL version %s is too low; 1.20 is required.\n",
5143 (const char *)gl_info->gl_ops.gl.p_glGetString(GL_SHADING_LANGUAGE_VERSION_ARB));
5144#ifdef __REACTOS__
5145 wined3d_warn_no_3d();
5146#endif
5147 wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
5148 return FALSE;
5149 }
5150
5151 gl_info->filling_convention_offset = wined3d_adapter_find_fill_offset(&caps_gl_ctx);
5152
5153 wined3d_adapter_gl_init_d3d_info(adapter_gl, wined3d_creation_flags);
5154
5155 if (!wined3d_driver_info_init(driver_info, caps_gl_ctx.gpu_description, adapter_gl->a.d3d_info.feature_level,
5156 caps_gl_ctx.vram_bytes, 0))
5157 {
5158 wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
5159 return FALSE;
5160 }
5161 TRACE("Reporting (fake) driver version 0x%08x-0x%08x.\n",
5162 driver_info->version_high, driver_info->version_low);
5163
5164 wined3d_adapter_init_fb_cfgs(adapter_gl, caps_gl_ctx.dc);
5165 /* We haven't found any suitable formats. This should only happen in
5166 * case of GDI software rendering, which is pretty useless anyway. */
5167 if (!adapter_gl->pixel_format_count)
5168 {
5169 WARN("No suitable pixel formats found.\n");
5170 wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
5171 free(adapter_gl->pixel_formats);
5172 return FALSE;
5173 }
5174
5175 if (!wined3d_adapter_gl_init_format_info(&adapter_gl->a, &caps_gl_ctx))
5176 {
5177 ERR("Failed to initialize GL format info.\n");
5178 wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
5179 free(adapter_gl->pixel_formats);
5180 return FALSE;
5181 }
5182
5183 wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
5184
5186
5187 return TRUE;
5188}
5189
5190struct wined3d_adapter *wined3d_adapter_gl_create(unsigned int ordinal, unsigned int wined3d_creation_flags)
5191{
5193
5194 if (!(adapter = calloc(1, sizeof(*adapter))))
5195 return NULL;
5196
5197 if (!wined3d_adapter_gl_init(adapter, ordinal, wined3d_creation_flags))
5198 {
5199 free(adapter);
5200 return NULL;
5201 }
5202
5203 TRACE("Created adapter %p.\n", adapter);
5204
5205 return &adapter->a;
5206}
#define isspace(c)
Definition: acclib.h:69
#define isdigit(c)
Definition: acclib.h:68
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
enum wined3d_pci_vendor card_vendor
Definition: adapter_gl.c:1919
static HRESULT adapter_gl_create_query(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: adapter_gl.c:4791
static void quirk_limited_tex_filtering(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:948
static HRESULT adapter_gl_create_texture(struct wined3d_device *device, const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count, uint32_t flags, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
Definition: adapter_gl.c:4518
static void wined3d_caps_gl_ctx_destroy(const struct wined3d_caps_gl_ctx *ctx)
Definition: adapter_gl.c:249
static void adapter_gl_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps)
Definition: adapter_gl.c:4141
static unsigned int wined3d_parse_gl_version(const char *gl_version)
Definition: adapter_gl.c:1145
static const struct wined3d_renderer_table cards_intel[]
static const struct gl_vendor_selection vmware_gl_vendor_table[]
static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:529
static enum wined3d_feature_level feature_level_from_caps(const struct wined3d_gl_info *gl_info, const struct shader_caps *shader_caps, const struct fragment_caps *fragment_caps)
Definition: adapter_gl.c:1255
static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:430
static void wined3d_query_gl_destroy_object(void *object)
Definition: adapter_gl.c:4800
#define MAP_GL_FUNCTION(core_func, ext_func)
struct wined3d_adapter * wined3d_adapter_gl_create(unsigned int ordinal, unsigned int wined3d_creation_flags)
Definition: adapter_gl.c:5190
static void WINE_GLAPI generic_float16_2(GLuint idx, const void *data)
Definition: adapter_gl.c:3892
static HRESULT adapter_gl_init_3d(struct wined3d_device *device)
Definition: adapter_gl.c:4317
static void wined3d_sampler_gl_destroy_object(void *object)
Definition: adapter_gl.c:4763
static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:2862
static void adapter_gl_copy_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
Definition: adapter_gl.c:4350
static void quirk_fbo_tex_update(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:933
static BOOL match_broken_rgba16(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:676
static void adapter_gl_generate_mipmap(struct wined3d_context *context, struct wined3d_shader_resource_view *view)
Definition: adapter_gl.c:4848
static void wined3d_view_gl_destroy_object(void *object)
Definition: adapter_gl.c:4606
static const struct wined3d_extension_map gl_extension_map[]
Definition: adapter_gl.c:48
static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:928
static const struct gl_vendor_selection intel_gl_vendor_table[]
static void adapter_gl_destroy_buffer(struct wined3d_buffer *buffer)
Definition: adapter_gl.c:4498
static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:581
static void WINE_GLAPI generic_d3dcolor(GLuint idx, const void *data)
Definition: adapter_gl.c:3866
static BOOL match_broken_arb_fog(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:718
static void load_gl_funcs(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:2070
wined3d_gl_vendor
Definition: adapter_gl.c:34
@ GL_VENDOR_UNKNOWN
Definition: adapter_gl.c:35
@ GL_VENDOR_APPLE
Definition: adapter_gl.c:36
@ GL_VENDOR_MESA
Definition: adapter_gl.c:38
@ GL_VENDOR_FGLRX
Definition: adapter_gl.c:37
@ GL_VENDOR_NVIDIA
Definition: adapter_gl.c:39
static BOOL match_no_independent_bit_depths(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:823
static const struct wined3d_renderer_table cards_nvidia_binary[]
static void quirk_clip_varying(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:918
static void WINE_GLAPI generic_ushort2n(GLuint idx, const void *data)
Definition: adapter_gl.c:3884
static BOOL match_amd_r300_to_500(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:420
static void adapter_gl_flush_bo_address(struct wined3d_context *context, const struct wined3d_const_bo_address *data, size_t size)
Definition: adapter_gl.c:4357
static void adapter_gl_destroy(struct wined3d_adapter *adapter)
Definition: adapter_gl.c:4082
const char * description
Definition: adapter_gl.c:1920
static const struct gl_vendor_selection redhat_gl_vendor_table[]
static void adapter_gl_flush_context(struct wined3d_context *context)
Definition: adapter_gl.c:4829
static void adapter_gl_destroy_device(struct wined3d_device *device)
Definition: adapter_gl.c:4119
static void WINE_GLAPI generic_short2n(GLuint idx, const void *data)
Definition: adapter_gl.c:3876
static void adapter_gl_uninit_3d(struct wined3d_device *device)
Definition: adapter_gl.c:4329
static enum wined3d_gl_vendor wined3d_guess_gl_vendor(const struct wined3d_gl_info *gl_info, const char *gl_vendor_string, const char *gl_renderer, const char *gl_version)
Definition: adapter_gl.c:1165
static BOOL match_apple(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:440
static BOOL test_arb_vs_offset_limit(const struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:385
static void wined3d_adapter_init_ffp_attrib_ops(struct wined3d_adapter_gl *adapter_gl)
Definition: adapter_gl.c:3912
static const struct wined3d_gpu_description * query_gpu_description(const struct wined3d_gl_info *gl_info, UINT64 *vram_bytes)
Definition: adapter_gl.c:991
static void parse_extension_string(struct wined3d_gl_info *gl_info, const char *extensions, const struct wined3d_extension_map *map, UINT entry_count)
Definition: adapter_gl.c:2012
static void wined3d_adapter_gl_init_d3d_info(struct wined3d_adapter_gl *adapter_gl, uint32_t wined3d_creation_flags)
Definition: adapter_gl.c:4896
static HRESULT adapter_gl_create_sampler(struct wined3d_device *device, const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler)
Definition: adapter_gl.c:4744
static HRESULT adapter_gl_create_unordered_access_view(const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_unordered_access_view **view)
Definition: adapter_gl.c:4707
static void WINE_GLAPI generic_float16_4(GLuint idx, const void *data)
Definition: adapter_gl.c:3901
static void adapter_gl_destroy_unordered_access_view(struct wined3d_unordered_access_view *view)
Definition: adapter_gl.c:4733
#define MAP_GL_FUNCTION_CAST(core_func, ext_func)
static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:464
static void quirk_no_independent_bit_depths(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:986
static void adapter_gl_clear_uav(struct wined3d_context *context, struct wined3d_unordered_access_view *view, const struct wined3d_uvec4 *clear_value, bool fp)
Definition: adapter_gl.c:4839
static void quirk_broken_rgba16(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:938
static HRESULT adapter_gl_create_device(struct wined3d *wined3d, const struct wined3d_adapter *adapter, enum wined3d_device_type device_type, HWND focus_window, unsigned int flags, BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count, struct wined3d_device_parent *device_parent, struct wined3d_device **device)
Definition: adapter_gl.c:4091
static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
Definition: adapter_gl.c:1209
static void quirk_broken_viewport_subpixel_bits(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:976
static void quirk_allows_specular_alpha(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:923
static void wined3d_view_gl_destroy(struct wined3d_device *device, const struct wined3d_gl_view *gl_view, struct wined3d_bo_user *bo_user, struct wined3d_bo_gl *counter_bo, void *object)
Definition: adapter_gl.c:4640
static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter_gl *adapter_gl, HDC dc)
Definition: adapter_gl.c:3952
static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:702
static const struct gl_vendor_selection nvidia_gl_vendor_table[]
static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:553
static const struct wined3d_renderer_table cards_nvidia_mesa[]
static void * adapter_gl_map_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *data, size_t size, uint32_t map_flags)
Definition: adapter_gl.c:4338
static BOOL adapter_gl_check_format(const struct wined3d_adapter *adapter, const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format, const struct wined3d_format *ds_format)
Definition: adapter_gl.c:4310
static BOOL match_r200(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:709
static float wined3d_adapter_find_fill_offset(struct wined3d_caps_gl_ctx *ctx)
Definition: adapter_gl.c:4962
static HRESULT adapter_gl_create_buffer(struct wined3d_device *device, const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_buffer **buffer)
Definition: adapter_gl.c:4472
static HRESULT adapter_gl_create_rendertarget_view(const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_rendertarget_view **view)
Definition: adapter_gl.c:4570
static void fixup_extensions(struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor)
Definition: adapter_gl.c:1021
static const struct wined3d_renderer_table cards_amd_binary[]
static BOOL match_not_dx10_capable(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:545
static void adapter_gl_unmap_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *data, unsigned int range_count, const struct wined3d_range *ranges)
Definition: adapter_gl.c:4344
static const struct wined3d_adapter_ops wined3d_adapter_gl_ops
Definition: adapter_gl.c:4856
static HRESULT adapter_gl_create_shader_resource_view(const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader_resource_view **view)
Definition: adapter_gl.c:4670
static enum wined3d_pci_device wined3d_guess_card(enum wined3d_feature_level feature_level, const char *gl_renderer, enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor)
Definition: adapter_gl.c:1933
static HRESULT adapter_gl_create_swapchain(struct wined3d_device *device, const struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain)
Definition: adapter_gl.c:4438
static void adapter_gl_destroy_shader_resource_view(struct wined3d_shader_resource_view *view)
Definition: adapter_gl.c:4696
static struct wined3d_context * adapter_gl_acquire_context(struct wined3d_device *device, struct wined3d_texture *texture, unsigned int sub_resource_idx)
Definition: adapter_gl.c:4130
static void quirk_infolog_spam(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:943
static void enumerate_gl_extensions(struct wined3d_gl_info *gl_info, const struct wined3d_extension_map *map, unsigned int map_entries_count)
Definition: adapter_gl.c:2046
static void adapter_gl_release_context(struct wined3d_context *context)
Definition: adapter_gl.c:4136
static void quirk_no_np2(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:900
static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter_gl *adapter_gl, struct wined3d_caps_gl_ctx *caps_gl_ctx, unsigned int wined3d_creation_flags)
Definition: adapter_gl.c:3228
static BOOL wined3d_caps_gl_ctx_create_attribs(struct wined3d_caps_gl_ctx *caps_gl_ctx, struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:280
static void adapter_gl_destroy_bo(struct wined3d_context *context, struct wined3d_bo *bo)
Definition: adapter_gl.c:4433
static const struct wined3d_renderer_table cards_amd_mesa[]
static BOOL wined3d_caps_gl_ctx_create(struct wined3d_adapter_gl *adapter_gl, struct wined3d_caps_gl_ctx *ctx)
Definition: adapter_gl.c:310
static void quirk_broken_arb_fog(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:971
static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:864
static void quirk_r200_constants(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:957
static void adapter_gl_destroy_swapchain(struct wined3d_swapchain *swapchain)
Definition: adapter_gl.c:4464
static void adapter_gl_destroy_texture(struct wined3d_texture *texture)
Definition: adapter_gl.c:4545
static const struct wined3d_extension_map wgl_extension_map[]
Definition: adapter_gl.c:241
#define USE_GL_FUNC(pfn)
static const struct gl_vendor_selection amd_gl_vendor_table[]
unsigned int gl_vendor_count
Definition: adapter_gl.c:1922
static void adapter_gl_destroy_rendertarget_view(struct wined3d_rendertarget_view *view)
Definition: adapter_gl.c:4659
static void adapter_gl_destroy_sampler(struct wined3d_sampler *sampler)
Definition: adapter_gl.c:4782
static BOOL wined3d_adapter_gl_init(struct wined3d_adapter_gl *adapter_gl, unsigned int ordinal, unsigned int wined3d_creation_flags)
Definition: adapter_gl.c:5031
static void adapter_gl_destroy_query(struct wined3d_query *query)
Definition: adapter_gl.c:4822
static void quirk_amd_dx9(struct wined3d_gl_info *gl_info)
Definition: adapter_gl.c:874
static const struct wined3d_renderer_table cards_redhat[]
static const struct wined3d_renderer_table cards_vmware[]
static enum wined3d_pci_device select_card_handler(const struct gl_vendor_selection *table, unsigned int table_size, enum wined3d_gl_vendor gl_vendor, const char *gl_renderer)
Definition: adapter_gl.c:1892
static BOOL match_broken_viewport_subpixel_bits(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:814
static BOOL match_fbo_tex_update(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
Definition: adapter_gl.c:626
static void WINE_GLAPI invalid_generic_attrib_func(GLuint idx, const void *data)
Definition: adapter_gl.c:3860
static const struct @331 card_vendor_table[]
static bool adapter_gl_alloc_bo(struct wined3d_device *device, struct wined3d_resource *resource, unsigned int sub_resource_idx, struct wined3d_bo_address *addr)
Definition: adapter_gl.c:4363
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
static HANDLE thread
Definition: service.c:33
#define HW_VENDOR_NVIDIA
Definition: builtin.c:4465
#define HW_VENDOR_AMD
Definition: builtin.c:4464
#define HW_VENDOR_INTEL
Definition: builtin.c:4467
#define HW_VENDOR_VMWARE
Definition: builtin.c:4466
Definition: _map.h:48
void wined3d_context_gl_destroy_bo(struct wined3d_context_gl *context_gl, struct wined3d_bo_gl *bo)
Definition: context_gl.c:3097
void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
Definition: context_gl.c:3016
struct wined3d_context * wined3d_context_gl_acquire(const struct wined3d_device *device, struct wined3d_texture *texture, unsigned int sub_resource_idx)
Definition: context_gl.c:4319
struct wined3d_context_gl * wined3d_context_gl_get_current(void)
Definition: context_gl.c:1566
void wined3d_context_gl_unmap_bo_address(struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data, unsigned int range_count, const struct wined3d_range *ranges)
Definition: context_gl.c:2988
HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, HGLRC share_ctx)
Definition: context_gl.c:1881
void dispatch_compute(struct wined3d_device *device, const struct wined3d_state *state, const struct wined3d_dispatch_parameters *parameters)
Definition: context_gl.c:4402
void wined3d_context_gl_release(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:1631
void * wined3d_context_gl_map_bo_address(struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data, size_t size, uint32_t flags)
Definition: context_gl.c:2932
void context_gl_resource_released(struct wined3d_device *device, GLuint name, BOOL rb_namespace)
Definition: context_gl.c:1137
void wined3d_context_gl_flush_bo_address(struct wined3d_context_gl *context_gl, const struct wined3d_const_bo_address *data, size_t size)
Definition: context_gl.c:3003
void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state, const struct wined3d_draw_parameters *parameters)
Definition: context_gl.c:4648
void wined3d_cs_destroy_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:2299
void wined3d_cs_init_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:2304
HDC dc
Definition: cylfrac.c:34
void * description
float float_16_to_32(const unsigned short in)
Definition: math.c:2203
const WCHAR * vendor
Definition: db.cpp:873
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
device_type
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT32 uint32_t
Definition: types.h:75
HRESULT wined3d_buffer_gl_init(struct wined3d_buffer_gl *buffer_gl, struct wined3d_device *device, const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: buffer.c:1101
GLenum wined3d_buffer_gl_binding_from_bind_flags(const struct wined3d_gl_info *gl_info, uint32_t bind_flags)
Definition: buffer.c:136
void wined3d_buffer_cleanup(struct wined3d_buffer *buffer)
Definition: buffer.c:453
void wined3d_device_gl_delete_opengl_contexts_cs(void *object)
Definition: device.c:1431
void wined3d_device_destroy_default_samplers(struct wined3d_device *device)
Definition: device.c:784
ULONG CDECL wined3d_device_decref(struct wined3d_device *device)
Definition: device.c:251
HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined3d, unsigned int adapter_idx, enum wined3d_device_type device_type, HWND focus_window, unsigned int flags, BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count, const BOOL *supported_extensions, struct wined3d_device_parent *device_parent)
Definition: device.c:5479
void wined3d_device_cleanup(struct wined3d_device *device)
Definition: device.c:205
bool wined3d_device_gl_create_bo(struct wined3d_device_gl *device_gl, struct wined3d_context_gl *context_gl, GLsizeiptr size, GLenum binding, GLenum usage, bool coherent, GLbitfield flags, struct wined3d_bo_gl *bo)
Definition: device.c:1335
ULONG CDECL wined3d_device_incref(struct wined3d_device *device)
Definition: device.c:161
void wined3d_device_gl_create_primary_opengl_context_cs(void *object)
Definition: device.c:1476
HRESULT wined3d_query_gl_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: query.c:1309
void wined3d_query_gl_destroy_buffer_object(struct wined3d_context_gl *context_gl, struct wined3d_query *query)
Definition: query.c:56
GLbitfield wined3d_resource_gl_storage_flags(const struct wined3d_resource *resource)
Definition: resource.c:355
HRESULT wined3d_texture_gl_init(struct wined3d_texture_gl *texture_gl, struct wined3d_device *device, const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count, uint32_t flags, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: texture.c:4083
void wined3d_texture_cleanup(struct wined3d_texture *texture)
Definition: texture.c:1593
void wined3d_texture_sub_resources_destroyed(struct wined3d_texture *texture)
Definition: texture.c:1111
BOOL wined3d_get_primary_adapter_luid(LUID *luid)
Definition: utils.c:5761
void wined3d_release_dc(HWND window, HDC dc)
Definition: utils.c:6658
BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx)
Definition: utils.c:4177
unsigned int idx
Definition: utils.c:40
BOOL wined3d_caps_gl_ctx_test_viewport_subpixel_bits(struct wined3d_caps_gl_ctx *ctx)
Definition: utils.c:3849
const char * debug_uvec4(const struct wined3d_uvec4 *v)
Definition: utils.c:4577
bool wined3d_caps_gl_ctx_test_filling_convention(struct wined3d_caps_gl_ctx *ctx, float offset)
Definition: utils.c:3896
const char * debug_glerror(GLenum error)
Definition: utils.c:5445
const char * wined3d_debug_view_desc(const struct wined3d_view_desc *d, const struct wined3d_resource *resource)
Definition: utils.c:4867
void wined3d_shader_resource_view_cleanup(struct wined3d_shader_resource_view *view)
Definition: view.c:978
void wined3d_unordered_access_view_cleanup(struct wined3d_unordered_access_view *view)
Definition: view.c:1531
void wined3d_unordered_access_view_gl_clear(struct wined3d_unordered_access_view_gl *view_gl, const struct wined3d_uvec4 *clear_value, struct wined3d_context_gl *context_gl, bool fp)
Definition: view.c:1570
HRESULT wined3d_rendertarget_view_gl_init(struct wined3d_rendertarget_view_gl *view_gl, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:659
HRESULT wined3d_unordered_access_view_gl_init(struct wined3d_unordered_access_view_gl *view_gl, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:1833
void wined3d_rendertarget_view_cleanup(struct wined3d_rendertarget_view *view)
Definition: view.c:374
void wined3d_shader_resource_view_gl_generate_mipmap(struct wined3d_shader_resource_view_gl *view_gl, struct wined3d_context_gl *context_gl)
Definition: view.c:1312
HRESULT wined3d_shader_resource_view_gl_init(struct wined3d_shader_resource_view_gl *view_gl, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:1121
#define CloseHandle
Definition: compat.h:739
#define GetProcAddress(x, y)
Definition: compat.h:753
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define WINE_DECLARE_DEBUG_CHANNEL(x)
Definition: compat.h:45
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
_ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl sscanf(const char *, const char *,...) __WINE_CRT_SCANF_ATTR(2
_ACRTIMP int __cdecl atoi(const char *)
Definition: string.c:1720
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
_ACRTIMP char *__cdecl strstr(const char *, const char *)
Definition: string.c:3420
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
#define check(expected, result)
Definition: dplayx.c:43
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
r parent
Definition: btrfs.c:3010
const struct wined3d_state_entry_template misc_state_template_gl[]
Definition: ffp_gl.c:1401
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
return adapter
unsigned char GLubyte
Definition: gl.h:157
#define GL_MAX_TEXTURE_SIZE
Definition: gl.h:510
#define GL_NICEST
Definition: gl.h:585
GLuint start
Definition: gl.h:1545
#define GL_TEXTURE_MIN_FILTER
Definition: gl.h:649
#define GL_VERSION
Definition: gl.h:689
GLAPI void GLAPIENTRY glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r)
#define GL_FOG_COLOR
Definition: gl.h:417
GLAPI void GLAPIENTRY glMultiTexCoord4fvARB(GLenum target, const GLfloat *v)
GLAPI void GLAPIENTRY glMultiTexCoord3fvARB(GLenum target, const GLfloat *v)
GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture)
short GLshort
Definition: gl.h:155
GLAPI void GLAPIENTRY glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
GLAPI void GLAPIENTRY glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
float GLfloat
Definition: gl.h:161
#define GL_RGBA8
Definition: gl.h:762
#define GL_UNSIGNED_SHORT
Definition: gl.h:180
#define GL_ALIASED_POINT_SIZE_RANGE
Definition: gl.h:1509
unsigned int GLbitfield
Definition: gl.h:152
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLAPI void GLAPIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
#define GL_MAX_TEXTURE_UNITS_ARB
Definition: gl.h:2000
GLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture)
GLAPI void GLAPIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t)
#define GL_RGB5
Definition: gl.h:754
#define GL_TEXTURE_MAX_LEVEL
Definition: gl.h:1504
#define GL_LINEAR
Definition: gl.h:421
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define GL_BGRA
Definition: gl.h:1485
unsigned int GLenum
Definition: gl.h:150
#define GL_RGB8
Definition: gl.h:755
GLAPI void GLAPIENTRY glGetCompressedTexImage(GLenum target, GLint lod, GLvoid *img)
GLdouble s
Definition: gl.h:2039
GLAPI void GLAPIENTRY glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
unsigned int GLuint
Definition: gl.h:159
#define GL_RGB
Definition: gl.h:502
#define GL_FOG_END
Definition: gl.h:420
#define GL_FOG_HINT
Definition: gl.h:582
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLAPI void GLAPIENTRY glTexImage3D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
#define GL_NEAREST
Definition: gl.h:678
#define GL_UNSIGNED_BYTE
Definition: gl.h:178
#define GL_NO_ERROR
Definition: gl.h:693
#define GL_POINT_SIZE_RANGE
Definition: gl.h:253
#define GL_FOG
Definition: gl.h:414
#define GL_COLOR_BUFFER_BIT
Definition: gl.h:716
GLAPI void GLAPIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
GLAPI void GLAPIENTRY glMultiTexCoord2svARB(GLenum target, const GLshort *v)
#define GL_RGBA
Definition: gl.h:503
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define GL_REPEAT
Definition: gl.h:679
#define GL_FOG_START
Definition: gl.h:419
#define GL_MAX_LIGHTS
Definition: gl.h:508
#define GL_EXTENSIONS
Definition: gl.h:690
GLAPI void GLAPIENTRY glBlendEquation(GLenum mode)
#define GL_FOG_MODE
Definition: gl.h:415
#define GL_UNSIGNED_INT_8_8_8_8
Definition: gl.h:1494
unsigned short GLushort
Definition: gl.h:158
#define GL_TEXTURE_MAG_FILTER
Definition: gl.h:648
int GLint
Definition: gl.h:156
#define GL_TRIANGLE_STRIP
Definition: gl.h:195
#define GL_TEXTURE_2D
Definition: gl.h:645
GLAPI void GLAPIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
#define GL_RENDERER
Definition: gl.h:688
#define GL_RGBA16
Definition: gl.h:765
GLAPI void GLAPIENTRY glMultiTexCoord1fARB(GLenum target, GLfloat s)
#define GL_CLAMP_TO_EDGE
Definition: gl.h:1481
GLAPI void GLAPIENTRY glActiveTexture(GLenum texture)
#define GL_UNSIGNED_INT_8_8_8_8_REV
Definition: gl.h:1495
#define GL_VENDOR
Definition: gl.h:687
#define GL_UNSIGNED_SHORT_5_6_5
Definition: gl.h:1488
GLAPI void GLAPIENTRY glMultiTexCoord1fvARB(GLenum target, const GLfloat *v)
GLAPI void GLAPIENTRY glMultiTexCoord2fvARB(GLenum target, const GLfloat *v)
GLAPI void GLAPIENTRY glMultiTexCoord4svARB(GLenum target, const GLshort *v)
GLAPI void GLAPIENTRY glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
#define GL_TEXTURE_RED_SIZE
Definition: gl.h:661
void install_gl_compat_wrapper(struct wined3d_gl_info *gl_info, enum wined3d_gl_extension ext)
Definition: gl_compat.c:423
#define GL_MAX_3D_TEXTURE_SIZE_EXT
Definition: glext.h:2475
#define GL_MAP_READ_BIT
Definition: glext.h:1793
#define GL_MAX_UNIFORM_BUFFER_BINDINGS
Definition: glext.h:1854
GLenum GLuint texture
Definition: glext.h:6295
#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB
Definition: glext.h:1410
#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS
Definition: glext.h:2117
#define GL_PROGRAM_ERROR_POSITION_ARB
Definition: glext.h:1400
#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS
Definition: glext.h:2314
GLenum src
Definition: glext.h:6340
#define GL_MIRRORED_REPEAT_ARB
Definition: glext.h:1359
#define GL_PROGRAM_FORMAT_ASCII_ARB
Definition: glext.h:1405
GLuint buffer
Definition: glext.h:5915
#define GL_PROGRAM_ERROR_STRING_ARB
Definition: glext.h:1404
#define GL_FRAGMENT_PROGRAM_ARB
Definition: glext.h:1466
GLsizeiptr size
Definition: glext.h:5919
#define GL_MAX_FRAGMENT_INPUT_COMPONENTS
Definition: glext.h:830
GLuint color
Definition: glext.h:6243
#define GL_CONTEXT_PROFILE_MASK
Definition: glext.h:831
#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB
Definition: glext.h:1414
#define GL_MAX_CLIP_DISTANCES
Definition: glext.h:514
#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS
Definition: glext.h:817
const GLubyte * c
Definition: glext.h:8905
#define GL_CLAMP_TO_BORDER_ARB
Definition: glext.h:1257
#define GL_MAX_SHININESS_NV
Definition: glext.h:3387
#define GL_COLOR_ATTACHMENT0
Definition: glext.h:1714
GLuint sampler
Definition: glext.h:7283
#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB
Definition: glext.h:1428
#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS
Definition: glext.h:2111
#define GL_MAX_VERTEX_UNIFORM_BLOCKS
Definition: glext.h:1850
#define GL_TIMESTAMP
Definition: glext.h:2037
#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
Definition: glext.h:1427
GLubyte * pattern
Definition: glext.h:7787
GLfloat f
Definition: glext.h:7540
#define GL_COLOR_ATTACHMENT1
Definition: glext.h:1715
#define GL_MAX_GENERAL_COMBINERS_NV
Definition: glext.h:3440
#define GL_MAX_VERTEX_ATTRIBS_ARB
Definition: glext.h:1402
#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS
Definition: glext.h:2313
#define GL_PRIMITIVES_GENERATED
Definition: glext.h:550
#define GL_FRAMEBUFFER_COMPLETE
Definition: glext.h:1707
#define GL_DRAW_FRAMEBUFFER
Definition: glext.h:1699
#define GL_MAX_SAMPLES
Definition: glext.h:1748
#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB
Definition: glext.h:1564
GLenum GLenum dst
Definition: glext.h:6340
#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS
Definition: glext.h:2112
GLboolean GLenum GLenum GLvoid * values
Definition: glext.h:5666
#define GL_MAX_TEXTURE_COORDS_ARB
Definition: glext.h:1479
GLbitfield flags
Definition: glext.h:7161
GLenum const GLvoid * addr
Definition: glext.h:9621
#define GL_MAP_WRITE_BIT
Definition: glext.h:1794
GLsizei levels
Definition: glext.h:7884
#define GL_FRAMEBUFFER
Definition: glext.h:1732
#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS
Definition: glext.h:1851
#define GL_MAX_TEXTURE_IMAGE_UNITS
Definition: glext.h:418
ptrdiff_t GLsizeiptr
Definition: glext.h:5499
#define GL_VIEWPORT_SUBPIXEL_BITS
Definition: glext.h:2211
#define GL_STREAM_DRAW
Definition: glext.h:347
#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB
Definition: glext.h:1574
#define GL_SAMPLES_PASSED
Definition: glext.h:356
#define GL_STATIC_DRAW
Definition: glext.h:350
#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN
Definition: glext.h:551
#define GL_SHADING_LANGUAGE_VERSION_ARB
Definition: glext.h:1579
#define GL_MAX_COMBINED_UNIFORM_BLOCKS
Definition: glext.h:1853
GLfloat param
Definition: glext.h:5796
#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS
Definition: glext.h:2322
#define GL_CONTEXT_CORE_PROFILE_BIT
Definition: glext.h:810
GLenum GLsizei len
Definition: glext.h:6722
#define GL_MIN_MAP_BUFFER_ALIGNMENT
Definition: glext.h:2293
#define GL_MAX_VARYING_FLOATS_ARB
Definition: glext.h:1565
#define GL_MAX_VERTEX_STREAMS
Definition: glext.h:2146
#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB
Definition: glext.h:1567
#define GL_VERTEX_PROGRAM_ARB
Definition: glext.h:1385
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB
Definition: glext.h:1418
#define GL_MAX_DRAW_BUFFERS_ARB
Definition: glext.h:1594
#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS
Definition: glext.h:2118
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
GLdouble GLdouble z
Definition: glext.h:5874
#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS
Definition: glext.h:1852
const GLint * attribs
Definition: glext.h:10538
#define GL_NUM_EXTENSIONS
Definition: glext.h:517
#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB
Definition: glext.h:1566
#define GL_PIXEL_UNPACK_BUFFER
Definition: glext.h:477
#define GL_QUERY_COUNTER_BITS
Definition: glext.h:332
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
const struct wined3d_shader_backend_ops glsl_shader_backend
const struct wined3d_fragment_pipe_ops glsl_fragment_pipe
const struct wined3d_vertex_pipe_ops glsl_vertex_pipe
unsigned int UINT
Definition: sysinfo.c:13
#define InterlockedCompareExchange
Definition: interlocked.h:119
#define FAILED(hr)
Definition: intsafe.h:51
char * prog
Definition: isohybrid.c:47
#define c
Definition: ke_i.h:80
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_a
Definition: kernel32.h:31
if(dx< 0)
Definition: linetemp.h:194
#define ZeroMemory
Definition: minwinbase.h:31
#define error(str)
Definition: mkdosfs.c:1605
char string[160]
Definition: util.h:11
static PVOID ptr
Definition: dispmode.c:27
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:88
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
static RPC_BINDING_HANDLE binding
Definition: server.c:166
static UINT format_id
Definition: clipboard.c:1455
#define min(a, b)
Definition: monoChain.cc:55
#define BOOL
Definition: nt_native.h:43
static HGLRC(WINAPI *pwglCreateContextAttribsARB)(HDC hDC
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
long LONG
Definition: pedump.c:60
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define MB_TOPMOST
Definition: winuser.h:836
#define MB_SETFOREGROUND
Definition: winuser.h:825
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4469
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
HDC WINAPI GetDC(_In_opt_ HWND)
#define MB_OK
Definition: winuser.h:801
#define MB_ICONWARNING
Definition: winuser.h:797
BOOL WINAPI DestroyWindow(_In_ HWND)
#define err(...)
#define calloc
Definition: rosglue.h:14
#define test
Definition: rosglue.h:37
const WCHAR * str
void wined3d_sampler_gl_init(struct wined3d_sampler_gl *sampler_gl, struct wined3d_device *device, const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: sampler.c:130
#define ERR_(ch,...)
Definition: debug.h:156
#define WARN_(ch,...)
Definition: debug.h:157
#define memset(x, y, z)
Definition: compat.h:39
LOCAL int table_size
Definition: write.c:65
#define minor(rdev)
Definition: propsheet.cpp:929
#define major(rdev)
Definition: propsheet.cpp:928
#define TRACE(s)
Definition: solgame.cpp:4
static PIXELFORMATDESCRIPTOR pfd
Definition: ssstars.c:67
Definition: http.c:7252
Definition: devices.h:37
unsigned int max_textures
unsigned int TextureOpCaps
const char * description
Definition: adapter_gl.c:1862
const struct wined3d_renderer_table * cards
Definition: adapter_gl.c:1863
enum wined3d_gl_vendor gl_vendor
Definition: adapter_gl.c:1861
Definition: match.c:28
size_t size
Definition: utils.c:170
unsigned int vs_version
unsigned int varying_count
unsigned int cs_version
unsigned int ps_uniform_count
unsigned int hs_version
unsigned int gs_version
unsigned int vs_uniform_count
unsigned int ps_version
unsigned int ds_version
Definition: ps.c:97
struct wined3d_pixel_format * pixel_formats
Definition: wined3d_gl.h:802
unsigned int pixel_format_count
Definition: wined3d_gl.h:803
struct wined3d_adapter a
Definition: wined3d_gl.h:798
struct wined3d_gl_info gl_info
Definition: wined3d_gl.h:800
unsigned int ordinal
struct wined3d_allocator_block * memory
Definition: wined3d_gl.h:419
struct wined3d_bo b
Definition: wined3d_gl.h:415
struct wined3d_buffer b
Definition: wined3d_gl.h:1046
const struct wined3d_gpu_description * gpu_description
Definition: wined3d_gl.h:789
const struct wined3d_gl_info * gl_info
Definition: wined3d_gl.h:785
DWORD MaxVertexShader30InstructionSlots
Definition: wined3d.h:1996
struct wined3d_vertex_shader_caps VS20Caps
Definition: wined3d.h:1991
DWORD VolumeTextureAddressCaps
Definition: wined3d.h:1940
DWORD PrimitiveMiscCaps
Definition: wined3d.h:1928
DWORD TextureAddressCaps
Definition: wined3d.h:1939
DWORD TextureCaps
Definition: wined3d.h:1935
DWORD MaxAnisotropy
Definition: wined3d.h:1948
DWORD MaxPixelShader30InstructionSlots
Definition: wined3d.h:1997
DWORD MaxVolumeExtent
Definition: wined3d.h:1945
DWORD VolumeTextureFilterCaps
Definition: wined3d.h:1938
DWORD DestBlendCaps
Definition: wined3d.h:1932
DWORD RasterCaps
Definition: wined3d.h:1929
struct wined3d_pixel_shader_caps PS20Caps
Definition: wined3d.h:1992
DWORD Caps2
Definition: wined3d.h:1923
DWORD VertexShaderVersion
Definition: wined3d.h:1977
DWORD PixelShaderVersion
Definition: wined3d.h:1980
DWORD CubeTextureFilterCaps
Definition: wined3d.h:1937
DWORD StencilCaps
Definition: wined3d.h:1957
DWORD SrcBlendCaps
Definition: wined3d.h:1931
DWORD DeclTypes
Definition: wined3d.h:1988
DWORD TextureFilterCaps
Definition: wined3d.h:1936
struct wined3d_ddraw_caps ddraw_caps
Definition: wined3d.h:1999
const struct wined3d_gl_info * gl_info
Definition: wined3d_gl.h:603
unsigned int sub_resource_idx
uint32_t subpixel_viewport
struct fragment_caps ffp_fragment_caps
uint32_t viewport_array_index_any_shader
uint32_t full_ffp_varyings
uint32_t srgb_read_control
enum wined3d_feature_level feature_level
uint32_t texture_swizzle
struct wined3d_d3d_limits limits
uint32_t shader_double_precision
uint32_t wined3d_creation_flags
uint32_t emulated_flatshading
uint32_t draw_base_vertex_offset
uint32_t shader_output_interpolation
float filling_convention_offset
DWORD multisample_draw_location
uint32_t srgb_write_control
uint32_t unconditional_npot
struct wined3d_device d
Definition: wined3d_gl.h:847
CRITICAL_SECTION allocator_cs
Definition: wined3d_gl.h:852
struct wined3d_device_gl::wined3d_retired_block_gl * retired_blocks
uint64_t current_fence_id
Definition: wined3d_gl.h:855
unsigned int version_high
unsigned int version_low
const char * extension_string
Definition: adapter_gl.c:44
enum wined3d_gl_extension extension
Definition: adapter_gl.c:45
wined3d_generic_attrib_func generic[WINED3D_FFP_EMIT_COUNT]
Definition: wined3d_gl.h:337
uint32_t quirks
Definition: wined3d_gl.h:346
unsigned int reserved_arb_constants
Definition: wined3d_gl.h:345
BOOL supported[WINED3D_GL_EXT_COUNT]
Definition: wined3d_gl.h:347
struct opengl_funcs gl_ops
Definition: wined3d_gl.h:353
struct wined3d_ffp_attrib_ops ffp_attrib_ops
Definition: wined3d_gl.h:352
struct wined3d_gl_limits limits
Definition: wined3d_gl.h:344
struct wined3d_fbo_ops fbo_ops
Definition: wined3d_gl.h:354
unsigned int glsl_version
Definition: wined3d_gl.h:343
GLint wrap_lookup[WINED3D_TADDRESS_MIRROR_ONCE - WINED3D_TADDRESS_WRAP+1]
Definition: wined3d_gl.h:348
float filling_convention_offset
Definition: wined3d_gl.h:349
unsigned int reserved_glsl_constants
Definition: wined3d_gl.h:345
const char * renderer
Definition: adapter_gl.c:1308
enum wined3d_pci_device id
Definition: adapter_gl.c:1309
struct wined3d_rendertarget_view v
Definition: wined3d_gl.h:1065
struct wined3d_gl_view gl_view
Definition: wined3d_gl.h:1066
const struct wined3d_parent_ops * parent_ops
struct wined3d_sampler s
Definition: wined3d_gl.h:1029
unsigned int max_gl_version
unsigned int multisample_textures
struct wined3d_bo_user bo_user
Definition: wined3d_gl.h:1082
struct wined3d_shader_resource_view v
Definition: wined3d_gl.h:1081
struct wined3d_gl_view gl_view
Definition: wined3d_gl.h:1083
struct wined3d_swapchain s
Definition: wined3d_gl.h:1126
struct wined3d_texture t
Definition: wined3d_gl.h:941
struct wined3d_bo_gl counter_bo
Definition: wined3d_gl.h:1107
struct wined3d_unordered_access_view v
Definition: wined3d_gl.h:1104
struct wined3d_bo_user bo_user
Definition: wined3d_gl.h:1105
struct wined3d_gl_view gl_view
Definition: wined3d_gl.h:1106
struct wined3d_bo_user * bo_user
Definition: adapter_gl.c:4600
const struct wined3d_gl_view * gl_view
Definition: adapter_gl.c:4599
struct wined3d_bo_gl * counter_bo
Definition: adapter_gl.c:4601
struct wined3d_view_gl_destroy_ctx * free
Definition: adapter_gl.c:4603
struct wined3d_device * device
Definition: adapter_gl.c:4598
#define max(a, b)
Definition: svc.c:63
Definition: pdh_main.c:64
BOOL WINAPI wglDeleteContext(HGLRC hglrc)
Definition: wgl.c:516
HDC WINAPI wglGetCurrentDC(void)
Definition: wgl.c:581
PROC WINAPI wglGetProcAddress(LPCSTR name)
Definition: wgl.c:631
HGLRC WINAPI wglGetCurrentContext(void)
Definition: wgl.c:576
HGLRC WINAPI wglCreateContext(HDC hdc)
Definition: wgl.c:383
BOOL WINAPI wglMakeCurrent(HDC hdc, HGLRC hglrc)
Definition: wgl.c:652
#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT
Definition: wgl.h:4324
#define WGL_STENCIL_BITS_ARB
Definition: wgl.h:5196
#define GL_MAX_COMPUTE_UNIFORM_BLOCKS
Definition: wgl.h:2266
#define GL_DRIVER_UUID_EXT
Definition: wgl.h:1154
#define GL_MAX_FRAMEBUFFER_WIDTH
Definition: wgl.h:2329
#define WGL_BLUE_BITS_ARB
Definition: wgl.h:5129
#define WGL_SWAP_METHOD_ARB
Definition: wgl.h:5203
#define GL_MAX_TEXTURE_MAX_ANISOTROPY
Definition: wgl.h:2514
#define WGL_RENDERER_VENDOR_ID_WINE
Definition: wgl.h:5188
#define WGL_GREEN_BITS_ARB
Definition: wgl.h:5158
#define GL_DEVICE_UUID_EXT
Definition: wgl.h:1025
#define WGL_ALPHA_BITS_ARB
Definition: wgl.h:5104
#define WGL_RENDERER_DEVICE_ID_WINE
Definition: wgl.h:5180
#define GL_NUM_DEVICE_UUIDS_EXT
Definition: wgl.h:2760
#define WGL_PIXEL_TYPE_ARB
Definition: wgl.h:5176
#define WGL_DEPTH_BITS_ARB
Definition: wgl.h:5144
#define GL_CLIENT_STORAGE_BIT
Definition: wgl.h:399
#define WGL_DOUBLE_BUFFER_ARB
Definition: wgl.h:5147
#define WGL_TYPE_COLORINDEX_ARB
Definition: wgl.h:5230
#define WGL_SAMPLES_ARB
Definition: wgl.h:5191
#define WGL_DRAW_TO_WINDOW_ARB
Definition: wgl.h:5150
#define WGL_TYPE_RGBA_ARB
Definition: wgl.h:5231
#define WGL_NUMBER_PIXEL_FORMATS_ARB
Definition: wgl.h:5170
#define WGL_SAMPLE_BUFFERS_ARB
Definition: wgl.h:5192
#define WGL_RED_BITS_ARB
Definition: wgl.h:5177
#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS
Definition: wgl.h:2265
#define WGL_RENDERER_VIDEO_MEMORY_WINE
Definition: wgl.h:5190
#define WGL_SWAP_UNDEFINED_ARB
Definition: wgl.h:5204
#define WGL_AUX_BUFFERS_ARB
Definition: wgl.h:5116
#define GL_MIRROR_CLAMP_TO_EDGE
Definition: wgl.h:2620
#define GL_MAX_FRAMEBUFFER_HEIGHT
Definition: wgl.h:2326
#define WGL_COLOR_BITS_ARB
Definition: wgl.h:5131
#define ALL_WGL_FUNCS
Definition: wgl_driver.h:3100
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
void WINAPI DebugBreak(void)
_In_ LONG iPixelFormat
Definition: winddi.h:3488
_In_opt_ SURFOBJ _In_opt_ SURFOBJ _In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ RECTL _In_opt_ POINTL _In_opt_ POINTL _In_opt_ BRUSHOBJ * pbo
Definition: winddi.h:3440
#define WINAPI
Definition: msvc.h:6
const struct wined3d_gpu_description * wined3d_get_gpu_description(enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
Definition: directx.c:688
void wined3d_adapter_cleanup(struct wined3d_adapter *adapter)
Definition: directx.c:176
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal, const LUID *luid, const struct wined3d_adapter_ops *adapter_ops)
Definition: directx.c:3383
bool wined3d_driver_info_init(struct wined3d_driver_info *driver_info, const struct wined3d_gpu_description *gpu_desc, enum wined3d_feature_level feature_level, UINT64 vram_bytes, UINT64 sysmem_bytes)
Definition: directx.c:740
const struct wined3d_gpu_description * wined3d_get_user_override_gpu_description(enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
Definition: directx.c:702
enum wined3d_pci_device wined3d_gpu_from_feature_level(enum wined3d_pci_vendor *vendor, enum wined3d_feature_level feature_level)
Definition: directx.c:930
void wined3d_swapchain_gl_cleanup(struct wined3d_swapchain_gl *swapchain_gl)
Definition: swapchain.c:91
HRESULT wined3d_swapchain_gl_init(struct wined3d_swapchain_gl *swapchain_gl, struct wined3d_device *device, const struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: swapchain.c:1696
#define WINED3DPTEXTURECAPS_MIPCUBEMAP
Definition: wined3d.h:1262
#define WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT
Definition: wined3d.h:1120
#define WINED3DPRASTERCAPS_ANISOTROPY
Definition: wined3d.h:1214
#define WINED3DPTADDRESSCAPS_WRAP
Definition: wined3d.h:1137
#define WINEDDSCAPS_NONLOCALVIDMEM
Definition: wined3d.h:1447
#define WINEDDSCAPS_OWNDC
Definition: wined3d.h:1438
#define WINED3DSTENCILCAPS_DECR
Definition: wined3d.h:1151
#define WINED3D_OK
Definition: wined3d.h:33
#define WINED3DPTFILTERCAPS_LINEARMIPNEAREST
Definition: wined3d.h:1271
#define WINEDDSCAPS_VIDEOMEMORY
Definition: wined3d.h:1434
#define WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS
Definition: wined3d.h:1113
#define WINED3DPTFILTERCAPS_MAGFLINEAR
Definition: wined3d.h:1279
#define WINED3DPTEXTURECAPS_CUBEMAP_POW2
Definition: wined3d.h:1263
#define WINED3DPTADDRESSCAPS_INDEPENDENTUV
Definition: wined3d.h:1141
#define WINED3DPTFILTERCAPS_MIPNEAREST
Definition: wined3d.h:1269
#define WINED3DPTEXTURECAPS_MIPVOLUMEMAP
Definition: wined3d.h:1261
#define WINED3DPTADDRESSCAPS_CLAMP
Definition: wined3d.h:1139
@ WINED3D_RTYPE_BUFFER
Definition: wined3d.h:718
#define WINED3DPBLENDCAPS_SRCALPHASAT
Definition: wined3d.h:1088
#define WINED3DCAPS2_CANGENMIPMAP
Definition: wined3d.h:1197
#define WINED3DPRASTERCAPS_MIPMAPLODBIAS
Definition: wined3d.h:1211
#define WINED3D_MAX_RENDER_TARGETS
Definition: wined3d.h:1606
#define WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS
Definition: wined3d.h:1117
#define WINED3DPTFILTERCAPS_MINFANISOTROPIC
Definition: wined3d.h:1275
#define WINED3DPTEXTURECAPS_VOLUMEMAP
Definition: wined3d.h:1259
#define WINED3DPTFILTERCAPS_MIPFLINEAR
Definition: wined3d.h:1277
#define WINED3DPMISCCAPS_SEPARATEALPHABLEND
Definition: wined3d.h:1116
#define WINEDDCAPS_3D
Definition: wined3d.h:1500
wined3d_query_type
Definition: wined3d.h:725
#define WINEDDSCAPS_LOCALVIDMEM
Definition: wined3d.h:1446
#define WINED3DDTCAPS_FLOAT16_2
Definition: wined3d.h:1061
#define WINED3DPTADDRESSCAPS_MIRRORONCE
Definition: wined3d.h:1142
@ WINED3D_TADDRESS_BORDER
Definition: wined3d.h:661
@ WINED3D_TADDRESS_MIRROR_ONCE
Definition: wined3d.h:662
@ WINED3D_TADDRESS_WRAP
Definition: wined3d.h:658
@ WINED3D_TADDRESS_MIRROR
Definition: wined3d.h:659
@ WINED3D_TADDRESS_CLAMP
Definition: wined3d.h:660
#define WINED3DPTFILTERCAPS_LINEARMIPLINEAR
Definition: wined3d.h:1272
#define WINED3DPTADDRESSCAPS_BORDER
Definition: wined3d.h:1140
#define WINED3DDTCAPS_FLOAT16_4
Definition: wined3d.h:1062
#define WINED3DPTADDRESSCAPS_MIRROR
Definition: wined3d.h:1138
#define WINED3DPTFILTERCAPS_NEAREST
Definition: wined3d.h:1267
#define WINED3DPTFILTERCAPS_MAGFPOINT
Definition: wined3d.h:1278
#define WINED3D_MAP_DISCARD
Definition: wined3d.h:953
#define WINED3D_MAP_WRITE
Definition: wined3d.h:956
#define WINED3DPTFILTERCAPS_LINEAR
Definition: wined3d.h:1268
#define WINED3DPTFILTERCAPS_MAGFANISOTROPIC
Definition: wined3d.h:1280
#define WINEDDSCAPS_FRONTBUFFER
Definition: wined3d.h:1425
#define WINEDDSCAPS_COMPLEX
Definition: wined3d.h:1423
wined3d_feature_level
Definition: wined3d.h:98
@ WINED3D_FEATURE_LEVEL_10_1
Definition: wined3d.h:108
@ WINED3D_FEATURE_LEVEL_8
Definition: wined3d.h:103
@ WINED3D_FEATURE_LEVEL_7
Definition: wined3d.h:102
@ WINED3D_FEATURE_LEVEL_6
Definition: wined3d.h:101
@ WINED3D_FEATURE_LEVEL_9_3
Definition: wined3d.h:106
@ WINED3D_FEATURE_LEVEL_10
Definition: wined3d.h:107
@ WINED3D_FEATURE_LEVEL_11_1
Definition: wined3d.h:110
@ WINED3D_FEATURE_LEVEL_5
Definition: wined3d.h:100
@ WINED3D_FEATURE_LEVEL_9_1
Definition: wined3d.h:104
@ WINED3D_FEATURE_LEVEL_9_2
Definition: wined3d.h:105
#define WINED3D_MAX_CLIP_DISTANCES
Definition: wined3d.h:1601
@ WINED3D_SHADER_TYPE_HULL
Definition: wined3d.h:844
@ WINED3D_SHADER_TYPE_PIXEL
Definition: wined3d.h:841
@ WINED3D_SHADER_TYPE_GEOMETRY
Definition: wined3d.h:843
@ WINED3D_SHADER_TYPE_GRAPHICS_COUNT
Definition: wined3d.h:846
@ WINED3D_SHADER_TYPE_DOMAIN
Definition: wined3d.h:845
@ WINED3D_SHADER_TYPE_COMPUTE
Definition: wined3d.h:848
@ WINED3D_SHADER_TYPE_VERTEX
Definition: wined3d.h:842
@ WINED3D_SHADER_TYPE_COUNT
Definition: wined3d.h:849
#define WINED3DPMISCCAPS_BLENDOP
Definition: wined3d.h:1111
#define WINED3DPTFILTERCAPS_MIPLINEAR
Definition: wined3d.h:1270
#define WINED3DPTFILTERCAPS_MINFPOINT
Definition: wined3d.h:1273
#define WINED3DPTEXTURECAPS_VOLUMEMAP_POW2
Definition: wined3d.h:1264
#define WINED3DPBLENDCAPS_BLENDFACTOR
Definition: wined3d.h:1091
#define WINED3DSTENCILCAPS_INCR
Definition: wined3d.h:1150
#define WINED3DUSAGE_DYNAMIC
Definition: wined3d.h:924
#define WINED3DPTEXTURECAPS_CUBEMAP
Definition: wined3d.h:1257
#define WINED3D_MAX_FFP_TEXTURES
Definition: wined3d.h:1597
#define WINED3DPTFILTERCAPS_MIPFPOINT
Definition: wined3d.h:1276
wined3d_device_type
Definition: wined3d.h:90
#define WINED3DTEXOPCAPS_DOTPRODUCT3
Definition: wined3d.h:1177
#define WINED3DPTFILTERCAPS_MINFLINEAR
Definition: wined3d.h:1274
#define WINEDDSCAPS_3DDEVICE
Definition: wined3d.h:1433
#define WINEDDSCAPS_BACKBUFFER
Definition: wined3d.h:1422
#define WINED3DSTENCILCAPS_TWOSIDED
Definition: wined3d.h:1152
#define WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS
Definition: wined3d_gl.h:331
#define WINE_GLAPI
Definition: wined3d_gl.h:27
wined3d_gl_extension
Definition: wined3d_gl.h:42
@ EXT_STENCIL_TWO_SIDE
Definition: wined3d_gl.h:188
@ ARB_GPU_SHADER5
Definition: wined3d_gl.h:87
@ EXT_BLEND_EQUATION_SEPARATE
Definition: wined3d_gl.h:168
@ NV_VERTEX_PROGRAM3
Definition: wined3d_gl.h:223
@ ARB_FRAGMENT_PROGRAM_SHADOW
Definition: wined3d_gl.h:81
@ ARB_EXPLICIT_ATTRIB_LOCATION
Definition: wined3d_gl.h:77
@ ARB_SHADING_LANGUAGE_PACKING
Definition: wined3d_gl.h:119
@ ARB_DEBUG_OUTPUT
Definition: wined3d_gl.h:65
@ NV_FRAGMENT_PROGRAM2
Definition: wined3d_gl.h:208
@ ARB_TEXTURE_QUERY_LEVELS
Definition: wined3d_gl.h:141
@ ARB_TEXTURE_FILTER_ANISOTROPIC
Definition: wined3d_gl.h:134
@ NV_HALF_FLOAT
Definition: wined3d_gl.h:210
@ NV_POINT_SPRITE
Definition: wined3d_gl.h:212
@ ARB_TEXTURE_BUFFER_OBJECT
Definition: wined3d_gl.h:125
@ NV_TEXTURE_SHADER2
Definition: wined3d_gl.h:218
@ ARB_TEXTURE_CUBE_MAP
Definition: wined3d_gl.h:130
@ ATI_FRAGMENT_SHADER
Definition: wined3d_gl.h:161
@ ARB_INTERNALFORMAT_QUERY
Definition: wined3d_gl.h:91
@ EXT_SECONDARY_COLOR
Definition: wined3d_gl.h:186
@ ATI_SEPARATE_STENCIL
Definition: wined3d_gl.h:162
@ ARB_CULL_DISTANCE
Definition: wined3d_gl.h:64
@ ARB_DERIVATIVE_CONTROL
Definition: wined3d_gl.h:69
@ ARB_SEAMLESS_CUBE_MAP
Definition: wined3d_gl.h:107
@ ARB_PIPELINE_STATISTICS_QUERY
Definition: wined3d_gl.h:98
@ EXT_BLEND_MINMAX
Definition: wined3d_gl.h:170
@ ARB_SHADER_BIT_ENCODING
Definition: wined3d_gl.h:110
@ WINED3D_GL_EXT_NONE
Definition: wined3d_gl.h:43
@ ARB_POINT_PARAMETERS
Definition: wined3d_gl.h:100
@ ARB_CLEAR_TEXTURE
Definition: wined3d_gl.h:57
@ ARB_FRAGMENT_PROGRAM
Definition: wined3d_gl.h:80
@ ARB_SHADER_IMAGE_SIZE
Definition: wined3d_gl.h:112
@ ARB_DEPTH_TEXTURE
Definition: wined3d_gl.h:68
@ EXT_TEXTURE_SHARED_EXPONENT
Definition: wined3d_gl.h:200
@ WGL_EXT_SWAP_CONTROL
Definition: wined3d_gl.h:227
@ ARB_DRAW_ELEMENTS_BASE_VERTEX
Definition: wined3d_gl.h:72
@ ARB_TEXTURE_BARRIER
Definition: wined3d_gl.h:159
@ ARB_COMPUTE_SHADER
Definition: wined3d_gl.h:60
@ ARB_PROVOKING_VERTEX
Definition: wined3d_gl.h:103
@ WINED3D_GL_PRIMITIVE_QUERY
Definition: wined3d_gl.h:234
@ NV_TEXGEN_REFLECTION
Definition: wined3d_gl.h:215
@ ARB_FRAGMENT_LAYER_VIEWPORT
Definition: wined3d_gl.h:79
@ EXT_FOG_COORD
Definition: wined3d_gl.h:174
@ WINED3D_GL_BLEND_EQUATION
Definition: wined3d_gl.h:231
@ APPLE_FENCE
Definition: wined3d_gl.h:46
@ EXT_MEMORY_OBJECT
Definition: wined3d_gl.h:181
@ WGL_WINE_QUERY_RENDERER
Definition: wined3d_gl.h:229
@ ARB_TEXTURE_VIEW
Definition: wined3d_gl.h:147
@ APPLE_FLUSH_BUFFER_RANGE
Definition: wined3d_gl.h:48
@ ARB_CONSERVATIVE_DEPTH
Definition: wined3d_gl.h:61
@ ARB_SHADER_STORAGE_BUFFER_OBJECT
Definition: wined3d_gl.h:114
@ ARB_TEXTURE_ENV_COMBINE
Definition: wined3d_gl.h:132
@ EXT_STENCIL_WRAP
Definition: wined3d_gl.h:189
@ WGL_WINE_PIXEL_FORMAT_PASSTHROUGH
Definition: wined3d_gl.h:228
@ ATI_TEXTURE_COMPRESSION_3DC
Definition: wined3d_gl.h:163
@ ARB_VERTEX_PROGRAM
Definition: wined3d_gl.h:154
@ EXT_FRAMEBUFFER_MULTISAMPLE_BLIT_SCALED
Definition: wined3d_gl.h:177
@ ARB_TEXTURE_COMPRESSION_RGTC
Definition: wined3d_gl.h:129
@ ARB_TEXTURE_MIRRORED_REPEAT
Definition: wined3d_gl.h:137
@ WGL_ARB_PIXEL_FORMAT
Definition: wined3d_gl.h:226
@ EXT_TEXTURE_SRGB_DECODE
Definition: wined3d_gl.h:203
@ ARB_SAMPLER_OBJECTS
Definition: wined3d_gl.h:106
@ ARB_VERTEX_BUFFER_OBJECT
Definition: wined3d_gl.h:153
@ EXT_TEXTURE_INTEGER
Definition: wined3d_gl.h:196
@ ARB_ES2_COMPATIBILITY
Definition: wined3d_gl.h:75
@ ARB_MULTISAMPLE
Definition: wined3d_gl.h:95
@ ARB_BUFFER_STORAGE
Definition: wined3d_gl.h:55
@ ARB_TEXTURE_FLOAT
Definition: wined3d_gl.h:135
@ ARB_FRAMEBUFFER_OBJECT
Definition: wined3d_gl.h:84
@ ARB_VERTEX_SHADER
Definition: wined3d_gl.h:155
@ ARB_POLYGON_OFFSET_CLAMP
Definition: wined3d_gl.h:102
@ EXT_TEXTURE3D
Definition: wined3d_gl.h:190
@ ARB_TEXTURE_BORDER_CLAMP
Definition: wined3d_gl.h:124
@ WINED3D_GL_VERSION_3_2
Definition: wined3d_gl.h:236
@ EXT_TEXTURE_LOD_BIAS
Definition: wined3d_gl.h:197
@ ARB_DRAW_INDIRECT
Definition: wined3d_gl.h:73
@ ARB_TEXTURE_RG
Definition: wined3d_gl.h:142
@ ARB_TEXTURE_MULTISAMPLE
Definition: wined3d_gl.h:139
@ ARB_TEXTURE_RGB10_A2UI
Definition: wined3d_gl.h:143
@ ARB_INTERNALFORMAT_QUERY2
Definition: wined3d_gl.h:92
@ EXT_GPU_SHADER4
Definition: wined3d_gl.h:180
@ ARB_BASE_INSTANCE
Definition: wined3d_gl.h:53
@ ARB_HALF_FLOAT_VERTEX
Definition: wined3d_gl.h:89
@ ARB_ES3_COMPATIBILITY
Definition: wined3d_gl.h:76
@ ARB_INSTANCED_ARRAYS
Definition: wined3d_gl.h:90
@ ARB_DEPTH_CLAMP
Definition: wined3d_gl.h:67
@ EXT_BLEND_FUNC_SEPARATE
Definition: wined3d_gl.h:169
@ NV_FRAGMENT_PROGRAM
Definition: wined3d_gl.h:207
@ EXT_PACKED_FLOAT
Definition: wined3d_gl.h:183
@ NV_REGISTER_COMBINERS2
Definition: wined3d_gl.h:214
@ NV_TEXTURE_ENV_COMBINE4
Definition: wined3d_gl.h:216
@ ARB_MAP_BUFFER_ALIGNMENT
Definition: wined3d_gl.h:93
@ ARB_FRAMEBUFFER_SRGB
Definition: wined3d_gl.h:85
@ ARB_SHADER_TEXTURE_IMAGE_SAMPLES
Definition: wined3d_gl.h:115
@ ARB_FRAGMENT_COORD_CONVENTIONS
Definition: wined3d_gl.h:78
@ ARB_UNIFORM_BUFFER_OBJECT
Definition: wined3d_gl.h:151
@ WINED3D_GL_NORMALIZED_TEXRECT
Definition: wined3d_gl.h:233
@ ARB_CLEAR_BUFFER_OBJECT
Definition: wined3d_gl.h:56
@ EXT_PACKED_DEPTH_STENCIL
Definition: wined3d_gl.h:182
@ ATI_TEXTURE_ENV_COMBINE3
Definition: wined3d_gl.h:164
@ ARB_SYNC
Definition: wined3d_gl.h:122
@ NV_FENCE
Definition: wined3d_gl.h:205
@ NV_VERTEX_PROGRAM
Definition: wined3d_gl.h:219
@ NV_FRAGMENT_PROGRAM_OPTION
Definition: wined3d_gl.h:209
@ NV_LIGHT_MAX_EXPONENT
Definition: wined3d_gl.h:211
@ EXT_TEXTURE_SRGB
Definition: wined3d_gl.h:202
@ ARB_FRAMEBUFFER_NO_ATTACHMENTS
Definition: wined3d_gl.h:83
@ EXT_TEXTURE_SHADOW_LOD
Definition: wined3d_gl.h:199
@ EXT_TEXTURE_ENV_DOT3
Definition: wined3d_gl.h:195
@ ARB_SHADOW
Definition: wined3d_gl.h:120
@ ARB_SHADING_LANGUAGE_100
Definition: wined3d_gl.h:117
@ APPLE_FLOAT_PIXELS
Definition: wined3d_gl.h:47
@ EXT_TEXTURE_COMPRESSION_RGTC
Definition: wined3d_gl.h:192
@ EXT_POINT_PARAMETERS
Definition: wined3d_gl.h:184
@ WINED3D_GLSL_130
Definition: wined3d_gl.h:237
@ EXT_TEXTURE_MIRROR_CLAMP
Definition: wined3d_gl.h:198
@ NV_VERTEX_PROGRAM1_1
Definition: wined3d_gl.h:220
@ ARB_SHADER_TEXTURE_LOD
Definition: wined3d_gl.h:116
@ EXT_BLEND_COLOR
Definition: wined3d_gl.h:167
@ ARB_FRAGMENT_SHADER
Definition: wined3d_gl.h:82
@ ARB_BLEND_FUNC_EXTENDED
Definition: wined3d_gl.h:54
@ ARB_TEXTURE_STORAGE
Definition: wined3d_gl.h:144
@ ARB_SHADER_ATOMIC_COUNTERS
Definition: wined3d_gl.h:108
@ EXT_FRAMEBUFFER_MULTISAMPLE
Definition: wined3d_gl.h:176
@ ARB_VERTEX_ARRAY_BGRA
Definition: wined3d_gl.h:152
@ NV_TEXTURE_BARRIER
Definition: wined3d_gl.h:224
@ ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE
Definition: wined3d_gl.h:138
@ ARB_SHADING_LANGUAGE_420PACK
Definition: wined3d_gl.h:118
@ ARB_TESSELLATION_SHADER
Definition: wined3d_gl.h:123
@ ARB_GEOMETRY_SHADER4
Definition: wined3d_gl.h:86
@ EXT_BLEND_SUBTRACT
Definition: wined3d_gl.h:171
@ ATI_TEXTURE_MIRROR_ONCE
Definition: wined3d_gl.h:165
@ EXT_SHADER_INTEGER_MIX
Definition: wined3d_gl.h:187
@ EXT_DEPTH_BOUNDS_TEST
Definition: wined3d_gl.h:172
@ ARB_VERTEX_TYPE_2_10_10_10_REV
Definition: wined3d_gl.h:157
@ ARB_DRAW_BUFFERS
Definition: wined3d_gl.h:70
@ ARB_HALF_FLOAT_PIXEL
Definition: wined3d_gl.h:88
@ ARB_COLOR_BUFFER_FLOAT
Definition: wined3d_gl.h:59
@ ARB_SAMPLE_SHADING
Definition: wined3d_gl.h:105
@ ARB_DRAW_INSTANCED
Definition: wined3d_gl.h:74
@ APPLE_YCBCR_422
Definition: wined3d_gl.h:51
@ ARB_TRANSFORM_FEEDBACK3
Definition: wined3d_gl.h:150
@ ARB_TEXTURE_GATHER
Definition: wined3d_gl.h:136
@ NV_TEXTURE_SHADER
Definition: wined3d_gl.h:217
@ ARB_VIEWPORT_ARRAY
Definition: wined3d_gl.h:158
@ ARB_TEXTURE_NON_POWER_OF_TWO
Definition: wined3d_gl.h:140
@ WINED3D_GL_LEGACY_CONTEXT
Definition: wined3d_gl.h:232
@ EXT_FRAMEBUFFER_OBJECT
Definition: wined3d_gl.h:178
@ NV_REGISTER_COMBINERS
Definition: wined3d_gl.h:213
@ WINED3D_GL_VERSION_2_0
Definition: wined3d_gl.h:235
@ ARB_MAP_BUFFER_RANGE
Definition: wined3d_gl.h:94
@ EXT_FRAMEBUFFER_BLIT
Definition: wined3d_gl.h:175
@ ARB_COPY_IMAGE
Definition: wined3d_gl.h:63
@ NV_VERTEX_PROGRAM2_OPTION
Definition: wined3d_gl.h:222
@ APPLE_RGB_422
Definition: wined3d_gl.h:50
@ ARB_SHADER_STENCIL_EXPORT
Definition: wined3d_gl.h:113
@ ARB_CLIP_CONTROL
Definition: wined3d_gl.h:58
@ ARB_TEXTURE_SWIZZLE
Definition: wined3d_gl.h:146
@ EXT_GPU_PROGRAM_PARAMETERS
Definition: wined3d_gl.h:179
@ ARB_SHADER_IMAGE_LOAD_STORE
Definition: wined3d_gl.h:111
@ ARB_TEXTURE_COMPRESSION_BPTC
Definition: wined3d_gl.h:128
@ ARB_OCCLUSION_QUERY
Definition: wined3d_gl.h:97
@ ARB_TEXTURE_COMPRESSION
Definition: wined3d_gl.h:127
@ ARB_TEXTURE_ENV_DOT3
Definition: wined3d_gl.h:133
@ ARB_POINT_SPRITE
Definition: wined3d_gl.h:101
@ ARB_SHADER_VIEWPORT_LAYER_ARRAY
Definition: wined3d_gl.h:109
@ ARB_STENCIL_TEXTURING
Definition: wined3d_gl.h:121
@ EXT_TEXTURE_ARRAY
Definition: wined3d_gl.h:191
@ NV_FOG_DISTANCE
Definition: wined3d_gl.h:206
@ EXT_TEXTURE_COMPRESSION_S3TC
Definition: wined3d_gl.h:193
@ ARB_TEXTURE_BUFFER_RANGE
Definition: wined3d_gl.h:126
@ ARB_MULTITEXTURE
Definition: wined3d_gl.h:96
@ EXT_TEXTURE_SNORM
Definition: wined3d_gl.h:201
@ ARB_PIXEL_BUFFER_OBJECT
Definition: wined3d_gl.h:99
@ ARB_QUERY_BUFFER_OBJECT
Definition: wined3d_gl.h:104
@ ARB_TRANSFORM_FEEDBACK2
Definition: wined3d_gl.h:149
@ ARB_VERTEX_TYPE_10F_11F_11F_REV
Definition: wined3d_gl.h:156
@ EXT_DRAW_BUFFERS2
Definition: wined3d_gl.h:173
@ APPLE_FLUSH_RENDER
Definition: wined3d_gl.h:49
@ ARB_DRAW_BUFFERS_BLEND
Definition: wined3d_gl.h:71
@ ARB_TIMER_QUERY
Definition: wined3d_gl.h:148
@ EXT_PROVOKING_VERTEX
Definition: wined3d_gl.h:185
@ ARB_TEXTURE_STORAGE_MULTISAMPLE
Definition: wined3d_gl.h:145
@ EXT_TEXTURE_ENV_COMBINE
Definition: wined3d_gl.h:194
@ ARB_TEXTURE_CUBE_MAP_ARRAY
Definition: wined3d_gl.h:131
@ ARB_DEPTH_BUFFER_FLOAT
Definition: wined3d_gl.h:66
@ ARB_COPY_BUFFER
Definition: wined3d_gl.h:62
@ NV_VERTEX_PROGRAM2
Definition: wined3d_gl.h:221
#define WINED3D_QUIRK_NV_CLIP_BROKEN
Definition: wined3d_gl.h:325
static void wined3d_allocator_chunk_gl_unlock(struct wined3d_allocator_chunk_gl *chunk_gl)
Definition: wined3d_gl.h:895
#define WINED3D_QUIRK_BROKEN_ARB_FOG
Definition: wined3d_gl.h:330
#define GL_EXTCALL(f)
Definition: wined3d_gl.h:360
#define MAX_GL_FRAGMENT_SAMPLERS
Definition: wined3d_gl.h:573
#define WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA
Definition: wined3d_gl.h:324
#define WINED3D_QUIRK_LIMITED_TEX_FILTERING
Definition: wined3d_gl.h:329
static bool wined3d_fence_supported(const struct wined3d_gl_info *gl_info)
Definition: wined3d_gl.h:394
#define WINED3D_QUIRK_INFO_LOG_SPAM
Definition: wined3d_gl.h:328
static void wined3d_allocator_chunk_gl_lock(struct wined3d_allocator_chunk_gl *chunk_gl)
Definition: wined3d_gl.h:890
#define WINED3D_QUIRK_BROKEN_RGBA16
Definition: wined3d_gl.h:327
#define WINED3D_QUIRK_FBO_TEX_UPDATE
Definition: wined3d_gl.h:326
#define WINED3D_QUIRK_GLSL_CLIP_VARYING
Definition: wined3d_gl.h:323
#define WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT
Definition: wined3d_gl.h:322
void(WINE_GLAPI * wined3d_generic_attrib_func)(GLuint idx, const void *data)
Definition: wined3d_gl.h:333
#define checkGLcall(A)
Definition: wined3d_gl.h:402
static const struct wined3d_adapter_gl * wined3d_adapter_gl_const(const struct wined3d_adapter *adapter)
Definition: wined3d_gl.h:811
#define D3DCOLOR_B_G(dw)
#define WINED3D_OPENGL_WINDOW_CLASS_NAME
#define WINED3D_MAX_CBS
static void * wined3d_texture_allocate_object_memory(SIZE_T s, SIZE_T level_count, SIZE_T layer_count)
#define PCI_VENDOR_NONE
@ WINED3D_FFP_EMIT_D3DCOLOR
@ WINED3D_FFP_EMIT_FLOAT16_2
@ WINED3D_FFP_EMIT_UBYTE4N
@ WINED3D_FFP_EMIT_COUNT
@ WINED3D_FFP_EMIT_FLOAT2
@ WINED3D_FFP_EMIT_SHORT4N
@ WINED3D_FFP_EMIT_USHORT2N
@ WINED3D_FFP_EMIT_SHORT2N
@ WINED3D_FFP_EMIT_UBYTE4
@ WINED3D_FFP_EMIT_FLOAT4
@ WINED3D_FFP_EMIT_FLOAT3
@ WINED3D_FFP_EMIT_FLOAT16_4
@ WINED3D_FFP_EMIT_USHORT4N
@ WINED3D_FFP_EMIT_SHORT2
@ WINED3D_FFP_EMIT_SHORT4
@ WINED3D_FFP_EMIT_FLOAT1
#define WINED3D_SHADER_CAP_DOUBLE_PRECISION
#define MAKEDWORD_VERSION(maj, min)
static void wined3d_cs_finish(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id)
wined3d_pci_vendor
@ HW_VENDOR_REDHAT
@ HW_VENDOR_SOFTWARE
static void wined3d_not_from_cs(const struct wined3d_cs *cs)
#define PCI_DEVICE_NONE
#define WINED3D_SHADER_CAP_OUTPUT_INTERPOLATION
#define MAX_UNORDERED_ACCESS_VIEWS
static void context_release(struct wined3d_context *context)
#define WINED3D_SHADER_CAP_FULL_FFP_VARYINGS
#define GL_EXT_EMUL_EXT_FOG_COORD
#define GL_EXT_EMUL_ARB_MULTITEXTURE
#define wined3d_lock_init(lock, name)
#define WINED3D_LOCATION_TEXTURE_RGB
#define D3DCOLOR_B_R(dw)
#define D3DCOLOR_B_A(dw)
#define D3DCOLOR_B_B(dw)
static void wined3d_lock_cleanup(CRITICAL_SECTION *lock)
#define WINED3D_LOCATION_RB_MULTISAMPLE
static struct wined3d_context * context_acquire(struct wined3d_device *device, struct wined3d_texture *texture, unsigned int sub_resource_idx)
@ WINED3D_CS_QUEUE_DEFAULT
wined3d_pci_device
@ CARD_NVIDIA_GEFORCE_GTX780
@ CARD_NVIDIA_GEFORCE_GTX950M
@ CARD_INTEL_946GZ
@ CARD_NVIDIA_GEFORCE_RTX4060
@ CARD_NVIDIA_GEFORCE_GTX1060_3GB
@ CARD_NVIDIA_GEFORCE_GT325M
@ CARD_NVIDIA_GEFORCE_GTXTITANZ
@ CARD_AMD_RADEON_HD4800
@ CARD_NVIDIA_GEFORCE_GTX570
@ CARD_NVIDIA_GEFORCE_GTXTITAN
@ CARD_NVIDIA_GEFORCE_RTX3080_10GB_LHR
@ CARD_NVIDIA_GEFORCE_GTX560TI
@ CARD_NVIDIA_GEFORCE_GTX1080TI
@ CARD_INTEL_855GM
@ CARD_NVIDIA_GEFORCE_GTS250
@ CARD_AMD_RADEON_HD6400
@ CARD_AMD_RADEON_HD4700
@ CARD_NVIDIA_GEFORCE_6800
@ CARD_AMD_RADEON_HD5700
@ CARD_NVIDIA_GEFORCE_GT610
@ CARD_NVIDIA_GEFORCE_GT420
@ CARD_NVIDIA_GEFORCEFX_5600
@ CARD_INTEL_945G
@ CARD_NVIDIA_GEFORCE_GTX1080
@ CARD_INTEL_945GME
@ CARD_AMD_RADEON_RX_460
@ CARD_NVIDIA_GEFORCE_9600GT
@ CARD_NVIDIA_GEFORCE_GT640M
@ CARD_AMD_RADEON_HD7800
@ CARD_NVIDIA_GEFORCE_GTX1650SUPER
@ CARD_NVIDIA_GEFORCE_GT1030
@ CARD_NVIDIA_GEFORCE_940M
@ CARD_INTEL_915G
@ CARD_NVIDIA_GEFORCE_320M
@ CARD_INTEL_G41
@ CARD_NVIDIA_GEFORCE_GT650M
@ CARD_NVIDIA_GEFORCE_GTX460
@ CARD_NVIDIA_GEFORCE_830M
@ CARD_AMD_RADEON_HD2900
@ CARD_NVIDIA_RIVA_128
@ CARD_NVIDIA_GEFORCE_7300
@ CARD_NVIDIA_GEFORCEFX_5200
@ CARD_NVIDIA_GEFORCE_GTX1650
@ CARD_NVIDIA_GEFORCE_GT330
@ CARD_NVIDIA_GEFORCE_7600
@ CARD_INTEL_IPP6300
@ CARD_NVIDIA_GEFORCE_GT320M
@ CARD_INTEL_PNVG
@ CARD_NVIDIA_GEFORCE_820M
@ CARD_NVIDIA_GEFORCE_GTX280
@ CARD_NVIDIA_GEFORCE_6600GT
@ CARD_NVIDIA_GEFORCE_GT425M
@ CARD_NVIDIA_GEFORCE_GTX275
@ CARD_AMD_RADEON_XPRESS_200M
@ CARD_NVIDIA_GEFORCE_GT440
@ CARD_NVIDIA_GEFORCE_7400
@ CARD_AMD_RADEON_HD5600
@ CARD_NVIDIA_GEFORCE_GTX560
@ CARD_INTEL_IVBD
@ CARD_NVIDIA_GEFORCE_GTX650TI
@ CARD_INTEL_SNBS
@ CARD_NVIDIA_GEFORCE_845M
@ CARD_AMD_RADEON_HD5400
@ CARD_NVIDIA_GEFORCE_RTX3080_10GB
@ CARD_NVIDIA_GEFORCE_840M
@ CARD_INTEL_915GM
@ CARD_AMD_RADEON_X1600
@ CARD_INTEL_945GM
@ CARD_NVIDIA_GEFORCE_8800GTX
@ CARD_NVIDIA_GEFORCE_9700MGT
@ CARD_INTEL_965Q
@ CARD_INTEL_965G
@ CARD_NVIDIA_GEFORCE_GT730
@ CARD_INTEL_PNVM
@ CARD_NVIDIA_GEFORCE_GTX580
@ CARD_NVIDIA_GEFORCE_GTX1060
@ CARD_INTEL_IVBM
@ CARD_NVIDIA_GEFORCE_GTX1070
@ CARD_NVIDIA_GEFORCE_GTX950
@ CARD_NVIDIA_GEFORCE_RTX3090
@ CARD_NVIDIA_GEFORCE_RTX3060TI_GA104_LHR
@ CARD_NVIDIA_GEFORCE_GTX690
@ CARD_NVIDIA_GEFORCE_GTX780TI
@ CARD_NVIDIA_GEFORCE_RTX3050
@ CARD_NVIDIA_GEFORCE_RTX3060TI_GA104
@ CARD_NVIDIA_GEFORCE_GTX770
@ CARD_NVIDIA_GEFORCE_RTX3090TI
@ CARD_NVIDIA_GEFORCE_GTX760
@ CARD_NVIDIA_GEFORCE_GTX880M
@ CARD_NVIDIA_GEFORCE4_TI4200
@ CARD_AMD_RADEON_HD4200M
@ CARD_NVIDIA_GEFORCE_GT430
@ CARD_NVIDIA_RIVA_TNT
@ CARD_NVIDIA_GEFORCE_GTX750TI
@ CARD_NVIDIA_GEFORCE_8300GS
@ CARD_NVIDIA_GEFORCE_RTX4090
@ CARD_NVIDIA_GEFORCE_GTX465
@ CARD_INTEL_E7221G
@ CARD_INTEL_965GME
@ CARD_AMD_RADEON_HD2600
@ CARD_INTEL_IP6200
@ CARD_NVIDIA_GEFORCE_RTX4070TI
@ CARD_NVIDIA_GEFORCE_GT240
@ CARD_NVIDIA_TITANX_PASCAL
@ CARD_AMD_RADEON_HD6550D
@ CARD_AMD_RADEON_HD4600
@ CARD_INTEL_HD520_1
@ CARD_NVIDIA_GEFORCE_GT520
@ CARD_INTEL_G33
@ CARD_NVIDIA_GEFORCE_RTX2080
@ CARD_NVIDIA_GEFORCE_GTX675MX_1
@ CARD_NVIDIA_GEFORCE_GT730M
@ CARD_AMD_RADEON_RX_NAVI_14
@ CARD_NVIDIA_GEFORCE_8800GTS
@ CARD_NVIDIA_GEFORCE_RTX4070TISUPER
@ CARD_AMD_RADEON_HD6800
@ CARD_AMD_RADEON_HD3200
@ CARD_NVIDIA_GEFORCE_8400GS
@ CARD_NVIDIA_GEFORCE_RTX3070TI
@ CARD_NVIDIA_GEFORCE_8200
@ CARD_VMWARE_SVGA3D
@ CARD_AMD_RADEON_HD6600M
@ CARD_AMD_RADEON_HD7900
@ CARD_INTEL_845G
@ CARD_NVIDIA_GEFORCE_RTX3080TI
@ CARD_NVIDIA_GEFORCE_GTX1660TI
@ CARD_NVIDIA_GEFORCE_RTX3070_MOBILE
@ CARD_AMD_RADEON_HD3850
@ CARD_AMD_RADEON_HD6600
@ CARD_INTEL_I5100_1
@ CARD_INTEL_ILKD
@ CARD_NVIDIA_GEFORCE_GTX480
@ CARD_NVIDIA_GEFORCE_RTX4070SUPER
@ CARD_NVIDIA_GEFORCE_GT720
@ CARD_NVIDIA_GEFORCE_GTX550
@ CARD_NVIDIA_GEFORCE_9400M
@ CARD_NVIDIA_GEFORCE_GTX960
@ CARD_REDHAT_VIRGL
@ CARD_AMD_RADEON_9500
@ CARD_NVIDIA_GEFORCE_GTX680
@ CARD_INTEL_Q45
@ CARD_AMD_RADEON_HD8670
@ CARD_NVIDIA_GEFORCE2
@ CARD_NVIDIA_GEFORCE_8600MGT
@ CARD_INTEL_Q33
@ CARD_NVIDIA_GEFORCE_GTX650
@ CARD_NVIDIA_GEFORCE_GT555M
@ CARD_NVIDIA_GEFORCE_GTS350M
@ CARD_NVIDIA_GEFORCE_RTX3080_12GB
@ CARD_AMD_RADEON_HD7660D
@ CARD_NVIDIA_GEFORCE_GTX870M
@ CARD_NVIDIA_GEFORCE_9400GT
@ CARD_NVIDIA_GEFORCE_GTX850M
@ CARD_NVIDIA_GEFORCE_RTX3060
@ CARD_NVIDIA_GEFORCE_7800GT
@ CARD_INTEL_Q35
@ CARD_NVIDIA_GEFORCE
@ CARD_NVIDIA_GEFORCE_RTX3060TI_GA103
@ CARD_NVIDIA_GEFORCE_GTX670
@ CARD_AMD_RADEON_R9_290
@ CARD_NVIDIA_GEFORCE_GTX765M
@ CARD_AMD_RADEON_HD5900
@ CARD_NVIDIA_TITANV
@ CARD_NVIDIA_GEFORCE_RTX4080SUPER
@ CARD_INTEL_G45
@ CARD_AMD_RADEON_R9_FURY
@ CARD_INTEL_IVBS
@ CARD_NVIDIA_GEFORCE_RTX4060TI16G
@ CARD_INTEL_865G
@ CARD_NVIDIA_GEFORCE_RTX4070
@ CARD_NVIDIA_GEFORCE_RTX3060_LHR
@ CARD_NVIDIA_GEFORCE_210
@ CARD_INTEL_IPP580_1
@ CARD_NVIDIA_GEFORCE_GTX660M
@ CARD_NVIDIA_GEFORCE_GTX460M
@ CARD_AMD_RADEON_HD6700
@ CARD_NVIDIA_GEFORCE_9800GT
@ CARD_INTEL_IGD
@ CARD_INTEL_965GM
@ CARD_AMD_RADEON_X700
@ CARD_AMD_RADEON_HD6900
@ CARD_INTEL_I6100
@ CARD_NVIDIA_GEFORCE_6200
@ CARD_INTEL_SNBD
@ CARD_AMD_RADEON_R7
@ CARD_AMD_RADEON_8500
@ CARD_INTEL_IP5200_1
@ CARD_NVIDIA_GEFORCE_9300
@ CARD_NVIDIA_GEFORCE_GT525M
@ CARD_NVIDIA_GEFORCE_GTX760TI
@ CARD_NVIDIA_AMPERE_A10
@ CARD_INTEL_GM45
@ CARD_NVIDIA_GEFORCE_GTX260
@ CARD_NVIDIA_GEFORCE_GTX980
@ CARD_NVIDIA_GEFORCE_8600GT
@ CARD_NVIDIA_GEFORCE_GTX970M
@ CARD_NVIDIA_GEFORCE_GTX560M
@ CARD_NVIDIA_GEFORCE_GTX1070M
@ CARD_NVIDIA_GEFORCE_315M
@ CARD_NVIDIA_GEFORCE_RTX2070
@ CARD_NVIDIA_GEFORCE_GT630
@ CARD_NVIDIA_GEFORCE_GT220
@ CARD_AMD_RADEON_HD7700
@ CARD_NVIDIA_GEFORCE_GTX750
@ CARD_NVIDIA_RIVA_TNT2
@ CARD_NVIDIA_GEFORCE_GTX770M
@ CARD_NVIDIA_GEFORCE_GTXTITANX
@ CARD_NVIDIA_GEFORCE_GTX1660SUPER
@ CARD_AMD_RADEON_RX_NAVI_10
@ CARD_AMD_RADEON_HD5800
@ CARD_NVIDIA_GEFORCEFX_5800
@ CARD_AMD_RADEON_HD2350
@ CARD_AMD_RADEON_R9_285
@ CARD_NVIDIA_GEFORCE_GTX1050
@ CARD_AMD_RADEON_HD8600M
@ CARD_NVIDIA_GEFORCE3
@ CARD_NVIDIA_GEFORCE_RTX4060TI8G
@ CARD_NVIDIA_GEFORCE_GTXTITANB
@ CARD_NVIDIA_GEFORCE4_MX
@ CARD_NVIDIA_TESLA_T4
@ CARD_NVIDIA_GEFORCE_GTX960M
@ CARD_AMD_RADEON_R3
@ CARD_NVIDIA_GEFORCE_GTX1050TI
@ CARD_NVIDIA_GEFORCE_GTX970
@ CARD_AMD_RADEON_HD6300
@ CARD_NVIDIA_GEFORCE_GT630M
@ CARD_INTEL_SNBM
@ CARD_NVIDIA_GEFORCE_GT740M
@ CARD_AMD_RADEON_HD8770
@ CARD_INTEL_830M
@ CARD_NVIDIA_GEFORCE_GT540M
@ CARD_NVIDIA_GEFORCE_GTX660
@ CARD_NVIDIA_GEFORCE_RTX4080
@ CARD_AMD_RADEON_RX_480
@ CARD_NVIDIA_GEFORCE_RTX3070
@ CARD_NVIDIA_GEFORCE2_MX
@ CARD_INTEL_ILKM
@ CARD_NVIDIA_GEFORCE_RTX2060
@ CARD_NVIDIA_GEFORCE_GTX470
@ CARD_NVIDIA_GEFORCE_RTX2080TI
@ CARD_NVIDIA_GEFORCE_8500GT
@ CARD_NVIDIA_GEFORCE_GTX980TI
@ CARD_NVIDIA_GEFORCE_410M
@ CARD_NVIDIA_GEFORCE_GTS450
@ CARD_NVIDIA_GEFORCE_GT750M
@ CARD_AMD_RADEON_HD6480G
@ CARD_NVIDIA_GEFORCE_RTX3070_LHR
@ CARD_NVIDIA_GEFORCE_GTX660TI
@ CARD_INTEL_HWM
@ CARD_NVIDIA_GEFORCE_9500GT
@ CARD_NVIDIA_GEFORCE_GTX670MX
@ CARD_NVIDIA_GEFORCE_GTX860M
@ CARD_AMD_RADEON_HD4350
@ CARD_INTEL_B43
@ CARD_NVIDIA_GEFORCE_9200
@ CARD_INTEL_HD5000_1
@ CARD_AMD_RADEON_HD6410D
static struct wined3d_texture * texture_from_resource(struct wined3d_resource *resource)
int WINAPI ChoosePixelFormat(_In_ HDC hdc, _In_ const PIXELFORMATDESCRIPTOR *ppfd)
BOOL WINAPI SetPixelFormat(_In_ HDC, _In_ int, _In_ const PIXELFORMATDESCRIPTOR *)
#define PFD_SUPPORT_OPENGL
Definition: wingdi.h:306
int WINAPI DescribePixelFormat(_In_ HDC hdc, _In_ int iPixelFormat, _In_ UINT nBytes, _Out_writes_bytes_opt_(nBytes) LPPIXELFORMATDESCRIPTOR ppfd)
#define PFD_GENERIC_FORMAT
Definition: wingdi.h:307
#define PFD_DRAW_TO_WINDOW
Definition: wingdi.h:303
#define PFD_GENERIC_ACCELERATED
Definition: wingdi.h:313
#define PFD_MAIN_PLANE
Definition: wingdi.h:298
#define PFD_TYPE_RGBA
Definition: wingdi.h:296
#define PFD_DOUBLEBUFFER
Definition: wingdi.h:301
unsigned char BYTE
Definition: xxhash.c:193