ReactOS  0.4.11-dev-195-gef016bf
directx.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 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 "config.h"
25 #include "wine/port.h"
26 
27 #include <stdio.h>
28 
29 #include "wined3d_private.h"
30 #include "wine/winternl.h"
31 
35 
36 #define DEFAULT_REFRESH_RATE 0
37 
38 /* The driver names reflect the lowest GPU supported
39  * by a certain driver, so DRIVER_AMD_R300 supports
40  * R3xx, R4xx and R5xx GPUs. */
42 {
60 };
61 
63 {
69 };
70 
72 {
78 };
79 
81 {
91 };
92 
93 /* The d3d device ID */
94 static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } };
95 
96 /* Extension detection */
98 {
99  const char *extension_string;
101 };
102 
104 {
105  /* APPLE */
106  {"GL_APPLE_fence", APPLE_FENCE },
107  {"GL_APPLE_float_pixels", APPLE_FLOAT_PIXELS },
108  {"GL_APPLE_flush_buffer_range", APPLE_FLUSH_BUFFER_RANGE },
109  {"GL_APPLE_ycbcr_422", APPLE_YCBCR_422 },
110 
111  /* ARB */
112  {"GL_ARB_base_instance", ARB_BASE_INSTANCE },
113  {"GL_ARB_blend_func_extended", ARB_BLEND_FUNC_EXTENDED },
114  {"GL_ARB_clear_buffer_object", ARB_CLEAR_BUFFER_OBJECT },
115  {"GL_ARB_clear_texture", ARB_CLEAR_TEXTURE },
116  {"GL_ARB_clip_control", ARB_CLIP_CONTROL },
117  {"GL_ARB_color_buffer_float", ARB_COLOR_BUFFER_FLOAT },
118  {"GL_ARB_compute_shader", ARB_COMPUTE_SHADER },
119  {"GL_ARB_conservative_depth", ARB_CONSERVATIVE_DEPTH },
120  {"GL_ARB_copy_buffer", ARB_COPY_BUFFER },
121  {"GL_ARB_copy_image", ARB_COPY_IMAGE },
122  {"GL_ARB_cull_distance", ARB_CULL_DISTANCE },
123  {"GL_ARB_debug_output", ARB_DEBUG_OUTPUT },
124  {"GL_ARB_depth_buffer_float", ARB_DEPTH_BUFFER_FLOAT },
125  {"GL_ARB_depth_clamp", ARB_DEPTH_CLAMP },
126  {"GL_ARB_depth_texture", ARB_DEPTH_TEXTURE },
127  {"GL_ARB_derivative_control", ARB_DERIVATIVE_CONTROL },
128  {"GL_ARB_draw_buffers", ARB_DRAW_BUFFERS },
129  {"GL_ARB_draw_elements_base_vertex", ARB_DRAW_ELEMENTS_BASE_VERTEX },
130  {"GL_ARB_draw_indirect", ARB_DRAW_INDIRECT },
131  {"GL_ARB_draw_instanced", ARB_DRAW_INSTANCED },
132  {"GL_ARB_ES2_compatibility", ARB_ES2_COMPATIBILITY },
133  {"GL_ARB_ES3_compatibility", ARB_ES3_COMPATIBILITY },
134  {"GL_ARB_explicit_attrib_location", ARB_EXPLICIT_ATTRIB_LOCATION },
135  {"GL_ARB_fragment_coord_conventions", ARB_FRAGMENT_COORD_CONVENTIONS},
136  {"GL_ARB_fragment_layer_viewport", ARB_FRAGMENT_LAYER_VIEWPORT },
137  {"GL_ARB_fragment_program", ARB_FRAGMENT_PROGRAM },
138  {"GL_ARB_fragment_shader", ARB_FRAGMENT_SHADER },
139  {"GL_ARB_framebuffer_no_attachments", ARB_FRAMEBUFFER_NO_ATTACHMENTS},
140  {"GL_ARB_framebuffer_object", ARB_FRAMEBUFFER_OBJECT },
141  {"GL_ARB_framebuffer_sRGB", ARB_FRAMEBUFFER_SRGB },
142  {"GL_ARB_geometry_shader4", ARB_GEOMETRY_SHADER4 },
143  {"GL_ARB_gpu_shader5", ARB_GPU_SHADER5 },
144  {"GL_ARB_half_float_pixel", ARB_HALF_FLOAT_PIXEL },
145  {"GL_ARB_half_float_vertex", ARB_HALF_FLOAT_VERTEX },
146  {"GL_ARB_instanced_arrays", ARB_INSTANCED_ARRAYS },
147  {"GL_ARB_internalformat_query", ARB_INTERNALFORMAT_QUERY },
148  {"GL_ARB_internalformat_query2", ARB_INTERNALFORMAT_QUERY2 },
149  {"GL_ARB_map_buffer_alignment", ARB_MAP_BUFFER_ALIGNMENT },
150  {"GL_ARB_map_buffer_range", ARB_MAP_BUFFER_RANGE },
151  {"GL_ARB_multisample", ARB_MULTISAMPLE },
152  {"GL_ARB_multitexture", ARB_MULTITEXTURE },
153  {"GL_ARB_occlusion_query", ARB_OCCLUSION_QUERY },
154  {"GL_ARB_pipeline_statistics_query", ARB_PIPELINE_STATISTICS_QUERY },
155  {"GL_ARB_pixel_buffer_object", ARB_PIXEL_BUFFER_OBJECT },
156  {"GL_ARB_point_parameters", ARB_POINT_PARAMETERS },
157  {"GL_ARB_point_sprite", ARB_POINT_SPRITE },
158  {"GL_ARB_provoking_vertex", ARB_PROVOKING_VERTEX },
159  {"GL_ARB_sample_shading", ARB_SAMPLE_SHADING },
160  {"GL_ARB_sampler_objects", ARB_SAMPLER_OBJECTS },
161  {"GL_ARB_seamless_cube_map", ARB_SEAMLESS_CUBE_MAP },
162  {"GL_ARB_shader_atomic_counters", ARB_SHADER_ATOMIC_COUNTERS },
163  {"GL_ARB_shader_bit_encoding", ARB_SHADER_BIT_ENCODING },
164  {"GL_ARB_shader_image_load_store", ARB_SHADER_IMAGE_LOAD_STORE },
165  {"GL_ARB_shader_image_size", ARB_SHADER_IMAGE_SIZE },
166  {"GL_ARB_shader_storage_buffer_object", ARB_SHADER_STORAGE_BUFFER_OBJECT},
167  {"GL_ARB_shader_texture_image_samples", ARB_SHADER_TEXTURE_IMAGE_SAMPLES},
168  {"GL_ARB_shader_texture_lod", ARB_SHADER_TEXTURE_LOD },
169  {"GL_ARB_shading_language_100", ARB_SHADING_LANGUAGE_100 },
170  {"GL_ARB_shading_language_420pack", ARB_SHADING_LANGUAGE_420PACK },
171  {"GL_ARB_shading_language_packing", ARB_SHADING_LANGUAGE_PACKING },
172  {"GL_ARB_shadow", ARB_SHADOW },
173  {"GL_ARB_stencil_texturing", ARB_STENCIL_TEXTURING },
174  {"GL_ARB_sync", ARB_SYNC },
175  {"GL_ARB_tessellation_shader", ARB_TESSELLATION_SHADER },
176  {"GL_ARB_texture_border_clamp", ARB_TEXTURE_BORDER_CLAMP },
177  {"GL_ARB_texture_buffer_object", ARB_TEXTURE_BUFFER_OBJECT },
178  {"GL_ARB_texture_buffer_range", ARB_TEXTURE_BUFFER_RANGE },
179  {"GL_ARB_texture_compression", ARB_TEXTURE_COMPRESSION },
180  {"GL_ARB_texture_compression_bptc", ARB_TEXTURE_COMPRESSION_BPTC },
181  {"GL_ARB_texture_compression_rgtc", ARB_TEXTURE_COMPRESSION_RGTC },
182  {"GL_ARB_texture_cube_map", ARB_TEXTURE_CUBE_MAP },
183  {"GL_ARB_texture_cube_map_array", ARB_TEXTURE_CUBE_MAP_ARRAY },
184  {"GL_ARB_texture_env_combine", ARB_TEXTURE_ENV_COMBINE },
185  {"GL_ARB_texture_env_dot3", ARB_TEXTURE_ENV_DOT3 },
186  {"GL_ARB_texture_filter_anisotropic", ARB_TEXTURE_FILTER_ANISOTROPIC},
187  {"GL_ARB_texture_float", ARB_TEXTURE_FLOAT },
188  {"GL_ARB_texture_gather", ARB_TEXTURE_GATHER },
189  {"GL_ARB_texture_mirrored_repeat", ARB_TEXTURE_MIRRORED_REPEAT },
190  {"GL_ARB_texture_mirror_clamp_to_edge", ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE},
191  {"GL_ARB_texture_multisample", ARB_TEXTURE_MULTISAMPLE },
192  {"GL_ARB_texture_non_power_of_two", ARB_TEXTURE_NON_POWER_OF_TWO },
193  {"GL_ARB_texture_query_levels", ARB_TEXTURE_QUERY_LEVELS },
194  {"GL_ARB_texture_rectangle", ARB_TEXTURE_RECTANGLE },
195  {"GL_ARB_texture_rg", ARB_TEXTURE_RG },
196  {"GL_ARB_texture_rgb10_a2ui", ARB_TEXTURE_RGB10_A2UI },
197  {"GL_ARB_texture_storage", ARB_TEXTURE_STORAGE },
198  {"GL_ARB_texture_storage_multisample", ARB_TEXTURE_STORAGE_MULTISAMPLE},
199  {"GL_ARB_texture_swizzle", ARB_TEXTURE_SWIZZLE },
200  {"GL_ARB_texture_view", ARB_TEXTURE_VIEW },
201  {"GL_ARB_timer_query", ARB_TIMER_QUERY },
202  {"GL_ARB_transform_feedback2", ARB_TRANSFORM_FEEDBACK2 },
203  {"GL_ARB_transform_feedback3", ARB_TRANSFORM_FEEDBACK3 },
204  {"GL_ARB_uniform_buffer_object", ARB_UNIFORM_BUFFER_OBJECT },
205  {"GL_ARB_vertex_array_bgra", ARB_VERTEX_ARRAY_BGRA },
206  {"GL_ARB_vertex_buffer_object", ARB_VERTEX_BUFFER_OBJECT },
207  {"GL_ARB_vertex_program", ARB_VERTEX_PROGRAM },
208  {"GL_ARB_vertex_shader", ARB_VERTEX_SHADER },
209  {"GL_ARB_vertex_type_2_10_10_10_rev", ARB_VERTEX_TYPE_2_10_10_10_REV},
210  {"GL_ARB_viewport_array", ARB_VIEWPORT_ARRAY },
211 
212  /* ATI */
213  {"GL_ATI_fragment_shader", ATI_FRAGMENT_SHADER },
214  {"GL_ATI_separate_stencil", ATI_SEPARATE_STENCIL },
215  {"GL_ATI_texture_compression_3dc", ATI_TEXTURE_COMPRESSION_3DC },
216  {"GL_ATI_texture_env_combine3", ATI_TEXTURE_ENV_COMBINE3 },
217  {"GL_ATI_texture_mirror_once", ATI_TEXTURE_MIRROR_ONCE },
218 
219  /* EXT */
220  {"GL_EXT_blend_color", EXT_BLEND_COLOR },
221  {"GL_EXT_blend_equation_separate", EXT_BLEND_EQUATION_SEPARATE },
222  {"GL_EXT_blend_func_separate", EXT_BLEND_FUNC_SEPARATE },
223  {"GL_EXT_blend_minmax", EXT_BLEND_MINMAX },
224  {"GL_EXT_blend_subtract", EXT_BLEND_SUBTRACT },
225  {"GL_EXT_depth_bounds_test", EXT_DEPTH_BOUNDS_TEST },
226  {"GL_EXT_draw_buffers2", EXT_DRAW_BUFFERS2 },
227  {"GL_EXT_fog_coord", EXT_FOG_COORD },
228  {"GL_EXT_framebuffer_blit", EXT_FRAMEBUFFER_BLIT },
229  {"GL_EXT_framebuffer_multisample", EXT_FRAMEBUFFER_MULTISAMPLE },
230  {"GL_EXT_framebuffer_object", EXT_FRAMEBUFFER_OBJECT },
231  {"GL_EXT_gpu_program_parameters", EXT_GPU_PROGRAM_PARAMETERS },
232  {"GL_EXT_gpu_shader4", EXT_GPU_SHADER4 },
233  {"GL_EXT_packed_depth_stencil", EXT_PACKED_DEPTH_STENCIL },
234  {"GL_EXT_packed_float", EXT_PACKED_FLOAT },
235  {"GL_EXT_point_parameters", EXT_POINT_PARAMETERS },
236  {"GL_EXT_polygon_offset_clamp", EXT_POLYGON_OFFSET_CLAMP },
237  {"GL_EXT_provoking_vertex", EXT_PROVOKING_VERTEX },
238  {"GL_EXT_secondary_color", EXT_SECONDARY_COLOR },
239  {"GL_EXT_stencil_two_side", EXT_STENCIL_TWO_SIDE },
240  {"GL_EXT_stencil_wrap", EXT_STENCIL_WRAP },
241  {"GL_EXT_texture3D", EXT_TEXTURE3D },
242  {"GL_EXT_texture_array", EXT_TEXTURE_ARRAY },
243  {"GL_EXT_texture_compression_rgtc", EXT_TEXTURE_COMPRESSION_RGTC },
244  {"GL_EXT_texture_compression_s3tc", EXT_TEXTURE_COMPRESSION_S3TC },
245  {"GL_EXT_texture_env_combine", EXT_TEXTURE_ENV_COMBINE },
246  {"GL_EXT_texture_env_dot3", EXT_TEXTURE_ENV_DOT3 },
247  {"GL_EXT_texture_filter_anisotropic", ARB_TEXTURE_FILTER_ANISOTROPIC},
248  {"GL_EXT_texture_integer", EXT_TEXTURE_INTEGER },
249  {"GL_EXT_texture_lod_bias", EXT_TEXTURE_LOD_BIAS },
250  {"GL_EXT_texture_mirror_clamp", EXT_TEXTURE_MIRROR_CLAMP },
251  {"GL_EXT_texture_shared_exponent", EXT_TEXTURE_SHARED_EXPONENT },
252  {"GL_EXT_texture_snorm", EXT_TEXTURE_SNORM },
253  {"GL_EXT_texture_sRGB", EXT_TEXTURE_SRGB },
254  {"GL_EXT_texture_sRGB_decode", EXT_TEXTURE_SRGB_DECODE },
255  {"GL_EXT_vertex_array_bgra", EXT_VERTEX_ARRAY_BGRA },
256 
257  /* NV */
258  {"GL_NV_fence", NV_FENCE },
259  {"GL_NV_fog_distance", NV_FOG_DISTANCE },
260  {"GL_NV_fragment_program", NV_FRAGMENT_PROGRAM },
261  {"GL_NV_fragment_program2", NV_FRAGMENT_PROGRAM2 },
262  {"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION },
263  {"GL_NV_half_float", NV_HALF_FLOAT },
264  {"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT },
265  {"GL_NV_point_sprite", NV_POINT_SPRITE },
266  {"GL_NV_register_combiners", NV_REGISTER_COMBINERS },
267  {"GL_NV_register_combiners2", NV_REGISTER_COMBINERS2 },
268  {"GL_NV_texgen_reflection", NV_TEXGEN_REFLECTION },
269  {"GL_NV_texture_env_combine4", NV_TEXTURE_ENV_COMBINE4 },
270  {"GL_NV_texture_shader", NV_TEXTURE_SHADER },
271  {"GL_NV_texture_shader2", NV_TEXTURE_SHADER2 },
272  {"GL_NV_vertex_program", NV_VERTEX_PROGRAM },
273  {"GL_NV_vertex_program1_1", NV_VERTEX_PROGRAM1_1 },
274  {"GL_NV_vertex_program2", NV_VERTEX_PROGRAM2 },
275  {"GL_NV_vertex_program2_option", NV_VERTEX_PROGRAM2_OPTION },
276  {"GL_NV_vertex_program3", NV_VERTEX_PROGRAM3 },
277  {"GL_NVX_gpu_memory_info", NVX_GPU_MEMORY_INFO },
278 };
279 
281 {
282  {"WGL_ARB_pixel_format", WGL_ARB_PIXEL_FORMAT },
283  {"WGL_EXT_swap_control", WGL_EXT_SWAP_CONTROL },
284  {"WGL_WINE_pixel_format_passthrough", WGL_WINE_PIXEL_FORMAT_PASSTHROUGH},
285  {"WGL_WINE_query_renderer", WGL_WINE_QUERY_RENDERER },
286 };
287 
288 /**********************************************************
289  * Utility functions follow
290  **********************************************************/
291 
292 const struct min_lookup minMipLookup[] =
293 {
294  /* NONE POINT LINEAR */
295  {{GL_NEAREST, GL_NEAREST, GL_NEAREST}}, /* NONE */
298 };
299 
300 const GLenum magLookup[] =
301 {
302  /* NONE POINT LINEAR */
304 };
305 
306 static void wined3d_caps_gl_ctx_destroy(const struct wined3d_caps_gl_ctx *ctx)
307 {
308  const struct wined3d_gl_info *gl_info = ctx->gl_info;
309 
310  TRACE("Destroying caps GL context.\n");
311 
312  /* Both glDeleteProgram and glDeleteBuffers silently ignore 0 IDs but
313  * this function might be called before the relevant function pointers
314  * in gl_info are initialized. */
315  if (ctx->test_program_id || ctx->test_vbo)
316  {
317  GL_EXTCALL(glDeleteProgram(ctx->test_program_id));
318  GL_EXTCALL(glDeleteBuffers(1, &ctx->test_vbo));
319  }
320 
321  if (!wglMakeCurrent(NULL, NULL))
322  ERR("Failed to disable caps GL context.\n");
323 
324  if (!wglDeleteContext(ctx->gl_ctx))
325  {
326  DWORD err = GetLastError();
327  ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx->gl_ctx, err);
328  }
329 
330  wined3d_release_dc(ctx->wnd, ctx->dc);
331  DestroyWindow(ctx->wnd);
332 
333  if (ctx->restore_gl_ctx && !wglMakeCurrent(ctx->restore_dc, ctx->restore_gl_ctx))
334  ERR("Failed to restore previous GL context.\n");
335 }
336 
338  struct wined3d_gl_info *gl_info)
339 {
340  HGLRC new_ctx;
341 
342  if (!(gl_info->p_wglCreateContextAttribsARB = (void *)wglGetProcAddress("wglCreateContextAttribsARB")))
343  return TRUE;
344 
345  if (!(new_ctx = context_create_wgl_attribs(gl_info, caps_gl_ctx->dc, NULL)))
346  {
347  gl_info->p_wglCreateContextAttribsARB = NULL;
348  return FALSE;
349  }
350 
351  if (!wglMakeCurrent(caps_gl_ctx->dc, new_ctx))
352  {
353  ERR("Failed to make new context current, last error %#x.\n", GetLastError());
354  if (!wglDeleteContext(new_ctx))
355  ERR("Failed to delete new context, last error %#x.\n", GetLastError());
356  gl_info->p_wglCreateContextAttribsARB = NULL;
357  return TRUE;
358  }
359 
360  if (!wglDeleteContext(caps_gl_ctx->gl_ctx))
361  ERR("Failed to delete old context, last error %#x.\n", GetLastError());
362  caps_gl_ctx->gl_ctx = new_ctx;
363 
364  return TRUE;
365 }
366 
368 {
370  int iPixelFormat;
371 
372  TRACE("getting context...\n");
373 
374  ctx->restore_dc = wglGetCurrentDC();
376 
377  /* We need a fake window as a hdc retrieved using GetDC(0) can't be used for much GL purposes. */
378  ctx->wnd = CreateWindowA(WINED3D_OPENGL_WINDOW_CLASS_NAME, "WineD3D fake window",
379  WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL);
380  if (!ctx->wnd)
381  {
382  ERR("Failed to create a window.\n");
383  goto fail;
384  }
385 
386  ctx->dc = GetDC(ctx->wnd);
387  if (!ctx->dc)
388  {
389  ERR("Failed to get a DC.\n");
390  goto fail;
391  }
392 
393  /* PixelFormat selection */
394  ZeroMemory(&pfd, sizeof(pfd));
395  pfd.nSize = sizeof(pfd);
396  pfd.nVersion = 1;
397  pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW; /* PFD_GENERIC_ACCELERATED */
399  pfd.cColorBits = 32;
401 
402  if (!(iPixelFormat = ChoosePixelFormat(ctx->dc, &pfd)))
403  {
404  /* If this happens something is very wrong as ChoosePixelFormat barely fails. */
405  ERR("Failed to find a suitable pixel format.\n");
406  goto fail;
407  }
408  DescribePixelFormat(ctx->dc, iPixelFormat, sizeof(pfd), &pfd);
409  SetPixelFormat(ctx->dc, iPixelFormat, &pfd);
410 
411  /* Create a GL context. */
412  if (!(ctx->gl_ctx = wglCreateContext(ctx->dc)))
413  {
414  WARN("Failed to create default context for capabilities initialization.\n");
415  goto fail;
416  }
417 
418  /* Make it the current GL context. */
419  if (!wglMakeCurrent(ctx->dc, ctx->gl_ctx))
420  {
421  ERR("Failed to make caps GL context current.\n");
422  goto fail;
423  }
424 
425  ctx->gl_info = &adapter->gl_info;
426  return TRUE;
427 
428 fail:
429  if (ctx->gl_ctx) wglDeleteContext(ctx->gl_ctx);
430  ctx->gl_ctx = NULL;
431  if (ctx->dc) ReleaseDC(ctx->wnd, ctx->dc);
432  ctx->dc = NULL;
433  if (ctx->wnd) DestroyWindow(ctx->wnd);
434  ctx->wnd = NULL;
435  if (ctx->restore_gl_ctx && !wglMakeCurrent(ctx->restore_dc, ctx->restore_gl_ctx))
436  ERR("Failed to restore previous GL context.\n");
437 
438  return FALSE;
439 }
440 
441 /* Adjust the amount of used texture memory */
443 {
444  adapter->vram_bytes_used += amount;
445  TRACE("Adjusted used adapter memory by 0x%s to 0x%s.\n",
446  wine_dbgstr_longlong(amount),
448  return adapter->vram_bytes_used;
449 }
450 
451 static void wined3d_adapter_cleanup(struct wined3d_adapter *adapter)
452 {
453  heap_free(adapter->gl_info.formats);
454  heap_free(adapter->cfgs);
455 }
456 
458 {
459  ULONG refcount = InterlockedIncrement(&wined3d->ref);
460 
461  TRACE("%p increasing refcount to %u.\n", wined3d, refcount);
462 
463  return refcount;
464 }
465 
467 {
468  ULONG refcount = InterlockedDecrement(&wined3d->ref);
469 
470  TRACE("%p decreasing refcount to %u.\n", wined3d, refcount);
471 
472  if (!refcount)
473  {
474  unsigned int i;
475 
476  for (i = 0; i < wined3d->adapter_count; ++i)
477  {
478  wined3d_adapter_cleanup(&wined3d->adapters[i]);
479  }
480  heap_free(wined3d);
481  }
482 
483  return refcount;
484 }
485 
486 /* Context activation is done by the caller. */
487 static BOOL test_arb_vs_offset_limit(const struct wined3d_gl_info *gl_info)
488 {
489  GLuint prog;
490  BOOL ret = FALSE;
491  static const char testcode[] =
492  "!!ARBvp1.0\n"
493  "PARAM C[66] = { program.env[0..65] };\n"
494  "ADDRESS A0;"
495  "PARAM zero = {0.0, 0.0, 0.0, 0.0};\n"
496  "ARL A0.x, zero.x;\n"
497  "MOV result.position, C[A0.x + 65];\n"
498  "END\n";
499 
500  while (gl_info->gl_ops.gl.p_glGetError());
501  GL_EXTCALL(glGenProgramsARB(1, &prog));
502  if(!prog) {
503  ERR("Failed to create an ARB offset limit test program\n");
504  }
505  GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog));
507  strlen(testcode), testcode));
508  if (gl_info->gl_ops.gl.p_glGetError())
509  {
510  TRACE("OpenGL implementation does not allow indirect addressing offsets > 63\n");
511  TRACE("error: %s\n", debugstr_a((const char *)gl_info->gl_ops.gl.p_glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
512  ret = TRUE;
513  } else TRACE("OpenGL implementation allows offsets > 63\n");
514 
515  GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0));
516  GL_EXTCALL(glDeleteProgramsARB(1, &prog));
517  checkGLcall("ARB vp offset limit test cleanup");
518 
519  return ret;
520 }
521 
522 static BOOL match_amd_r300_to_500(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
523  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
525 {
526  if (card_vendor != HW_VENDOR_AMD) return FALSE;
527  if (device == CARD_AMD_RADEON_9500) return TRUE;
528  if (device == CARD_AMD_RADEON_X700) return TRUE;
529  if (device == CARD_AMD_RADEON_X1600) return TRUE;
530  return FALSE;
531 }
532 
533 static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
534  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
536 {
537  if (card_vendor == HW_VENDOR_NVIDIA)
538  {
539  if (device == CARD_NVIDIA_GEFORCEFX_5200 ||
540  device == CARD_NVIDIA_GEFORCEFX_5600 ||
541  device == CARD_NVIDIA_GEFORCEFX_5800)
542  {
543  return TRUE;
544  }
545  }
546  return FALSE;
547 }
548 
549 static BOOL match_apple(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
550  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
552 {
553  /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
554  * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
555  * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
556  *
557  * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
558  * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
559  * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
560  * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
561  * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
562  * the chance that other implementations support them is rather small since Win32 QuickTime uses
563  * DirectDraw, not OpenGL.
564  *
565  * This test has been moved into wined3d_guess_gl_vendor()
566  */
567  return gl_vendor == GL_VENDOR_APPLE;
568 }
569 
570 /* Context activation is done by the caller. */
571 static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
572 {
573  /* Some OpenGL implementations, namely Apple's Geforce 8 driver, advertises PBOs,
574  * but glTexSubImage from a PBO fails miserably, with the first line repeated over
575  * all the texture. This function detects this bug by its symptom and disables PBOs
576  * if the test fails.
577  *
578  * The test uploads a 4x4 texture via the PBO in the "native" format GL_BGRA,
579  * GL_UNSIGNED_INT_8_8_8_8_REV. This format triggers the bug, and it is what we use
580  * for D3DFMT_A8R8G8B8. Then the texture is read back without any PBO and the data
581  * read back is compared to the original. If they are equal PBOs are assumed to work,
582  * otherwise the PBO extension is disabled. */
583  GLuint texture, pbo;
584  static const unsigned int pattern[] =
585  {
586  0x00000000, 0x000000ff, 0x0000ff00, 0x40ff0000,
587  0x80ffffff, 0x40ffff00, 0x00ff00ff, 0x0000ffff,
588  0x00ffff00, 0x00ff00ff, 0x0000ffff, 0x000000ff,
589  0x80ff00ff, 0x0000ffff, 0x00ff00ff, 0x40ff00ff
590  };
591  unsigned int check[ARRAY_SIZE(pattern)];
592 
593  /* No PBO -> No point in testing them. */
594  if (!gl_info->supported[ARB_PIXEL_BUFFER_OBJECT]) return;
595 
596  while (gl_info->gl_ops.gl.p_glGetError());
597  gl_info->gl_ops.gl.p_glGenTextures(1, &texture);
598  gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, texture);
599 
600  gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
601  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);
602  checkGLcall("Specifying the PBO test texture");
603 
604  GL_EXTCALL(glGenBuffers(1, &pbo));
605  GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo));
606  GL_EXTCALL(glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(pattern), pattern, GL_STREAM_DRAW));
607  checkGLcall("Specifying the PBO test pbo");
608 
609  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);
610  checkGLcall("Loading the PBO test texture");
611 
612  GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
613 
614  gl_info->gl_ops.gl.p_glFinish(); /* just to be sure */
615 
616  memset(check, 0, sizeof(check));
617  gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, check);
618  checkGLcall("Reading back the PBO test texture");
619 
620  gl_info->gl_ops.gl.p_glDeleteTextures(1, &texture);
621  GL_EXTCALL(glDeleteBuffers(1, &pbo));
622  checkGLcall("PBO test cleanup");
623 
624  if (memcmp(check, pattern, sizeof(check)))
625  {
626  WARN_(d3d_perf)("PBO test failed, read back data doesn't match original.\n"
627  "Disabling PBOs. This may result in slower performance.\n");
629  }
630  else
631  {
632  TRACE("PBO test successful.\n");
633  }
634 }
635 
636 static BOOL match_apple_intel(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
637  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
639 {
640  return (card_vendor == HW_VENDOR_INTEL) && (gl_vendor == GL_VENDOR_APPLE);
641 }
642 
643 static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
644  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
646 {
647  if (gl_vendor != GL_VENDOR_APPLE) return FALSE;
648  if (card_vendor != HW_VENDOR_AMD) return FALSE;
649  if (device == CARD_AMD_RADEON_X1600) return FALSE;
650  return TRUE;
651 }
652 
653 static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
654  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
656 {
657  /* DX9 cards support 40 single float varyings in hardware, most drivers report 32. ATI misreports
658  * 44 varyings. So assume that if we have more than 44 varyings we have a dx10 card.
659  * This detection is for the gl_ClipPos varying quirk. If a d3d9 card really supports more than 44
660  * varyings and we subtract one in dx9 shaders it's not going to hurt us because the dx9 limit is
661  * hardcoded
662  *
663  * dx10 cards usually have 64 varyings */
664  return gl_info->limits.glsl_varyings > 44;
665 }
666 
667 static BOOL match_not_dx10_capable(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
668  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
670 {
671  return !match_dx10_capable(gl_info, ctx, gl_renderer, gl_vendor, card_vendor, device);
672 }
673 
674 /* A GL context is provided by the caller */
675 static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
676  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
678 {
679  GLenum error;
680  DWORD data[16];
681 
683  return FALSE;
684 
685  while (gl_info->gl_ops.gl.p_glGetError());
686  GL_EXTCALL(glSecondaryColorPointerEXT)(4, GL_UNSIGNED_BYTE, 4, data);
687  error = gl_info->gl_ops.gl.p_glGetError();
688 
689  if (error == GL_NO_ERROR)
690  {
691  TRACE("GL Implementation accepts 4 component specular color pointers\n");
692  return TRUE;
693  }
694  else
695  {
696  TRACE("GL implementation does not accept 4 component specular colors, error %s\n",
697  debug_glerror(error));
698  return FALSE;
699  }
700 }
701 
702 /* A GL context is provided by the caller */
703 static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
704  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
706 {
707  GLuint prog;
708  BOOL ret = FALSE;
709  GLint pos;
710  static const char testcode[] =
711  "!!ARBvp1.0\n"
712  "OPTION NV_vertex_program2;\n"
713  "MOV result.clip[0], 0.0;\n"
714  "MOV result.position, 0.0;\n"
715  "END\n";
716 
717  if (!gl_info->supported[NV_VERTEX_PROGRAM2_OPTION]) return FALSE;
718 
719  while (gl_info->gl_ops.gl.p_glGetError());
720 
721  GL_EXTCALL(glGenProgramsARB(1, &prog));
722  if(!prog)
723  {
724  ERR("Failed to create the NVvp clip test program\n");
725  return FALSE;
726  }
727  GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog));
729  strlen(testcode), testcode));
730  gl_info->gl_ops.gl.p_glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
731  if(pos != -1)
732  {
733  WARN("GL_NV_vertex_program2_option result.clip[] test failed\n");
734  TRACE("error: %s\n", debugstr_a((const char *)gl_info->gl_ops.gl.p_glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
735  ret = TRUE;
736  while (gl_info->gl_ops.gl.p_glGetError());
737  }
738  else TRACE("GL_NV_vertex_program2_option result.clip[] test passed\n");
739 
740  GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0));
741  GL_EXTCALL(glDeleteProgramsARB(1, &prog));
742  checkGLcall("GL_NV_vertex_program2_option result.clip[] test cleanup");
743 
744  return ret;
745 }
746 
747 /* Context activation is done by the caller. */
748 static BOOL match_fbo_tex_update(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
749  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
751 {
752  char data[4 * 4 * 4];
753  GLuint tex, fbo;
754  GLenum status;
755 
757 
758  memset(data, 0xcc, sizeof(data));
759 
760  gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
761  gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
762  gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
763  gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
764  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);
765  checkGLcall("glTexImage2D");
766 
767  gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
768  gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
769  gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
770  checkGLcall("glFramebufferTexture2D");
771 
772  status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
773  if (status != GL_FRAMEBUFFER_COMPLETE) ERR("FBO status %#x\n", status);
774  checkGLcall("glCheckFramebufferStatus");
775 
776  memset(data, 0x11, sizeof(data));
777  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);
778  checkGLcall("glTexSubImage2D");
779 
780  gl_info->gl_ops.gl.p_glClearColor(0.996f, 0.729f, 0.745f, 0.792f);
781  gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
782  checkGLcall("glClear");
783 
784  gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
785  checkGLcall("glGetTexImage");
786 
787  gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
788  gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
789  gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
790  checkGLcall("glBindTexture");
791 
792  gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
793  gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
794  checkGLcall("glDeleteTextures");
795 
796  return *(DWORD *)data == 0x11111111;
797 }
798 
799 /* Context activation is done by the caller. */
800 static BOOL match_broken_rgba16(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
801  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
803 {
804  /* GL_RGBA16 uses GL_RGBA8 internally on Geforce 7 and older cards.
805  * This leads to graphical bugs in Half Life 2 and Unreal engine games. */
806  GLuint tex;
807  GLint size;
808 
809  gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
810  gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
811  gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT, NULL);
812  checkGLcall("glTexImage2D");
813 
814  gl_info->gl_ops.gl.p_glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_RED_SIZE, &size);
815  checkGLcall("glGetTexLevelParameteriv");
816  TRACE("Real color depth is %d\n", size);
817 
818  gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
819  checkGLcall("glBindTexture");
820  gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
821  checkGLcall("glDeleteTextures");
822 
823  return size < 16;
824 }
825 
826 static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
827  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
829 {
830  return gl_vendor == GL_VENDOR_FGLRX;
831 }
832 
833 static BOOL match_r200(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
834  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
836 {
837  if (card_vendor != HW_VENDOR_AMD) return FALSE;
838  if (device == CARD_AMD_RADEON_8500) return TRUE;
839  return FALSE;
840 }
841 
842 static BOOL match_broken_arb_fog(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
843  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
845 {
846  DWORD data[4];
847  GLuint tex, fbo;
848  GLenum status;
849  float color[4] = {0.0f, 1.0f, 0.0f, 0.0f};
850  GLuint prog;
851  GLint err_pos;
852  static const char program_code[] =
853  "!!ARBfp1.0\n"
854  "OPTION ARB_fog_linear;\n"
855  "MOV result.color, {1.0, 0.0, 0.0, 0.0};\n"
856  "END\n";
857 
859  return FALSE;
860  if (!gl_info->supported[ARB_FRAGMENT_PROGRAM])
861  return FALSE;
862  if (!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
863  return FALSE;
864 
865  gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
866  gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
867  gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
868  gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
869  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);
870  checkGLcall("glTexImage2D");
871 
872  gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
873  gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
874  gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
875  checkGLcall("glFramebufferTexture2D");
876 
877  status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
878  if (status != GL_FRAMEBUFFER_COMPLETE) ERR("FBO status %#x\n", status);
879  checkGLcall("glCheckFramebufferStatus");
880 
881  gl_info->gl_ops.gl.p_glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
882  gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
883  checkGLcall("glClear");
884  gl_info->gl_ops.gl.p_glViewport(0, 0, 4, 1);
885  checkGLcall("glViewport");
886 
887  gl_info->gl_ops.gl.p_glEnable(GL_FOG);
888  gl_info->gl_ops.gl.p_glFogf(GL_FOG_START, 0.5f);
889  gl_info->gl_ops.gl.p_glFogf(GL_FOG_END, 0.5f);
890  gl_info->gl_ops.gl.p_glFogi(GL_FOG_MODE, GL_LINEAR);
891  gl_info->gl_ops.gl.p_glHint(GL_FOG_HINT, GL_NICEST);
892  gl_info->gl_ops.gl.p_glFogfv(GL_FOG_COLOR, color);
893  checkGLcall("fog setup");
894 
895  GL_EXTCALL(glGenProgramsARB(1, &prog));
896  GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog));
898  strlen(program_code), program_code));
899  gl_info->gl_ops.gl.p_glEnable(GL_FRAGMENT_PROGRAM_ARB);
900  checkGLcall("Test fragment program setup");
901 
902  gl_info->gl_ops.gl.p_glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &err_pos);
903  if (err_pos != -1)
904  {
905  const char *error_str;
906  error_str = (const char *)gl_info->gl_ops.gl.p_glGetString(GL_PROGRAM_ERROR_STRING_ARB);
907  FIXME("Fog test program error at position %d: %s\n\n", err_pos, debugstr_a(error_str));
908  }
909 
910  gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
911  gl_info->gl_ops.gl.p_glVertex3f(-1.0f, -1.0f, 0.0f);
912  gl_info->gl_ops.gl.p_glVertex3f( 1.0f, -1.0f, 1.0f);
913  gl_info->gl_ops.gl.p_glVertex3f(-1.0f, 1.0f, 0.0f);
914  gl_info->gl_ops.gl.p_glVertex3f( 1.0f, 1.0f, 1.0f);
915  gl_info->gl_ops.gl.p_glEnd();
916  checkGLcall("ARBfp fog test draw");
917 
918  gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
919  checkGLcall("glGetTexImage");
920  data[0] &= 0x00ffffff;
921  data[1] &= 0x00ffffff;
922  data[2] &= 0x00ffffff;
923  data[3] &= 0x00ffffff;
924 
925  gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
926  gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
927 
928  gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
929  gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
930  gl_info->gl_ops.gl.p_glDisable(GL_FOG);
931  GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0));
932  gl_info->gl_ops.gl.p_glDisable(GL_FRAGMENT_PROGRAM_ARB);
933  GL_EXTCALL(glDeleteProgramsARB(1, &prog));
934  checkGLcall("ARBfp fog test teardown");
935 
936  TRACE("Fog test data: %08x %08x %08x %08x\n", data[0], data[1], data[2], data[3]);
937  return data[0] != 0x00ff0000 || data[3] != 0x0000ff00;
938 }
939 
941  struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
943 {
944  if (!gl_info->supported[ARB_VIEWPORT_ARRAY])
945  return FALSE;
947  return FALSE;
949 }
950 
951 static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
952 {
953  /* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
954  * Beyond that the general uniform isn't optimal, so reserve a number of uniforms. 12 vec4's should
955  * allow 48 different offsets or other helper immediate values. */
956  TRACE("Reserving 12 GLSL constants for compiler private use.\n");
957  gl_info->reserved_glsl_constants = max(gl_info->reserved_glsl_constants, 12);
958 }
959 
960 static void quirk_amd_dx9(struct wined3d_gl_info *gl_info)
961 {
962  /* MacOS advertises GL_ARB_texture_non_power_of_two on ATI r500 and earlier cards, although
963  * these cards only support GL_ARB_texture_rectangle(D3DPTEXTURECAPS_NONPOW2CONDITIONAL).
964  * If real NP2 textures are used, the driver falls back to software. We could just remove the
965  * extension and use GL_ARB_texture_rectangle instead, but texture_rectangle is inconvenient
966  * due to the non-normalized texture coordinates. Thus set an internal extension flag,
967  * GL_WINE_normalized_texrect, which signals the code that it can use non power of two textures
968  * as per GL_ARB_texture_non_power_of_two, but has to stick to the texture_rectangle limits.
969  *
970  * fglrx doesn't advertise GL_ARB_texture_non_power_of_two, but it advertises opengl 2.0 which
971  * has this extension promoted to core. The extension loading code sets this extension supported
972  * due to that, so this code works on fglrx as well. */
974  {
975  TRACE("GL_ARB_texture_non_power_of_two advertised on R500 or earlier card, removing.\n");
978  }
979 }
980 
981 static void quirk_no_np2(struct wined3d_gl_info *gl_info)
982 {
983  /* The nVidia GeForceFX series reports OpenGL 2.0 capabilities with the latest drivers versions, but
984  * doesn't explicitly advertise the ARB_tex_npot extension in the GL extension string.
985  * This usually means that ARB_tex_npot is supported in hardware as long as the application is staying
986  * within the limits enforced by the ARB_texture_rectangle extension. This however is not true for the
987  * FX series, which instantly falls back to a slower software path as soon as ARB_tex_npot is used.
988  * We therefore completely remove ARB_tex_npot from the list of supported extensions.
989  *
990  * Note that wine_normalized_texrect can't be used in this case because internally it uses ARB_tex_npot,
991  * triggering the software fallback. There is not much we can do here apart from disabling the
992  * software-emulated extension and re-enable ARB_tex_rect (which was previously disabled
993  * in wined3d_adapter_init_gl_caps).
994  * This fixup removes performance problems on both the FX 5900 and FX 5700 (e.g. for framebuffer
995  * post-processing effects in the game "Max Payne 2").
996  * The behaviour can be verified through a simple test app attached in bugreport #14724. */
997  TRACE("GL_ARB_texture_non_power_of_two advertised through OpenGL 2.0 on NV FX card, removing.\n");
1000 }
1001 
1002 static void quirk_texcoord_w(struct wined3d_gl_info *gl_info)
1003 {
1004  /* The Intel GPUs on MacOS set the .w register of texcoords to 0.0 by default, which causes problems
1005  * with fixed function fragment processing. Ideally this flag should be detected with a test shader
1006  * and OpenGL feedback mode, but some GL implementations (MacOS ATI at least, probably all MacOS ones)
1007  * do not like vertex shaders in feedback mode and return an error, even though it should be valid
1008  * according to the spec.
1009  *
1010  * We don't want to enable this on all cards, as it adds an extra instruction per texcoord used. This
1011  * makes the shader slower and eats instruction slots which should be available to the d3d app.
1012  *
1013  * ATI Radeon HD 2xxx cards on MacOS have the issue. Instead of checking for the buggy cards, blacklist
1014  * all radeon cards on Macs and whitelist the good ones. That way we're prepared for the future. If
1015  * this workaround is activated on cards that do not need it, it won't break things, just affect
1016  * performance negatively. */
1017  TRACE("Enabling vertex texture coord fixes in vertex shaders.\n");
1019 }
1020 
1021 static void quirk_clip_varying(struct wined3d_gl_info *gl_info)
1022 {
1024 }
1025 
1026 static void quirk_allows_specular_alpha(struct wined3d_gl_info *gl_info)
1027 {
1029 }
1030 
1031 static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
1032 {
1034 }
1035 
1036 static void quirk_fbo_tex_update(struct wined3d_gl_info *gl_info)
1037 {
1039 }
1040 
1041 static void quirk_broken_rgba16(struct wined3d_gl_info *gl_info)
1042 {
1043  gl_info->quirks |= WINED3D_QUIRK_BROKEN_RGBA16;
1044 }
1045 
1046 static void quirk_infolog_spam(struct wined3d_gl_info *gl_info)
1047 {
1048  gl_info->quirks |= WINED3D_QUIRK_INFO_LOG_SPAM;
1049 }
1050 
1051 static void quirk_limited_tex_filtering(struct wined3d_gl_info *gl_info)
1052 {
1053  /* Nvidia GeForce 6xxx and 7xxx support accelerated VTF only on a few
1054  selected texture formats. They are apparently the only DX9 class GPUs
1055  supporting VTF.
1056  Also, DX9-era GPUs are somewhat limited with float textures
1057  filtering and blending. */
1059 }
1060 
1061 static void quirk_r200_constants(struct wined3d_gl_info *gl_info)
1062 {
1063  /* The Mesa r200 driver (and there is no other driver for this GPU Wine would run on)
1064  * loads some fog parameters (start, end, exponent, but not the color) into the
1065  * program.
1066  *
1067  * Apparently the fog hardware is only able to handle linear fog with a range of 0.0;1.0,
1068  * and it is the responsibility of the vertex pipeline to handle non-linear fog and
1069  * linear fog with start and end other than 0.0 and 1.0. */
1070  TRACE("Reserving 1 ARB constant for compiler private use.\n");
1071  gl_info->reserved_arb_constants = max(gl_info->reserved_arb_constants, 1);
1072 }
1073 
1074 static void quirk_broken_arb_fog(struct wined3d_gl_info *gl_info)
1075 {
1077 }
1078 
1080 {
1081  if (gl_info->supported[ARB_CLIP_CONTROL])
1082  {
1083  TRACE("Disabling ARB_clip_control.\n");
1084  gl_info->supported[ARB_CLIP_CONTROL] = FALSE;
1085  }
1086 }
1087 
1089 {
1090  BOOL (*match)(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
1091  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
1093  void (*apply)(struct wined3d_gl_info *gl_info);
1094  const char *description;
1095 };
1096 
1097 static const struct driver_quirk quirk_table[] =
1098 {
1099  {
1101  quirk_amd_dx9,
1102  "AMD normalized texrect quirk"
1103  },
1104  {
1105  match_apple,
1107  "Apple GLSL uniform override"
1108  },
1109  {
1111  quirk_no_np2,
1112  "Geforce 5 NP2 disable"
1113  },
1114  {
1117  "Init texcoord .w for Apple Intel GPU driver"
1118  },
1119  {
1122  "Init texcoord .w for Apple ATI >= r600 GPU driver"
1123  },
1124  {
1127  "Reserved varying for gl_ClipPos"
1128  },
1129  {
1130  /* GL_EXT_secondary_color does not allow 4 component secondary colors, but most
1131  * GL implementations accept it. The Mac GL is the only implementation known to
1132  * reject it.
1133  *
1134  * If we can pass 4 component specular colors, do it, because (a) we don't have
1135  * to screw around with the data, and (b) the D3D fixed function vertex pipeline
1136  * passes specular alpha to the pixel shader if any is used. Otherwise the
1137  * specular alpha is used to pass the fog coordinate, which we pass to opengl
1138  * via GL_EXT_fog_coord.
1139  */
1142  "Allow specular alpha quirk"
1143  },
1144  {
1147  "Apple NV_vertex_program clip bug quirk"
1148  },
1149  {
1152  "FBO rebind for attachment updates"
1153  },
1154  {
1157  "True RGBA16 is not available"
1158  },
1159  {
1160  match_fglrx,
1162  "Not printing GLSL infolog"
1163  },
1164  {
1167  "Texture filtering, blending and VTF support is limited"
1168  },
1169  {
1170  match_r200,
1172  "r200 vertex shader constants"
1173  },
1174  {
1177  "ARBfp fogstart == fogend workaround"
1178  },
1179  {
1182  "Nvidia viewport subpixel bits bug"
1183  },
1184 };
1185 
1186 /* Certain applications (Steam) complain if we report an outdated driver version. In general,
1187  * reporting a driver version is moot because we are not the Windows driver, and we have different
1188  * bugs, features, etc.
1189  *
1190  * The driver version has the form "x.y.z.w".
1191  *
1192  * "x" is the Windows version the driver is meant for:
1193  * 4 -> 95/98/NT4
1194  * 5 -> 2000
1195  * 6 -> 2000/XP
1196  * 7 -> Vista
1197  * 8 -> Win 7
1198  *
1199  * "y" is the maximum Direct3D version the driver supports.
1200  * y -> d3d version mapping:
1201  * 11 -> d3d6
1202  * 12 -> d3d7
1203  * 13 -> d3d8
1204  * 14 -> d3d9
1205  * 15 -> d3d10
1206  * 16 -> d3d10.1
1207  * 17 -> d3d11
1208  *
1209  * "z" is the subversion number.
1210  *
1211  * "w" is the vendor specific driver build number.
1212  */
1213 
1215 {
1218  const char *driver_name; /* name of Windows driver */
1219  WORD version; /* version word ('y'), contained in low word of DriverVersion.HighPart */
1220  WORD subversion; /* subversion word ('z'), contained in high word of DriverVersion.LowPart */
1221  WORD build; /* build number ('w'), contained in low word of DriverVersion.LowPart */
1222 };
1223 
1224 /* The driver version table contains driver information for different devices on several OS versions. */
1226 {
1227  /* AMD
1228  * - Radeon HD2x00 (R600) and up supported by current drivers.
1229  * - Radeon 9500 (R300) - X1*00 (R5xx) supported up to Catalyst 9.3 (Linux) and 10.2 (XP/Vista/Win7)
1230  * - Radeon 7xxx (R100) - 9250 (RV250) supported up to Catalyst 6.11 (XP)
1231  * - Rage 128 supported up to XP, latest official build 6.13.3279 dated October 2001 */
1232  {DRIVER_AMD_RAGE_128PRO, DRIVER_MODEL_NT5X, "ati2dvaa.dll", 13, 3279, 0},
1233  {DRIVER_AMD_R100, DRIVER_MODEL_NT5X, "ati2dvag.dll", 14, 10, 6614},
1234  {DRIVER_AMD_R300, DRIVER_MODEL_NT5X, "ati2dvag.dll", 14, 10, 6764},
1235  {DRIVER_AMD_R600, DRIVER_MODEL_NT5X, "ati2dvag.dll", 17, 10, 1280},
1236  {DRIVER_AMD_R300, DRIVER_MODEL_NT6X, "atiumdag.dll", 14, 10, 741 },
1237  {DRIVER_AMD_R600, DRIVER_MODEL_NT6X, "atiumdag.dll", 17, 10, 1280},
1238  {DRIVER_AMD_RX, DRIVER_MODEL_NT6X, "aticfx32.dll", 17, 10, 1474},
1239 
1240  /* Intel
1241  * The drivers are unified but not all versions support all GPUs. At some point the 2k/xp
1242  * drivers used ialmrnt5.dll for GMA800/GMA900 but at some point the file was renamed to
1243  * igxprd32.dll but the GMA800 driver was never updated. */
1244  {DRIVER_INTEL_GMA800, DRIVER_MODEL_NT5X, "ialmrnt5.dll", 14, 10, 3889},
1245  {DRIVER_INTEL_GMA900, DRIVER_MODEL_NT5X, "igxprd32.dll", 14, 10, 4764},
1246  {DRIVER_INTEL_GMA950, DRIVER_MODEL_NT5X, "igxprd32.dll", 14, 10, 4926},
1247  {DRIVER_INTEL_GMA3000, DRIVER_MODEL_NT5X, "igxprd32.dll", 14, 10, 5218},
1248  {DRIVER_INTEL_GMA950, DRIVER_MODEL_NT6X, "igdumd32.dll", 14, 10, 1504},
1249  {DRIVER_INTEL_GMA3000, DRIVER_MODEL_NT6X, "igdumd32.dll", 15, 10, 1666},
1250  {DRIVER_INTEL_HD4000, DRIVER_MODEL_NT6X, "igdumdim32.dll", 19, 15, 4352},
1251 
1252  /* Nvidia
1253  * - Geforce8 and newer is supported by the current 340.52 driver on XP-Win8
1254  * - Geforce6 and 7 support is up to 307.83 on XP-Win8
1255  * - GeforceFX support is up to 173.x on <= XP
1256  * - Geforce2MX/3/4 up to 96.x on <= XP
1257  * - TNT/Geforce1/2 up to 71.x on <= XP
1258  * All version numbers used below are from the Linux nvidia drivers. */
1259  {DRIVER_NVIDIA_TNT, DRIVER_MODEL_NT5X, "nv4_disp.dll", 14, 10, 7186},
1260  {DRIVER_NVIDIA_GEFORCE2MX, DRIVER_MODEL_NT5X, "nv4_disp.dll", 14, 10, 9371},
1261  {DRIVER_NVIDIA_GEFORCEFX, DRIVER_MODEL_NT5X, "nv4_disp.dll", 14, 11, 7516},
1262  {DRIVER_NVIDIA_GEFORCE6, DRIVER_MODEL_NT5X, "nv4_disp.dll", 18, 13, 783},
1263  {DRIVER_NVIDIA_GEFORCE8, DRIVER_MODEL_NT5X, "nv4_disp.dll", 18, 13, 4052},
1264  {DRIVER_NVIDIA_GEFORCE6, DRIVER_MODEL_NT6X, "nvd3dum.dll", 18, 13, 783},
1265  {DRIVER_NVIDIA_GEFORCE8, DRIVER_MODEL_NT6X, "nvd3dum.dll", 18, 13, 4052},
1266 
1267  /* VMware */
1268  {DRIVER_VMWARE, DRIVER_MODEL_NT5X, "vm3dum.dll", 14, 1, 1134},
1269 };
1270 
1272 {
1273  WORD vendor; /* reported PCI card vendor ID */
1274  WORD card; /* reported PCI card device ID */
1275  const char *description; /* Description of the card e.g. NVIDIA RIVA TNT */
1277  unsigned int vidmem;
1278 };
1279 
1280 /* The amount of video memory stored in the gpu description table is the minimum amount of video memory
1281  * found on a board containing a specific GPU. */
1283 {
1284  /* Nvidia cards */
1285  {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_128, "NVIDIA RIVA 128", DRIVER_NVIDIA_TNT, 4 },
1286  {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT, "NVIDIA RIVA TNT", DRIVER_NVIDIA_TNT, 16 },
1287  {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", DRIVER_NVIDIA_TNT, 32 },
1288  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", DRIVER_NVIDIA_TNT, 32 },
1289  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", DRIVER_NVIDIA_TNT, 32 },
1290  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", DRIVER_NVIDIA_GEFORCE2MX,32 },
1292  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", DRIVER_NVIDIA_GEFORCE2MX,64 },
1293  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", DRIVER_NVIDIA_GEFORCE2MX,64, },
1294  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", DRIVER_NVIDIA_GEFORCEFX, 64 },
1295  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", DRIVER_NVIDIA_GEFORCEFX, 128 },
1296  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", DRIVER_NVIDIA_GEFORCEFX, 256 },
1297  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", DRIVER_NVIDIA_GEFORCE6, 64 },
1298  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", DRIVER_NVIDIA_GEFORCE6, 128 },
1299  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", DRIVER_NVIDIA_GEFORCE6, 128 },
1300  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", DRIVER_NVIDIA_GEFORCE6, 256 },
1301  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", DRIVER_NVIDIA_GEFORCE6, 256 },
1302  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", DRIVER_NVIDIA_GEFORCE6, 256 },
1303  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", DRIVER_NVIDIA_GEFORCE6, 256 },
1304  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8200, "NVIDIA GeForce 8200", DRIVER_NVIDIA_GEFORCE8, 512 },
1305  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", DRIVER_NVIDIA_GEFORCE8, 128 },
1306  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8400GS, "NVIDIA GeForce 8400 GS", DRIVER_NVIDIA_GEFORCE8, 128 },
1307  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8500GT, "NVIDIA GeForce 8500 GT", DRIVER_NVIDIA_GEFORCE8, 256 },
1308  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", DRIVER_NVIDIA_GEFORCE8, 256 },
1309  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", DRIVER_NVIDIA_GEFORCE8, 512 },
1310  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", DRIVER_NVIDIA_GEFORCE8, 320 },
1311  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTX, "NVIDIA GeForce 8800 GTX", DRIVER_NVIDIA_GEFORCE8, 768 },
1312  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", DRIVER_NVIDIA_GEFORCE8, 256 },
1313  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9300, "NVIDIA GeForce 9300", DRIVER_NVIDIA_GEFORCE8, 256 },
1314  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400M, "NVIDIA GeForce 9400M", DRIVER_NVIDIA_GEFORCE8, 256 },
1315  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", DRIVER_NVIDIA_GEFORCE8, 256 },
1316  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", DRIVER_NVIDIA_GEFORCE8, 256 },
1317  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", DRIVER_NVIDIA_GEFORCE8, 512 },
1318  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9700MGT, "NVIDIA GeForce 9700M GT", DRIVER_NVIDIA_GEFORCE8, 512 },
1319  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", DRIVER_NVIDIA_GEFORCE8, 512 },
1320  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_210, "NVIDIA GeForce 210", DRIVER_NVIDIA_GEFORCE8, 512 },
1321  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT220, "NVIDIA GeForce GT 220", DRIVER_NVIDIA_GEFORCE8, 512 },
1322  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT240, "NVIDIA GeForce GT 240", DRIVER_NVIDIA_GEFORCE8, 512 },
1323  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTS250, "NVIDIA GeForce GTS 250", DRIVER_NVIDIA_GEFORCE8, 1024},
1324  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", DRIVER_NVIDIA_GEFORCE8, 1024},
1325  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", DRIVER_NVIDIA_GEFORCE8, 896 },
1326  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", DRIVER_NVIDIA_GEFORCE8, 1024},
1327  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_315M, "NVIDIA GeForce 315M", DRIVER_NVIDIA_GEFORCE8, 512 },
1328  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_320M, "NVIDIA GeForce 320M", DRIVER_NVIDIA_GEFORCE8, 256},
1329  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT320M, "NVIDIA GeForce GT 320M", DRIVER_NVIDIA_GEFORCE8, 1024},
1330  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT325M, "NVIDIA GeForce GT 325M", DRIVER_NVIDIA_GEFORCE8, 1024},
1331  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT330, "NVIDIA GeForce GT 330", DRIVER_NVIDIA_GEFORCE8, 1024},
1332  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTS350M, "NVIDIA GeForce GTS 350M", DRIVER_NVIDIA_GEFORCE8, 1024},
1333  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_410M, "NVIDIA GeForce 410M", DRIVER_NVIDIA_GEFORCE8, 512},
1334  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT420, "NVIDIA GeForce GT 420", DRIVER_NVIDIA_GEFORCE8, 2048},
1335  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT425M, "NVIDIA GeForce GT 425M", DRIVER_NVIDIA_GEFORCE8, 1024},
1336  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT430, "NVIDIA GeForce GT 430", DRIVER_NVIDIA_GEFORCE8, 1024},
1337  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT440, "NVIDIA GeForce GT 440", DRIVER_NVIDIA_GEFORCE8, 1024},
1338  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTS450, "NVIDIA GeForce GTS 450", DRIVER_NVIDIA_GEFORCE8, 1024},
1339  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX460, "NVIDIA GeForce GTX 460", DRIVER_NVIDIA_GEFORCE8, 768 },
1340  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX460M, "NVIDIA GeForce GTX 460M", DRIVER_NVIDIA_GEFORCE8, 1536},
1341  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX465, "NVIDIA GeForce GTX 465", DRIVER_NVIDIA_GEFORCE8, 1024},
1342  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX470, "NVIDIA GeForce GTX 470", DRIVER_NVIDIA_GEFORCE8, 1280},
1343  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX480, "NVIDIA GeForce GTX 480", DRIVER_NVIDIA_GEFORCE8, 1536},
1344  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT520, "NVIDIA GeForce GT 520", DRIVER_NVIDIA_GEFORCE8, 1024},
1345  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT525M, "NVIDIA GeForce GT 525M", DRIVER_NVIDIA_GEFORCE8, 1024},
1346  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT540M, "NVIDIA GeForce GT 540M", DRIVER_NVIDIA_GEFORCE8, 1024},
1347  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX550, "NVIDIA GeForce GTX 550 Ti", DRIVER_NVIDIA_GEFORCE8, 1024},
1348  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT555M, "NVIDIA GeForce GT 555M", DRIVER_NVIDIA_GEFORCE8, 1024},
1349  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX560TI, "NVIDIA GeForce GTX 560 Ti", DRIVER_NVIDIA_GEFORCE8, 1024},
1350  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX560M, "NVIDIA GeForce GTX 560M", DRIVER_NVIDIA_GEFORCE8, 3072},
1351  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX560, "NVIDIA GeForce GTX 560", DRIVER_NVIDIA_GEFORCE8, 1024},
1352  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX570, "NVIDIA GeForce GTX 570", DRIVER_NVIDIA_GEFORCE8, 1280},
1353  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX580, "NVIDIA GeForce GTX 580", DRIVER_NVIDIA_GEFORCE8, 1536},
1354  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT610, "NVIDIA GeForce GT 610", DRIVER_NVIDIA_GEFORCE8, 1024},
1355  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT630, "NVIDIA GeForce GT 630", DRIVER_NVIDIA_GEFORCE8, 1024},
1356  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT630M, "NVIDIA GeForce GT 630M", DRIVER_NVIDIA_GEFORCE8, 1024},
1357  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT640M, "NVIDIA GeForce GT 640M", DRIVER_NVIDIA_GEFORCE8, 1024},
1358  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT650M, "NVIDIA GeForce GT 650M", DRIVER_NVIDIA_GEFORCE8, 2048},
1359  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX650, "NVIDIA GeForce GTX 650", DRIVER_NVIDIA_GEFORCE8, 1024},
1360  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX650TI, "NVIDIA GeForce GTX 650 Ti", DRIVER_NVIDIA_GEFORCE8, 1024},
1361  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX660, "NVIDIA GeForce GTX 660", DRIVER_NVIDIA_GEFORCE8, 2048},
1362  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX660M, "NVIDIA GeForce GTX 660M", DRIVER_NVIDIA_GEFORCE8, 2048},
1363  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX660TI, "NVIDIA GeForce GTX 660 Ti", DRIVER_NVIDIA_GEFORCE8, 2048},
1364  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX670, "NVIDIA GeForce GTX 670", DRIVER_NVIDIA_GEFORCE8, 2048},
1365  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX670MX, "NVIDIA GeForce GTX 670MX", DRIVER_NVIDIA_GEFORCE8, 3072},
1366  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX675MX, "NVIDIA GeForce GTX 675MX", DRIVER_NVIDIA_GEFORCE8, 4096},
1367  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX680, "NVIDIA GeForce GTX 680", DRIVER_NVIDIA_GEFORCE8, 2048},
1368  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX690, "NVIDIA GeForce GTX 690", DRIVER_NVIDIA_GEFORCE8, 2048},
1369  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT730, "NVIDIA GeForce GT 730", DRIVER_NVIDIA_GEFORCE8, 2048},
1370  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT730M, "NVIDIA GeForce GT 730M", DRIVER_NVIDIA_GEFORCE8, 1024},
1371  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT740M, "NVIDIA GeForce GT 740M", DRIVER_NVIDIA_GEFORCE8, 2048},
1372  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT750M, "NVIDIA GeForce GT 750M", DRIVER_NVIDIA_GEFORCE8, 1024},
1373  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX750, "NVIDIA GeForce GTX 750", DRIVER_NVIDIA_GEFORCE8, 1024},
1374  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX750TI, "NVIDIA GeForce GTX 750 Ti", DRIVER_NVIDIA_GEFORCE8, 2048},
1375  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX760, "NVIDIA GeForce GTX 760", DRIVER_NVIDIA_GEFORCE8, 2048},
1376  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX760TI, "NVIDIA GeForce GTX 760 Ti", DRIVER_NVIDIA_GEFORCE8, 2048},
1377  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX765M, "NVIDIA GeForce GTX 765M", DRIVER_NVIDIA_GEFORCE8, 2048},
1378  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX770M, "NVIDIA GeForce GTX 770M", DRIVER_NVIDIA_GEFORCE8, 3072},
1379  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX770, "NVIDIA GeForce GTX 770", DRIVER_NVIDIA_GEFORCE8, 2048},
1380  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX780, "NVIDIA GeForce GTX 780", DRIVER_NVIDIA_GEFORCE8, 3072},
1381  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX780TI, "NVIDIA GeForce GTX 780 Ti", DRIVER_NVIDIA_GEFORCE8, 3072},
1382  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTXTITAN, "NVIDIA GeForce GTX TITAN", DRIVER_NVIDIA_GEFORCE8, 6144},
1383  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTXTITANB, "NVIDIA GeForce GTX TITAN Black", DRIVER_NVIDIA_GEFORCE8, 6144},
1384  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTXTITANX, "NVIDIA GeForce GTX TITAN X", DRIVER_NVIDIA_GEFORCE8, 12288},
1385  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTXTITANZ, "NVIDIA GeForce GTX TITAN Z", DRIVER_NVIDIA_GEFORCE8, 12288},
1386  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_820M, "NVIDIA GeForce 820M", DRIVER_NVIDIA_GEFORCE8, 2048},
1387  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_830M, "NVIDIA GeForce 830M", DRIVER_NVIDIA_GEFORCE8, 2048},
1388  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_840M, "NVIDIA GeForce 840M", DRIVER_NVIDIA_GEFORCE8, 2048},
1389  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_845M, "NVIDIA GeForce 845M", DRIVER_NVIDIA_GEFORCE8, 2048},
1390  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX850M, "NVIDIA GeForce GTX 850M", DRIVER_NVIDIA_GEFORCE8, 2048},
1391  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX860M, "NVIDIA GeForce GTX 860M", DRIVER_NVIDIA_GEFORCE8, 2048},
1392  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX870M, "NVIDIA GeForce GTX 870M", DRIVER_NVIDIA_GEFORCE8, 3072},
1393  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX880M, "NVIDIA GeForce GTX 880M", DRIVER_NVIDIA_GEFORCE8, 4096},
1394  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_940M, "NVIDIA GeForce 940M", DRIVER_NVIDIA_GEFORCE8, 4096},
1395  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX950, "NVIDIA GeForce GTX 950", DRIVER_NVIDIA_GEFORCE8, 2048},
1396  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX950M, "NVIDIA GeForce GTX 950M", DRIVER_NVIDIA_GEFORCE8, 4096},
1397  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX960, "NVIDIA GeForce GTX 960", DRIVER_NVIDIA_GEFORCE8, 4096},
1398  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX960M, "NVIDIA GeForce GTX 960M", DRIVER_NVIDIA_GEFORCE8, 2048},
1399  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX970, "NVIDIA GeForce GTX 970", DRIVER_NVIDIA_GEFORCE8, 4096},
1400  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX970M, "NVIDIA GeForce GTX 970M", DRIVER_NVIDIA_GEFORCE8, 3072},
1401  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX980, "NVIDIA GeForce GTX 980", DRIVER_NVIDIA_GEFORCE8, 4096},
1402  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX980TI, "NVIDIA GeForce GTX 980 Ti", DRIVER_NVIDIA_GEFORCE8, 6144},
1403  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1050, "NVIDIA GeForce GTX 1050", DRIVER_NVIDIA_GEFORCE8, 2048},
1404  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1050TI, "NVIDIA GeForce GTX 1050 Ti", DRIVER_NVIDIA_GEFORCE8, 4096},
1405  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1060, "NVIDIA GeForce GTX 1060", DRIVER_NVIDIA_GEFORCE8, 6144},
1406  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1070, "NVIDIA GeForce GTX 1070", DRIVER_NVIDIA_GEFORCE8, 8192},
1407  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1080, "NVIDIA GeForce GTX 1080", DRIVER_NVIDIA_GEFORCE8, 8192},
1408  {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1080TI, "NVIDIA GeForce GTX 1080 Ti", DRIVER_NVIDIA_GEFORCE8, 11264},
1409  {HW_VENDOR_NVIDIA, CARD_NVIDIA_TITANX_PASCAL, "NVIDIA TITAN X (Pascal)", DRIVER_NVIDIA_GEFORCE8, 12288},
1410  {HW_VENDOR_NVIDIA, CARD_NVIDIA_TITANV, "NVIDIA TITAN V", DRIVER_NVIDIA_GEFORCE8, 12288},
1411 
1412  /* AMD cards */
1413  {HW_VENDOR_AMD, CARD_AMD_RAGE_128PRO, "ATI Rage Fury", DRIVER_AMD_RAGE_128PRO, 16 },
1414  {HW_VENDOR_AMD, CARD_AMD_RADEON_7200, "ATI RADEON 7200 SERIES", DRIVER_AMD_R100, 32 },
1415  {HW_VENDOR_AMD, CARD_AMD_RADEON_8500, "ATI RADEON 8500 SERIES", DRIVER_AMD_R100, 64 },
1416  {HW_VENDOR_AMD, CARD_AMD_RADEON_9500, "ATI Radeon 9500", DRIVER_AMD_R300, 64 },
1417  {HW_VENDOR_AMD, CARD_AMD_RADEON_XPRESS_200M, "ATI RADEON XPRESS 200M Series", DRIVER_AMD_R300, 64 },
1418  {HW_VENDOR_AMD, CARD_AMD_RADEON_X700, "ATI Radeon X700 SE", DRIVER_AMD_R300, 128 },
1419  {HW_VENDOR_AMD, CARD_AMD_RADEON_X1600, "ATI Radeon X1600 Series", DRIVER_AMD_R300, 128 },
1420  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD2350, "ATI Mobility Radeon HD 2350", DRIVER_AMD_R600, 256 },
1421  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD2600, "ATI Mobility Radeon HD 2600", DRIVER_AMD_R600, 256 },
1422  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD2900, "ATI Radeon HD 2900 XT", DRIVER_AMD_R600, 512 },
1423  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD3200, "ATI Radeon HD 3200 Graphics", DRIVER_AMD_R600, 128 },
1424  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD3850, "ATI Radeon HD 3850 AGP", DRIVER_AMD_R600, 512 },
1425  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD4200M, "ATI Mobility Radeon HD 4200", DRIVER_AMD_R600, 256 },
1426  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD4350, "ATI Radeon HD 4350", DRIVER_AMD_R600, 256 },
1427  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD4600, "ATI Radeon HD 4600 Series", DRIVER_AMD_R600, 512 },
1428  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD4700, "ATI Radeon HD 4700 Series", DRIVER_AMD_R600, 512 },
1429  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD4800, "ATI Radeon HD 4800 Series", DRIVER_AMD_R600, 512 },
1430  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD5400, "ATI Radeon HD 5400 Series", DRIVER_AMD_R600, 512 },
1431  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD5600, "ATI Radeon HD 5600 Series", DRIVER_AMD_R600, 512 },
1432  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD5700, "ATI Radeon HD 5700 Series", DRIVER_AMD_R600, 512 },
1433  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD5800, "ATI Radeon HD 5800 Series", DRIVER_AMD_R600, 1024},
1434  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD5900, "ATI Radeon HD 5900 Series", DRIVER_AMD_R600, 1024},
1435  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6300, "AMD Radeon HD 6300 series Graphics", DRIVER_AMD_R600, 1024},
1436  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6400, "AMD Radeon HD 6400 Series", DRIVER_AMD_R600, 1024},
1437  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6410D, "AMD Radeon HD 6410D", DRIVER_AMD_R600, 1024},
1438  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6480G, "AMD Radeon HD 6480G", DRIVER_AMD_R600, 512 },
1439  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6550D, "AMD Radeon HD 6550D", DRIVER_AMD_R600, 1024},
1440  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6600, "AMD Radeon HD 6600 Series", DRIVER_AMD_R600, 1024},
1441  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6600M, "AMD Radeon HD 6600M Series", DRIVER_AMD_R600, 512 },
1442  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6700, "AMD Radeon HD 6700 Series", DRIVER_AMD_R600, 1024},
1443  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6800, "AMD Radeon HD 6800 Series", DRIVER_AMD_R600, 1024},
1444  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6900, "AMD Radeon HD 6900 Series", DRIVER_AMD_R600, 2048},
1445  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD7660D, "AMD Radeon HD 7660D", DRIVER_AMD_R600, 2048},
1446  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD7700, "AMD Radeon HD 7700 Series", DRIVER_AMD_R600, 1024},
1447  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD7800, "AMD Radeon HD 7800 Series", DRIVER_AMD_R600, 2048},
1448  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD7900, "AMD Radeon HD 7900 Series", DRIVER_AMD_R600, 2048},
1449  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD8600M, "AMD Radeon HD 8600M Series", DRIVER_AMD_R600, 1024},
1450  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD8670, "AMD Radeon HD 8670", DRIVER_AMD_R600, 2048},
1451  {HW_VENDOR_AMD, CARD_AMD_RADEON_HD8770, "AMD Radeon HD 8770", DRIVER_AMD_R600, 2048},
1452  {HW_VENDOR_AMD, CARD_AMD_RADEON_R3, "AMD Radeon HD 8400 / R3 Series", DRIVER_AMD_R600, 2048},
1453  {HW_VENDOR_AMD, CARD_AMD_RADEON_R7, "AMD Radeon(TM) R7 Graphics", DRIVER_AMD_R600, 2048},
1454  {HW_VENDOR_AMD, CARD_AMD_RADEON_R9_285, "AMD Radeon R9 285", DRIVER_AMD_RX, 2048},
1455  {HW_VENDOR_AMD, CARD_AMD_RADEON_R9_290, "AMD Radeon R9 290", DRIVER_AMD_RX, 4096},
1456  {HW_VENDOR_AMD, CARD_AMD_RADEON_R9_FURY, "AMD Radeon (TM) R9 Fury Series", DRIVER_AMD_RX, 4096},
1457  {HW_VENDOR_AMD, CARD_AMD_RADEON_RX_460, "Radeon(TM) RX 460 Graphics", DRIVER_AMD_RX, 4096},
1458  {HW_VENDOR_AMD, CARD_AMD_RADEON_RX_480, "Radeon (TM) RX 480 Graphics", DRIVER_AMD_RX, 4096},
1459 
1460  /* VMware */
1461  {HW_VENDOR_VMWARE, CARD_VMWARE_SVGA3D, "VMware SVGA 3D (Microsoft Corporation - WDDM)", DRIVER_VMWARE, 1024},
1462 
1463  /* Intel cards */
1464  {HW_VENDOR_INTEL, CARD_INTEL_830M, "Intel(R) 82830M Graphics Controller", DRIVER_INTEL_GMA800, 32 },
1465  {HW_VENDOR_INTEL, CARD_INTEL_855GM, "Intel(R) 82852/82855 GM/GME Graphics Controller", DRIVER_INTEL_GMA800, 32 },
1466  {HW_VENDOR_INTEL, CARD_INTEL_845G, "Intel(R) 845G", DRIVER_INTEL_GMA800, 32 },
1467  {HW_VENDOR_INTEL, CARD_INTEL_865G, "Intel(R) 82865G Graphics Controller", DRIVER_INTEL_GMA800, 32 },
1468  {HW_VENDOR_INTEL, CARD_INTEL_915G, "Intel(R) 82915G/GV/910GL Express Chipset Family", DRIVER_INTEL_GMA900, 64 },
1469  {HW_VENDOR_INTEL, CARD_INTEL_E7221G, "Intel(R) E7221G", DRIVER_INTEL_GMA900, 64 },
1470  {HW_VENDOR_INTEL, CARD_INTEL_915GM, "Mobile Intel(R) 915GM/GMS,910GML Express Chipset Family", DRIVER_INTEL_GMA900, 64 },
1471  {HW_VENDOR_INTEL, CARD_INTEL_945G, "Intel(R) 945G", DRIVER_INTEL_GMA950, 64 },
1472  {HW_VENDOR_INTEL, CARD_INTEL_945GM, "Mobile Intel(R) 945GM Express Chipset Family", DRIVER_INTEL_GMA950, 64 },
1473  {HW_VENDOR_INTEL, CARD_INTEL_945GME, "Intel(R) 945GME", DRIVER_INTEL_GMA950, 64 },
1474  {HW_VENDOR_INTEL, CARD_INTEL_Q35, "Intel(R) Q35", DRIVER_INTEL_GMA950, 64 },
1475  {HW_VENDOR_INTEL, CARD_INTEL_G33, "Intel(R) G33", DRIVER_INTEL_GMA950, 64 },
1476  {HW_VENDOR_INTEL, CARD_INTEL_Q33, "Intel(R) Q33", DRIVER_INTEL_GMA950, 64 },
1477  {HW_VENDOR_INTEL, CARD_INTEL_PNVG, "Intel(R) IGD", DRIVER_INTEL_GMA950, 64 },
1478  {HW_VENDOR_INTEL, CARD_INTEL_PNVM, "Intel(R) IGD", DRIVER_INTEL_GMA950, 64 },
1479  {HW_VENDOR_INTEL, CARD_INTEL_965Q, "Intel(R) 965Q", DRIVER_INTEL_GMA3000, 128},
1480  {HW_VENDOR_INTEL, CARD_INTEL_965G, "Intel(R) 965G", DRIVER_INTEL_GMA3000, 128},
1481  {HW_VENDOR_INTEL, CARD_INTEL_946GZ, "Intel(R) 946GZ", DRIVER_INTEL_GMA3000, 128},
1482  {HW_VENDOR_INTEL, CARD_INTEL_965GM, "Mobile Intel(R) 965 Express Chipset Family", DRIVER_INTEL_GMA3000, 128},
1483  {HW_VENDOR_INTEL, CARD_INTEL_965GME, "Intel(R) 965GME", DRIVER_INTEL_GMA3000, 128},
1484  {HW_VENDOR_INTEL, CARD_INTEL_GM45, "Mobile Intel(R) GM45 Express Chipset Family", DRIVER_INTEL_GMA3000, 512},
1485  {HW_VENDOR_INTEL, CARD_INTEL_IGD, "Intel(R) Integrated Graphics Device", DRIVER_INTEL_GMA3000, 512},
1486  {HW_VENDOR_INTEL, CARD_INTEL_G45, "Intel(R) G45/G43", DRIVER_INTEL_GMA3000, 512},
1487  {HW_VENDOR_INTEL, CARD_INTEL_Q45, "Intel(R) Q45/Q43", DRIVER_INTEL_GMA3000, 512},
1488  {HW_VENDOR_INTEL, CARD_INTEL_G41, "Intel(R) G41", DRIVER_INTEL_GMA3000, 512},
1489  {HW_VENDOR_INTEL, CARD_INTEL_B43, "Intel(R) B43", DRIVER_INTEL_GMA3000, 512},
1490  {HW_VENDOR_INTEL, CARD_INTEL_ILKD, "Intel(R) HD Graphics", DRIVER_INTEL_GMA3000, 1536},
1491  {HW_VENDOR_INTEL, CARD_INTEL_ILKM, "Intel(R) HD Graphics", DRIVER_INTEL_GMA3000, 1536},
1492  {HW_VENDOR_INTEL, CARD_INTEL_SNBD, "Intel(R) HD Graphics 3000", DRIVER_INTEL_GMA3000, 1536},
1493  {HW_VENDOR_INTEL, CARD_INTEL_SNBM, "Intel(R) HD Graphics 3000", DRIVER_INTEL_GMA3000, 1536},
1494  {HW_VENDOR_INTEL, CARD_INTEL_SNBS, "Intel(R) HD Graphics Family", DRIVER_INTEL_GMA3000, 1536},
1495  {HW_VENDOR_INTEL, CARD_INTEL_IVBD, "Intel(R) HD Graphics 4000", DRIVER_INTEL_HD4000, 1536},
1496  {HW_VENDOR_INTEL, CARD_INTEL_IVBM, "Intel(R) HD Graphics 4000", DRIVER_INTEL_HD4000, 1536},
1497  {HW_VENDOR_INTEL, CARD_INTEL_IVBS, "Intel(R) HD Graphics Family", DRIVER_INTEL_HD4000, 1536},
1498  {HW_VENDOR_INTEL, CARD_INTEL_HWD, "Intel(R) HD Graphics 4600", DRIVER_INTEL_HD4000, 1536},
1499  {HW_VENDOR_INTEL, CARD_INTEL_HWM, "Intel(R) HD Graphics 4600", DRIVER_INTEL_HD4000, 1536},
1500  {HW_VENDOR_INTEL, CARD_INTEL_HD5000, "Intel(R) HD Graphics 5000", DRIVER_INTEL_HD4000, 1536},
1501  {HW_VENDOR_INTEL, CARD_INTEL_I5100_1, "Intel(R) Iris(TM) Graphics 5100", DRIVER_INTEL_HD4000, 1536},
1502  {HW_VENDOR_INTEL, CARD_INTEL_I5100_2, "Intel(R) Iris(TM) Graphics 5100", DRIVER_INTEL_HD4000, 1536},
1503  {HW_VENDOR_INTEL, CARD_INTEL_I5100_3, "Intel(R) Iris(TM) Graphics 5100", DRIVER_INTEL_HD4000, 1536},
1504  {HW_VENDOR_INTEL, CARD_INTEL_I5100_4, "Intel(R) Iris(TM) Graphics 5100", DRIVER_INTEL_HD4000, 1536},
1505  {HW_VENDOR_INTEL, CARD_INTEL_IP5200_1, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 1536},
1506  {HW_VENDOR_INTEL, CARD_INTEL_IP5200_2, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 1536},
1507  {HW_VENDOR_INTEL, CARD_INTEL_IP5200_3, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 1536},
1508  {HW_VENDOR_INTEL, CARD_INTEL_IP5200_4, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 1536},
1509  {HW_VENDOR_INTEL, CARD_INTEL_IP5200_5, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 1536},
1510  {HW_VENDOR_INTEL, CARD_INTEL_HD5300, "Intel(R) HD Graphics 5300", DRIVER_INTEL_HD4000, 2048},
1511  {HW_VENDOR_INTEL, CARD_INTEL_HD5500, "Intel(R) HD Graphics 5500", DRIVER_INTEL_HD4000, 2048},
1512  {HW_VENDOR_INTEL, CARD_INTEL_HD5600, "Intel(R) HD Graphics 5600", DRIVER_INTEL_HD4000, 2048},
1513  {HW_VENDOR_INTEL, CARD_INTEL_HD6000, "Intel(R) HD Graphics 6000", DRIVER_INTEL_HD4000, 2048},
1514  {HW_VENDOR_INTEL, CARD_INTEL_I6100, "Intel(R) Iris(TM) Graphics 6100", DRIVER_INTEL_HD4000, 2048},
1515  {HW_VENDOR_INTEL, CARD_INTEL_IP6200, "Intel(R) Iris(TM) Pro Graphics 6200", DRIVER_INTEL_HD4000, 2048},
1516  {HW_VENDOR_INTEL, CARD_INTEL_IPP6300, "Intel(R) Iris(TM) Pro Graphics P6300", DRIVER_INTEL_HD4000, 2048},
1517  {HW_VENDOR_INTEL, CARD_INTEL_HD510_1, "Intel(R) HD Graphics 510", DRIVER_INTEL_HD4000, 2048},
1518  {HW_VENDOR_INTEL, CARD_INTEL_HD510_2, "Intel(R) HD Graphics 510", DRIVER_INTEL_HD4000, 2048},
1519  {HW_VENDOR_INTEL, CARD_INTEL_HD510_3, "Intel(R) HD Graphics 510", DRIVER_INTEL_HD4000, 2048},
1520  {HW_VENDOR_INTEL, CARD_INTEL_HD515, "Intel(R) HD Graphics 515", DRIVER_INTEL_HD4000, 2048},
1521  {HW_VENDOR_INTEL, CARD_INTEL_HD520_1, "Intel(R) HD Graphics 520", DRIVER_INTEL_HD4000, 2048},
1522  {HW_VENDOR_INTEL, CARD_INTEL_HD520_2, "Intel(R) HD Graphics 520", DRIVER_INTEL_HD4000, 2048},
1523  {HW_VENDOR_INTEL, CARD_INTEL_HD530_1, "Intel(R) HD Graphics 530", DRIVER_INTEL_HD4000, 2048},
1524  {HW_VENDOR_INTEL, CARD_INTEL_HD530_2, "Intel(R) HD Graphics 530", DRIVER_INTEL_HD4000, 2048},
1525  {HW_VENDOR_INTEL, CARD_INTEL_HDP530, "Intel(R) HD Graphics P530", DRIVER_INTEL_HD4000, 2048},
1526  {HW_VENDOR_INTEL, CARD_INTEL_I540, "Intel(R) Iris(TM) Graphics 540", DRIVER_INTEL_HD4000, 2048},
1527  {HW_VENDOR_INTEL, CARD_INTEL_I550, "Intel(R) Iris(TM) Graphics 550", DRIVER_INTEL_HD4000, 2048},
1528  {HW_VENDOR_INTEL, CARD_INTEL_I555, "Intel(R) Iris(TM) Graphics 555", DRIVER_INTEL_HD4000, 2048},
1529  {HW_VENDOR_INTEL, CARD_INTEL_IP555, "Intel(R) Iris(TM) Graphics P555", DRIVER_INTEL_HD4000, 2048},
1530  {HW_VENDOR_INTEL, CARD_INTEL_IP580_1, "Intel(R) Iris(TM) Pro Graphics 580", DRIVER_INTEL_HD4000, 2048},
1531  {HW_VENDOR_INTEL, CARD_INTEL_IP580_2, "Intel(R) Iris(TM) Pro Graphics 580", DRIVER_INTEL_HD4000, 2048},
1532  {HW_VENDOR_INTEL, CARD_INTEL_IPP580_1, "Intel(R) Iris(TM) Pro Graphics P580", DRIVER_INTEL_HD4000, 2048},
1533  {HW_VENDOR_INTEL, CARD_INTEL_IPP580_2, "Intel(R) Iris(TM) Pro Graphics P580", DRIVER_INTEL_HD4000, 2048},
1534 };
1535 
1538 {
1539  unsigned int i;
1540 
1541  TRACE("Looking up version info for driver=%d driver_model=%d\n", driver, driver_model);
1542  for (i = 0; i < ARRAY_SIZE(driver_version_table); ++i)
1543  {
1544  const struct driver_version_information *entry = &driver_version_table[i];
1545 
1546  if (entry->driver == driver && (driver_model == DRIVER_MODEL_GENERIC
1547  || entry->driver_model == driver_model))
1548  {
1549  TRACE("Found driver \"%s\", version %u, subversion %u, build %u.\n",
1550  entry->driver_name, entry->version, entry->subversion, entry->build);
1551  return entry;
1552  }
1553  }
1554  return NULL;
1555 }
1556 
1559 {
1560  unsigned int i;
1561 
1562  for (i = 0; i < ARRAY_SIZE(gpu_description_table); ++i)
1563  {
1564  if (vendor == gpu_description_table[i].vendor && device == gpu_description_table[i].card)
1565  return &gpu_description_table[i];
1566  }
1567 
1568  return NULL;
1569 }
1570 
1571 static const struct gpu_description *query_gpu_description(const struct wined3d_gl_info *gl_info, UINT64 *vram_bytes)
1572 {
1575  const struct gpu_description *gpu_description;
1576  static unsigned int once;
1577 
1578  if (gl_info->supported[WGL_WINE_QUERY_RENDERER])
1579  {
1580  GLuint value;
1581 
1582  if (GL_EXTCALL(wglQueryCurrentRendererIntegerWINE(WGL_RENDERER_VENDOR_ID_WINE, &value)))
1583  vendor = value;
1584  if (GL_EXTCALL(wglQueryCurrentRendererIntegerWINE(WGL_RENDERER_DEVICE_ID_WINE, &value)))
1585  device = value;
1586  if (GL_EXTCALL(wglQueryCurrentRendererIntegerWINE(WGL_RENDERER_VIDEO_MEMORY_WINE, &value)))
1587  *vram_bytes = (UINT64)value * 1024 * 1024;
1588  TRACE("Card reports vendor PCI ID 0x%04x, device PCI ID 0x%04x, 0x%s bytes of video memory.\n",
1589  vendor, device, wine_dbgstr_longlong(*vram_bytes));
1590  }
1591  else if (gl_info->supported[NVX_GPU_MEMORY_INFO])
1592  {
1593  GLint vram_kb;
1594  gl_info->gl_ops.gl.p_glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &vram_kb);
1595 
1596  *vram_bytes = (UINT64)vram_kb * 1024;
1597  TRACE("Got 0x%s as video memory from NVX_GPU_MEMORY_INFO extension.\n",
1598  wine_dbgstr_longlong(*vram_bytes));
1599  }
1600 
1602  {
1604  TRACE("Overriding vendor PCI ID with 0x%04x.\n", vendor);
1605  }
1606 
1608  {
1610  TRACE("Overriding device PCI ID with 0x%04x.\n", device);
1611  }
1612 
1614  {
1615  *vram_bytes = wined3d_settings.emulated_textureram;
1616  TRACE("Overriding amount of video memory with 0x%s bytes.\n",
1617  wine_dbgstr_longlong(*vram_bytes));
1618  }
1619 
1620  if (!(gpu_description = get_gpu_description(vendor, device))
1623  ERR_(winediag)("Invalid GPU override %04x:%04x specified, ignoring.\n", vendor, device);
1624 
1625  return gpu_description;
1626 }
1627 
1628 static void init_driver_info(struct wined3d_driver_info *driver_info,
1629  const struct gpu_description *gpu_desc, UINT64 vram_bytes)
1630 {
1631  OSVERSIONINFOW os_version;
1632  WORD driver_os_version;
1634  enum wined3d_driver_model driver_model;
1635  const struct driver_version_information *version_info;
1636 
1637  memset(&os_version, 0, sizeof(os_version));
1638  os_version.dwOSVersionInfoSize = sizeof(os_version);
1639  if (!GetVersionExW(&os_version))
1640  {
1641  ERR("Failed to get OS version, reporting 2000/XP.\n");
1642  driver_os_version = 6;
1643  driver_model = DRIVER_MODEL_NT5X;
1644  }
1645  else
1646  {
1647  TRACE("OS version %u.%u.\n", os_version.dwMajorVersion, os_version.dwMinorVersion);
1648  switch (os_version.dwMajorVersion)
1649  {
1650  case 4:
1651  /* If needed we could distinguish between 9x and NT4, but this code won't make
1652  * sense for NT4 since it had no way to obtain this info through DirectDraw 3.0.
1653  */
1654  driver_os_version = 4;
1655  driver_model = DRIVER_MODEL_WIN9X;
1656  break;
1657 
1658  case 5:
1659  driver_os_version = 6;
1660  driver_model = DRIVER_MODEL_NT5X;
1661  break;
1662 
1663  case 6:
1664  if (os_version.dwMinorVersion == 0)
1665  {
1666  driver_os_version = 7;
1667  driver_model = DRIVER_MODEL_NT6X;
1668  }
1669  else if (os_version.dwMinorVersion == 1)
1670  {
1671  driver_os_version = 8;
1672  driver_model = DRIVER_MODEL_NT6X;
1673  }
1674  else
1675  {
1676  if (os_version.dwMinorVersion > 2)
1677  {
1678  FIXME("Unhandled OS version %u.%u, reporting Win 8.\n",
1679  os_version.dwMajorVersion, os_version.dwMinorVersion);
1680  }
1681  driver_os_version = 9;
1682  driver_model = DRIVER_MODEL_NT6X;
1683  }
1684  break;
1685 
1686  case 10:
1687  driver_os_version = 10;
1688  driver_model = DRIVER_MODEL_NT6X;
1689  break;
1690 
1691  default:
1692  FIXME("Unhandled OS version %u.%u, reporting 2000/XP.\n",
1693  os_version.dwMajorVersion, os_version.dwMinorVersion);
1694  driver_os_version = 6;
1695  driver_model = DRIVER_MODEL_NT5X;
1696  break;
1697  }
1698  }
1699 
1700  driver_info->vendor = gpu_desc->vendor;
1701  driver_info->device = gpu_desc->card;
1702  driver_info->description = gpu_desc->description;
1703  driver_info->vram_bytes = vram_bytes ? vram_bytes : (UINT64)gpu_desc->vidmem * 1024 * 1024;
1704  driver = gpu_desc->driver;
1705 
1711  if (driver_model < DRIVER_MODEL_NT6X && driver_info->vram_bytes > LONG_MAX)
1712  {
1713  TRACE("Limiting amount of video memory to %#lx bytes for OS version older than Vista.\n", LONG_MAX);
1714  driver_info->vram_bytes = LONG_MAX;
1715  }
1716 
1717  /* Try to obtain driver version information for the current Windows version. This fails in
1718  * some cases:
1719  * - the gpu is not available on the currently selected OS version:
1720  * - Geforce GTX480 on Win98. When running applications in compatibility mode on Windows,
1721  * version information for the current Windows version is returned instead of faked info.
1722  * We do the same and assume the default Windows version to emulate is WinXP.
1723  *
1724  * - Videocard is a Riva TNT but winver is set to win7 (there are no drivers for this beast)
1725  * For now return the XP driver info. Perhaps later on we should return VESA.
1726  *
1727  * - the gpu is not in our database (can happen when the user overrides the vendor_id / device_id)
1728  * This could be an indication that our database is not up to date, so this should be fixed.
1729  */
1730  if ((version_info = get_driver_version_info(driver, driver_model))
1731  || (version_info = get_driver_version_info(driver, DRIVER_MODEL_GENERIC)))
1732  {
1733  driver_info->name = version_info->driver_name;
1734  driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, version_info->version);
1735  driver_info->version_low = MAKEDWORD_VERSION(version_info->subversion, version_info->build);
1736  }
1737  else
1738  {
1739  ERR("No driver version info found for device %04x:%04x, driver model %#x.\n",
1740  driver_info->vendor, driver_info->device, driver_model);
1741  driver_info->name = "Display";
1742  driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, 15);
1743  driver_info->version_low = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */
1744  }
1745 
1746  TRACE("Reporting (fake) driver version 0x%08x-0x%08x.\n",
1747  driver_info->version_high, driver_info->version_low);
1748 }
1749 
1750 /* Context activation is done by the caller. */
1751 static void fixup_extensions(struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
1752  const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
1754 {
1755  unsigned int i;
1756 
1757  for (i = 0; i < ARRAY_SIZE(quirk_table); ++i)
1758  {
1759  if (!quirk_table[i].match(gl_info, ctx, gl_renderer, gl_vendor, card_vendor, device)) continue;
1760  TRACE("Applying driver quirk \"%s\".\n", quirk_table[i].description);
1761  quirk_table[i].apply(gl_info);
1762  }
1763 
1764  /* Find out if PBOs work as they are supposed to. */
1765  test_pbo_functionality(gl_info);
1766 }
1767 
1768 static DWORD wined3d_parse_gl_version(const char *gl_version)
1769 {
1770  const char *ptr = gl_version;
1771  int major, minor;
1772 
1773  major = atoi(ptr);
1774  if (major <= 0)
1775  ERR("Invalid OpenGL major version %d.\n", major);
1776 
1777  while (isdigit(*ptr)) ++ptr;
1778  if (*ptr++ != '.')
1779  ERR("Invalid OpenGL version string %s.\n", debugstr_a(gl_version));
1780 
1781  minor = atoi(ptr);
1782 
1783  TRACE("Found OpenGL version %d.%d.\n", major, minor);
1784 
1785  return MAKEDWORD_VERSION(major, minor);
1786 }
1787 
1789  const char *gl_vendor_string, const char *gl_renderer, const char *gl_version)
1790 {
1791  /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
1792  * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
1793  * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
1794  *
1795  * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
1796  * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
1797  * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
1798  * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
1799  * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
1800  * the chance that other implementations support them is rather small since Win32 QuickTime uses
1801  * DirectDraw, not OpenGL. */
1802  if (gl_info->supported[APPLE_FENCE] && gl_info->supported[APPLE_YCBCR_422])
1803  return GL_VENDOR_APPLE;
1804 
1805  if (strstr(gl_vendor_string, "NVIDIA"))
1806  return GL_VENDOR_NVIDIA;
1807 
1808  if (strstr(gl_vendor_string, "ATI"))
1809  return GL_VENDOR_FGLRX;
1810 
1811  if (strstr(gl_vendor_string, "Mesa")
1812  || strstr(gl_vendor_string, "Brian Paul")
1813  || strstr(gl_vendor_string, "X.Org")
1814  || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
1815  || strstr(gl_vendor_string, "DRI R300 Project")
1816  || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
1817  || strstr(gl_vendor_string, "VMware, Inc.")
1818  || strstr(gl_vendor_string, "Intel")
1819  || strstr(gl_renderer, "Mesa")
1820  || strstr(gl_renderer, "Gallium")
1821  || strstr(gl_renderer, "Intel")
1822  || strstr(gl_version, "Mesa"))
1823  return GL_VENDOR_MESA;
1824 
1825  FIXME("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_UNKNOWN.\n",
1826  debugstr_a(gl_vendor_string));
1827 
1828  return GL_VENDOR_UNKNOWN;
1829 }
1830 
1831 static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
1832 {
1833  if (strstr(gl_vendor_string, "NVIDIA")
1834  || strstr(gl_vendor_string, "Nouveau")
1835  || strstr(gl_vendor_string, "nouveau"))
1836  return HW_VENDOR_NVIDIA;
1837 
1838  if (strstr(gl_vendor_string, "ATI")
1839  || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
1840  || strstr(gl_vendor_string, "X.Org R300 Project")
1841  || strstr(gl_renderer, "AMD")
1842  || strstr(gl_renderer, "FirePro")
1843  || strstr(gl_renderer, "Radeon")
1844  || strstr(gl_renderer, "R100")
1845  || strstr(gl_renderer, "R200")
1846  || strstr(gl_renderer, "R300")
1847  || strstr(gl_renderer, "R600")
1848  || strstr(gl_renderer, "R700"))
1849  return HW_VENDOR_AMD;
1850 
1851  if (strstr(gl_vendor_string, "Intel(R)")
1852  /* Intel switched from Intel(R) to Intel® recently, so just match Intel. */
1853  || strstr(gl_renderer, "Intel")
1854  || strstr(gl_renderer, "i915")
1855  || strstr(gl_vendor_string, "Intel Inc."))
1856  return HW_VENDOR_INTEL;
1857 
1858  if (strstr(gl_renderer, "SVGA3D"))
1859  return HW_VENDOR_VMWARE;
1860 
1861  if (strstr(gl_vendor_string, "Mesa")
1862  || strstr(gl_vendor_string, "Brian Paul")
1863  || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
1864  || strstr(gl_vendor_string, "VMware, Inc."))
1865  return HW_VENDOR_SOFTWARE;
1866 
1867  FIXME("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string));
1868 
1869  return HW_VENDOR_NVIDIA;
1870 }
1871 
1872 static enum wined3d_d3d_level d3d_level_from_caps(const struct shader_caps *shader_caps, const struct fragment_caps *fragment_caps, DWORD glsl_version)
1873 {
1874  if (shader_caps->vs_version >= 5)
1875  return WINED3D_D3D_LEVEL_11;
1876  if (shader_caps->vs_version == 4)
1877  return WINED3D_D3D_LEVEL_10;
1878  if (shader_caps->vs_version == 3)
1879  {
1880  /* wined3d with default settings at the moment doesn't expose SM4+ on
1881  * Mesa drivers. */
1882  if (glsl_version >= MAKEDWORD_VERSION(4, 30))
1883  return WINED3D_D3D_LEVEL_11;
1884  if (glsl_version >= MAKEDWORD_VERSION(1, 30))
1885  return WINED3D_D3D_LEVEL_10;
1886  return WINED3D_D3D_LEVEL_9_SM3;
1887  }
1888  if (shader_caps->vs_version == 2)
1889  return WINED3D_D3D_LEVEL_9_SM2;
1890  if (shader_caps->vs_version == 1)
1891  return WINED3D_D3D_LEVEL_8;
1892 
1893  if (fragment_caps->TextureOpCaps & WINED3DTEXOPCAPS_DOTPRODUCT3)
1894  return WINED3D_D3D_LEVEL_7;
1895  if (fragment_caps->MaxSimultaneousTextures > 1)
1896  return WINED3D_D3D_LEVEL_6;
1897 
1898  return WINED3D_D3D_LEVEL_5;
1899 }
1900 
1901 static const struct wined3d_renderer_table
1902 {
1903  const char *renderer;
1905 }
1907 {
1908  /* Direct 3D 11 */
1909  {"TITAN V", CARD_NVIDIA_TITANV}, /* GeForce 1000 - highend */
1910  {"TITAN X (Pascal)", CARD_NVIDIA_TITANX_PASCAL}, /* GeForce 1000 - highend */
1911  {"GTX 1080 Ti", CARD_NVIDIA_GEFORCE_GTX1080TI}, /* GeForce 1000 - highend */
1912  {"GTX 1080", CARD_NVIDIA_GEFORCE_GTX1080}, /* GeForce 1000 - highend */
1913  {"GTX 1070", CARD_NVIDIA_GEFORCE_GTX1070}, /* GeForce 1000 - highend */
1914  {"GTX 1060", CARD_NVIDIA_GEFORCE_GTX1060}, /* GeForce 1000 - midend high */
1915  {"GTX 1050 Ti", CARD_NVIDIA_GEFORCE_GTX1050TI}, /* GeForce 1000 - midend */
1916  {"GTX 1050", CARD_NVIDIA_GEFORCE_GTX1050}, /* GeForce 1000 - midend */
1917  {"GTX 980 Ti", CARD_NVIDIA_GEFORCE_GTX980TI}, /* GeForce 900 - highend */
1918  {"GTX 980", CARD_NVIDIA_GEFORCE_GTX980}, /* GeForce 900 - highend */
1919  {"GTX 970M", CARD_NVIDIA_GEFORCE_GTX970M}, /* GeForce 900 - highend mobile*/
1920  {"GTX 970", CARD_NVIDIA_GEFORCE_GTX970}, /* GeForce 900 - highend */
1921  {"GTX TITAN X", CARD_NVIDIA_GEFORCE_GTXTITANX}, /* Geforce 900 - highend */
1922  {"GTX 960M", CARD_NVIDIA_GEFORCE_GTX960M}, /* GeForce 900 - midend high mobile */
1923  {"GTX 960", CARD_NVIDIA_GEFORCE_GTX960}, /* GeForce 900 - midend high */
1924  {"GTX 950M", CARD_NVIDIA_GEFORCE_GTX950M}, /* GeForce 900 - midend mobile */
1925  {"GTX 950", CARD_NVIDIA_GEFORCE_GTX950}, /* GeForce 900 - midend */
1926  {"GeForce 940M", CARD_NVIDIA_GEFORCE_940M}, /* GeForce 900 - midend mobile */
1927  {"GTX 880M", CARD_NVIDIA_GEFORCE_GTX880M}, /* GeForce 800 - mobile */
1928  {"GTX 870M", CARD_NVIDIA_GEFORCE_GTX870M}, /* GeForce 800 - mobile */
1929  {"GTX 860M", CARD_NVIDIA_GEFORCE_GTX860M}, /* GeForce 800 - mobile */
1930  {"GTX 850M", CARD_NVIDIA_GEFORCE_GTX850M}, /* GeForce 800 - mobile */
1931  {"GeForce 845M", CARD_NVIDIA_GEFORCE_845M}, /* GeForce 800 - mobile */
1932  {"GeForce 840M", CARD_NVIDIA_GEFORCE_840M}, /* GeForce 800 - mobile */
1933  {"GeForce 830M", CARD_NVIDIA_GEFORCE_830M}, /* GeForce 800 - mobile */
1934  {"GeForce 820M", CARD_NVIDIA_GEFORCE_820M}, /* GeForce 800 - mobile */
1935  {"GTX 780 Ti", CARD_NVIDIA_GEFORCE_GTX780TI}, /* Geforce 700 - highend */
1936  {"GTX TITAN Black", CARD_NVIDIA_GEFORCE_GTXTITANB}, /* Geforce 700 - highend */
1937  {"GTX TITAN Z", CARD_NVIDIA_GEFORCE_GTXTITANZ}, /* Geforce 700 - highend */
1938  {"GTX TITAN", CARD_NVIDIA_GEFORCE_GTXTITAN}, /* Geforce 700 - highend */
1939  {"GTX 780", CARD_NVIDIA_GEFORCE_GTX780}, /* Geforce 700 - highend */
1940  {"GTX 770M", CARD_NVIDIA_GEFORCE_GTX770M}, /* Geforce 700 - midend high mobile */
1941  {"GTX 770", CARD_NVIDIA_GEFORCE_GTX770}, /* Geforce 700 - highend */
1942  {"GTX 765M", CARD_NVIDIA_GEFORCE_GTX765M}, /* Geforce 700 - midend high mobile */
1943  {"GTX 760 Ti", CARD_NVIDIA_GEFORCE_GTX760TI}, /* Geforce 700 - midend high */
1944  {"GTX 760", CARD_NVIDIA_GEFORCE_GTX760}, /* Geforce 700 - midend high */
1945  {"GTX 750 Ti", CARD_NVIDIA_GEFORCE_GTX750TI}, /* Geforce 700 - midend */
1946  {"GTX 750", CARD_NVIDIA_GEFORCE_GTX750}, /* Geforce 700 - midend */
1947  {"GT 750M", CARD_NVIDIA_GEFORCE_GT750M}, /* Geforce 700 - midend mobile */
1948  {"GT 740M", CARD_NVIDIA_GEFORCE_GT740M}, /* Geforce 700 - midend mobile */
1949  {"GT 730M", CARD_NVIDIA_GEFORCE_GT730M}, /* Geforce 700 - midend mobile */
1950  {"GT 730", CARD_NVIDIA_GEFORCE_GT730}, /* Geforce 700 - lowend */
1951  {"GTX 690", CARD_NVIDIA_GEFORCE_GTX690}, /* Geforce 600 - highend */
1952  {"GTX 680", CARD_NVIDIA_GEFORCE_GTX680}, /* Geforce 600 - highend */
1953  {"GTX 675MX", CARD_NVIDIA_GEFORCE_GTX675MX}, /* Geforce 600 - highend */
1954  {"GTX 670MX", CARD_NVIDIA_GEFORCE_GTX670MX}, /* Geforce 600 - highend */
1955  {"GTX 670", CARD_NVIDIA_GEFORCE_GTX670}, /* Geforce 600 - midend high */
1956  {"GTX 660 Ti", CARD_NVIDIA_GEFORCE_GTX660TI}, /* Geforce 600 - midend high */
1957  {"GTX 660M", CARD_NVIDIA_GEFORCE_GTX660M}, /* Geforce 600 - midend high mobile */
1958  {"GTX 660", CARD_NVIDIA_GEFORCE_GTX660}, /* Geforce 600 - midend high */
1959  {"GTX 650 Ti", CARD_NVIDIA_GEFORCE_GTX650TI}, /* Geforce 600 - lowend */
1960  {"GTX 650", CARD_NVIDIA_GEFORCE_GTX650}, /* Geforce 600 - lowend */
1961  {"GT 650M", CARD_NVIDIA_GEFORCE_GT650M}, /* Geforce 600 - midend mobile */
1962  {"GT 640M", CARD_NVIDIA_GEFORCE_GT640M}, /* Geforce 600 - midend mobile */
1963  {"GT 630M", CARD_NVIDIA_GEFORCE_GT630M}, /* Geforce 600 - midend mobile */
1964  {"GT 630", CARD_NVIDIA_GEFORCE_GT630}, /* Geforce 600 - lowend */
1965  {"GT 610", CARD_NVIDIA_GEFORCE_GT610}, /* Geforce 600 - lowend */
1966  {"GTX 580", CARD_NVIDIA_GEFORCE_GTX580}, /* Geforce 500 - highend */
1967  {"GTX 570", CARD_NVIDIA_GEFORCE_GTX570}, /* Geforce 500 - midend high */
1968  {"GTX 560 Ti", CARD_NVIDIA_GEFORCE_GTX560TI}, /* Geforce 500 - midend */
1969  {"GTX 560M", CARD_NVIDIA_GEFORCE_GTX560M}, /* Geforce 500 - midend mobile */
1970  {"GTX 560", CARD_NVIDIA_GEFORCE_GTX560}, /* Geforce 500 - midend */
1971  {"GT 555M", CARD_NVIDIA_GEFORCE_GT555M}, /* Geforce 500 - midend mobile */
1972  {"GTX 550 Ti", CARD_NVIDIA_GEFORCE_GTX550}, /* Geforce 500 - midend */
1973  {"GT 540M", CARD_NVIDIA_GEFORCE_GT540M}, /* Geforce 500 - midend mobile */
1974  {"GT 525M", CARD_NVIDIA_GEFORCE_GT525M}, /* Geforce 500 - lowend mobile */
1975  {"GT 520", CARD_NVIDIA_GEFORCE_GT520}, /* Geforce 500 - lowend */
1976  {"GTX 480", CARD_NVIDIA_GEFORCE_GTX480}, /* Geforce 400 - highend */
1977  {"GTX 470", CARD_NVIDIA_GEFORCE_GTX470}, /* Geforce 400 - midend high */
1978  /* Direct 3D 10 */
1979  {"GTX 465", CARD_NVIDIA_GEFORCE_GTX465}, /* Geforce 400 - midend */
1980  {"GTX 460M", CARD_NVIDIA_GEFORCE_GTX460M}, /* Geforce 400 - highend mobile */
1981  {"GTX 460", CARD_NVIDIA_GEFORCE_GTX460}, /* Geforce 400 - midend */
1982  {"GTS 450", CARD_NVIDIA_GEFORCE_GTS450}, /* Geforce 400 - midend low */
1983  {"GT 440", CARD_NVIDIA_GEFORCE_GT440}, /* Geforce 400 - lowend */
1984  {"GT 430", CARD_NVIDIA_GEFORCE_GT430}, /* Geforce 400 - lowend */
1985  {"GT 425M", CARD_NVIDIA_GEFORCE_GT425M}, /* Geforce 400 - lowend mobile */
1986  {"GT 420", CARD_NVIDIA_GEFORCE_GT420}, /* Geforce 400 - lowend */
1987  {"410M", CARD_NVIDIA_GEFORCE_410M}, /* Geforce 400 - lowend mobile */
1988  {"GT 330", CARD_NVIDIA_GEFORCE_GT330}, /* Geforce 300 - highend */
1989  {"GTS 360M", CARD_NVIDIA_GEFORCE_GTS350M}, /* Geforce 300 - highend mobile */
1990  {"GTS 350M", CARD_NVIDIA_GEFORCE_GTS350M}, /* Geforce 300 - highend mobile */
1991  {"GT 330M", CARD_NVIDIA_GEFORCE_GT325M}, /* Geforce 300 - midend mobile */
1992  {"GT 325M", CARD_NVIDIA_GEFORCE_GT325M}, /* Geforce 300 - midend mobile */
1993  {"GT 320M", CARD_NVIDIA_GEFORCE_GT320M}, /* Geforce 300 - midend mobile */
1994  {"320M", CARD_NVIDIA_GEFORCE_320M}, /* Geforce 300 - midend mobile */
1995  {"315M", CARD_NVIDIA_GEFORCE_315M}, /* Geforce 300 - midend mobile */
1996  {"GTX 295", CARD_NVIDIA_GEFORCE_GTX280}, /* Geforce 200 - highend */
1997  {"GTX 285", CARD_NVIDIA_GEFORCE_GTX280}, /* Geforce 200 - highend */
1998  {"GTX 280", CARD_NVIDIA_GEFORCE_GTX280}, /* Geforce 200 - highend */
1999  {"GTX 275", CARD_NVIDIA_GEFORCE_GTX275}, /* Geforce 200 - midend high */
2000  {"GTX 260", CARD_NVIDIA_GEFORCE_GTX260}, /* Geforce 200 - midend */
2001  {"GTS 250", CARD_NVIDIA_GEFORCE_GTS250}, /* Geforce 200 - midend */
2002  {"GT 240", CARD_NVIDIA_GEFORCE_GT240}, /* Geforce 200 - midend */
2003  {"GT 220", CARD_NVIDIA_GEFORCE_GT220}, /* Geforce 200 - lowend */
2004  {"GeForce 310", CARD_NVIDIA_GEFORCE_210}, /* Geforce 200 - lowend */
2005  {"GeForce 305", CARD_NVIDIA_GEFORCE_210}, /* Geforce 200 - lowend */
2006  {"GeForce 210", CARD_NVIDIA_GEFORCE_210}, /* Geforce 200 - lowend */
2007  {"G 210", CARD_NVIDIA_GEFORCE_210}, /* Geforce 200 - lowend */
2008  {"GTS 150", CARD_NVIDIA_GEFORCE_9800GT}, /* Geforce 9 - highend / Geforce 200 - midend */
2009  {"9800", CARD_NVIDIA_GEFORCE_9800GT}, /* Geforce 9 - highend / Geforce 200 - midend */
2010  {"9700M GT", CARD_NVIDIA_GEFORCE_9700MGT}, /* Geforce 9 - midend */
2011  {"GT 140", CARD_NVIDIA_GEFORCE_9600GT}, /* Geforce 9 - midend */
2012  {"9600", CARD_NVIDIA_GEFORCE_9600GT}, /* Geforce 9 - midend */
2013  {"GT 130", CARD_NVIDIA_GEFORCE_9500GT}, /* Geforce 9 - midend low / Geforce 200 - low */
2014  {"GT 120", CARD_NVIDIA_GEFORCE_9500GT}, /* Geforce 9 - midend low / Geforce 200 - low */
2015  {"9500", CARD_NVIDIA_GEFORCE_9500GT}, /* Geforce 9 - midend low / Geforce 200 - low */
2016  {"9400M", CARD_NVIDIA_GEFORCE_9400M}, /* Geforce 9 - lowend */
2017  {"9400", CARD_NVIDIA_GEFORCE_9400GT}, /* Geforce 9 - lowend */
2018  {"9300", CARD_NVIDIA_GEFORCE_9300}, /* Geforce 9 - lowend low */
2019  {"9200", CARD_NVIDIA_GEFORCE_9200}, /* Geforce 9 - lowend low */
2020  {"9100", CARD_NVIDIA_GEFORCE_9200}, /* Geforce 9 - lowend low */
2021  {"G 100", CARD_NVIDIA_GEFORCE_9200}, /* Geforce 9 - lowend low */
2022  {"8800 GTX", CARD_NVIDIA_GEFORCE_8800GTX}, /* Geforce 8 - highend high */
2023  {"8800", CARD_NVIDIA_GEFORCE_8800GTS}, /* Geforce 8 - highend */
2024  {"8600M", CARD_NVIDIA_GEFORCE_8600MGT}, /* Geforce 8 - midend mobile */
2025  {"8600 M", CARD_NVIDIA_GEFORCE_8600MGT}, /* Geforce 8 - midend mobile */
2026  {"8700", CARD_NVIDIA_GEFORCE_8600GT}, /* Geforce 8 - midend */
2027  {"8600", CARD_NVIDIA_GEFORCE_8600GT}, /* Geforce 8 - midend */
2028  {"8500", CARD_NVIDIA_GEFORCE_8500GT}, /* Geforce 8 - mid-lowend */
2029  {"8400", CARD_NVIDIA_GEFORCE_8400GS}, /* Geforce 8 - mid-lowend */
2030  {"8300", CARD_NVIDIA_GEFORCE_8300GS}, /* Geforce 8 - lowend */
2031  {"8200", CARD_NVIDIA_GEFORCE_8200}, /* Geforce 8 - lowend */
2032  {"8100", CARD_NVIDIA_GEFORCE_8200}, /* Geforce 8 - lowend */
2033  /* Direct 3D 9 SM3 */
2034  {"Quadro FX 5", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
2035  {"Quadro FX 4", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
2036  {"7950", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
2037  {"7900", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
2038  {"7800", CARD_NVIDIA_GEFORCE_7800GT}, /* Geforce 7 - highend */
2039  {"7700", CARD_NVIDIA_GEFORCE_7600}, /* Geforce 7 - midend */
2040  {"7600", CARD_NVIDIA_GEFORCE_7600}, /* Geforce 7 - midend */
2041  {"7400", CARD_NVIDIA_GEFORCE_7400}, /* Geforce 7 - lower medium */
2042  {"7300", CARD_NVIDIA_GEFORCE_7300}, /* Geforce 7 - lowend */
2043  {"6800", CARD_NVIDIA_GEFORCE_6800}, /* Geforce 6 - highend */
2044  {"6700", CARD_NVIDIA_GEFORCE_6600GT}, /* Geforce 6 - midend */
2045  {"6610", CARD_NVIDIA_GEFORCE_6600GT}, /* Geforce 6 - midend */
2046  {"6600", CARD_NVIDIA_GEFORCE_6600GT}, /* Geforce 6 - midend */
2047  /* Direct 3D 9 SM2 */
2048  {"Quadro FX", CARD_NVIDIA_GEFORCEFX_5800}, /* GeforceFX - highend */
2049  {"5950", CARD_NVIDIA_GEFORCEFX_5800}, /* GeforceFX - highend */
2050  {"5900", CARD_NVIDIA_GEFORCEFX_5800}, /* GeforceFX - highend */
2051  {"5800", CARD_NVIDIA_GEFORCEFX_5800}, /* GeforceFX - highend */
2052  {"5750", CARD_NVIDIA_GEFORCEFX_5600}, /* GeforceFX - midend */
2053  {"5700", CARD_NVIDIA_GEFORCEFX_5600}, /* GeforceFX - midend */
2054  {"5650", CARD_NVIDIA_GEFORCEFX_5600}, /* GeforceFX - midend */
2055  {"5600", CARD_NVIDIA_GEFORCEFX_5600}, /* GeforceFX - midend */
2056  {"5500", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
2057  {"5300", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
2058  {"5250", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
2059  {"5200", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
2060  {"5100", CARD_NVIDIA_GEFORCEFX_5200}, /* GeforceFX - lowend */
2061  /* Direct 3D 8 */
2062  {"Quadro4", CARD_NVIDIA_GEFORCE4_TI4200},
2063  {"GeForce4 Ti", CARD_NVIDIA_GEFORCE4_TI4200}, /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800 */
2064  /* Direct 3D 7 */
2065  {"GeForce4 MX", CARD_NVIDIA_GEFORCE4_MX}, /* MX420/MX440/MX460/MX4000 */
2066  {"Quadro2 MXR", CARD_NVIDIA_GEFORCE2_MX},
2067  {"GeForce2 MX", CARD_NVIDIA_GEFORCE2_MX}, /* Geforce2 standard/MX100/MX200/MX400 */
2068  {"Quadro2", CARD_NVIDIA_GEFORCE2},
2069  {"GeForce2", CARD_NVIDIA_GEFORCE2}, /* Geforce2 GTS/Pro/Ti/Ultra */
2070  /* Direct 3D 6 */
2071  {"TNT2", CARD_NVIDIA_RIVA_TNT2}, /* Riva TNT2 standard/M64/Pro/Ultra */
2072 },
2073 /* See http://developer.amd.com/resources/hardware-drivers/ati-catalyst-pc-vendor-id-1002-li/
2074  *
2075  * Beware: renderer string do not match exact card model,
2076  * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
2077 cards_amd_binary[] =
2078 {
2079  {"RX 480", CARD_AMD_RADEON_RX_480},
2080  {"RX 460", CARD_AMD_RADEON_RX_460},
2081  {"R9 Fury Series", CARD_AMD_RADEON_R9_FURY},
2082  /* Southern Islands */
2083  {"HD 7900", CARD_AMD_RADEON_HD7900},
2084  {"HD 7800", CARD_AMD_RADEON_HD7800},
2085  {"HD 7700", CARD_AMD_RADEON_HD7700},
2086  /* Northern Islands */
2087  {"HD 6970", CARD_AMD_RADEON_HD6900},
2088  {"HD 6900", CARD_AMD_RADEON_HD6900},
2089  {"HD 6800", CARD_AMD_RADEON_HD6800},
2090  {"HD 6770M", CARD_AMD_RADEON_HD6600M},
2091  {"HD 6750M", CARD_AMD_RADEON_HD6600M},
2092  {"HD 6700", CARD_AMD_RADEON_HD6700},
2093  {"HD 6670", CARD_AMD_RADEON_HD6600},
2094  {"HD 6630M", CARD_AMD_RADEON_HD6600M},
2095  {"HD 6600M", CARD_AMD_RADEON_HD6600M},
2096  {"HD 6600", CARD_AMD_RADEON_HD6600},
2097  {"HD 6570", CARD_AMD_RADEON_HD6600},
2098  {"HD 6500M", CARD_AMD_RADEON_HD6600M},
2099  {"HD 6500", CARD_AMD_RADEON_HD6600},
2100  {"HD 6480G", CARD_AMD_RADEON_HD6480G},
2101  {"HD 6400", CARD_AMD_RADEON_HD6400},
2102  {"HD 6300", CARD_AMD_RADEON_HD6300},
2103  {"HD 6200", CARD_AMD_RADEON_HD6300},
2104  /* Evergreen */
2105  {"HD 5870", CARD_AMD_RADEON_HD5800}, /* Radeon EG CYPRESS PRO */
2106  {"HD 5850", CARD_AMD_RADEON_HD5800}, /* Radeon EG CYPRESS XT */
2107  {"HD 5800", CARD_AMD_RADEON_HD5800}, /* Radeon EG CYPRESS HD58xx generic renderer string */
2108  {"HD 5770", CARD_AMD_RADEON_HD5700}, /* Radeon EG JUNIPER XT */
2109  {"HD 5750", CARD_AMD_RADEON_HD5700}, /* Radeon EG JUNIPER LE */
2110  {"HD 5700", CARD_AMD_RADEON_HD5700}, /* Radeon EG JUNIPER HD57xx generic renderer string */
2111  {"HD 5670", CARD_AMD_RADEON_HD5600}, /* Radeon EG REDWOOD XT */
2112  {"HD 5570", CARD_AMD_RADEON_HD5600}, /* Radeon EG REDWOOD PRO mapped to HD5600 series */
2113  {"HD 5550", CARD_AMD_RADEON_HD5600}, /* Radeon EG REDWOOD LE mapped to HD5600 series */
2114  {"HD 5450", CARD_AMD_RADEON_HD5400}, /* Radeon EG CEDAR PRO */
2115  {"HD 5000", CARD_AMD_RADEON_HD5600}, /* Defaulting to HD 5600 */
2116  /* R700 */
2117  {"HD 4890", CARD_AMD_RADEON_HD4800}, /* Radeon RV790 */
2118  {"HD 4870", CARD_AMD_RADEON_HD4800}, /* Radeon RV770 */
2119  {"HD 4850", CARD_AMD_RADEON_HD4800}, /* Radeon RV770 */
2120  {"HD 4830", CARD_AMD_RADEON_HD4800}, /* Radeon RV770 */
2121  {"HD 4800", CARD_AMD_RADEON_HD4800}, /* Radeon RV7xx HD48xx generic renderer string */
2122  {"HD 4770", CARD_AMD_RADEON_HD4700}, /* Radeon RV740 */
2123  {"HD 4700", CARD_AMD_RADEON_HD4700}, /* Radeon RV7xx HD47xx generic renderer string */
2124  {"HD 4670", CARD_AMD_RADEON_HD4600}, /* Radeon RV730 */
2125  {"HD 4650", CARD_AMD_RADEON_HD4600}, /* Radeon RV730 */
2126  {"HD 4600", CARD_AMD_RADEON_HD4600}, /* Radeon RV730 */
2127  {"HD 4550", CARD_AMD_RADEON_HD4350}, /* Radeon RV710 */
2128  {"HD 4350", CARD_AMD_RADEON_HD4350}, /* Radeon RV710 */
2129  /* R600/R700 integrated */
2130  {"HD 4200M", CARD_AMD_RADEON_HD4200M},
2131  {"HD 3300", CARD_AMD_RADEON_HD3200},
2132  {"HD 3200", CARD_AMD_RADEON_HD3200},
2133  {"HD 3100", CARD_AMD_RADEON_HD3200},
2134  /* R600 */
2135  {"HD 3870", CARD_AMD_RADEON_HD2900}, /* HD2900/HD3800 - highend */
2136  {"HD 3850", CARD_AMD_RADEON_HD2900}, /* HD2900/HD3800 - highend */
2137  {"HD 2900", CARD_AMD_RADEON_HD2900}, /* HD2900/HD3800 - highend */
2138  {"HD 3830", CARD_AMD_RADEON_HD2600}, /* China-only midend */
2139  {"HD 3690", CARD_AMD_RADEON_HD2600}, /* HD2600/HD3600 - midend */
2140  {"HD 3650", CARD_AMD_RADEON_HD2600}, /* HD2600/HD3600 - midend */
2141  {"HD 2600", CARD_AMD_RADEON_HD2600}, /* HD2600/HD3600 - midend */
2142  {"HD 3470", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
2143  {"HD 3450", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
2144  {"HD 3430", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
2145  {"HD 3400", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
2146  {"HD 2400", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
2147  {"HD 2350", CARD_AMD_RADEON_HD2350}, /* HD2350/HD2400/HD3400 - lowend */
2148  /* Radeon R5xx */
2149  {"X1950", CARD_AMD_RADEON_X1600},
2150  {"X1900", CARD_AMD_RADEON_X1600},
2151  {"X1800", CARD_AMD_RADEON_X1600},
2152  {"X1650", CARD_AMD_RADEON_X1600},
2153  {"X1600", CARD_AMD_RADEON_X1600},
2154  /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300/X2500/HD2300 (lowend R5xx)
2155  * Note X2300/X2500/HD2300 are R5xx GPUs with a 2xxx naming but they are still DX9-only */
2156  {"HD 2300", CARD_AMD_RADEON_X700},
2157  {"X2500", CARD_AMD_RADEON_X700},
2158  {"X2300", CARD_AMD_RADEON_X700},
2159  {"X1550", CARD_AMD_RADEON_X700},
2160  {"X1450", CARD_AMD_RADEON_X700},
2161  {"X1400", CARD_AMD_RADEON_X700},
2162  {"X1300", CARD_AMD_RADEON_X700},
2163  {"X850", CARD_AMD_RADEON_X700},
2164  {"X800", CARD_AMD_RADEON_X700},
2165  {"X700", CARD_AMD_RADEON_X700},
2166  /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400 MHz */
2167  {"Radeon Xpress", CARD_AMD_RADEON_XPRESS_200M},
2168 },
2169 cards_intel[] =
2170 {
2171  /* Skylake */
2172  {"Iris Pro Graphics P580", CARD_INTEL_IPP580_1},
2173  {"Skylake", CARD_INTEL_HD520_1},
2174  /* Broadwell */
2175  {"Iris Pro P6300", CARD_INTEL_IPP6300},
2176  {"Iris Pro 6200", CARD_INTEL_IP6200},
2177  {"Iris 6100", CARD_INTEL_I6100},
2178  {"Iris(TM) Graphics 6100", CARD_INTEL_I6100}, /* MacOS */
2179  /* Haswell */
2180  {"Iris Pro 5200", CARD_INTEL_IP5200_1},
2181  {"Iris 5100", CARD_INTEL_I5100_1},
2182  {"HD Graphics 5000", CARD_INTEL_HD5000}, /* MacOS */
2183  {"Haswell Mobile", CARD_INTEL_HWM},
2184  {"Iris OpenGL Engine", CARD_INTEL_HWM}, /* MacOS */
2185  /* Ivybridge */
2186  {"Ivybridge Server", CARD_INTEL_IVBS},
2187  {"Ivybridge Mobile", CARD_INTEL_IVBM},
2188  {"Ivybridge Desktop", CARD_INTEL_IVBD},
2189  {"HD Graphics 4000", CARD_INTEL_IVBD}, /* MacOS */
2190  /* Sandybridge */
2191  {"Sandybridge Server", CARD_INTEL_SNBS},
2192  {"Sandybridge Mobile", CARD_INTEL_SNBM},
2193  {"Sandybridge Desktop", CARD_INTEL_SNBD},
2194  /* Ironlake */
2195  {"Ironlake Mobile", CARD_INTEL_ILKM},
2196  {"Ironlake Desktop", CARD_INTEL_ILKD},
2197  /* G4x */
2198  {"B43", CARD_INTEL_B43},
2199  {"G41", CARD_INTEL_G41},
2200  {"G45", CARD_INTEL_G45},
2201  {"Q45", CARD_INTEL_Q45},
2202  {"Integrated Graphics Device", CARD_INTEL_IGD},
2203  {"GM45", CARD_INTEL_GM45},
2204  /* i965 */
2205  {"965GME", CARD_INTEL_965GME},
2206  {"965GM", CARD_INTEL_965GM},
2207  {"X3100", CARD_INTEL_965GM}, /* MacOS */
2208  {"946GZ", CARD_INTEL_946GZ},
2209  {"965G", CARD_INTEL_965G},
2210  {"965Q", CARD_INTEL_965Q},
2211  /* i945 */
2212  {"Pineview M", CARD_INTEL_PNVM},
2213  {"Pineview G", CARD_INTEL_PNVG},
2214  {"IGD", CARD_INTEL_PNVG},
2215  {"Q33", CARD_INTEL_Q33},
2216  {"G33", CARD_INTEL_G33},
2217  {"Q35", CARD_INTEL_Q35},
2218  {"945GME", CARD_INTEL_945GME},
2219  {"945GM", CARD_INTEL_945GM},
2220  {"GMA 950", CARD_INTEL_945GM}, /* MacOS */
2221  {"945G", CARD_INTEL_945G},
2222  /* i915 */
2223  {"915GM", CARD_INTEL_915GM},
2224  {"E7221G", CARD_INTEL_E7221G},
2225  {"915G", CARD_INTEL_915G},
2226  /* i8xx */
2227  {"865G", CARD_INTEL_865G},
2228  {"845G", CARD_INTEL_845G},
2229  {"855GM", CARD_INTEL_855GM},
2230  {"830M", CARD_INTEL_830M},
2231 },
2232 /* 20101109 - These are never returned by current Gallium radeon
2233  * drivers: R700, RV790, R680, RV535, RV516, R410, RS485, RV360, RV351. */
2234 cards_amd_mesa[] =
2235 {
2236  /* Polaris 10/11 */
2237  {"POLARIS10", CARD_AMD_RADEON_RX_480},
2238  {"POLARIS11", CARD_AMD_RADEON_RX_460},
2239  /* Volcanic Islands */
2240  {"FIJI", CARD_AMD_RADEON_R9_FURY},
2241  {"TONGA", CARD_AMD_RADEON_R9_285},
2242  /* Sea Islands */
2243  {"HAWAII", CARD_AMD_RADEON_R9_290},
2244  {"KAVERI", CARD_AMD_RADEON_R7 },
2245  {"KABINI", CARD_AMD_RADEON_R3 },
2246  {"BONAIRE", CARD_AMD_RADEON_HD8770},
2247  /* Southern Islands */
2248  {"OLAND", CARD_AMD_RADEON_HD8670},
2249  {"HAINAN", CARD_AMD_RADEON_HD8600M},
2250  {"TAHITI", CARD_AMD_RADEON_HD7900},
2251  {"PITCAIRN", CARD_AMD_RADEON_HD7800},
2252  {"CAPE VERDE", CARD_AMD_RADEON_HD7700},
2253  /* Northern Islands */
2254  {"ARUBA", CARD_AMD_RADEON_HD7660D},
2255  {"CAYMAN", CARD_AMD_RADEON_HD6900},
2256  {"BARTS", CARD_AMD_RADEON_HD6800},
2257  {"TURKS", CARD_AMD_RADEON_HD6600},
2258  {"SUMO2", CARD_AMD_RADEON_HD6410D}, /* SUMO2 first, because we do a strstr(). */
2259  {"SUMO", CARD_AMD_RADEON_HD6550D},
2260  {"CAICOS", CARD_AMD_RADEON_HD6400},
2261  {"PALM", CARD_AMD_RADEON_HD6300},
2262  /* Evergreen */
2263  {"HEMLOCK", CARD_AMD_RADEON_HD5900},
2264  {"CYPRESS", CARD_AMD_RADEON_HD5800},
2265  {"JUNIPER", CARD_AMD_RADEON_HD5700},
2266  {"REDWOOD", CARD_AMD_RADEON_HD5600},
2267  {"CEDAR", CARD_AMD_RADEON_HD5400},
2268  /* R700 */
2269  {"R700", CARD_AMD_RADEON_HD4800},
2270  {"RV790", CARD_AMD_RADEON_HD4800},
2271  {"RV770", CARD_AMD_RADEON_HD4800},
2272  {"RV740", CARD_AMD_RADEON_HD4700},
2273  {"RV730", CARD_AMD_RADEON_HD4600},
2274  {"RV710", CARD_AMD_RADEON_HD4350},
2275  /* R600/R700 integrated */
2276  {"RS880", CARD_AMD_RADEON_HD4200M},
2277  {"RS780", CARD_AMD_RADEON_HD3200},
2278  /* R600 */
2279  {"R680", CARD_AMD_RADEON_HD2900},
2280  {"R600", CARD_AMD_RADEON_HD2900},
2281  {"RV670", CARD_AMD_RADEON_HD3850},
2282  {"RV635", CARD_AMD_RADEON_HD2600},
2283  {"RV630", CARD_AMD_RADEON_HD2600},
2284  {"RV620", CARD_AMD_RADEON_HD2350},
2285  {"RV610", CARD_AMD_RADEON_HD2350},
2286  /* R500 */
2287  {"R580", CARD_AMD_RADEON_X1600},
2288  {"R520", CARD_AMD_RADEON_X1600},
2289  {"RV570", CARD_AMD_RADEON_X1600},
2290  {"RV560", CARD_AMD_RADEON_X1600},
2291  {"RV535", CARD_AMD_RADEON_X1600},
2292  {"RV530", CARD_AMD_RADEON_X1600},
2293  {"RV516", CARD_AMD_RADEON_X700},
2294  {"RV515", CARD_AMD_RADEON_X700},
2295  /* R400 */
2296  {"R481", CARD_AMD_RADEON_X700},
2297  {"R480", CARD_AMD_RADEON_X700},
2298  {"R430", CARD_AMD_RADEON_X700},
2299  {"R423", CARD_AMD_RADEON_X700},
2300  {"R420", CARD_AMD_RADEON_X700},
2301  {"R410", CARD_AMD_RADEON_X700},
2302  {"RV410", CARD_AMD_RADEON_X700},
2303  /* Radeon Xpress - onboard, DX9b, Shader 2.0, 300-400 MHz */
2304  {"RS740", CARD_AMD_RADEON_XPRESS_200M},
2305  {"RS690", CARD_AMD_RADEON_XPRESS_200M},
2306  {"RS600", CARD_AMD_RADEON_XPRESS_200M},
2307  {"RS485", CARD_AMD_RADEON_XPRESS_200M},
2308  {"RS482", CARD_AMD_RADEON_XPRESS_200M},
2309  {"RS480", CARD_AMD_RADEON_XPRESS_200M},
2310  {"RS400", CARD_AMD_RADEON_XPRESS_200M},
2311  {"RC410", CARD_AMD_RADEON_XPRESS_200M},
2312  /* R300 */
2313  {"R360", CARD_AMD_RADEON_9500},
2314  {"R350", CARD_AMD_RADEON_9500},
2315  {"R300", CARD_AMD_RADEON_9500},
2316  {"RV380", CARD_AMD_RADEON_9500},
2317  {"RV370", CARD_AMD_RADEON_9500},
2318  {"RV360", CARD_AMD_RADEON_9500},
2319  {"RV351", CARD_AMD_RADEON_9500},
2320  {"RV350", CARD_AMD_RADEON_9500},
2321 },
2323 {
2324  /* Maxwell */
2325  {"NV124", CARD_NVIDIA_GEFORCE_GTX970},
2326  {"NV120", CARD_NVIDIA_GEFORCE_GTX980TI},
2327  {"NV118", CARD_NVIDIA_GEFORCE_840M},
2328  {"NV117", CARD_NVIDIA_GEFORCE_GTX750},
2329  /* Kepler */
2330  {"NV108", CARD_NVIDIA_GEFORCE_GT740M},
2331  {"NVF1", CARD_NVIDIA_GEFORCE_GTX780TI},
2332  {"NVF0", CARD_NVIDIA_GEFORCE_GTX780},
2333  {"NVE6", CARD_NVIDIA_GEFORCE_GTX770M},
2334  {"NVE4", CARD_NVIDIA_GEFORCE_GTX680}, /* 690 / 675MX / 760TI */
2335  /* Fermi */
2336  {"NVD9", CARD_NVIDIA_GEFORCE_GT520},
2337  {"NVD7", CARD_NVIDIA_GEFORCE_820M},
2338  {"NVCF", CARD_NVIDIA_GEFORCE_GTX550},
2339  {"NVCE", CARD_NVIDIA_GEFORCE_GTX560},
2340  {"NVC8", CARD_NVIDIA_GEFORCE_GTX570},
2341  {"NVC4", CARD_NVIDIA_GEFORCE_GTX460},
2342  {"NVC3", CARD_NVIDIA_GEFORCE_GT440},
2343  {"NVC1", CARD_NVIDIA_GEFORCE_GT420},
2344  {"NVC0", CARD_NVIDIA_GEFORCE_GTX480},
2345  /* Tesla */
2346  {"NVAF", CARD_NVIDIA_GEFORCE_GT320M},
2347  {"NVAC", CARD_NVIDIA_GEFORCE_8200},
2348  {"NVAA", CARD_NVIDIA_GEFORCE_8200}, /* 8100 */
2349  {"NVA8", CARD_NVIDIA_GEFORCE_210},
2350  {"NVA5", CARD_NVIDIA_GEFORCE_GT220},
2351  {"NVA3", CARD_NVIDIA_GEFORCE_GT240},
2352  {"NVA0", CARD_NVIDIA_GEFORCE_GTX280},
2353  {"NV98", CARD_NVIDIA_GEFORCE_9200},
2354  {"NV96", CARD_NVIDIA_GEFORCE_9400GT},
2355  {"NV94", CARD_NVIDIA_GEFORCE_9600GT},
2356  {"NV92", CARD_NVIDIA_GEFORCE_9800GT},
2357  {"NV86", CARD_NVIDIA_GEFORCE_8500GT},
2358  {"NV84", CARD_NVIDIA_GEFORCE_8600GT},
2359  {"NV50", CARD_NVIDIA_GEFORCE_8800GTX},
2360  /* Curie */
2361  {"NV68", CARD_NVIDIA_GEFORCE_6200}, /* 7050 */
2362  {"NV67", CARD_NVIDIA_GEFORCE_6200}, /* 7000M */
2363  {"NV63", CARD_NVIDIA_GEFORCE_6200}, /* 7100 */
2364  {"NV4E", CARD_NVIDIA_GEFORCE_6200}, /* 6100 Go / 6150 Go */
2365  {"NV4C", CARD_NVIDIA_GEFORCE_6200}, /* 6150SE */
2366  {"NV4B", CARD_NVIDIA_GEFORCE_7600},
2367  {"NV4A", CARD_NVIDIA_GEFORCE_6200},
2368  {"NV49", CARD_NVIDIA_GEFORCE_7800GT}, /* 7900 */
2369  {"NV47", CARD_NVIDIA_GEFORCE_7800GT},
2370  {"NV46", CARD_NVIDIA_GEFORCE_7400},
2371  {"NV45", CARD_NVIDIA_GEFORCE_6800},
2372  {"NV44", CARD_NVIDIA_GEFORCE_6200},
2373  {"NV43", CARD_NVIDIA_GEFORCE_6600GT},
2374  {"NV42", CARD_NVIDIA_GEFORCE_6800},
2375  {"NV41", CARD_NVIDIA_GEFORCE_6800},
2376  {"NV40", CARD_NVIDIA_GEFORCE_6800},
2377  /* Rankine */
2378  {"NV38", CARD_NVIDIA_GEFORCEFX_5800}, /* FX 5950 Ultra */
2379  {"NV36", CARD_NVIDIA_GEFORCEFX_5800}, /* FX 5700/5750 */
2380  {"NV35", CARD_NVIDIA_GEFORCEFX_5800}, /* FX 5900 */
2381  {"NV34", CARD_NVIDIA_GEFORCEFX_5200},
2382  {"NV31", CARD_NVIDIA_GEFORCEFX_5600},
2383  {"NV30", CARD_NVIDIA_GEFORCEFX_5800},
2384  /* Kelvin */
2385  {"nv28", CARD_NVIDIA_GEFORCE4_TI4200},
2386  {"nv25", CARD_NVIDIA_GEFORCE4_TI4200},
2387  {"nv20", CARD_NVIDIA_GEFORCE3},
2388  /* Celsius */
2389  {"nv1F", CARD_NVIDIA_GEFORCE4_MX}, /* GF4 MX IGP */
2390  {"nv1A", CARD_NVIDIA_GEFORCE2}, /* GF2 IGP */
2391  {"nv18", CARD_NVIDIA_GEFORCE4_MX},
2392  {"nv17", CARD_NVIDIA_GEFORCE4_MX},
2393  {"nv16", CARD_NVIDIA_GEFORCE2},
2394  {"nv15", CARD_NVIDIA_GEFORCE2},
2395  {"nv11", CARD_NVIDIA_GEFORCE2_MX},
2396  {"nv10", CARD_NVIDIA_GEFORCE},
2397  /* Fahrenheit */
2398  {"nv05", CARD_NVIDIA_RIVA_TNT2},
2399  {"nv04", CARD_NVIDIA_RIVA_TNT},
2400  {"nv03", CARD_NVIDIA_RIVA_128},
2401 },
2402 cards_vmware[] =
2403 {
2404  {"SVGA3D", CARD_VMWARE_SVGA3D},
2405 };
2406 
2407 static const struct gl_vendor_selection
2408 {
2410  const char *description; /* Description of the card selector i.e. Apple OS/X Intel */
2411  const struct wined3d_renderer_table *cards; /* To be used as cards[], pointer to the first member in an array */
2412  size_t cards_size; /* Number of entries in the array above */
2413 }
2415 {
2416  {GL_VENDOR_APPLE, "Apple OSX AMD/ATI binary driver", cards_amd_binary, ARRAY_SIZE(cards_amd_binary)},
2417  {GL_VENDOR_FGLRX, "AMD/ATI binary driver", cards_amd_binary, ARRAY_SIZE(cards_amd_binary)},
2418  {GL_VENDOR_MESA, "Mesa AMD/ATI driver", cards_amd_mesa, ARRAY_SIZE(cards_amd_mesa)},
2419 },
2421 {
2422  {GL_VENDOR_APPLE, "Apple OSX NVidia binary driver", cards_nvidia_binary, ARRAY_SIZE(cards_nvidia_binary)},
2423  {GL_VENDOR_MESA, "Mesa Nouveau driver", cards_nvidia_mesa, ARRAY_SIZE(cards_nvidia_mesa)},
2424  {GL_VENDOR_NVIDIA, "Nvidia binary driver", cards_nvidia_binary, ARRAY_SIZE(cards_nvidia_binary)},
2425 },
2427 {
2428  {GL_VENDOR_MESA, "VMware driver", cards_vmware, ARRAY_SIZE(cards_vmware)},
2429 },
2431 {
2432  {GL_VENDOR_APPLE, "Apple OSX Intel binary driver", cards_intel, ARRAY_SIZE(cards_intel)},
2433  {GL_VENDOR_MESA, "Mesa Intel driver", cards_intel, ARRAY_SIZE(cards_intel)},
2434 };
2435 
2436 static const enum wined3d_pci_device
2438 {
2439  CARD_NVIDIA_RIVA_128, /* D3D5 */
2440  CARD_NVIDIA_RIVA_TNT, /* D3D6 */
2441  CARD_NVIDIA_GEFORCE, /* D3D7 */
2442  CARD_NVIDIA_GEFORCE3, /* D3D8 */
2443  CARD_NVIDIA_GEFORCEFX_5800, /* D3D9_SM2 */
2444  CARD_NVIDIA_GEFORCE_6800, /* D3D9_SM3 */
2445  CARD_NVIDIA_GEFORCE_8800GTX, /* D3D10 */
2446  CARD_NVIDIA_GEFORCE_GTX470, /* D3D11 */
2447 },
2449 {
2450  CARD_AMD_RAGE_128PRO, /* D3D5 */
2451  CARD_AMD_RAGE_128PRO, /* D3D6 */
2452  CARD_AMD_RADEON_7200, /* D3D7 */
2453  CARD_AMD_RADEON_8500, /* D3D8 */
2454  CARD_AMD_RADEON_9500, /* D3D9_SM2 */
2455  CARD_AMD_RADEON_X1600, /* D3D9_SM3 */
2456  CARD_AMD_RADEON_HD2900, /* D3D10 */
2457  CARD_AMD_RADEON_HD5600, /* D3D11 */
2458 },
2460 {
2461  CARD_INTEL_845G, /* D3D5 */
2462  CARD_INTEL_845G, /* D3D6 */
2463  CARD_INTEL_845G, /* D3D7 */
2464  CARD_INTEL_915G, /* D3D8 */
2465  CARD_INTEL_915G, /* D3D9_SM2 */
2466  CARD_INTEL_945G, /* D3D9_SM3 */
2467  CARD_INTEL_G45, /* D3D10 */
2468  CARD_INTEL_IVBD, /* D3D11 */
2469 };
2473 
2475  unsigned int table_size, enum wined3d_gl_vendor gl_vendor, const char *gl_renderer)
2476 {
2477  unsigned int i, j;
2478 
2479  for (i = 0; i < table_size; ++i)
2480  {
2481  if (table[i].gl_vendor != gl_vendor)
2482  continue;
2483 
2484  TRACE("Applying card selector \"%s\".\n", table[i].description);
2485 
2486  for (j = 0; j < table[i].cards_size; ++j)
2487  {
2488  if (strstr(gl_renderer, table[i].cards[j].renderer))
2489  return table[i].cards[j].id;
2490  }
2491  return PCI_DEVICE_NONE;
2492  }
2493  FIXME("Couldn't find a suitable card selector for GL vendor %04x (using GL_RENDERER %s)\n",
2494  gl_vendor, debugstr_a(gl_renderer));
2495 
2496  return PCI_DEVICE_NONE;
2497 }
2498 
2499 static const struct
2500 {
2502  const char *description; /* Description of the card selector i.e. Apple OS/X Intel */
2504  unsigned int gl_vendor_count;
2505  const enum wined3d_pci_device *card_fallback; /* An array with D3D_LEVEL_COUNT elements */
2506 }
2508 {
2510  ARRAY_SIZE(amd_gl_vendor_table),
2513  ARRAY_SIZE(nvidia_gl_vendor_table),
2516  ARRAY_SIZE(vmware_gl_vendor_table),
2519  ARRAY_SIZE(intel_gl_vendor_table),
2521 };
2522 
2523 
2525  DWORD glsl_version, const char *gl_renderer, enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor)
2526 {
2527  /* A Direct3D device object contains the PCI id (vendor + device) of the
2528  * videocard which is used for rendering. Various applications use this
2529  * information to get a rough estimation of the features of the card and
2530  * some might use it for enabling 3d effects only on certain types of
2531  * videocards. In some cases games might even use it to work around bugs
2532  * which happen on certain videocards/driver combinations. The problem is
2533  * that OpenGL only exposes a rendering string containing the name of the
2534  * videocard and not the PCI id.
2535  *
2536  * Various games depend on the PCI id, so somehow we need to provide one.
2537  * A simple option is to parse the renderer string and translate this to
2538  * the right PCI id. This is a lot of work because there are more than 200
2539  * GPUs just for Nvidia. Various cards share the same renderer string, so
2540  * the amount of code might be 'small' but there are quite a number of
2541  * exceptions which would make this a pain to maintain. Another way would
2542  * be to query the PCI id from the operating system (assuming this is the
2543  * videocard which is used for rendering which is not always the case).
2544  * This would work but it is not very portable. Second it would not work
2545  * well in, let's say, a remote X situation in which the amount of 3d
2546  * features which can be used is limited.
2547  *
2548  * As said most games only use the PCI id to get an indication of the
2549  * capabilities of the card. It doesn't really matter if the given id is
2550  * the correct one if we return the id of a card with similar 3d features.
2551  *
2552  * The code below checks the OpenGL capabilities of a videocard and matches
2553  * that to a certain level of Direct3D functionality. Once a card passes
2554  * the Direct3D9 check, we know that the card (in case of Nvidia) is at
2555  * least a GeforceFX. To give a better estimate we do a basic check on the
2556  * renderer string but if that won't pass we return a default card. This
2557  * way is better than maintaining a full card database as even without a
2558  * full database we can return a card with similar features. Second the
2559  * size of the database can be made quite small because when you know what
2560  * type of 3d functionality a card has, you know to which GPU family the
2561  * GPU must belong. Because of this you only have to check a small part of
2562  * the renderer string to distinguish between different models from that
2563  * family.
2564  *
2565  * The code also selects a default amount of video memory which we will
2566  * use for an estimation of the amount of free texture memory. In case of
2567  * real D3D the amount of texture memory includes video memory and system
2568  * memory (to be specific AGP memory or in case of PCIE TurboCache /
2569  * HyperMemory). We don't know how much system memory can be addressed by
2570  * the system but we can make a reasonable estimation about the amount of
2571  * video memory. If the value is slightly wrong it doesn't matter as we
2572  * didn't include AGP-like memory which makes the amount of addressable
2573  * memory higher and second OpenGL isn't that critical it moves to system
2574  * memory behind our backs if really needed. Note that the amount of video
2575  * memory can be overruled using a registry setting. */
2576 
2577  unsigned int i;
2578  enum wined3d_d3d_level d3d_level = d3d_level_from_caps(shader_caps, fragment_caps, glsl_version);
2580 
2581  for (i = 0; i < ARRAY_SIZE(card_vendor_table); ++i)
2582  {
2583  if (card_vendor_table[i].card_vendor != *card_vendor)
2584  continue;
2585 
2586  TRACE("Applying card selector \"%s\".\n", card_vendor_table[i].description);
2588  card_vendor_table[i].gl_vendor_count, *gl_vendor, gl_renderer);
2589  if (device != PCI_DEVICE_NONE)
2590  return device;
2591 
2592  TRACE("Unrecognized renderer %s, falling back to default.\n", debugstr_a(gl_renderer));
2593  return card_vendor_table[i].card_fallback[d3d_level];
2594  }
2595 
2596  FIXME("No card selector available for card vendor %04x (using GL_RENDERER %s).\n",
2597  *card_vendor, debugstr_a(gl_renderer));
2598 
2599  /* Default to generic Nvidia hardware based on the supported OpenGL extensions. */
2600  *card_vendor = HW_VENDOR_NVIDIA;
2601  return card_fallback_nvidia[d3d_level];
2602 }
2603 
2604 static const struct wined3d_vertex_pipe_ops *select_vertex_implementation(const struct wined3d_gl_info *gl_info,
2605  const struct wined3d_shader_backend_ops *shader_backend_ops)
2606 {
2607  if (shader_backend_ops == &glsl_shader_backend && gl_info->supported[ARB_VERTEX_SHADER])
2608  return &glsl_vertex_pipe;
2609  return &ffp_vertex_pipe;
2610 }
2611 
2612 static const struct fragment_pipeline *select_fragment_implementation(const struct wined3d_gl_info *gl_info,
2613  const struct wined3d_shader_backend_ops *shader_backend_ops)
2614 {
2615  if (shader_backend_ops == &glsl_shader_backend && gl_info->supported[ARB_FRAGMENT_SHADER])
2616  return &glsl_fragment_pipe;
2617  if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
2618  return &arbfp_fragment_pipeline;
2619  if (gl_info->supported[ATI_FRAGMENT_SHADER])
2620  return &atifs_fragment_pipeline;
2621  if (gl_info->supported[NV_REGISTER_COMBINERS] && gl_info->supported[NV_TEXTURE_SHADER2])
2622  return &nvts_fragment_pipeline;
2623  if (gl_info->supported[NV_REGISTER_COMBINERS])
2624  return &nvrc_fragment_pipeline;
2625  return &ffp_fragment_pipeline;
2626 }
2627 
2628 static const struct wined3d_shader_backend_ops *select_shader_backend(const struct wined3d_gl_info *gl_info)
2629 {
2630  BOOL glsl = wined3d_settings.glslRequested && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 20);
2631 
2632  if (glsl && gl_info->supported[ARB_VERTEX_SHADER] && gl_info->supported[ARB_FRAGMENT_SHADER])
2633  return &glsl_shader_backend;
2634  if (gl_info->supported[ARB_VERTEX_PROGRAM] && gl_info->supported[ARB_FRAGMENT_PROGRAM])
2636  if (glsl && (gl_info->supported[ARB_VERTEX_SHADER] || gl_info->supported[ARB_FRAGMENT_SHADER]))
2637  return &glsl_shader_backend;
2638  if (gl_info->supported[ARB_VERTEX_PROGRAM] || gl_info->supported[ARB_FRAGMENT_PROGRAM])
2640  return &none_shader_backend;
2641 }
2642 
2643 static void parse_extension_string(struct wined3d_gl_info *gl_info, const char *extensions,
2644  const struct wined3d_extension_map *map, UINT entry_count)
2645 {
2646  while (*extensions)
2647  {
2648  const char *start;
2649  size_t len;
2650  UINT i;
2651 
2652  while (isspace(*extensions))
2653  ++extensions;
2654  start = extensions;
2655  while (!isspace(*extensions) && *extensions)
2656  ++extensions;
2657 
2658  len = extensions - start;
2659  if (!len)
2660  continue;
2661 
2662  TRACE("- %s.\n", debugstr_an(start, len));
2663 
2664  for (i = 0; i < entry_count; ++i)
2665  {
2666  if (len == strlen(map[i].extension_string)
2667  && !memcmp(start, map[i].extension_string, len))
2668  {
2669  TRACE(" FOUND: %s support.\n", map[i].extension_string);
2670  gl_info->supported[map[i].extension] = TRUE;
2671  break;
2672  }
2673  }
2674  }
2675 }
2676 
2677 static void enumerate_gl_extensions(struct wined3d_gl_info *gl_info,
2678  const struct wined3d_extension_map *map, unsigned int map_entries_count)
2679 {
2680  const char *gl_extension_name;
2681  unsigned int i, j;
2682  GLint extensions_count;
2683 
2684  gl_info->gl_ops.gl.p_glGetIntegerv(GL_NUM_EXTENSIONS, &extensions_count);
2685  for (i = 0; i < extensions_count; ++i)
2686  {
2687  gl_extension_name = (const char *)GL_EXTCALL(glGetStringi(GL_EXTENSIONS, i));
2688  TRACE("- %s.\n", debugstr_a(gl_extension_name));
2689  for (j = 0; j < map_entries_count; ++j)
2690  {
2691  if (!strcmp(gl_extension_name, map[j].extension_string))
2692  {
2693  TRACE("FOUND: %s support.\n", map[j].extension_string);
2694  gl_info->supported[map[j].extension] = TRUE;
2695  break;
2696  }
2697  }
2698  }
2699 }
2700 
2701 static void load_gl_funcs(struct wined3d_gl_info *gl_info)
2702 {
2703 #define USE_GL_FUNC(pfn) gl_info->gl_ops.ext.p_##pfn = (void *)wglGetProcAddress(#pfn);
2704  /* GL_APPLE_fence */
2705  USE_GL_FUNC(glDeleteFencesAPPLE)
2706  USE_GL_FUNC(glFinishFenceAPPLE)
2707  USE_GL_FUNC(glFinishObjectAPPLE)
2708  USE_GL_FUNC(glGenFencesAPPLE)
2709  USE_GL_FUNC(glIsFenceAPPLE)
2710  USE_GL_FUNC(glSetFenceAPPLE)
2711  USE_GL_FUNC(glTestFenceAPPLE)
2712  USE_GL_FUNC(glTestObjectAPPLE)
2713  /* GL_APPLE_flush_buffer_range */
2714  USE_GL_FUNC(glBufferParameteriAPPLE)
2715  USE_GL_FUNC(glFlushMappedBufferRangeAPPLE)
2716  /* GL_ARB_base_instance */
2717  USE_GL_FUNC(glDrawArraysInstancedBaseInstance)
2718  USE_GL_FUNC(glDrawElementsInstancedBaseVertexBaseInstance)
2719  /* GL_ARB_blend_func_extended */
2720  USE_GL_FUNC(glBindFragDataLocationIndexed)
2721  USE_GL_FUNC(glGetFragDataIndex)
2722  /* GL_ARB_clear_buffer_object */
2723  USE_GL_FUNC(glClearBufferData)
2724  USE_GL_FUNC(glClearBufferSubData)
2725  /* GL_ARB_clear_texture */
2726  USE_GL_FUNC(glClearTexImage)
2727  USE_GL_FUNC(glClearTexSubImage)
2728  /* GL_ARB_clip_control */
2729  USE_GL_FUNC(glClipControl)
2730  /* GL_ARB_color_buffer_float */
2731  USE_GL_FUNC(glClampColorARB)
2732  /* GL_ARB_compute_shader */
2733  USE_GL_FUNC(glDispatchCompute)
2734  USE_GL_FUNC(glDispatchComputeIndirect)
2735  /* GL_ARB_copy_buffer */
2736  USE_GL_FUNC(glCopyBufferSubData)
2737  /* GL_ARB_copy_image */
2738  USE_GL_FUNC(glCopyImageSubData)
2739  /* GL_ARB_debug_output */
2740  USE_GL_FUNC(glDebugMessageCallbackARB)
2741  USE_GL_FUNC(glDebugMessageControlARB)
2742  USE_GL_FUNC(glDebugMessageInsertARB)
2743  USE_GL_FUNC(glGetDebugMessageLogARB)
2744  /* GL_ARB_draw_buffers */
2745  USE_GL_FUNC(glDrawBuffersARB)
2746  /* GL_ARB_draw_elements_base_vertex */
2747  USE_GL_FUNC(glDrawElementsBaseVertex)
2748  USE_GL_FUNC(glDrawElementsInstancedBaseVertex)
2749  USE_GL_FUNC(glDrawRangeElementsBaseVertex)
2750  USE_GL_FUNC(glMultiDrawElementsBaseVertex)
2751  /* GL_ARB_draw_indirect */
2752  USE_GL_FUNC(glDrawArraysIndirect)
2753  USE_GL_FUNC(glDrawElementsIndirect)
2754  /* GL_ARB_draw_instanced */
2755  USE_GL_FUNC(glDrawArraysInstancedARB)
2756  USE_GL_FUNC(glDrawElementsInstancedARB)
2757  /* GL_ARB_ES2_compatibility */
2758  USE_GL_FUNC(glReleaseShaderCompiler)
2759  USE_GL_FUNC(glShaderBinary)
2760  USE_GL_FUNC(glGetShaderPrecisionFormat)
2761  USE_GL_FUNC(glDepthRangef)
2762  USE_GL_FUNC(glClearDepthf)
2763  /* GL_ARB_framebuffer_no_attachments */
2764  USE_GL_FUNC(glFramebufferParameteri)
2765  /* GL_ARB_framebuffer_object */
2766  USE_GL_FUNC(glBindFramebuffer)
2767  USE_GL_FUNC(glBindRenderbuffer)
2768  USE_GL_FUNC(glBlitFramebuffer)
2769  USE_GL_FUNC(glCheckFramebufferStatus)
2770  USE_GL_FUNC(glDeleteFramebuffers)
2771  USE_GL_FUNC(glDeleteRenderbuffers)
2772  USE_GL_FUNC(glFramebufferRenderbuffer)
2773  USE_GL_FUNC(glFramebufferTexture)
2774  USE_GL_FUNC(glFramebufferTexture1D)
2775  USE_GL_FUNC(glFramebufferTexture2D)
2776  USE_GL_FUNC(glFramebufferTexture3D)
2777  USE_GL_FUNC(glFramebufferTextureLayer)
2778  USE_GL_FUNC(glGenFramebuffers)
2779  USE_GL_FUNC(glGenRenderbuffers)
2780  USE_GL_FUNC(glGenerateMipmap)
2781  USE_GL_FUNC(glGetFramebufferAttachmentParameteriv)
2782  USE_GL_FUNC(glGetRenderbufferParameteriv)
2783  USE_GL_FUNC(glIsFramebuffer)
2784  USE_GL_FUNC(glIsRenderbuffer)
2785  USE_GL_FUNC(glRenderbufferStorage)
2786  USE_GL_FUNC(glRenderbufferStorageMultisample)
2787  /* GL_ARB_geometry_shader4 */
2788  USE_GL_FUNC(glFramebufferTextureARB)
2789  USE_GL_FUNC(glFramebufferTextureFaceARB)
2790  USE_GL_FUNC(glFramebufferTextureLayerARB)
2791  USE_GL_FUNC(glProgramParameteriARB)
2792  /* GL_ARB_instanced_arrays */
2793  USE_GL_FUNC(glVertexAttribDivisorARB)
2794  /* GL_ARB_internalformat_query */
2795  USE_GL_FUNC(glGetInternalformativ)
2796  /* GL_ARB_internalformat_query2 */
2797  USE_GL_FUNC(glGetInternalformati64v)
2798  /* GL_ARB_map_buffer_range */
2799  USE_GL_FUNC(glFlushMappedBufferRange)
2800  USE_GL_FUNC(glMapBufferRange)
2801  /* GL_ARB_multisample */
2802  USE_GL_FUNC(glSampleCoverageARB)
2803  /* GL_ARB_multitexture */
2816  /* GL_ARB_occlusion_query */
2817  USE_GL_FUNC(glBeginQueryARB)
2818  USE_GL_FUNC(glDeleteQueriesARB)
2819  USE_GL_FUNC(glEndQueryARB)
2820  USE_GL_FUNC(glGenQueriesARB)
2821  USE_GL_FUNC(glGetQueryivARB)
2822  USE_GL_FUNC(glGetQueryObjectivARB)
2823  USE_GL_FUNC(glGetQueryObjectuivARB)
2824  USE_GL_FUNC(glIsQueryARB)
2825  /* GL_ARB_point_parameters */
2826  USE_GL_FUNC(glPointParameterfARB)
2827  USE_GL_FUNC(glPointParameterfvARB)
2828  /* GL_ARB_provoking_vertex */
2829  USE_GL_FUNC(glProvokingVertex)
2830  /* GL_ARB_sample_shading */
2831  USE_GL_FUNC(glMinSampleShadingARB)
2832  /* GL_ARB_sampler_objects */
2833  USE_GL_FUNC(glGenSamplers)
2834  USE_GL_FUNC(glDeleteSamplers)
2835  USE_GL_FUNC(glIsSampler)
2836  USE_GL_FUNC(glBindSampler)
2837  USE_GL_FUNC(glSamplerParameteri)
2838  USE_GL_FUNC(glSamplerParameterf)
2839  USE_GL_FUNC(glSamplerParameteriv)
2840  USE_GL_FUNC(glSamplerParameterfv)
2841  USE_GL_FUNC(glSamplerParameterIiv)
2842  USE_GL_FUNC(glSamplerParameterIuiv)
2843  USE_GL_FUNC(glGetSamplerParameteriv)
2844  USE_GL_FUNC(glGetSamplerParameterfv)
2845  USE_GL_FUNC(glGetSamplerParameterIiv)
2846  USE_GL_FUNC(glGetSamplerParameterIuiv)
2847  /* GL_ARB_shader_atomic_counters */
2848  USE_GL_FUNC(glGetActiveAtomicCounterBufferiv)
2849  /* GL_ARB_shader_image_load_store */
2850  USE_GL_FUNC(glBindImageTexture)
2851  USE_GL_FUNC(glMemoryBarrier)
2852  /* GL_ARB_shader_objects */
2853  USE_GL_FUNC(glAttachObjectARB)
2854  USE_GL_FUNC(glBindAttribLocationARB)
2855  USE_GL_FUNC(glCompileShaderARB)
2856  USE_GL_FUNC(glCreateProgramObjectARB)
2857  USE_GL_FUNC(glCreateShaderObjectARB)
2858  USE_GL_FUNC(glDeleteObjectARB)
2859  USE_GL_FUNC(glDetachObjectARB)
2860  USE_GL_FUNC(glGetActiveUniformARB)
2861  USE_GL_FUNC(glGetAttachedObjectsARB)
2862  USE_GL_FUNC(glGetAttribLocationARB)
2863  USE_GL_FUNC(glGetHandleARB)
2864  USE_GL_FUNC(glGetInfoLogARB)
2865  USE_GL_FUNC(glGetObjectParameterfvARB)
2866  USE_GL_FUNC(glGetObjectParameterivARB)
2867  USE_GL_FUNC(glGetShaderSourceARB)
2868  USE_GL_FUNC(glGetUniformLocationARB)
2869  USE_GL_FUNC(glGetUniformfvARB)
2870  USE_GL_FUNC(glGetUniformivARB)
2871  USE_GL_FUNC(glLinkProgramARB)
2872  USE_GL_FUNC(glShaderSourceARB)
2873  USE_GL_FUNC(glUniform1fARB)
2874  USE_GL_FUNC(glUniform1fvARB)
2875  USE_GL_FUNC(glUniform1iARB)
2876  USE_GL_FUNC(glUniform1ivARB)
2877  USE_GL_FUNC(glUniform2fARB)
2878  USE_GL_FUNC(glUniform2fvARB)
2879  USE_GL_FUNC(glUniform2iARB)
2880  USE_GL_FUNC(glUniform2ivARB)
2881  USE_GL_FUNC(glUniform3fARB)
2882  USE_GL_FUNC(glUniform3fvARB)
2883  USE_GL_FUNC(glUniform3iARB)
2884  USE_GL_FUNC(glUniform3ivARB)
2885  USE_GL_FUNC(glUniform4fARB)
2886  USE_GL_FUNC(glUniform4fvARB)
2887  USE_GL_FUNC(glUniform4iARB)
2888  USE_GL_FUNC(glUniform4ivARB)
2889  USE_GL_FUNC(glUniformMatrix2fvARB)
2890  USE_GL_FUNC(glUniformMatrix3fvARB)
2891  USE_GL_FUNC(glUniformMatrix4fvARB)
2892  USE_GL_FUNC(glUseProgramObjectARB)
2893  USE_GL_FUNC(glValidateProgramARB)
2894  /* GL_ARB_shader_storage_buffer_object */
2895  USE_GL_FUNC(glShaderStorageBlockBinding)
2896  /* GL_ARB_sync */
2897  USE_GL_FUNC(glClientWaitSync)
2898  USE_GL_FUNC(glDeleteSync)
2899  USE_GL_FUNC(glFenceSync)
2900  USE_GL_FUNC(glGetInteger64v)
2901  USE_GL_FUNC(glGetSynciv)
2902  USE_GL_FUNC(glIsSync)
2903  USE_GL_FUNC(glWaitSync)
2904  /* GL_ARB_tessellation_shader */
2905  USE_GL_FUNC(glPatchParameteri)
2906  USE_GL_FUNC(glPatchParameterfv)
2907  /* GL_ARB_texture_buffer_object */
2908  USE_GL_FUNC(glTexBufferARB)
2909  /* GL_ARB_texture_buffer_range */
2910  USE_GL_FUNC(glTexBufferRange)
2911  /* GL_ARB_texture_compression */
2912  USE_GL_FUNC(glCompressedTexImage2DARB)
2913  USE_GL_FUNC(glCompressedTexImage3DARB)
2914  USE_GL_FUNC(glCompressedTexSubImage2DARB)
2915  USE_GL_FUNC(glCompressedTexSubImage3DARB)
2916  USE_GL_FUNC(glGetCompressedTexImageARB)
2917  /* GL_ARB_texture_multisample */
2918  USE_GL_FUNC(glGetMultisamplefv);
2919  USE_GL_FUNC(glSampleMaski);
2920  USE_GL_FUNC(glTexImage2DMultisample);
2921  USE_GL_FUNC(glTexImage3DMultisample);
2922  /* GL_ARB_texture_storage */
2923  USE_GL_FUNC(glTexStorage1D)
2924  USE_GL_FUNC(glTexStorage2D)
2925  USE_GL_FUNC(glTexStorage3D)
2926  /* GL_ARB_texture_storage_multisample */
2927  USE_GL_FUNC(glTexStorage2DMultisample);
2928  USE_GL_FUNC(glTexStorage3DMultisample);
2929  /* GL_ARB_texture_view */
2930  USE_GL_FUNC(glTextureView)
2931  /* GL_ARB_timer_query */
2932  USE_GL_FUNC(glQueryCounter)
2933  USE_GL_FUNC(glGetQueryObjectui64v)
2934  /* GL_ARB_transform_feedback2 */
2935  USE_GL_FUNC(glBindTransformFeedback);
2936  USE_GL_FUNC(glDeleteTransformFeedbacks);
2937  USE_GL_FUNC(glDrawTransformFeedback);
2938  USE_GL_FUNC(glGenTransformFeedbacks);
2939  USE_GL_FUNC(glIsTransformFeedback);
2940  USE_GL_FUNC(glPauseTransformFeedback);
2941  USE_GL_FUNC(glResumeTransformFeedback);
2942  /* GL_ARB_transform_feedback3 */
2943  USE_GL_FUNC(glBeginQueryIndexed);
2944  USE_GL_FUNC(glDrawTransformFeedbackStream);
2945  USE_GL_FUNC(glEndQueryIndexed);
2946  USE_GL_FUNC(glGetQueryIndexediv);
2947  /* GL_ARB_uniform_buffer_object */
2948  USE_GL_FUNC(glBindBufferBase)
2949  USE_GL_FUNC(glBindBufferRange)
2950  USE_GL_FUNC(glGetActiveUniformBlockName)
2951  USE_GL_FUNC(glGetActiveUniformBlockiv)
2952  USE_GL_FUNC(glGetActiveUniformName)
2953  USE_GL_FUNC(glGetActiveUniformsiv)
2954  USE_GL_FUNC(glGetIntegeri_v)
2955  USE_GL_FUNC(glGetUniformBlockIndex)
2956  USE_GL_FUNC(glGetUniformIndices)
2957  USE_GL_FUNC(glUniformBlockBinding)
2958  /* GL_ARB_vertex_buffer_object */
2959  USE_GL_FUNC(glBindBufferARB)
2960  USE_GL_FUNC(glBufferDataARB)
2961  USE_GL_FUNC(glBufferSubDataARB)
2962  USE_GL_FUNC(glDeleteBuffersARB)
2963  USE_GL_FUNC(glGenBuffersARB)
2964  USE_GL_FUNC(glGetBufferParameterivARB)
2965  USE_GL_FUNC(glGetBufferPointervARB)
2966  USE_GL_FUNC(glGetBufferSubDataARB)
2967  USE_GL_FUNC(glIsBufferARB)
2968  USE_GL_FUNC(glMapBufferARB)
2969  USE_GL_FUNC(glUnmapBufferARB)
2970  /* GL_ARB_vertex_program */
2971  USE_GL_FUNC(glBindProgramARB)
2972  USE_GL_FUNC(glDeleteProgramsARB)
2973  USE_GL_FUNC(glDisableVertexAttribArrayARB)
2974  USE_GL_FUNC(glEnableVertexAttribArrayARB)
2975  USE_GL_FUNC(glGenProgramsARB)
2976  USE_GL_FUNC(glGetProgramivARB)
2977  USE_GL_FUNC(glProgramEnvParameter4fvARB)
2978  USE_GL_FUNC(glProgramLocalParameter4fvARB)
2979  USE_GL_FUNC(glProgramStringARB)
2980  USE_GL_FUNC(glVertexAttrib1dARB)
2981  USE_GL_FUNC(glVertexAttrib1dvARB)
2982  USE_GL_FUNC(glVertexAttrib1fARB)
2983  USE_GL_FUNC(glVertexAttrib1fvARB)
2984  USE_GL_FUNC(glVertexAttrib1sARB)
2985  USE_GL_FUNC(glVertexAttrib1svARB)
2986  USE_GL_FUNC(glVertexAttrib2dARB)
2987  USE_GL_FUNC(glVertexAttrib2dvARB)
2988  USE_GL_FUNC(glVertexAttrib2fARB)
2989  USE_GL_FUNC(glVertexAttrib2fvARB)
2990  USE_GL_FUNC(glVertexAttrib2sARB)
2991  USE_GL_FUNC(glVertexAttrib2svARB)
2992  USE_GL_FUNC(glVertexAttrib3dARB)
2993  USE_GL_FUNC(glVertexAttrib3dvARB)
2994  USE_GL_FUNC(glVertexAttrib3fARB)
2995  USE_GL_FUNC(glVertexAttrib3fvARB)
2996  USE_GL_FUNC(glVertexAttrib3sARB)
2997  USE_GL_FUNC(glVertexAttrib3svARB)
2998  USE_GL_FUNC(glVertexAttrib4NbvARB)
2999  USE_GL_FUNC(glVertexAttrib4NivARB)
3000  USE_GL_FUNC(glVertexAttrib4NsvARB)
3001  USE_GL_FUNC(glVertexAttrib4NubARB)
3002  USE_GL_FUNC(glVertexAttrib4NubvARB)
3003  USE_GL_FUNC(glVertexAttrib4NuivARB)
3004  USE_GL_FUNC(glVertexAttrib4NusvARB)
3005  USE_GL_FUNC(glVertexAttrib4bvARB)
3006  USE_GL_FUNC(glVertexAttrib4dARB)
3007  USE_GL_FUNC(glVertexAttrib4dvARB)
3008  USE_GL_FUNC(glVertexAttrib4fARB)
3009  USE_GL_FUNC(glVertexAttrib4fvARB)
3010  USE_GL_FUNC(glVertexAttrib4ivARB)
3011  USE_GL_FUNC(glVertexAttrib4sARB)
3012  USE_GL_FUNC(glVertexAttrib4svARB)
3013  USE_GL_FUNC(glVertexAttrib4ubvARB)
3014  USE_GL_FUNC(glVertexAttrib4uivARB)
3015  USE_GL_FUNC(glVertexAttrib4usvARB)
3016  USE_GL_FUNC(glVertexAttribPointerARB)
3017  /* GL_ARB_viewport_array */
3018  USE_GL_FUNC(glDepthRangeArrayv)
3019  USE_GL_FUNC(glDepthRangeIndexed)
3020  USE_GL_FUNC(glGetDoublei_v)
3021  USE_GL_FUNC(glGetFloati_v)
3022  USE_GL_FUNC(glScissorArrayv)
3023  USE_GL_FUNC(glScissorIndexed)
3024  USE_GL_FUNC(glScissorIndexedv)
3025  USE_GL_FUNC(glViewportArrayv)
3026  USE_GL_FUNC(glViewportIndexedf)
3027  USE_GL_FUNC(glViewportIndexedfv)
3028  /* GL_ATI_fragment_shader */
3029  USE_GL_FUNC(glAlphaFragmentOp1ATI)
3030  USE_GL_FUNC(glAlphaFragmentOp2ATI)
3031  USE_GL_FUNC(glAlphaFragmentOp3ATI)
3032  USE_GL_FUNC(glBeginFragmentShaderATI)
3033  USE_GL_FUNC(glBindFragmentShaderATI)
3034  USE_GL_FUNC(glColorFragmentOp1ATI)
3035  USE_GL_FUNC(glColorFragmentOp2ATI)
3036  USE_GL_FUNC(glColorFragmentOp3ATI)
3037  USE_GL_FUNC(glDeleteFragmentShaderATI)
3038  USE_GL_FUNC(glEndFragmentShaderATI)
3039  USE_GL_FUNC(glGenFragmentShadersATI)
3040  USE_GL_FUNC(glPassTexCoordATI)
3041  USE_GL_FUNC(glSampleMapATI)
3042  USE_GL_FUNC(glSetFragmentShaderConstantATI)
3043  /* GL_ATI_separate_stencil */
3044  USE_GL_FUNC(glStencilOpSeparateATI)
3045  USE_GL_FUNC(glStencilFuncSeparateATI)
3046  /* GL_EXT_blend_color */
3047  USE_GL_FUNC(glBlendColorEXT)
3048  /* GL_EXT_blend_equation_separate */
3049  USE_GL_FUNC(glBlendFuncSeparateEXT)
3050  /* GL_EXT_blend_func_separate */
3051  USE_GL_FUNC(glBlendEquationSeparateEXT)
3052  /* GL_EXT_blend_minmax */
3053  USE_GL_FUNC(glBlendEquationEXT)
3054  /* GL_EXT_depth_bounds_test */
3055  USE_GL_FUNC(glDepthBoundsEXT)
3056  /* GL_EXT_draw_buffers2 */
3057  USE_GL_FUNC(glColorMaskIndexedEXT)
3058  USE_GL_FUNC(glDisableIndexedEXT)
3059  USE_GL_FUNC(glEnableIndexedEXT)
3060  USE_GL_FUNC(glGetBooleanIndexedvEXT)
3061  USE_GL_FUNC(glGetIntegerIndexedvEXT)
3062  USE_GL_FUNC(glIsEnabledIndexedEXT)
3063  /* GL_EXT_fog_coord */
3064  USE_GL_FUNC(glFogCoordPointerEXT)
3065  USE_GL_FUNC(glFogCoorddEXT)
3066  USE_GL_FUNC(glFogCoorddvEXT)
3067  USE_GL_FUNC(glFogCoordfEXT)
3068  USE_GL_FUNC(glFogCoordfvEXT)
3069  /* GL_EXT_framebuffer_blit */
3070  USE_GL_FUNC(glBlitFramebufferEXT)
3071  /* GL_EXT_framebuffer_multisample */
3072  USE_GL_FUNC(glRenderbufferStorageMultisampleEXT)
3073  /* GL_EXT_framebuffer_object */
3074  USE_GL_FUNC(glBindFramebufferEXT)
3075  USE_GL_FUNC(glBindRenderbufferEXT)
3076  USE_GL_FUNC(glCheckFramebufferStatusEXT)
3077  USE_GL_FUNC(glDeleteFramebuffersEXT)
3078  USE_GL_FUNC(glDeleteRenderbuffersEXT)
3079  USE_GL_FUNC(glFramebufferRenderbufferEXT)
3080  USE_GL_FUNC(glFramebufferTexture1DEXT)
3081  USE_GL_FUNC(glFramebufferTexture2DEXT)
3082  USE_GL_FUNC(glFramebufferTexture3DEXT)
3083  USE_GL_FUNC(glGenFramebuffersEXT)
3084  USE_GL_FUNC(glGenRenderbuffersEXT)
3085  USE_GL_FUNC(glGenerateMipmapEXT)
3086  USE_GL_FUNC(glGetFramebufferAttachmentParameterivEXT)
3087  USE_GL_FUNC(glGetRenderbufferParameterivEXT)
3088  USE_GL_FUNC(glIsFramebufferEXT)
3089  USE_GL_FUNC(glIsRenderbufferEXT)
3090  USE_GL_FUNC(glRenderbufferStorageEXT)
3091  /* GL_EXT_gpu_program_parameters */
3092  USE_GL_FUNC(glProgramEnvParameters4fvEXT)
3093  USE_GL_FUNC(glProgramLocalParameters4fvEXT)
3094  /* GL_EXT_gpu_shader4 */
3095  USE_GL_FUNC(glBindFragDataLocationEXT)
3096  USE_GL_FUNC(glGetFragDataLocationEXT)
3097  USE_GL_FUNC(glGetUniformuivEXT)
3098  USE_GL_FUNC(glGetVertexAttribIivEXT)
3099  USE_GL_FUNC(glGetVertexAttribIuivEXT)
3100  USE_GL_FUNC(glUniform1uiEXT)
3101  USE_GL_FUNC(glUniform1uivEXT)
3102  USE_GL_FUNC(glUniform2uiEXT)
3103  USE_GL_FUNC(glUniform2uivEXT)
3104  USE_GL_FUNC(glUniform3uiEXT)
3105  USE_GL_FUNC(glUniform3uivEXT)
3106  USE_GL_FUNC(glUniform4uiEXT)
3107  USE_GL_FUNC(glUniform4uivEXT)
3108  USE_GL_FUNC(glVertexAttribI1iEXT)
3109  USE_GL_FUNC(glVertexAttribI1ivEXT)
3110  USE_GL_FUNC(glVertexAttribI1uiEXT)
3111  USE_GL_FUNC(glVertexAttribI1uivEXT)
3112  USE_GL_FUNC(glVertexAttribI2iEXT)
3113  USE_GL_FUNC(glVertexAttribI2ivEXT)
3114  USE_GL_FUNC(glVertexAttribI2uiEXT)
3115  USE_GL_FUNC(glVertexAttribI2uivEXT)
3116  USE_GL_FUNC(glVertexAttribI3iEXT)
3117  USE_GL_FUNC(glVertexAttribI3ivEXT)
3118  USE_GL_FUNC(glVertexAttribI3uiEXT)
3119  USE_GL_FUNC(glVertexAttribI3uivEXT)
3120  USE_GL_FUNC(glVertexAttribI4bvEXT)
3121  USE_GL_FUNC(glVertexAttribI4iEXT)
3122  USE_GL_FUNC(glVertexAttribI4ivEXT)
3123  USE_GL_FUNC(glVertexAttribI4svEXT)
3124  USE_GL_FUNC(glVertexAttribI4ubvEXT)
3125  USE_GL_FUNC(glVertexAttribI4uiEXT)
3126  USE_GL_FUNC(glVertexAttribI4uivEXT)
3127  USE_GL_FUNC(glVertexAttribI4usvEXT)
3128  USE_GL_FUNC(glVertexAttribIPointerEXT)
3129  /* GL_EXT_point_parameters */
3130  USE_GL_FUNC(glPointParameterfEXT)
3131  USE_GL_FUNC(glPointParameterfvEXT)
3132  /* GL_EXT_polygon_offset_clamp */
3133  USE_GL_FUNC(glPolygonOffsetClampEXT)
3134  /* GL_EXT_provoking_vertex */
3135  USE_GL_FUNC(glProvokingVertexEXT)
3136  /* GL_EXT_secondary_color */
3137  USE_GL_FUNC(glSecondaryColor3fEXT)
3138  USE_GL_FUNC(glSecondaryColor3fvEXT)
3139  USE_GL_FUNC(glSecondaryColor3ubEXT)
3140  USE_GL_FUNC(glSecondaryColor3ubvEXT)
3141  USE_GL_FUNC(glSecondaryColorPointerEXT)
3142  /* GL_EXT_stencil_two_side */
3143  USE_GL_FUNC(glActiveStencilFaceEXT)
3144  /* GL_EXT_texture3D */
3146  USE_GL_FUNC(glTexImage3DEXT)
3148  USE_GL_FUNC(glTexSubImage3DEXT)
3149  /* GL_NV_fence */
3150  USE_GL_FUNC(glDeleteFencesNV)
3151  USE_GL_FUNC(glFinishFenceNV)
3152  USE_GL_FUNC(glGenFencesNV)
3153  USE_GL_FUNC(glGetFenceivNV)
3154  USE_GL_FUNC(glIsFenceNV)
3155  USE_GL_FUNC(glSetFenceNV)
3156  USE_GL_FUNC(glTestFenceNV)
3157  /* GL_NV_half_float */
3158  USE_GL_FUNC(glColor3hNV)
3159  USE_GL_FUNC(glColor3hvNV)
3160  USE_GL_FUNC(glColor4hNV)
3161  USE_GL_FUNC(glColor4hvNV)
3162  USE_GL_FUNC(glFogCoordhNV)
3163  USE_GL_FUNC(glFogCoordhvNV)
3164  USE_GL_FUNC(glMultiTexCoord1hNV)
3165  USE_GL_FUNC(glMultiTexCoord1hvNV)
3166  USE_GL_FUNC(glMultiTexCoord2hNV)
3167  USE_GL_FUNC(glMultiTexCoord2hvNV)
3168  USE_GL_FUNC(glMultiTexCoord3hNV)
3169  USE_GL_FUNC(glMultiTexCoord3hvNV)
3170  USE_GL_FUNC(glMultiTexCoord4hNV)
3171  USE_GL_FUNC(glMultiTexCoord4hvNV)
3172  USE_GL_FUNC(glNormal3hNV)
3173  USE_GL_FUNC(glNormal3hvNV)
3174  USE_GL_FUNC(glSecondaryColor3hNV)
3175  USE_GL_FUNC(glSecondaryColor3hvNV)
3176  USE_GL_FUNC(glTexCoord1hNV)
3177  USE_GL_FUNC(glTexCoord1hvNV)
3178  USE_GL_FUNC(glTexCoord2hNV)
3179  USE_GL_FUNC(glTexCoord2hvNV)
3180  USE_GL_FUNC(glTexCoord3hNV)
3181  USE_GL_FUNC(glTexCoord3hvNV)
3182  USE_GL_FUNC(glTexCoord4hNV)
3183  USE_GL_FUNC(glTexCoord4hvNV)
3184  USE_GL_FUNC(glVertex2hNV)
3185  USE_GL_FUNC(glVertex2hvNV)
3186  USE_GL_FUNC(glVertex3hNV)
3187  USE_GL_FUNC(glVertex3hvNV)
3188  USE_GL_FUNC(glVertex4hNV)
3189  USE_GL_FUNC(glVertex4hvNV)
3190  USE_GL_FUNC(glVertexAttrib1hNV)
3191  USE_GL_FUNC(glVertexAttrib1hvNV)
3192  USE_GL_FUNC(glVertexAttrib2hNV)
3193  USE_GL_FUNC(glVertexAttrib2hvNV)
3194  USE_GL_FUNC(glVertexAttrib3hNV)
3195  USE_GL_FUNC(glVertexAttrib3hvNV)
3196  USE_GL_FUNC(glVertexAttrib4hNV)
3197  USE_GL_FUNC(glVertexAttrib4hvNV)
3198  USE_GL_FUNC(glVertexAttribs1hvNV)
3199  USE_GL_FUNC(glVertexAttribs2hvNV)
3200  USE_GL_FUNC(glVertexAttribs3hvNV)
3201  USE_GL_FUNC(glVertexAttribs4hvNV)
3202  USE_GL_FUNC(glVertexWeighthNV)
3203  USE_GL_FUNC(glVertexWeighthvNV)
3204  /* GL_NV_point_sprite */
3205  USE_GL_FUNC(glPointParameteriNV)
3206  USE_GL_FUNC(glPointParameterivNV)
3207  /* GL_NV_register_combiners */
3208  USE_GL_FUNC(glCombinerInputNV)
3209  USE_GL_FUNC(glCombinerOutputNV)
3210  USE_GL_FUNC(glCombinerParameterfNV)
3211  USE_GL_FUNC(glCombinerParameterfvNV)
3212  USE_GL_FUNC(glCombinerParameteriNV)
3213  USE_GL_FUNC(glCombinerParameterivNV)
3214  USE_GL_FUNC(glFinalCombinerInputNV)
3215  /* WGL extensions */
3216  USE_GL_FUNC(wglChoosePixelFormatARB)
3217  USE_GL_FUNC(wglGetExtensionsStringARB)
3218  USE_GL_FUNC(wglGetPixelFormatAttribfvARB)
3219  USE_GL_FUNC(wglGetPixelFormatAttribivARB)
3220  USE_GL_FUNC(wglQueryCurrentRendererIntegerWINE)
3221  USE_GL_FUNC(wglQueryCurrentRendererStringWINE)
3222  USE_GL_FUNC(wglQueryRendererIntegerWINE)
3223  USE_GL_FUNC(wglQueryRendererStringWINE)
3224  USE_GL_FUNC(wglSetPixelFormatWINE)
3225  USE_GL_FUNC(wglSwapIntervalEXT)
3226 
3227  /* Newer core functions */
3228  USE_GL_FUNC(glActiveTexture) /* OpenGL 1.3 */
3229  USE_GL_FUNC(glAttachShader) /* OpenGL 2.0 */
3230  USE_GL_FUNC(glBeginQuery) /* OpenGL 1.5 */
3231  USE_GL_FUNC(glBeginTransformFeedback) /* OpenGL 3.0 */
3232  USE_GL_FUNC(glBindAttribLocation) /* OpenGL 2.0 */
3233  USE_GL_FUNC(glBindBuffer) /* OpenGL 1.5 */
3234  USE_GL_FUNC(glBindFragDataLocation) /* OpenGL 3.0 */
3235  USE_GL_FUNC(glBindVertexArray) /* OpenGL 3.0 */
3236  USE_GL_FUNC(glBlendColor) /* OpenGL 1.4 */
3237  USE_GL_FUNC(glBlendEquation) /* OpenGL 1.4 */
3238  USE_GL_FUNC(glBlendEquationSeparate) /* OpenGL 2.0 */
3239  USE_GL_FUNC(glBlendFuncSeparate) /* OpenGL 1.4 */
3240  USE_GL_FUNC(glBufferData) /* OpenGL 1.5 */
3241  USE_GL_FUNC(glBufferSubData) /* OpenGL 1.5 */
3242  USE_GL_FUNC(glColorMaski) /* OpenGL 3.0 */
3243  USE_GL_FUNC(glCompileShader) /* OpenGL 2.0 */
3244  USE_GL_FUNC(glCompressedTexImage2D) /* OpenGL 1.3 */
3245  USE_GL_FUNC(glCompressedTexImage3D) /* OpenGL 1.3 */
3246  USE_GL_FUNC(glCompressedTexSubImage2D) /* OpenGL 1.3 */
3247  USE_GL_FUNC(glCompressedTexSubImage3D) /* OpenGL 1.3 */
3248  USE_GL_FUNC(glCreateProgram) /* OpenGL 2.0 */
3249  USE_GL_FUNC(glCreateShader) /* OpenGL 2.0 */
3250  USE_GL_FUNC(glDebugMessageCallback) /* OpenGL 4.3 */
3251  USE_GL_FUNC(glDebugMessageControl) /* OpenGL 4.3 */
3252  USE_GL_FUNC(glDebugMessageInsert) /* OpenGL 4.3 */
3253  USE_GL_FUNC(glDeleteBuffers) /* OpenGL 1.5 */
3254  USE_GL_FUNC(glDeleteProgram) /* OpenGL 2.0 */
3255  USE_GL_FUNC(glDeleteQueries) /* OpenGL 1.5 */
3256  USE_GL_FUNC(glDeleteShader) /* OpenGL 2.0 */
3257  USE_GL_FUNC(glDeleteVertexArrays) /* OpenGL 3.0 */
3258  USE_GL_FUNC(glDetachShader) /* OpenGL 2.0 */
3259  USE_GL_FUNC(glDisablei) /* OpenGL 3.0 */
3260  USE_GL_FUNC(glDisableVertexAttribArray) /* OpenGL 2.0 */
3261  USE_GL_FUNC(glDrawArraysInstanced) /* OpenGL 3.1 */
3262  USE_GL_FUNC(glDrawBuffers) /* OpenGL 2.0 */
3263  USE_GL_FUNC(glDrawElementsInstanced) /* OpenGL 3.1 */
3264  USE_GL_FUNC(glEnablei) /* OpenGL 3.0 */
3265  USE_GL_FUNC(glEnableVertexAttribArray) /* OpenGL 2.0 */
3266  USE_GL_FUNC(glEndQuery) /* OpenGL 1.5 */
3267  USE_GL_FUNC(glEndTransformFeedback) /* OpenGL 3.0 */
3268  USE_GL_FUNC(glFramebufferTexture) /* OpenGL 3.2 */
3269  USE_GL_FUNC(glGenBuffers) /* OpenGL 1.5 */
3270  USE_GL_FUNC(glGenQueries) /* OpenGL 1.5 */
3271  USE_GL_FUNC(glGenVertexArrays) /* OpenGL 3.0 */
3272  USE_GL_FUNC(glGetActiveUniform) /* OpenGL 2.0 */
3273  USE_GL_FUNC(glGetAttachedShaders) /* OpenGL 2.0 */
3274  USE_GL_FUNC(glGetAttribLocation) /* OpenGL 2.0 */
3275  USE_GL_FUNC(glGetBooleani_v) /* OpenGL 3.0 */
3276  USE_GL_FUNC(glGetBufferSubData) /* OpenGL 1.5 */
3277  USE_GL_FUNC(glGetCompressedTexImage) /* OpenGL 1.3 */
3278  USE_GL_FUNC(glGetDebugMessageLog) /* OpenGL 4.3 */
3279  USE_GL_FUNC(glGetIntegeri_v) /* OpenGL 3.0 */
3280  USE_GL_FUNC(glGetProgramInfoLog) /* OpenGL 2.0 */
3281  USE_GL_FUNC(glGetProgramiv) /* OpenGL 2.0 */
3282  USE_GL_FUNC(glGetQueryiv) /* OpenGL 1.5 */
3283  USE_GL_FUNC(glGetQueryObjectuiv) /* OpenGL 1.5 */
3284  USE_GL_FUNC(glGetShaderInfoLog) /* OpenGL 2.0 */
3285  USE_GL_FUNC(glGetShaderiv) /* OpenGL 2.0 */
3286  USE_GL_FUNC(glGetShaderSource) /* OpenGL 2.0 */
3287  USE_GL_FUNC(glGetStringi) /* OpenGL 3.0 */
3288  USE_GL_FUNC(glGetTextureLevelParameteriv) /* OpenGL 4.5 */
3289  USE_GL_FUNC(glGetTextureParameteriv) /* OpenGL 4.5 */
3290  USE_GL_FUNC(glGetUniformfv) /* OpenGL 2.0 */
3291  USE_GL_FUNC(glGetUniformiv) /* OpenGL 2.0 */
3292  USE_GL_FUNC(glGetUniformLocation) /* OpenGL 2.0 */
3293  USE_GL_FUNC(glIsEnabledi) /* OpenGL 3.0 */
3294  USE_GL_FUNC(glLinkProgram) /* OpenGL 2.0 */
3295  USE_GL_FUNC(glMapBuffer) /* OpenGL 1.5 */
3296  USE_GL_FUNC(glPointParameteri) /* OpenGL 1.4 */
3297  USE_GL_FUNC(glPointParameteriv) /* OpenGL 1.4 */
3298  USE_GL_FUNC(glShaderSource) /* OpenGL 2.0 */
3299  USE_GL_FUNC(glStencilFuncSeparate) /* OpenGL 2.0 */
3300  USE_GL_FUNC(glStencilOpSeparate) /* OpenGL 2.0 */
3301  USE_GL_FUNC(glTexBuffer) /* OpenGL 3.1 */
3302  USE_GL_FUNC(glTexImage3D) /* OpenGL 1.2 */
3303  USE_GL_FUNC(glTexSubImage3D) /* OpenGL 1.2 */
3304  USE_GL_FUNC(glTransformFeedbackVaryings) /* OpenGL 3.0 */
3305  USE_GL_FUNC(glUniform1f) /* OpenGL 2.0 */
3306  USE_GL_FUNC(glUniform1fv) /* OpenGL 2.0 */
3307  USE_GL_FUNC(glUniform1i) /* OpenGL 2.0 */
3308  USE_GL_FUNC(glUniform1iv) /* OpenGL 2.0 */
3309  USE_GL_FUNC(glUniform2f) /* OpenGL 2.0 */
3310  USE_GL_FUNC(glUniform2fv) /* OpenGL 2.0 */
3311  USE_GL_FUNC(glUniform2i) /* OpenGL 2.0 */
3312  USE_GL_FUNC(glUniform2iv) /* OpenGL 2.0 */
3313  USE_GL_FUNC(glUniform3f) /* OpenGL 2.0 */
3314  USE_GL_FUNC(glUniform3fv) /* OpenGL 2.0 */
3315  USE_GL_FUNC(glUniform3i) /* OpenGL 2.0 */
3316  USE_GL_FUNC(glUniform3iv) /* OpenGL 2.0 */
3317  USE_GL_FUNC(glUniform4f) /* OpenGL 2.0 */
3318  USE_GL_FUNC(glUniform4fv) /* OpenGL 2.0 */
3319  USE_GL_FUNC(glUniform4i) /* OpenGL 2.0 */
3320  USE_GL_FUNC(glUniform4iv) /* OpenGL 2.0 */
3321  USE_GL_FUNC(glUniformMatrix2fv) /* OpenGL 2.0 */
3322  USE_GL_FUNC(glUniformMatrix3fv) /* OpenGL 2.0 */
3323  USE_GL_FUNC(glUniformMatrix4fv) /* OpenGL 2.0 */
3324  USE_GL_FUNC(glUnmapBuffer) /* OpenGL 1.5 */
3325  USE_GL_FUNC(glUseProgram) /* OpenGL 2.0 */
3326  USE_GL_FUNC(glValidateProgram) /* OpenGL 2.0 */
3327  USE_GL_FUNC(glVertexAttrib1f) /* OpenGL 2.0 */
3328  USE_GL_FUNC(glVertexAttrib1fv) /* OpenGL 2.0 */
3329  USE_GL_FUNC(glVertexAttrib2f) /* OpenGL 2.0 */
3330  USE_GL_FUNC(glVertexAttrib2fv) /* OpenGL 2.0 */
3331  USE_GL_FUNC(glVertexAttrib3f) /* OpenGL 2.0 */
3332  USE_GL_FUNC(glVertexAttrib3fv) /* OpenGL 2.0 */
3333  USE_GL_FUNC(glVertexAttrib4f) /* OpenGL 2.0 */
3334  USE_GL_FUNC(glVertexAttrib4fv) /* OpenGL 2.0 */
3335  USE_GL_FUNC(glVertexAttrib4Nsv) /* OpenGL 2.0 */
3336  USE_GL_FUNC(glVertexAttrib4Nub) /* OpenGL 2.0 */
3337  USE_GL_FUNC(glVertexAttrib4Nubv) /* OpenGL 2.0 */
3338  USE_GL_FUNC(glVertexAttrib4Nusv) /* OpenGL 2.0 */
3339  USE_GL_FUNC(glVertexAttrib4sv) /* OpenGL 2.0 */
3340  USE_GL_FUNC(glVertexAttrib4ubv) /* OpenGL 2.0 */
3341  USE_GL_FUNC(glVertexAttribDivisor) /* OpenGL 3.3 */
3342  USE_GL_FUNC(glVertexAttribIPointer) /* OpenGL 3.0 */
3343  USE_GL_FUNC(glVertexAttribPointer) /* OpenGL 2.0 */
3344 #undef USE_GL_FUNC
3345 
3346 #ifndef USE_WIN32_OPENGL
3347  /* hack: use the functions directly from the TEB table to bypass the thunks */
3348  /* note that we still need the above wglGetProcAddress calls to initialize the table */
3349  gl_info->gl_ops.ext = ((struct opengl_funcs *)NtCurrentTeb()->glTable)->ext;
3350 #endif
3351 
3352 #define MAP_GL_FUNCTION(core_func, ext_func) \
3353  do \
3354  { \
3355  if (!gl_info->gl_ops.ext.p_##core_func) \
3356  gl_info->gl_ops.ext.p_##core_func = gl_info->gl_ops.ext.p_##ext_func; \
3357  } while (0)
3358 #define MAP_GL_FUNCTION_CAST(core_func, ext_func) \
3359  do \
3360  { \
3361  if (!gl_info->gl_ops.ext.p_##core_func) \
3362  gl_info->gl_ops.ext.p_##core_func = (void *)gl_info->gl_ops.ext.p_##ext_func; \
3363  } while (0)
3364 
3366  MAP_GL_FUNCTION(glAttachShader, glAttachObjectARB);
3367  MAP_GL_FUNCTION(glBeginQuery, glBeginQueryARB);
3368  MAP_GL_FUNCTION(glBindAttribLocation, glBindAttribLocationARB);
3369  MAP_GL_FUNCTION(glBindBuffer, glBindBufferARB);
3370  MAP_GL_FUNCTION(glBindFragDataLocation, glBindFragDataLocationEXT);
3371  MAP_GL_FUNCTION(glBlendColor, glBlendColorEXT);
3372  MAP_GL_FUNCTION(glBlendEquation, glBlendEquationEXT);
3373  MAP_GL_FUNCTION(glBlendEquationSeparate, glBlendEquationSeparateEXT);
3374  MAP_GL_FUNCTION(glBlendFuncSeparate, glBlendFuncSeparateEXT);
3375  MAP_GL_FUNCTION(glBufferData, glBufferDataARB);
3376  MAP_GL_FUNCTION(glBufferSubData, glBufferSubDataARB);
3377  MAP_GL_FUNCTION(glColorMaski, glColorMaskIndexedEXT);
3378  MAP_GL_FUNCTION(glCompileShader, glCompileShaderARB);
3379  MAP_GL_FUNCTION(glCompressedTexImage2D, glCompressedTexImage2DARB);
3380  MAP_GL_FUNCTION(glCompressedTexImage3D, glCompressedTexImage3DARB);
3381  MAP_GL_FUNCTION(glCompressedTexSubImage2D, glCompressedTexSubImage2DARB);
3382  MAP_GL_FUNCTION(glCompressedTexSubImage3D, glCompressedTexSubImage3DARB);
3383  MAP_GL_FUNCTION(glCreateProgram, glCreateProgramObjectARB);
3384  MAP_GL_FUNCTION(glCreateShader, glCreateShaderObjectARB);
3385  MAP_GL_FUNCTION(glDebugMessageCallback, glDebugMessageCallbackARB);
3386  MAP_GL_FUNCTION(glDebugMessageControl, glDebugMessageControlARB);
3387  MAP_GL_FUNCTION(glDebugMessageInsert, glDebugMessageInsertARB);
3388  MAP_GL_FUNCTION(glDeleteBuffers, glDeleteBuffersARB);
3389  MAP_GL_FUNCTION(glDeleteProgram, glDeleteObjectARB);
3390  MAP_GL_FUNCTION(glDeleteQueries, glDeleteQueriesARB);
3391  MAP_GL_FUNCTION(glDeleteShader, glDeleteObjectARB);
3392  MAP_GL_FUNCTION(glDetachShader, glDetachObjectARB);
3393  MAP_GL_FUNCTION(glDisablei, glDisableIndexedEXT);
3394  MAP_GL_FUNCTION(glDisableVertexAttribArray, glDisableVertexAttribArrayARB);
3395  MAP_GL_FUNCTION(glDrawArraysInstanced, glDrawArraysInstancedARB);
3396  MAP_GL_FUNCTION(glDrawBuffers, glDrawBuffersARB);
3397  MAP_GL_FUNCTION(glDrawElementsInstanced, glDrawElementsInstancedARB);
3398  MAP_GL_FUNCTION(glEnablei, glEnableIndexedEXT);
3399  MAP_GL_FUNCTION(glEnableVertexAttribArray, glEnableVertexAttribArrayARB);
3400  MAP_GL_FUNCTION(glEndQuery, glEndQueryARB);
3401  MAP_GL_FUNCTION(glFramebufferTexture, glFramebufferTextureARB);
3402  MAP_GL_FUNCTION(glGenBuffers, glGenBuffersARB);
3403  MAP_GL_FUNCTION(glGenQueries, glGenQueriesARB);
3404  MAP_GL_FUNCTION(glGetActiveUniform, glGetActiveUniformARB);
3405  MAP_GL_FUNCTION(glGetAttachedShaders, glGetAttachedObjectsARB);
3406  MAP_GL_FUNCTION(glGetAttribLocation, glGetAttribLocationARB);
3407  MAP_GL_FUNCTION(glGetBooleani_v, glGetBooleanIndexedvEXT);
3408  MAP_GL_FUNCTION(glGetBufferSubData, glGetBufferSubDataARB);
3409  MAP_GL_FUNCTION(glGetCompressedTexImage, glGetCompressedTexImageARB);
3410  MAP_GL_FUNCTION(glGetDebugMessageLog, glGetDebugMessageLogARB);
3411  MAP_GL_FUNCTION(glGetIntegeri_v, glGetIntegerIndexedvEXT);
3412  MAP_GL_FUNCTION(glGetProgramInfoLog, glGetInfoLogARB);
3413  MAP_GL_FUNCTION(glGetProgramiv, glGetObjectParameterivARB);
3414  MAP_GL_FUNCTION(glGetQueryiv, glGetQueryivARB);
3415  MAP_GL_FUNCTION(glGetQueryObjectuiv, glGetQueryObjectuivARB);
3416  MAP_GL_FUNCTION(glGetShaderInfoLog, glGetInfoLogARB);
3417  MAP_GL_FUNCTION(glGetShaderiv, glGetObjectParameterivARB);
3418  MAP_GL_FUNCTION(glGetShaderSource, glGetShaderSourceARB);
3419  MAP_GL_FUNCTION(glGetUniformfv, glGetUniformfvARB);
3420  MAP_GL_FUNCTION(glGetUniformiv, glGetUniformivARB);
3421  MAP_GL_FUNCTION(glGetUniformLocation, glGetUniformLocationARB);
3422  MAP_GL_FUNCTION(glIsEnabledi, glIsEnabledIndexedEXT);
3423  MAP_GL_FUNCTION(glLinkProgram, glLinkProgramARB);
3424  MAP_GL_FUNCTION(glMapBuffer, glMapBufferARB);
3425  MAP_GL_FUNCTION(glMinSampleShading, glMinSampleShadingARB);
3426  MAP_GL_FUNCTION_CAST(glShaderSource, glShaderSourceARB);
3427  MAP_GL_FUNCTION(glTexBuffer, glTexBufferARB);
3428  MAP_GL_FUNCTION_CAST(glTexImage3D, glTexImage3DEXT);
3429  MAP_GL_FUNCTION(glTexSubImage3D, glTexSubImage3DEXT);
3430  MAP_GL_FUNCTION(glUniform1f, glUniform1fARB);
3431  MAP_GL_FUNCTION(glUniform1fv, glUniform1fvARB);
3432  MAP_GL_FUNCTION(glUniform1i, glUniform1iARB);
3433  MAP_GL_FUNCTION(glUniform1iv, glUniform1ivARB);
3434  MAP_GL_FUNCTION(glUniform2f, glUniform2fARB);
3435  MAP_GL_FUNCTION(glUniform2fv, glUniform2fvARB);
3436  MAP_GL_FUNCTION(glUniform2i, glUniform2iARB);
3437  MAP_GL_FUNCTION(glUniform2iv, glUniform2ivARB);
3438  MAP_GL_FUNCTION(glUniform3f, glUniform3fARB);
3439  MAP_GL_FUNCTION(glUniform3fv, glUniform3fvARB);
3440  MAP_GL_FUNCTION(glUniform3i, glUniform3iARB);
3441  MAP_GL_FUNCTION(glUniform3iv, glUniform3ivARB);
3442  MAP_GL_FUNCTION(glUniform4f, glUniform4fARB);
3443  MAP_GL_FUNCTION(glUniform4fv, glUniform4fvARB);
3444  MAP_GL_FUNCTION(glUniform4i, glUniform4iARB);
3445  MAP_GL_FUNCTION(glUniform4iv, glUniform4ivARB);
3446  MAP_GL_FUNCTION(glUniformMatrix2fv, glUniformMatrix2fvARB);
3447  MAP_GL_FUNCTION(glUniformMatrix3fv, glUniformMatrix3fvARB);
3448  MAP_GL_FUNCTION(glUniformMatrix4fv, glUniformMatrix4fvARB);
3449  MAP_GL_FUNCTION(glUnmapBuffer, glUnmapBufferARB);
3450  MAP_GL_FUNCTION(glUseProgram, glUseProgramObjectARB);
3451  MAP_GL_FUNCTION(glValidateProgram, glValidateProgramARB);
3452  MAP_GL_FUNCTION(glVertexAttrib1f, glVertexAttrib1fARB);
3453  MAP_GL_FUNCTION(glVertexAttrib1fv, glVertexAttrib1fvARB);
3454  MAP_GL_FUNCTION(glVertexAttrib2f, glVertexAttrib2fARB);
3455  MAP_GL_FUNCTION(glVertexAttrib2fv, glVertexAttrib2fvARB);
3456  MAP_GL_FUNCTION(glVertexAttrib3f, glVertexAttrib3fARB);
3457  MAP_GL_FUNCTION(glVertexAttrib3fv, glVertexAttrib3fvARB);
3458  MAP_GL_FUNCTION(glVertexAttrib4f, glVertexAttrib4fARB);
3459  MAP_GL_FUNCTION(glVertexAttrib4fv, glVertexAttrib4fvARB);
3460  MAP_GL_FUNCTION(glVertexAttrib4Nsv, glVertexAttrib4NsvARB);
3461  MAP_GL_FUNCTION(glVertexAttrib4Nub, glVertexAttrib4NubARB);
3462  MAP_GL_FUNCTION(glVertexAttrib4Nubv, glVertexAttrib4NubvARB);
3463  MAP_GL_FUNCTION(glVertexAttrib4Nusv, glVertexAttrib4NusvARB);
3464  MAP_GL_FUNCTION(glVertexAttrib4sv, glVertexAttrib4svARB);
3465  MAP_GL_FUNCTION(glVertexAttrib4ubv, glVertexAttrib4ubvARB);
3466  MAP_GL_FUNCTION(glVertexAttribDivisor, glVertexAttribDivisorARB);
3467  MAP_GL_FUNCTION(glVertexAttribIPointer, glVertexAttribIPointerEXT);
3468  MAP_GL_FUNCTION(glVertexAttribPointer, glVertexAttribPointerARB);
3469 #undef MAP_GL_FUNCTION
3470 #undef MAP_GL_FUNCTION_CAST
3471 }
3472 
3473 static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
3474 {
3475  unsigned int i, sampler_count;
3476  GLfloat gl_floatv[2];
3477  GLint gl_max;
3478 
3479  gl_info->limits.buffers = 1;
3480  gl_info->limits.textures = 0;
3481  gl_info->limits.texture_coords = 0;
3482  for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i)
3483  {
3484  gl_info->limits.uniform_blocks[i] = 0;
3485  gl_info->limits.samplers[i] = 0;
3486  }
3487  gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = 1;
3488  gl_info->limits.combined_samplers = gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL];
3489  gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers;
3490  gl_info->limits.vertex_attribs = 16;
3491  gl_info->limits.texture_buffer_offset_alignment = 1;
3492  gl_info->limits.glsl_vs_float_constants = 0;
3493  gl_info->limits.glsl_ps_float_constants = 0;
3494  gl_info->limits.arb_vs_float_constants = 0;
3495  gl_info->limits.arb_vs_native_constants = 0;
3496  gl_info->limits.arb_vs_instructions = 0;
3497  gl_info->limits.arb_vs_temps = 0;
3498  gl_info->limits.arb_ps_float_constants = 0;
3499  gl_info->limits.arb_ps_local_constants = 0;
3500  gl_info->limits.arb_ps_instructions = 0;
3501  gl_info->limits.arb_ps_temps = 0;
3502 
3503  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_CLIP_DISTANCES, &gl_max);
3504  gl_info->limits.user_clip_distances = min(MAX_CLIP_DISTANCES, gl_max);
3505  TRACE("Clip plane support - max planes %d.\n", gl_max);
3506 
3507  if (gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
3508  {
3509  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_LIGHTS, &gl_max);
3510  gl_info->limits.lights = gl_max;
3511  TRACE("Light support - max lights %d.\n", gl_max);
3512  }
3513 
3514  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_max);
3515  gl_info->limits.texture_size = gl_max;
3516  TRACE("Maximum texture size support - max texture size %d.\n", gl_max);
3517 
3518  gl_info->gl_ops.gl.p_glGetFloatv(gl_info->supported[WINED3D_GL_LEGACY_CONTEXT]
3520  gl_info->limits.pointsize_min = gl_floatv[0];
3521  gl_info->limits.pointsize_max = gl_floatv[1];
3522  TRACE("Maximum point size support - max point size %f.\n", gl_floatv[1]);
3523 
3524  if (gl_info->supported[ARB_MAP_BUFFER_ALIGNMENT])
3525  {
3526  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MIN_MAP_BUFFER_ALIGNMENT, &gl_max);
3527  TRACE("Minimum buffer map alignment: %d.\n", gl_max);
3528  }
3529  else
3530  {
3531  WARN_(d3d_perf)("Driver doesn't guarantee a minimum buffer map alignment.\n");
3532  }
3533  if (gl_info->supported[NV_REGISTER_COMBINERS])
3534  {
3535  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &gl_max);
3536  gl_info->limits.general_combiners = gl_max;
3537  TRACE("Max general combiners: %d.\n", gl_max);
3538  }
3540  {
3541  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
3542  gl_info->limits.buffers = min(MAX_RENDER_TARGET_VIEWS, gl_max);
3543  TRACE("Max draw buffers: %u.\n", gl_max);
3544  }
3545  if (gl_info->supported[ARB_BLEND_FUNC_EXTENDED])
3546  {
3547  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_DUAL_SOURCE_DRAW_BUFFERS, &gl_max);
3548  gl_info->limits.dual_buffers = gl_max;
3549  TRACE("Max dual source draw buffers: %u.\n", gl_max);
3550  }
3551  if (gl_info->supported[ARB_MULTITEXTURE])
3552  {
3553  if (gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
3554  {
3555  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
3556  gl_info->limits.textures = min(MAX_TEXTURES, gl_max);
3557  TRACE("Max textures: %d.\n", gl_info->limits.textures);
3558 
3559  if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
3560  {
3561  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_COORDS_ARB, &gl_max);
3562  gl_info->limits.texture_coords = min(MAX_TEXTURES, gl_max);
3563  }
3564  else
3565  {
3566  gl_info->limits.texture_coords = gl_info->limits.textures;
3567  }
3568  TRACE("Max texture coords: %d.\n", gl_info->limits.texture_coords);
3569  }
3570 
3571  if (gl_info->supported[ARB_FRAGMENT_PROGRAM] || gl_info->supported[ARB_FRAGMENT_SHADER])
3572  {
3573  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &gl_max);
3574  gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = gl_max;
3575  }
3576  else
3577  {
3578  gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = gl_info->limits.textures;
3579  }
3580  TRACE("Max fragment samplers: %d.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL]);
3581 
3582  if (gl_info->supported[ARB_VERTEX_SHADER])
3583  {
3584  unsigned int vertex_sampler_count;
3585 
3586  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &gl_max);
3587  vertex_sampler_count = gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX] = gl_max;
3588  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, &gl_max);
3589  gl_info->limits.combined_samplers = gl_max;
3590  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &gl_max);
3591  gl_info->limits.vertex_attribs = gl_max;
3592 
3593  /* Loading GLSL sampler uniforms is much simpler if we can assume that the sampler setup
3594  * is known at shader link time. In a vertex shader + pixel shader combination this isn't
3595  * an issue because then the sampler setup only depends on the two shaders. If a pixel
3596  * shader is used with fixed function vertex processing we're fine too because fixed function
3597  * vertex processing doesn't use any samplers. If fixed function fragment processing is
3598  * used we have to make sure that all vertex sampler setups are valid together with all
3599  * possible fixed function fragment processing setups. This is true if vsamplers + MAX_TEXTURES
3600  * <= max_samplers. This is true on all d3d9 cards that support vtf(gf 6 and gf7 cards).
3601  * dx9 radeon cards do not support vertex texture fetch. DX10 cards have 128 samplers, and
3602  * dx9 is limited to 8 fixed function texture stages and 4 vertex samplers. DX10 does not have
3603  * a fixed function pipeline anymore.
3604  *
3605  * So this is just a check to check that our assumption holds true. If not, write a warning
3606  * and reduce the number of vertex samplers or probably disable vertex texture fetch. */
3607  if (vertex_sampler_count && gl_info->limits.combined_samplers < 12
3608  && MAX_TEXTURES + vertex_sampler_count > gl_info->limits.combined_samplers)
3609  {
3610  FIXME("OpenGL implementation supports %u vertex samplers and %u total samplers.\n",
3611  vertex_sampler_count, gl_info->limits.combined_samplers);
3612  FIXME("Expected vertex samplers + MAX_TEXTURES(=8) > combined_samplers.\n");
3613  if (gl_info->limits.combined_samplers > MAX_TEXTURES)
3614  vertex_sampler_count = gl_info->limits.combined_samplers - MAX_TEXTURES;
3615  else
3616  vertex_sampler_count = 0;
3617  gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX] = vertex_sampler_count;
3618  }
3619  }
3620  else
3621  {
3622  gl_info->limits.combined_samplers = gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL];
3623  }
3624  TRACE("Max vertex samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX]);
3625  TRACE("Max combined samplers: %u.\n", gl_info->limits.combined_samplers);
3626  TRACE("Max vertex attributes: %u.\n", gl_info->limits.vertex_attribs);
3627  }
3628  else
3629  {
3630  gl_info->limits.textures = 1;
3631  gl_info->limits.texture_coords = 1;
3632  }
3633 
3634  if (gl_info->supported[EXT_TEXTURE3D])
3635  {
3636  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE_EXT, &gl_max);
3637  gl_info->limits.texture3d_size = gl_max;
3638  TRACE("Max texture3D size: %d.\n", gl_info->limits.texture3d_size);
3639  }
3641  {
3642  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &gl_max);
3643  gl_info->limits.anisotropy = gl_max;
3644  TRACE("Max anisotropy: %d.\n", gl_info->limits.anisotropy);
3645  }
3646  if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
3647  {
3649  gl_info->limits.arb_ps_float_constants = gl_max;
3650  TRACE("Max ARB_FRAGMENT_PROGRAM float constants: %d.\n", gl_info->limits.arb_ps_float_constants);
3652  gl_info->limits.arb_ps_native_constants = gl_max;
3653  TRACE("Max ARB_FRAGMENT_PROGRAM native float constants: %d.\n",
3654  gl_info->limits.arb_ps_native_constants);
3656  gl_info->limits.arb_ps_temps = gl_max;
3657  TRACE("Max ARB_FRAGMENT_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_ps_temps);
3659  gl_info->limits.arb_ps_instructions = gl_max;
3660  TRACE("Max ARB_FRAGMENT_PROGRAM native instructions: %d.\n", gl_info->limits.arb_ps_instructions);
3662  gl_info->limits.arb_ps_local_constants = gl_max;
3663  TRACE("Max ARB_FRAGMENT_PROGRAM local parameters: %d.\n", gl_info->limits.arb_ps_instructions);
3664  }
3665  if (gl_info->supported[ARB_VERTEX_PROGRAM])
3666  {
3668  gl_info->limits.arb_vs_float_constants = gl_max;
3669  TRACE("Max ARB_VERTEX_PROGRAM float constants: %d.\n", gl_info->limits.arb_vs_float_constants);
3671  gl_info->limits.arb_vs_native_constants = gl_max;
3672  TRACE("Max ARB_VERTEX_PROGRAM native float constants: %d.\n",
3673  gl_info->limits.arb_vs_native_constants);
3675  gl_info->limits.arb_vs_temps = gl_max;
3676  TRACE("Max ARB_VERTEX_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_vs_temps);
3678  gl_info->limits.arb_vs_instructions = gl_max;
3679  TRACE("Max ARB_VERTEX_PROGRAM native instructions: %d.\n", gl_info->limits.arb_vs_instructions);
3680  }
3681  if (gl_info->supported[ARB_VERTEX_SHADER])
3682  {
3683  gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max);
3684  gl_info->limits.glsl_vs_float_constants = gl_max / 4;
3685  TRACE("Max ARB_VERTEX_SHADER float constants: %u.\n", gl_info->limits.glsl_vs_float_constants);
368