wined3d: Add legacy ATI cards.
[wine] / dlls / wined3d / directx.c
1 /*
2  * IWineD3D implementation
3  *
4  * Copyright 2002-2004 Jason Edmeades
5  * Copyright 2003-2004 Raphael Junqueira
6  * Copyright 2004 Christian Costa
7  * Copyright 2005 Oliver Stieber
8  * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
9  * Copyright 2009 Henri Verbeet for CodeWeavers
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with this library; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25
26 #include "config.h"
27 #include <stdio.h>
28 #include "wined3d_private.h"
29
30 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
31 WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
32
33 #define WINE_DEFAULT_VIDMEM (64 * 1024 * 1024)
34
35 /* The d3d device ID */
36 static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } };
37
38 /* Extension detection */
39 static const struct {
40     const char *extension_string;
41     GL_SupportedExt extension;
42     DWORD version;
43 } EXTENSION_MAP[] = {
44     /* APPLE */
45     {"GL_APPLE_client_storage",             APPLE_CLIENT_STORAGE,           0                           },
46     {"GL_APPLE_fence",                      APPLE_FENCE,                    0                           },
47     {"GL_APPLE_float_pixels",               APPLE_FLOAT_PIXELS,             0                           },
48     {"GL_APPLE_flush_buffer_range",         APPLE_FLUSH_BUFFER_RANGE,       0                           },
49     {"GL_APPLE_flush_render",               APPLE_FLUSH_RENDER,             0                           },
50     {"GL_APPLE_ycbcr_422",                  APPLE_YCBCR_422,                0                           },
51
52     /* ARB */
53     {"GL_ARB_color_buffer_float",           ARB_COLOR_BUFFER_FLOAT,         0                           },
54     {"GL_ARB_depth_buffer_float",           ARB_DEPTH_BUFFER_FLOAT,         0                           },
55     {"GL_ARB_depth_clamp",                  ARB_DEPTH_CLAMP,                0                           },
56     {"GL_ARB_depth_texture",                ARB_DEPTH_TEXTURE,              0                           },
57     {"GL_ARB_draw_buffers",                 ARB_DRAW_BUFFERS,               0                           },
58     {"GL_ARB_fragment_program",             ARB_FRAGMENT_PROGRAM,           0                           },
59     {"GL_ARB_fragment_shader",              ARB_FRAGMENT_SHADER,            0                           },
60     {"GL_ARB_framebuffer_object",           ARB_FRAMEBUFFER_OBJECT,         0                           },
61     {"GL_ARB_geometry_shader4",             ARB_GEOMETRY_SHADER4,           0                           },
62     {"GL_ARB_half_float_pixel",             ARB_HALF_FLOAT_PIXEL,           0                           },
63     {"GL_ARB_half_float_vertex",            ARB_HALF_FLOAT_VERTEX,          0                           },
64     {"GL_ARB_imaging",                      ARB_IMAGING,                    0                           },
65     {"GL_ARB_map_buffer_range",             ARB_MAP_BUFFER_RANGE,           0                           },
66     {"GL_ARB_multisample",                  ARB_MULTISAMPLE,                0                           }, /* needs GLX_ARB_MULTISAMPLE as well */
67     {"GL_ARB_multitexture",                 ARB_MULTITEXTURE,               0                           },
68     {"GL_ARB_occlusion_query",              ARB_OCCLUSION_QUERY,            0                           },
69     {"GL_ARB_pixel_buffer_object",          ARB_PIXEL_BUFFER_OBJECT,        0                           },
70     {"GL_ARB_point_parameters",             ARB_POINT_PARAMETERS,           0                           },
71     {"GL_ARB_point_sprite",                 ARB_POINT_SPRITE,               0                           },
72     {"GL_ARB_provoking_vertex",             ARB_PROVOKING_VERTEX,           0                           },
73     {"GL_ARB_shader_objects",               ARB_SHADER_OBJECTS,             0                           },
74     {"GL_ARB_shader_texture_lod",           ARB_SHADER_TEXTURE_LOD,         0                           },
75     {"GL_ARB_shading_language_100",         ARB_SHADING_LANGUAGE_100,       0                           },
76     {"GL_ARB_shadow",                       ARB_SHADOW,                     0                           },
77     {"GL_ARB_sync",                         ARB_SYNC,                       0                           },
78     {"GL_ARB_texture_border_clamp",         ARB_TEXTURE_BORDER_CLAMP,       0                           },
79     {"GL_ARB_texture_compression",          ARB_TEXTURE_COMPRESSION,        0                           },
80     {"GL_ARB_texture_compression_rgtc",     ARB_TEXTURE_COMPRESSION_RGTC,   0                           },
81     {"GL_ARB_texture_cube_map",             ARB_TEXTURE_CUBE_MAP,           0                           },
82     {"GL_ARB_texture_env_add",              ARB_TEXTURE_ENV_ADD,            0                           },
83     {"GL_ARB_texture_env_combine",          ARB_TEXTURE_ENV_COMBINE,        0                           },
84     {"GL_ARB_texture_env_dot3",             ARB_TEXTURE_ENV_DOT3,           0                           },
85     {"GL_ARB_texture_float",                ARB_TEXTURE_FLOAT,              0                           },
86     {"GL_ARB_texture_mirrored_repeat",      ARB_TEXTURE_MIRRORED_REPEAT,    0                           },
87     {"GL_ARB_texture_non_power_of_two",     ARB_TEXTURE_NON_POWER_OF_TWO,   MAKEDWORD_VERSION(2, 0)     },
88     {"GL_ARB_texture_rectangle",            ARB_TEXTURE_RECTANGLE,          0                           },
89     {"GL_ARB_texture_rg",                   ARB_TEXTURE_RG,                 0                           },
90     {"GL_ARB_vertex_array_bgra",            ARB_VERTEX_ARRAY_BGRA,          0                           },
91     {"GL_ARB_vertex_blend",                 ARB_VERTEX_BLEND,               0                           },
92     {"GL_ARB_vertex_buffer_object",         ARB_VERTEX_BUFFER_OBJECT,       0                           },
93     {"GL_ARB_vertex_program",               ARB_VERTEX_PROGRAM,             0                           },
94     {"GL_ARB_vertex_shader",                ARB_VERTEX_SHADER,              0                           },
95
96     /* ATI */
97     {"GL_ATI_fragment_shader",              ATI_FRAGMENT_SHADER,            0                           },
98     {"GL_ATI_separate_stencil",             ATI_SEPARATE_STENCIL,           0                           },
99     {"GL_ATI_texture_compression_3dc",      ATI_TEXTURE_COMPRESSION_3DC,    0                           },
100     {"GL_ATI_texture_env_combine3",         ATI_TEXTURE_ENV_COMBINE3,       0                           },
101     {"GL_ATI_texture_mirror_once",          ATI_TEXTURE_MIRROR_ONCE,        0                           },
102
103     /* EXT */
104     {"GL_EXT_blend_color",                  EXT_BLEND_COLOR,                0                           },
105     {"GL_EXT_blend_equation_separate",      EXT_BLEND_EQUATION_SEPARATE,    0                           },
106     {"GL_EXT_blend_func_separate",          EXT_BLEND_FUNC_SEPARATE,        0                           },
107     {"GL_EXT_blend_minmax",                 EXT_BLEND_MINMAX,               0                           },
108     {"GL_EXT_draw_buffers2",                EXT_DRAW_BUFFERS2,              0                           },
109     {"GL_EXT_fog_coord",                    EXT_FOG_COORD,                  0                           },
110     {"GL_EXT_framebuffer_blit",             EXT_FRAMEBUFFER_BLIT,           0                           },
111     {"GL_EXT_framebuffer_multisample",      EXT_FRAMEBUFFER_MULTISAMPLE,    0                           },
112     {"GL_EXT_framebuffer_object",           EXT_FRAMEBUFFER_OBJECT,         0                           },
113     {"GL_EXT_gpu_program_parameters",       EXT_GPU_PROGRAM_PARAMETERS,     0                           },
114     {"GL_EXT_gpu_shader4",                  EXT_GPU_SHADER4,                0                           },
115     {"GL_EXT_packed_depth_stencil",         EXT_PACKED_DEPTH_STENCIL,       0                           },
116     {"GL_EXT_paletted_texture",             EXT_PALETTED_TEXTURE,           0                           },
117     {"GL_EXT_point_parameters",             EXT_POINT_PARAMETERS,           0                           },
118     {"GL_EXT_provoking_vertex",             EXT_PROVOKING_VERTEX,           0                           },
119     {"GL_EXT_secondary_color",              EXT_SECONDARY_COLOR,            0                           },
120     {"GL_EXT_stencil_two_side",             EXT_STENCIL_TWO_SIDE,           0                           },
121     {"GL_EXT_stencil_wrap",                 EXT_STENCIL_WRAP,               0                           },
122     {"GL_EXT_texture3D",                    EXT_TEXTURE3D,                  MAKEDWORD_VERSION(1, 2)     },
123     {"GL_EXT_texture_compression_rgtc",     EXT_TEXTURE_COMPRESSION_RGTC,   0                           },
124     {"GL_EXT_texture_compression_s3tc",     EXT_TEXTURE_COMPRESSION_S3TC,   0                           },
125     {"GL_EXT_texture_env_add",              EXT_TEXTURE_ENV_ADD,            0                           },
126     {"GL_EXT_texture_env_combine",          EXT_TEXTURE_ENV_COMBINE,        0                           },
127     {"GL_EXT_texture_env_dot3",             EXT_TEXTURE_ENV_DOT3,           0                           },
128     {"GL_EXT_texture_filter_anisotropic",   EXT_TEXTURE_FILTER_ANISOTROPIC, 0                           },
129     {"GL_EXT_texture_lod_bias",             EXT_TEXTURE_LOD_BIAS,           0                           },
130     {"GL_EXT_texture_sRGB",                 EXT_TEXTURE_SRGB,               0                           },
131     {"GL_EXT_vertex_array_bgra",            EXT_VERTEX_ARRAY_BGRA,          0                           },
132
133     /* NV */
134     {"GL_NV_depth_clamp",                   NV_DEPTH_CLAMP,                 0                           },
135     {"GL_NV_fence",                         NV_FENCE,                       0                           },
136     {"GL_NV_fog_distance",                  NV_FOG_DISTANCE,                0                           },
137     {"GL_NV_fragment_program",              NV_FRAGMENT_PROGRAM,            0                           },
138     {"GL_NV_fragment_program2",             NV_FRAGMENT_PROGRAM2,           0                           },
139     {"GL_NV_fragment_program_option",       NV_FRAGMENT_PROGRAM_OPTION,     0                           },
140     {"GL_NV_half_float",                    NV_HALF_FLOAT,                  0                           },
141     {"GL_NV_light_max_exponent",            NV_LIGHT_MAX_EXPONENT,          0                           },
142     {"GL_NV_point_sprite",                  NV_POINT_SPRITE,                0                           },
143     {"GL_NV_register_combiners",            NV_REGISTER_COMBINERS,          0                           },
144     {"GL_NV_register_combiners2",           NV_REGISTER_COMBINERS2,         0                           },
145     {"GL_NV_texgen_reflection",             NV_TEXGEN_REFLECTION,           0                           },
146     {"GL_NV_texture_env_combine4",          NV_TEXTURE_ENV_COMBINE4,        0                           },
147     {"GL_NV_texture_shader",                NV_TEXTURE_SHADER,              0                           },
148     {"GL_NV_texture_shader2",               NV_TEXTURE_SHADER2,             0                           },
149     {"GL_NV_vertex_program",                NV_VERTEX_PROGRAM,              0                           },
150     {"GL_NV_vertex_program1_1",             NV_VERTEX_PROGRAM1_1,           0                           },
151     {"GL_NV_vertex_program2",               NV_VERTEX_PROGRAM2,             0                           },
152     {"GL_NV_vertex_program2_option",        NV_VERTEX_PROGRAM2_OPTION,      0                           },
153     {"GL_NV_vertex_program3",               NV_VERTEX_PROGRAM3,             0                           },
154
155     /* SGI */
156     {"GL_SGIS_generate_mipmap",             SGIS_GENERATE_MIPMAP,           0                           },
157 };
158
159 /**********************************************************
160  * Utility functions follow
161  **********************************************************/
162
163 const struct min_lookup minMipLookup[] =
164 {
165     /* NONE         POINT                       LINEAR */
166     {{GL_NEAREST,   GL_NEAREST,                 GL_NEAREST}},               /* NONE */
167     {{GL_NEAREST,   GL_NEAREST_MIPMAP_NEAREST,  GL_NEAREST_MIPMAP_LINEAR}}, /* POINT*/
168     {{GL_LINEAR,    GL_LINEAR_MIPMAP_NEAREST,   GL_LINEAR_MIPMAP_LINEAR}},  /* LINEAR */
169 };
170
171 const struct min_lookup minMipLookup_noFilter[] =
172 {
173     /* NONE         POINT                       LINEAR */
174     {{GL_NEAREST,   GL_NEAREST,                 GL_NEAREST}},               /* NONE */
175     {{GL_NEAREST,   GL_NEAREST,                 GL_NEAREST}},               /* POINT */
176     {{GL_NEAREST,   GL_NEAREST,                 GL_NEAREST}},               /* LINEAR */
177 };
178
179 const struct min_lookup minMipLookup_noMip[] =
180 {
181     /* NONE         POINT                       LINEAR */
182     {{GL_NEAREST,   GL_NEAREST,                 GL_NEAREST}},               /* NONE */
183     {{GL_NEAREST,   GL_NEAREST,                 GL_NEAREST}},               /* POINT */
184     {{GL_LINEAR,    GL_LINEAR,                  GL_LINEAR }},               /* LINEAR */
185 };
186
187 const GLenum magLookup[] =
188 {
189     /* NONE     POINT       LINEAR */
190     GL_NEAREST, GL_NEAREST, GL_LINEAR,
191 };
192
193 const GLenum magLookup_noFilter[] =
194 {
195     /* NONE     POINT       LINEAR */
196     GL_NEAREST, GL_NEAREST, GL_NEAREST,
197 };
198
199 /* drawStridedSlow attributes */
200 glAttribFunc position_funcs[WINED3D_FFP_EMIT_COUNT];
201 glAttribFunc diffuse_funcs[WINED3D_FFP_EMIT_COUNT];
202 glAttribFunc specular_func_3ubv;
203 glAttribFunc specular_funcs[WINED3D_FFP_EMIT_COUNT];
204 glAttribFunc normal_funcs[WINED3D_FFP_EMIT_COUNT];
205 glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT];
206
207 /**
208  * Note: GL seems to trap if GetDeviceCaps is called before any HWND's created,
209  * i.e., there is no GL Context - Get a default rendering context to enable the
210  * function query some info from GL.
211  */
212
213 struct wined3d_fake_gl_ctx
214 {
215     HDC dc;
216     HWND wnd;
217     HGLRC gl_ctx;
218     HDC restore_dc;
219     HGLRC restore_gl_ctx;
220 };
221
222 static void WineD3D_ReleaseFakeGLContext(struct wined3d_fake_gl_ctx *ctx)
223 {
224     TRACE_(d3d_caps)("Destroying fake GL context.\n");
225
226     if (!pwglMakeCurrent(NULL, NULL))
227     {
228         ERR_(d3d_caps)("Failed to disable fake GL context.\n");
229     }
230
231     if (!pwglDeleteContext(ctx->gl_ctx))
232     {
233         DWORD err = GetLastError();
234         ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx->gl_ctx, err);
235     }
236
237     ReleaseDC(ctx->wnd, ctx->dc);
238     DestroyWindow(ctx->wnd);
239
240     if (ctx->restore_gl_ctx && !pwglMakeCurrent(ctx->restore_dc, ctx->restore_gl_ctx))
241     {
242         ERR_(d3d_caps)("Failed to restore previous GL context.\n");
243     }
244 }
245
246 /* Do not call while under the GL lock. */
247 static BOOL WineD3D_CreateFakeGLContext(struct wined3d_fake_gl_ctx *ctx)
248 {
249     PIXELFORMATDESCRIPTOR pfd;
250     int iPixelFormat;
251
252     TRACE("getting context...\n");
253
254     ctx->restore_dc = pwglGetCurrentDC();
255     ctx->restore_gl_ctx = pwglGetCurrentContext();
256
257     /* We need a fake window as a hdc retrieved using GetDC(0) can't be used for much GL purposes. */
258     ctx->wnd = CreateWindowA(WINED3D_OPENGL_WINDOW_CLASS_NAME, "WineD3D fake window",
259             WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL);
260     if (!ctx->wnd)
261     {
262         ERR_(d3d_caps)("Failed to create a window.\n");
263         goto fail;
264     }
265
266     ctx->dc = GetDC(ctx->wnd);
267     if (!ctx->dc)
268     {
269         ERR_(d3d_caps)("Failed to get a DC.\n");
270         goto fail;
271     }
272
273     /* PixelFormat selection */
274     ZeroMemory(&pfd, sizeof(pfd));
275     pfd.nSize = sizeof(pfd);
276     pfd.nVersion = 1;
277     pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW; /* PFD_GENERIC_ACCELERATED */
278     pfd.iPixelType = PFD_TYPE_RGBA;
279     pfd.cColorBits = 32;
280     pfd.iLayerType = PFD_MAIN_PLANE;
281
282     iPixelFormat = ChoosePixelFormat(ctx->dc, &pfd);
283     if (!iPixelFormat)
284     {
285         /* If this happens something is very wrong as ChoosePixelFormat barely fails. */
286         ERR_(d3d_caps)("Can't find a suitable iPixelFormat.\n");
287         goto fail;
288     }
289     DescribePixelFormat(ctx->dc, iPixelFormat, sizeof(pfd), &pfd);
290     SetPixelFormat(ctx->dc, iPixelFormat, &pfd);
291
292     /* Create a GL context. */
293     ctx->gl_ctx = pwglCreateContext(ctx->dc);
294     if (!ctx->gl_ctx)
295     {
296         WARN_(d3d_caps)("Error creating default context for capabilities initialization.\n");
297         goto fail;
298     }
299
300     /* Make it the current GL context. */
301     if (!context_set_current(NULL))
302     {
303         ERR_(d3d_caps)("Failed to clear current D3D context.\n");
304     }
305
306     if (!pwglMakeCurrent(ctx->dc, ctx->gl_ctx))
307     {
308         ERR_(d3d_caps)("Failed to make fake GL context current.\n");
309         goto fail;
310     }
311
312     return TRUE;
313
314 fail:
315     if (ctx->gl_ctx) pwglDeleteContext(ctx->gl_ctx);
316     ctx->gl_ctx = NULL;
317     if (ctx->dc) ReleaseDC(ctx->wnd, ctx->dc);
318     ctx->dc = NULL;
319     if (ctx->wnd) DestroyWindow(ctx->wnd);
320     ctx->wnd = NULL;
321     if (ctx->restore_gl_ctx && !pwglMakeCurrent(ctx->restore_dc, ctx->restore_gl_ctx))
322     {
323         ERR_(d3d_caps)("Failed to restore previous GL context.\n");
324     }
325
326     return FALSE;
327 }
328
329 /* Adjust the amount of used texture memory */
330 unsigned int WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *device, unsigned int glram)
331 {
332     struct wined3d_adapter *adapter = device->adapter;
333
334     adapter->UsedTextureRam += glram;
335     TRACE("Adjusted gl ram by %d to %d\n", glram, adapter->UsedTextureRam);
336     return adapter->UsedTextureRam;
337 }
338
339 static void wined3d_adapter_cleanup(struct wined3d_adapter *adapter)
340 {
341     HeapFree(GetProcessHeap(), 0, adapter->gl_info.formats);
342     HeapFree(GetProcessHeap(), 0, adapter->cfgs);
343 }
344
345 /**********************************************************
346  * IUnknown parts follows
347  **********************************************************/
348
349 static HRESULT WINAPI IWineD3DImpl_QueryInterface(IWineD3D *iface,REFIID riid,LPVOID *ppobj)
350 {
351     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
352
353     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj);
354     if (IsEqualGUID(riid, &IID_IUnknown)
355         || IsEqualGUID(riid, &IID_IWineD3DBase)
356         || IsEqualGUID(riid, &IID_IWineD3DDevice)) {
357         IUnknown_AddRef(iface);
358         *ppobj = This;
359         return S_OK;
360     }
361     *ppobj = NULL;
362     return E_NOINTERFACE;
363 }
364
365 static ULONG WINAPI IWineD3DImpl_AddRef(IWineD3D *iface) {
366     IWineD3DImpl *This = (IWineD3DImpl *)iface;
367     ULONG refCount = InterlockedIncrement(&This->ref);
368
369     TRACE("(%p) : AddRef increasing from %d\n", This, refCount - 1);
370     return refCount;
371 }
372
373 static ULONG WINAPI IWineD3DImpl_Release(IWineD3D *iface) {
374     IWineD3DImpl *This = (IWineD3DImpl *)iface;
375     ULONG ref;
376     TRACE("(%p) : Releasing from %d\n", This, This->ref);
377     ref = InterlockedDecrement(&This->ref);
378     if (ref == 0) {
379         unsigned int i;
380
381         for (i = 0; i < This->adapter_count; ++i)
382         {
383             wined3d_adapter_cleanup(&This->adapters[i]);
384         }
385         HeapFree(GetProcessHeap(), 0, This);
386     }
387
388     return ref;
389 }
390
391 /**********************************************************
392  * IWineD3D parts follows
393  **********************************************************/
394
395 /* GL locking is done by the caller */
396 static inline BOOL test_arb_vs_offset_limit(const struct wined3d_gl_info *gl_info)
397 {
398     GLuint prog;
399     BOOL ret = FALSE;
400     const char *testcode =
401         "!!ARBvp1.0\n"
402         "PARAM C[66] = { program.env[0..65] };\n"
403         "ADDRESS A0;"
404         "PARAM zero = {0.0, 0.0, 0.0, 0.0};\n"
405         "ARL A0.x, zero.x;\n"
406         "MOV result.position, C[A0.x + 65];\n"
407         "END\n";
408
409     while(glGetError());
410     GL_EXTCALL(glGenProgramsARB(1, &prog));
411     if(!prog) {
412         ERR("Failed to create an ARB offset limit test program\n");
413     }
414     GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog));
415     GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
416                                   strlen(testcode), testcode));
417     if(glGetError() != 0) {
418         TRACE("OpenGL implementation does not allow indirect addressing offsets > 63\n");
419         TRACE("error: %s\n", debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
420         ret = TRUE;
421     } else TRACE("OpenGL implementation allows offsets > 63\n");
422
423     GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0));
424     GL_EXTCALL(glDeleteProgramsARB(1, &prog));
425     checkGLcall("ARB vp offset limit test cleanup");
426
427     return ret;
428 }
429
430 static DWORD ver_for_ext(GL_SupportedExt ext)
431 {
432     unsigned int i;
433     for (i = 0; i < (sizeof(EXTENSION_MAP) / sizeof(*EXTENSION_MAP)); ++i) {
434         if(EXTENSION_MAP[i].extension == ext) {
435             return EXTENSION_MAP[i].version;
436         }
437     }
438     return 0;
439 }
440
441 static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
442         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
443 {
444     if (card_vendor != HW_VENDOR_ATI) return FALSE;
445     if (device == CARD_ATI_RADEON_9500) return TRUE;
446     if (device == CARD_ATI_RADEON_X700) return TRUE;
447     if (device == CARD_ATI_RADEON_X1600) return TRUE;
448     return FALSE;
449 }
450
451 static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
452         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
453 {
454     if (card_vendor == HW_VENDOR_NVIDIA)
455     {
456         if (device == CARD_NVIDIA_GEFORCEFX_5200 ||
457             device == CARD_NVIDIA_GEFORCEFX_5600 ||
458             device == CARD_NVIDIA_GEFORCEFX_5800)
459         {
460             return TRUE;
461         }
462     }
463     return FALSE;
464 }
465
466 static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
467         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
468 {
469     /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
470      * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
471      * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
472      *
473      * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
474      * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
475      * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
476      * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
477      * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
478      * the chance that other implementations support them is rather small since Win32 QuickTime uses
479      * DirectDraw, not OpenGL.
480      *
481      * This test has been moved into wined3d_guess_gl_vendor()
482      */
483     if (gl_vendor == GL_VENDOR_APPLE)
484     {
485         return TRUE;
486     }
487     return FALSE;
488 }
489
490 /* Context activation is done by the caller. */
491 static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
492 {
493     /* Some OpenGL implementations, namely Apple's Geforce 8 driver, advertises PBOs,
494      * but glTexSubImage from a PBO fails miserably, with the first line repeated over
495      * all the texture. This function detects this bug by its symptom and disables PBOs
496      * if the test fails.
497      *
498      * The test uploads a 4x4 texture via the PBO in the "native" format GL_BGRA,
499      * GL_UNSIGNED_INT_8_8_8_8_REV. This format triggers the bug, and it is what we use
500      * for D3DFMT_A8R8G8B8. Then the texture is read back without any PBO and the data
501      * read back is compared to the original. If they are equal PBOs are assumed to work,
502      * otherwise the PBO extension is disabled. */
503     GLuint texture, pbo;
504     static const unsigned int pattern[] =
505     {
506         0x00000000, 0x000000ff, 0x0000ff00, 0x40ff0000,
507         0x80ffffff, 0x40ffff00, 0x00ff00ff, 0x0000ffff,
508         0x00ffff00, 0x00ff00ff, 0x0000ffff, 0x000000ff,
509         0x80ff00ff, 0x0000ffff, 0x00ff00ff, 0x40ff00ff
510     };
511     unsigned int check[sizeof(pattern) / sizeof(pattern[0])];
512
513     /* No PBO -> No point in testing them. */
514     if (!gl_info->supported[ARB_PIXEL_BUFFER_OBJECT]) return;
515
516     ENTER_GL();
517
518     while (glGetError());
519     glGenTextures(1, &texture);
520     glBindTexture(GL_TEXTURE_2D, texture);
521
522     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
523     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
524     checkGLcall("Specifying the PBO test texture");
525
526     GL_EXTCALL(glGenBuffersARB(1, &pbo));
527     GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo));
528     GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, sizeof(pattern), pattern, GL_STREAM_DRAW_ARB));
529     checkGLcall("Specifying the PBO test pbo");
530
531     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
532     checkGLcall("Loading the PBO test texture");
533
534     GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
535     LEAVE_GL();
536
537     wglFinish(); /* just to be sure */
538
539     memset(check, 0, sizeof(check));
540     ENTER_GL();
541     glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, check);
542     checkGLcall("Reading back the PBO test texture");
543
544     glDeleteTextures(1, &texture);
545     GL_EXTCALL(glDeleteBuffersARB(1, &pbo));
546     checkGLcall("PBO test cleanup");
547
548     LEAVE_GL();
549
550     if (memcmp(check, pattern, sizeof(check)))
551     {
552         WARN_(d3d_caps)("PBO test failed, read back data doesn't match original.\n");
553         WARN_(d3d_caps)("Disabling PBOs. This may result in slower performance.\n");
554         gl_info->supported[ARB_PIXEL_BUFFER_OBJECT] = FALSE;
555     }
556     else
557     {
558         TRACE_(d3d_caps)("PBO test successful.\n");
559     }
560 }
561
562 static BOOL match_apple_intel(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
563         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
564 {
565     return (card_vendor == HW_VENDOR_INTEL) && (gl_vendor == GL_VENDOR_APPLE);
566 }
567
568 static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
569         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
570 {
571     if (gl_vendor != GL_VENDOR_APPLE) return FALSE;
572     if (card_vendor != HW_VENDOR_ATI) return FALSE;
573     if (device == CARD_ATI_RADEON_X1600) return FALSE;
574     return TRUE;
575 }
576
577 static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
578         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
579 {
580     return gl_vendor == GL_VENDOR_FGLRX;
581
582 }
583
584 static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
585         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
586 {
587     /* DX9 cards support 40 single float varyings in hardware, most drivers report 32. ATI misreports
588      * 44 varyings. So assume that if we have more than 44 varyings we have a dx10 card.
589      * This detection is for the gl_ClipPos varying quirk. If a d3d9 card really supports more than 44
590      * varyings and we subtract one in dx9 shaders its not going to hurt us because the dx9 limit is
591      * hardcoded
592      *
593      * dx10 cards usually have 64 varyings */
594     return gl_info->limits.glsl_varyings > 44;
595 }
596
597 /* A GL context is provided by the caller */
598 static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
599         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
600 {
601     GLenum error;
602     DWORD data[16];
603
604     if (!gl_info->supported[EXT_SECONDARY_COLOR]) return FALSE;
605
606     ENTER_GL();
607     while(glGetError());
608     GL_EXTCALL(glSecondaryColorPointerEXT)(4, GL_UNSIGNED_BYTE, 4, data);
609     error = glGetError();
610     LEAVE_GL();
611
612     if(error == GL_NO_ERROR)
613     {
614         TRACE("GL Implementation accepts 4 component specular color pointers\n");
615         return TRUE;
616     }
617     else
618     {
619         TRACE("GL implementation does not accept 4 component specular colors, error %s\n",
620               debug_glerror(error));
621         return FALSE;
622     }
623 }
624
625 static BOOL match_apple_nvts(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
626         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
627 {
628     if (!match_apple(gl_info, gl_renderer, gl_vendor, card_vendor, device)) return FALSE;
629     return gl_info->supported[NV_TEXTURE_SHADER];
630 }
631
632 /* A GL context is provided by the caller */
633 static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
634         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
635 {
636     GLuint prog;
637     BOOL ret = FALSE;
638     GLint pos;
639     const char *testcode =
640         "!!ARBvp1.0\n"
641         "OPTION NV_vertex_program2;\n"
642         "MOV result.clip[0], 0.0;\n"
643         "MOV result.position, 0.0;\n"
644         "END\n";
645
646     if (!gl_info->supported[NV_VERTEX_PROGRAM2_OPTION]) return FALSE;
647
648     ENTER_GL();
649     while(glGetError());
650
651     GL_EXTCALL(glGenProgramsARB(1, &prog));
652     if(!prog)
653     {
654         ERR("Failed to create the NVvp clip test program\n");
655         LEAVE_GL();
656         return FALSE;
657     }
658     GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog));
659     GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
660                                   strlen(testcode), testcode));
661     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
662     if(pos != -1)
663     {
664         WARN("GL_NV_vertex_program2_option result.clip[] test failed\n");
665         TRACE("error: %s\n", debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
666         ret = TRUE;
667         while(glGetError());
668     }
669     else TRACE("GL_NV_vertex_program2_option result.clip[] test passed\n");
670
671     GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0));
672     GL_EXTCALL(glDeleteProgramsARB(1, &prog));
673     checkGLcall("GL_NV_vertex_program2_option result.clip[] test cleanup");
674
675     LEAVE_GL();
676     return ret;
677 }
678
679 /* Context activation is done by the caller. */
680 static BOOL match_fbo_tex_update(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
681         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
682 {
683     char data[4 * 4 * 4];
684     GLuint tex, fbo;
685     GLenum status;
686
687     if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) return FALSE;
688
689     memset(data, 0xcc, sizeof(data));
690
691     ENTER_GL();
692
693     glGenTextures(1, &tex);
694     glBindTexture(GL_TEXTURE_2D, tex);
695     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
696     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
697     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
698     checkGLcall("glTexImage2D");
699
700     gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
701     gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
702     gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
703     checkGLcall("glFramebufferTexture2D");
704
705     status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
706     if (status != GL_FRAMEBUFFER_COMPLETE) ERR("FBO status %#x\n", status);
707     checkGLcall("glCheckFramebufferStatus");
708
709     memset(data, 0x11, sizeof(data));
710     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
711     checkGLcall("glTexSubImage2D");
712
713     glClearColor(0.996f, 0.729f, 0.745f, 0.792f);
714     glClear(GL_COLOR_BUFFER_BIT);
715     checkGLcall("glClear");
716
717     glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
718     checkGLcall("glGetTexImage");
719
720     gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
721     gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
722     glBindTexture(GL_TEXTURE_2D, 0);
723     checkGLcall("glBindTexture");
724
725     gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
726     glDeleteTextures(1, &tex);
727     checkGLcall("glDeleteTextures");
728
729     LEAVE_GL();
730
731     return *(DWORD *)data == 0x11111111;
732 }
733
734 static void quirk_arb_constants(struct wined3d_gl_info *gl_info)
735 {
736     TRACE_(d3d_caps)("Using ARB vs constant limit(=%u) for GLSL.\n", gl_info->limits.arb_vs_native_constants);
737     gl_info->limits.glsl_vs_float_constants = gl_info->limits.arb_vs_native_constants;
738     TRACE_(d3d_caps)("Using ARB ps constant limit(=%u) for GLSL.\n", gl_info->limits.arb_ps_native_constants);
739     gl_info->limits.glsl_ps_float_constants = gl_info->limits.arb_ps_native_constants;
740 }
741
742 static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
743 {
744     quirk_arb_constants(gl_info);
745     /* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
746      * Beyond that the general uniform isn't optimal, so reserve a number of uniforms. 12 vec4's should
747      * allow 48 different offsets or other helper immediate values. */
748     TRACE_(d3d_caps)("Reserving 12 GLSL constants for compiler private use.\n");
749     gl_info->reserved_glsl_constants = max(gl_info->reserved_glsl_constants, 12);
750 }
751
752 /* fglrx crashes with a very bad kernel panic if GL_POINT_SPRITE_ARB is set to GL_COORD_REPLACE_ARB
753  * on more than one texture unit. This means that the d3d9 visual point size test will cause a
754  * kernel panic on any machine running fglrx 9.3(latest that supports r300 to r500 cards). This
755  * quirk only enables point sprites on the first texture unit. This keeps point sprites working in
756  * most games, but avoids the crash
757  *
758  * A more sophisticated way would be to find all units that need texture coordinates and enable
759  * point sprites for one if only one is found, and software emulate point sprites in drawStridedSlow
760  * if more than one unit needs texture coordinates(This requires software ffp and vertex shaders though)
761  *
762  * Note that disabling the extension entirely does not gain predictability because there is no point
763  * sprite capability flag in d3d, so the potential rendering bugs are the same if we disable the extension. */
764 static void quirk_one_point_sprite(struct wined3d_gl_info *gl_info)
765 {
766     if (gl_info->supported[ARB_POINT_SPRITE])
767     {
768         TRACE("Limiting point sprites to one texture unit.\n");
769         gl_info->limits.point_sprite_units = 1;
770     }
771 }
772
773 static void quirk_ati_dx9(struct wined3d_gl_info *gl_info)
774 {
775     quirk_arb_constants(gl_info);
776
777     /* MacOS advertises GL_ARB_texture_non_power_of_two on ATI r500 and earlier cards, although
778      * these cards only support GL_ARB_texture_rectangle(D3DPTEXTURECAPS_NONPOW2CONDITIONAL).
779      * If real NP2 textures are used, the driver falls back to software. We could just remove the
780      * extension and use GL_ARB_texture_rectangle instead, but texture_rectangle is inconventient
781      * due to the non-normalized texture coordinates. Thus set an internal extension flag,
782      * GL_WINE_normalized_texrect, which signals the code that it can use non power of two textures
783      * as per GL_ARB_texture_non_power_of_two, but has to stick to the texture_rectangle limits.
784      *
785      * fglrx doesn't advertise GL_ARB_texture_non_power_of_two, but it advertises opengl 2.0 which
786      * has this extension promoted to core. The extension loading code sets this extension supported
787      * due to that, so this code works on fglrx as well. */
788     if(gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO])
789     {
790         TRACE("GL_ARB_texture_non_power_of_two advertised on R500 or earlier card, removing.\n");
791         gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] = FALSE;
792         gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT] = TRUE;
793     }
794
795     /* fglrx has the same structural issues as the one described in quirk_apple_glsl_constants, although
796      * it is generally more efficient. Reserve just 8 constants. */
797     TRACE_(d3d_caps)("Reserving 8 GLSL constants for compiler private use.\n");
798     gl_info->reserved_glsl_constants = max(gl_info->reserved_glsl_constants, 8);
799 }
800
801 static void quirk_no_np2(struct wined3d_gl_info *gl_info)
802 {
803     /*  The nVidia GeForceFX series reports OpenGL 2.0 capabilities with the latest drivers versions, but
804      *  doesn't explicitly advertise the ARB_tex_npot extension in the GL extension string.
805      *  This usually means that ARB_tex_npot is supported in hardware as long as the application is staying
806      *  within the limits enforced by the ARB_texture_rectangle extension. This however is not true for the
807      *  FX series, which instantly falls back to a slower software path as soon as ARB_tex_npot is used.
808      *  We therefore completely remove ARB_tex_npot from the list of supported extensions.
809      *
810      *  Note that wine_normalized_texrect can't be used in this case because internally it uses ARB_tex_npot,
811      *  triggering the software fallback. There is not much we can do here apart from disabling the
812      *  software-emulated extension and reenable ARB_tex_rect (which was previously disabled
813      *  in IWineD3DImpl_FillGLCaps).
814      *  This fixup removes performance problems on both the FX 5900 and FX 5700 (e.g. for framebuffer
815      *  post-processing effects in the game "Max Payne 2").
816      *  The behaviour can be verified through a simple test app attached in bugreport #14724. */
817     TRACE("GL_ARB_texture_non_power_of_two advertised through OpenGL 2.0 on NV FX card, removing.\n");
818     gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] = FALSE;
819     gl_info->supported[ARB_TEXTURE_RECTANGLE] = TRUE;
820 }
821
822 static void quirk_texcoord_w(struct wined3d_gl_info *gl_info)
823 {
824     /* The Intel GPUs on MacOS set the .w register of texcoords to 0.0 by default, which causes problems
825      * with fixed function fragment processing. Ideally this flag should be detected with a test shader
826      * and OpenGL feedback mode, but some GL implementations (MacOS ATI at least, probably all MacOS ones)
827      * do not like vertex shaders in feedback mode and return an error, even though it should be valid
828      * according to the spec.
829      *
830      * We don't want to enable this on all cards, as it adds an extra instruction per texcoord used. This
831      * makes the shader slower and eats instruction slots which should be available to the d3d app.
832      *
833      * ATI Radeon HD 2xxx cards on MacOS have the issue. Instead of checking for the buggy cards, blacklist
834      * all radeon cards on Macs and whitelist the good ones. That way we're prepared for the future. If
835      * this workaround is activated on cards that do not need it, it won't break things, just affect
836      * performance negatively. */
837     TRACE("Enabling vertex texture coord fixes in vertex shaders.\n");
838     gl_info->quirks |= WINED3D_QUIRK_SET_TEXCOORD_W;
839 }
840
841 static void quirk_clip_varying(struct wined3d_gl_info *gl_info)
842 {
843     gl_info->quirks |= WINED3D_QUIRK_GLSL_CLIP_VARYING;
844 }
845
846 static void quirk_allows_specular_alpha(struct wined3d_gl_info *gl_info)
847 {
848     gl_info->quirks |= WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA;
849 }
850
851 static void quirk_apple_nvts(struct wined3d_gl_info *gl_info)
852 {
853     gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
854     gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
855 }
856
857 static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
858 {
859     gl_info->quirks |= WINED3D_QUIRK_NV_CLIP_BROKEN;
860 }
861
862 static void quirk_fbo_tex_update(struct wined3d_gl_info *gl_info)
863 {
864     gl_info->quirks |= WINED3D_QUIRK_FBO_TEX_UPDATE;
865 }
866
867 struct driver_quirk
868 {
869     BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
870             enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device);
871     void (*apply)(struct wined3d_gl_info *gl_info);
872     const char *description;
873 };
874
875 static const struct driver_quirk quirk_table[] =
876 {
877     {
878         match_ati_r300_to_500,
879         quirk_ati_dx9,
880         "ATI GLSL constant and normalized texrect quirk"
881     },
882     /* MacOS advertises more GLSL vertex shader uniforms than supported by the hardware, and if more are
883      * used it falls back to software. While the compiler can detect if the shader uses all declared
884      * uniforms, the optimization fails if the shader uses relative addressing. So any GLSL shader
885      * using relative addressing falls back to software.
886      *
887      * ARB vp gives the correct amount of uniforms, so use it instead of GLSL. */
888     {
889         match_apple,
890         quirk_apple_glsl_constants,
891         "Apple GLSL uniform override"
892     },
893     {
894         match_geforce5,
895         quirk_no_np2,
896         "Geforce 5 NP2 disable"
897     },
898     {
899         match_apple_intel,
900         quirk_texcoord_w,
901         "Init texcoord .w for Apple Intel GPU driver"
902     },
903     {
904         match_apple_nonr500ati,
905         quirk_texcoord_w,
906         "Init texcoord .w for Apple ATI >= r600 GPU driver"
907     },
908     {
909         match_fglrx,
910         quirk_one_point_sprite,
911         "Fglrx point sprite crash workaround"
912     },
913     {
914         match_dx10_capable,
915         quirk_clip_varying,
916         "Reserved varying for gl_ClipPos"
917     },
918     {
919         /* GL_EXT_secondary_color does not allow 4 component secondary colors, but most
920          * GL implementations accept it. The Mac GL is the only implementation known to
921          * reject it.
922          *
923          * If we can pass 4 component specular colors, do it, because (a) we don't have
924          * to screw around with the data, and (b) the D3D fixed function vertex pipeline
925          * passes specular alpha to the pixel shader if any is used. Otherwise the
926          * specular alpha is used to pass the fog coordinate, which we pass to opengl
927          * via GL_EXT_fog_coord.
928          */
929         match_allows_spec_alpha,
930         quirk_allows_specular_alpha,
931         "Allow specular alpha quirk"
932     },
933     {
934         /* The pixel formats provided by GL_NV_texture_shader are broken on OSX
935          * (rdar://5682521).
936          */
937         match_apple_nvts,
938         quirk_apple_nvts,
939         "Apple NV_texture_shader disable"
940     },
941     {
942         match_broken_nv_clip,
943         quirk_disable_nvvp_clip,
944         "Apple NV_vertex_program clip bug quirk"
945     },
946     {
947         match_fbo_tex_update,
948         quirk_fbo_tex_update,
949         "FBO rebind for attachment updates"
950     },
951 };
952
953 /* Certain applications (Steam) complain if we report an outdated driver version. In general,
954  * reporting a driver version is moot because we are not the Windows driver, and we have different
955  * bugs, features, etc.
956  *
957  * The driver version has the form "x.y.z.w".
958  *
959  * "x" is the Windows version the driver is meant for:
960  * 4 -> 95/98/NT4
961  * 5 -> 2000
962  * 6 -> 2000/XP
963  * 7 -> Vista
964  * 8 -> Win 7
965  *
966  * "y" is the maximum Direct3D version the driver supports.
967  * y  -> d3d version mapping:
968  * 11 -> d3d6
969  * 12 -> d3d7
970  * 13 -> d3d8
971  * 14 -> d3d9
972  * 15 -> d3d10
973  * 16 -> d3d10.1
974  * 17 -> d3d11
975  *
976  * "z" is the subversion number.
977  *
978  * "w" is the vendor specific driver build number.
979  */
980
981 struct driver_version_information
982 {
983     enum wined3d_display_driver driver;
984     enum wined3d_driver_model driver_model;
985     const char *driver_name;            /* name of Windows driver */
986     WORD version;                       /* version word ('y'), contained in low word of DriverVersion.HighPart */
987     WORD subversion;                    /* subversion word ('z'), contained in high word of DriverVersion.LowPart */
988     WORD build;                         /* build number ('w'), contained in low word of DriverVersion.LowPart */
989 };
990
991 /* The driver version table contains driver information for different devices on several OS versions. */
992 static const struct driver_version_information driver_version_table[] =
993 {
994     /* ATI
995      * - Radeon HD2x00 (R600) and up supported by current drivers.
996      * - Radeon 9500 (R300) - X1*00 (R5xx) supported upto Catalyst 9.3 (Linux) and 10.2 (XP/Vista/Win7)
997      * - Radeon 7xxx (R100) - 9250 (RV250) supported upto Catalyst 6.11 (XP)
998      * - Rage 128 supported upto XP, latest official build 6.13.3279 dated October 2001 */
999     {DRIVER_ATI_RAGE_128PRO,    DRIVER_MODEL_NT5X,  "ati2dvaa.dll", 13, 3279,  0},
1000     {DRIVER_ATI_R100,           DRIVER_MODEL_NT5X,  "ati2dvag.dll", 14, 10, 6614},
1001     {DRIVER_ATI_R300,           DRIVER_MODEL_NT5X,  "ati2dvag.dll", 14, 10, 6764},
1002     {DRIVER_ATI_R600,           DRIVER_MODEL_NT5X,  "ati2dvag.dll", 14, 10, 8681},
1003     {DRIVER_ATI_R300,           DRIVER_MODEL_NT6X,  "atiumdag.dll", 14, 10, 741 },
1004     {DRIVER_ATI_R600,           DRIVER_MODEL_NT6X,  "atiumdag.dll", 14, 10, 741 },
1005
1006     /* Intel
1007      * The drivers are unified but not all versions support all GPUs. At some point the 2k/xp
1008      * drivers used ialmrnt5.dll for GMA800/GMA900 but at some point the file was renamed to
1009      * igxprd32.dll but the GMA800 driver was never updated. */
1010     {DRIVER_INTEL_GMA800,       DRIVER_MODEL_NT5X,  "ialmrnt5.dll", 14, 10, 3889},
1011     {DRIVER_INTEL_GMA900,       DRIVER_MODEL_NT5X,  "igxprd32.dll", 14, 10, 4764},
1012     {DRIVER_INTEL_GMA950,       DRIVER_MODEL_NT5X,  "igxprd32.dll", 14, 10, 4926},
1013     {DRIVER_INTEL_GMA3000,      DRIVER_MODEL_NT5X,  "igxprd32.dll", 14, 10, 5218},
1014     {DRIVER_INTEL_GMA950,       DRIVER_MODEL_NT6X,  "igdumd32.dll", 14, 10, 1504},
1015     {DRIVER_INTEL_GMA3000,      DRIVER_MODEL_NT6X,  "igdumd32.dll", 15, 10, 1666},
1016
1017     /* Nvidia
1018      * - Geforce6 and newer cards are supported by the current driver (197.x) on XP-Win7
1019      * - GeforceFX support is up to 173.x on <= XP
1020      * - Geforce2MX/3/4 up to 96.x on <= XP
1021      * - TNT/Geforce1/2 up to 71.x on <= XP
1022      * All version numbers used below are from the Linux nvidia drivers. */
1023     {DRIVER_NVIDIA_TNT,         DRIVER_MODEL_NT5X,  "nv4_disp.dll", 14, 10, 7186},
1024     {DRIVER_NVIDIA_GEFORCE2MX,  DRIVER_MODEL_NT5X,  "nv4_disp.dll", 14, 10, 9371},
1025     {DRIVER_NVIDIA_GEFORCEFX,   DRIVER_MODEL_NT5X,  "nv4_disp.dll", 14, 11, 7516},
1026     {DRIVER_NVIDIA_GEFORCE6,    DRIVER_MODEL_NT5X,  "nv4_disp.dll", 15, 11, 9745},
1027     {DRIVER_NVIDIA_GEFORCE6,    DRIVER_MODEL_NT6X,  "nvd3dum.dll",  15, 11, 9745},
1028 };
1029
1030 struct gpu_description
1031 {
1032     WORD vendor;                    /* reported PCI card vendor ID  */
1033     WORD card;                      /* reported PCI card device ID  */
1034     const char *description;        /* Description of the card e.g. NVIDIA RIVA TNT */
1035     enum wined3d_display_driver driver;
1036 };
1037
1038 static const struct gpu_description gpu_description_table[] =
1039 {
1040     /* Nvidia cards */
1041     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT,           "NVIDIA RIVA TNT",                  DRIVER_NVIDIA_TNT        },
1042     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT2,          "NVIDIA RIVA TNT2/TNT2 Pro",        DRIVER_NVIDIA_TNT        },
1043     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE,            "NVIDIA GeForce 256",               DRIVER_NVIDIA_TNT        },
1044     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2,           "NVIDIA GeForce2 GTS/GeForce2 Pro", DRIVER_NVIDIA_TNT        },
1045     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2_MX,        "NVIDIA GeForce2 MX/MX 400",        DRIVER_NVIDIA_GEFORCE2MX },
1046     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE3,           "NVIDIA GeForce3",                  DRIVER_NVIDIA_GEFORCE2MX },
1047     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_MX,        "NVIDIA GeForce4 MX 460",           DRIVER_NVIDIA_GEFORCE2MX },
1048     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_TI4200,    "NVIDIA GeForce4 Ti 4200",          DRIVER_NVIDIA_GEFORCE2MX },
1049     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5200,     "NVIDIA GeForce FX 5200",           DRIVER_NVIDIA_GEFORCEFX  },
1050     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5600,     "NVIDIA GeForce FX 5600",           DRIVER_NVIDIA_GEFORCEFX  },
1051     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5800,     "NVIDIA GeForce FX 5800",           DRIVER_NVIDIA_GEFORCEFX  },
1052     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6200,       "NVIDIA GeForce 6200",              DRIVER_NVIDIA_GEFORCE6   },
1053     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6600GT,     "NVIDIA GeForce 6600 GT",           DRIVER_NVIDIA_GEFORCE6   },
1054     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6800,       "NVIDIA GeForce 6800",              DRIVER_NVIDIA_GEFORCE6   },
1055     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7300,       "NVIDIA GeForce Go 7300",           DRIVER_NVIDIA_GEFORCE6   },
1056     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7400,       "NVIDIA GeForce Go 7400",           DRIVER_NVIDIA_GEFORCE6   },
1057     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7600,       "NVIDIA GeForce 7600 GT",           DRIVER_NVIDIA_GEFORCE6   },
1058     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7800GT,     "NVIDIA GeForce 7800 GT",           DRIVER_NVIDIA_GEFORCE6   },
1059     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8300GS,     "NVIDIA GeForce 8300 GS",           DRIVER_NVIDIA_GEFORCE6   },
1060     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8400GS,     "NVIDIA GeForce 8400 GS",           DRIVER_NVIDIA_GEFORCE6   },
1061     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600GT,     "NVIDIA GeForce 8600 GT",           DRIVER_NVIDIA_GEFORCE6   },
1062     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600MGT,    "NVIDIA GeForce 8600M GT",          DRIVER_NVIDIA_GEFORCE6   },
1063     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8800GTS,    "NVIDIA GeForce 8800 GTS",          DRIVER_NVIDIA_GEFORCE6   },
1064     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8800GTX,    "NVIDIA GeForce 8800 GTX",          DRIVER_NVIDIA_GEFORCE6   },
1065     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9200,       "NVIDIA GeForce 9200",              DRIVER_NVIDIA_GEFORCE6   },
1066     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9400GT,     "NVIDIA GeForce 9400 GT",           DRIVER_NVIDIA_GEFORCE6   },
1067     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9500GT,     "NVIDIA GeForce 9500 GT",           DRIVER_NVIDIA_GEFORCE6   },
1068     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9600GT,     "NVIDIA GeForce 9600 GT",           DRIVER_NVIDIA_GEFORCE6   },
1069     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9800GT,     "NVIDIA GeForce 9800 GT",           DRIVER_NVIDIA_GEFORCE6   },
1070     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_210,        "NVIDIA GeForce 210",               DRIVER_NVIDIA_GEFORCE6   },
1071     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GT220,      "NVIDIA GeForce GT 220",            DRIVER_NVIDIA_GEFORCE6   },
1072     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GT240,      "NVIDIA GeForce GT 240",            DRIVER_NVIDIA_GEFORCE6   },
1073     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX260,     "NVIDIA GeForce GTX 260",           DRIVER_NVIDIA_GEFORCE6   },
1074     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX275,     "NVIDIA GeForce GTX 275",           DRIVER_NVIDIA_GEFORCE6   },
1075     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX280,     "NVIDIA GeForce GTX 280",           DRIVER_NVIDIA_GEFORCE6   },
1076     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GT325M,     "NVIDIA GeForce GT 325M",           DRIVER_NVIDIA_GEFORCE6   },
1077     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTS350M,    "NVIDIA GeForce GTS 350M",          DRIVER_NVIDIA_GEFORCE6   },
1078     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX460,     "NVIDIA GeForce GTX 460",           DRIVER_NVIDIA_GEFORCE6   },
1079     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX470,     "NVIDIA GeForce GTX 470",           DRIVER_NVIDIA_GEFORCE6   },
1080     {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX480,     "NVIDIA GeForce GTX 480",           DRIVER_NVIDIA_GEFORCE6   },
1081     /* ATI cards */
1082     {HW_VENDOR_ATI,        CARD_ATI_RAGE_128PRO,           "ATI Rage Fury",                    DRIVER_ATI_RAGE_128PRO,  },
1083     {HW_VENDOR_ATI,        CARD_ATI_RADEON_7200,           "ATI RADEON 7200 SERIES",           DRIVER_ATI_R100,         },
1084     {HW_VENDOR_ATI,        CARD_ATI_RADEON_8500,           "ATI RADEON 8500 SERIES",           DRIVER_ATI_R100,         },
1085     {HW_VENDOR_ATI,        CARD_ATI_RADEON_9500,           "ATI Radeon 9500",                  DRIVER_ATI_R300,         },
1086     {HW_VENDOR_ATI,        CARD_ATI_RADEON_XPRESS_200M,    "ATI RADEON XPRESS 200M Series",    DRIVER_ATI_R300,         },
1087     {HW_VENDOR_ATI,        CARD_ATI_RADEON_X700,           "ATI Radeon X700 SE",               DRIVER_ATI_R300,         },
1088     {HW_VENDOR_ATI,        CARD_ATI_RADEON_X1600,          "ATI Radeon X1600 Series",          DRIVER_ATI_R300,         },
1089     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2350,         "ATI Mobility Radeon HD 2350",      DRIVER_ATI_R600,         },
1090     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2600,         "ATI Mobility Radeon HD 2600",      DRIVER_ATI_R600,         },
1091     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2900,         "ATI Radeon HD 2900 XT",            DRIVER_ATI_R600,         },
1092     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4350,         "ATI Radeon HD 4350",               DRIVER_ATI_R600,         },
1093     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4600,         "ATI Radeon HD 4600 Series",        DRIVER_ATI_R600,         },
1094     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4700,         "ATI Radeon HD 4700 Series",        DRIVER_ATI_R600,         },
1095     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4800,         "ATI Radeon HD 4800 Series",        DRIVER_ATI_R600,         },
1096     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD5700,         "ATI Radeon HD 5700 Series",        DRIVER_ATI_R600,         },
1097     {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD5800,         "ATI Radeon HD 5800 Series",        DRIVER_ATI_R600,         },
1098     /* Intel cards */
1099     {HW_VENDOR_INTEL,      CARD_INTEL_I830G,               "Intel(R) 82830M Graphics Controller",                       DRIVER_INTEL_GMA800  },
1100     {HW_VENDOR_INTEL,      CARD_INTEL_I855G,               "Intel(R) 82852/82855 GM/GME Graphics Controller",           DRIVER_INTEL_GMA800  },
1101     {HW_VENDOR_INTEL,      CARD_INTEL_I865G,               "Intel(R) 82865G Graphics Controller",                       DRIVER_INTEL_GMA800  },
1102     {HW_VENDOR_INTEL,      CARD_INTEL_I915G,               "Intel(R) 82915G/GV/910GL Express Chipset Family",           DRIVER_INTEL_GMA900  },
1103     {HW_VENDOR_INTEL,      CARD_INTEL_I915GM,              "Mobile Intel(R) 915GM/GMS,910GML Express Chipset Family",   DRIVER_INTEL_GMA900  },
1104     {HW_VENDOR_INTEL,      CARD_INTEL_I945GM,              "Mobile Intel(R) 945GM Express Chipset Family",              DRIVER_INTEL_GMA950  },
1105     {HW_VENDOR_INTEL,      CARD_INTEL_X3100,               "Mobile Intel(R) 965 Express Chipset Family",                DRIVER_INTEL_GMA3000 }
1106 };
1107
1108 static const struct driver_version_information *get_driver_version_info(enum wined3d_display_driver driver,
1109         enum wined3d_driver_model driver_model)
1110 {
1111     unsigned int i;
1112
1113     TRACE("Looking up version info for driver=%d driver_model=%d\n", driver, driver_model);
1114     for (i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); i++)
1115     {
1116         const struct driver_version_information *entry = &driver_version_table[i];
1117
1118         if (entry->driver == driver && entry->driver_model == driver_model)
1119         {
1120             TRACE_(d3d_caps)("Found driver '%s' version=%d subversion=%d build=%d\n",
1121                 entry->driver_name, entry->version, entry->subversion, entry->build);
1122
1123             return entry;
1124         }
1125     }
1126     return NULL;
1127 }
1128
1129 static void init_driver_info(struct wined3d_driver_info *driver_info,
1130         enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
1131 {
1132     OSVERSIONINFOW os_version;
1133     WORD driver_os_version;
1134     unsigned int i;
1135     enum wined3d_display_driver driver = DRIVER_UNKNOWN;
1136     enum wined3d_driver_model driver_model;
1137     const struct driver_version_information *version_info;
1138
1139     if (wined3d_settings.pci_vendor_id != PCI_VENDOR_NONE)
1140     {
1141         TRACE_(d3d_caps)("Overriding PCI vendor ID with: %04x\n", wined3d_settings.pci_vendor_id);
1142         vendor = wined3d_settings.pci_vendor_id;
1143     }
1144     driver_info->vendor = vendor;
1145
1146     if (wined3d_settings.pci_device_id != PCI_DEVICE_NONE)
1147     {
1148         TRACE_(d3d_caps)("Overriding PCI device ID with: %04x\n", wined3d_settings.pci_device_id);
1149         device = wined3d_settings.pci_device_id;
1150     }
1151     driver_info->device = device;
1152
1153     memset(&os_version, 0, sizeof(os_version));
1154     os_version.dwOSVersionInfoSize = sizeof(os_version);
1155     if (!GetVersionExW(&os_version))
1156     {
1157         ERR("Failed to get OS version, reporting 2000/XP.\n");
1158         driver_os_version = 6;
1159         driver_model = DRIVER_MODEL_NT5X;
1160     }
1161     else
1162     {
1163         TRACE("OS version %u.%u.\n", os_version.dwMajorVersion, os_version.dwMinorVersion);
1164         switch (os_version.dwMajorVersion)
1165         {
1166             case 4:
1167                 /* If needed we could distinguish between 9x and NT4, but this code won't make
1168                  * sense for NT4 since it had no way to obtain this info through DirectDraw 3.0.
1169                  */
1170                 driver_os_version = 4;
1171                 driver_model = DRIVER_MODEL_WIN9X;
1172                 break;
1173
1174             case 5:
1175                 driver_os_version = 6;
1176                 driver_model = DRIVER_MODEL_NT5X;
1177                 break;
1178
1179             case 6:
1180                 if (os_version.dwMinorVersion == 0)
1181                 {
1182                     driver_os_version = 7;
1183                     driver_model = DRIVER_MODEL_NT6X;
1184                 }
1185                 else
1186                 {
1187                     if (os_version.dwMinorVersion > 1)
1188                     {
1189                         FIXME("Unhandled OS version %u.%u, reporting Win 7.\n",
1190                                 os_version.dwMajorVersion, os_version.dwMinorVersion);
1191                     }
1192                     driver_os_version = 8;
1193                     driver_model = DRIVER_MODEL_NT6X;
1194                 }
1195                 break;
1196
1197             default:
1198                 FIXME("Unhandled OS version %u.%u, reporting 2000/XP.\n",
1199                         os_version.dwMajorVersion, os_version.dwMinorVersion);
1200                 driver_os_version = 6;
1201                 driver_model = DRIVER_MODEL_NT5X;
1202                 break;
1203         }
1204     }
1205
1206     /* When we reach this stage we always have a vendor or device id (it can be a default one).
1207      * This means that unless the ids are overriden, we will always find a GPU description. */
1208     for (i = 0; i < (sizeof(gpu_description_table) / sizeof(gpu_description_table[0])); i++)
1209     {
1210         if (vendor == gpu_description_table[i].vendor && device == gpu_description_table[i].card)
1211         {
1212             TRACE_(d3d_caps)("Found card %04x:%04x in driver DB.\n", vendor, device);
1213
1214             driver_info->description = gpu_description_table[i].description;
1215             driver = gpu_description_table[i].driver;
1216             break;
1217         }
1218     }
1219
1220     /* Try to obtain driver version information for the current Windows version. This fails in
1221      * some cases:
1222      * - the gpu is not available on the currently selected OS version:
1223      *   - Geforce GTX480 on Win98. When running applications in compatibility mode on Windows,
1224      *     version information for the current Windows version is returned instead of faked info.
1225      *     We do the same and assume the default Windows version to emulate is WinXP.
1226      *
1227      *   - Videocard is a Riva TNT but winver is set to win7 (there are no drivers for this beast)
1228      *     For now return the XP driver info. Perhaps later on we should return VESA.
1229      *
1230      * - the gpu is not in our database (can happen when the user overrides the vendor_id / device_id)
1231      *   This could be an indication that our database is not up to date, so this should be fixed.
1232      */
1233     version_info = get_driver_version_info(driver, driver_model);
1234     if (version_info)
1235     {
1236         driver_info->name = version_info->driver_name;
1237         driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, version_info->version);
1238         driver_info->version_low = MAKEDWORD_VERSION(version_info->subversion, version_info->build);
1239     }
1240     else
1241     {
1242         version_info = get_driver_version_info(driver, DRIVER_MODEL_NT5X);
1243         if (version_info)
1244         {
1245             driver_info->name = version_info->driver_name;
1246             driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, version_info->version);
1247             driver_info->version_low = MAKEDWORD_VERSION(version_info->subversion, version_info->build);
1248         }
1249         else
1250         {
1251             driver_info->description = "Direct3D HAL";
1252             driver_info->name = "Display";
1253             driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, 15);
1254             driver_info->version_low = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */
1255
1256             FIXME("Unable to find a driver/device info for vendor_id=%#x device_id=%#x for driver_model=%d\n",
1257                     vendor, device, driver_model);
1258         }
1259     }
1260
1261     TRACE_(d3d_caps)("Reporting (fake) driver version 0x%08x-0x%08x.\n",
1262             driver_info->version_high, driver_info->version_low);
1263 }
1264
1265 /* Context activation is done by the caller. */
1266 static void fixup_extensions(struct wined3d_gl_info *gl_info, const char *gl_renderer,
1267         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
1268 {
1269     unsigned int i;
1270
1271     for (i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); ++i)
1272     {
1273         if (!quirk_table[i].match(gl_info, gl_renderer, gl_vendor, card_vendor, device)) continue;
1274         TRACE_(d3d_caps)("Applying driver quirk \"%s\".\n", quirk_table[i].description);
1275         quirk_table[i].apply(gl_info);
1276     }
1277
1278     /* Find out if PBOs work as they are supposed to. */
1279     test_pbo_functionality(gl_info);
1280 }
1281
1282 static DWORD wined3d_parse_gl_version(const char *gl_version)
1283 {
1284     const char *ptr = gl_version;
1285     int major, minor;
1286
1287     major = atoi(ptr);
1288     if (major <= 0) ERR_(d3d_caps)("Invalid opengl major version: %d.\n", major);
1289
1290     while (isdigit(*ptr)) ++ptr;
1291     if (*ptr++ != '.') ERR_(d3d_caps)("Invalid opengl version string: %s.\n", debugstr_a(gl_version));
1292
1293     minor = atoi(ptr);
1294
1295     TRACE_(d3d_caps)("Found OpenGL version: %d.%d.\n", major, minor);
1296
1297     return MAKEDWORD_VERSION(major, minor);
1298 }
1299
1300 static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl_info, const char *gl_vendor_string, const char *gl_renderer)
1301 {
1302
1303     /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
1304      * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
1305      * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
1306      *
1307      * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
1308      * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
1309      * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
1310      * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
1311      * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
1312      * the chance that other implementations support them is rather small since Win32 QuickTime uses
1313      * DirectDraw, not OpenGL. */
1314     if (gl_info->supported[APPLE_FENCE]
1315             && gl_info->supported[APPLE_CLIENT_STORAGE]
1316             && gl_info->supported[APPLE_FLUSH_RENDER]
1317             && gl_info->supported[APPLE_YCBCR_422])
1318         return GL_VENDOR_APPLE;
1319
1320     if (strstr(gl_vendor_string, "NVIDIA"))
1321         return GL_VENDOR_NVIDIA;
1322
1323     if (strstr(gl_vendor_string, "ATI"))
1324         return GL_VENDOR_FGLRX;
1325
1326     if (strstr(gl_vendor_string, "Intel(R)")
1327             /* Intel switched from Intel(R) to Intel® recently, so just match Intel. */
1328             || strstr(gl_renderer, "Intel")
1329             || strstr(gl_vendor_string, "Intel Inc."))
1330         return GL_VENDOR_INTEL;
1331
1332     if (strstr(gl_vendor_string, "Mesa")
1333             || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
1334             || strstr(gl_vendor_string, "DRI R300 Project")
1335             || strstr(gl_vendor_string, "X.Org R300 Project")
1336             || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
1337             || strstr(gl_vendor_string, "VMware, Inc.")
1338             || strstr(gl_renderer, "Mesa")
1339             || strstr(gl_renderer, "Gallium"))
1340         return GL_VENDOR_MESA;
1341
1342     FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_UNKNOWN.\n",
1343             debugstr_a(gl_vendor_string));
1344
1345     return GL_VENDOR_UNKNOWN;
1346 }
1347
1348 static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
1349 {
1350     if (strstr(gl_vendor_string, "NVIDIA"))
1351         return HW_VENDOR_NVIDIA;
1352
1353     if (strstr(gl_vendor_string, "ATI")
1354             || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
1355             || strstr(gl_vendor_string, "X.Org R300 Project")
1356             || strstr(gl_renderer, "R100")
1357             || strstr(gl_renderer, "R200")
1358             || strstr(gl_renderer, "R300")
1359             || strstr(gl_renderer, "R600")
1360             || strstr(gl_renderer, "R700"))
1361         return HW_VENDOR_ATI;
1362
1363     if (strstr(gl_vendor_string, "Intel(R)")
1364             /* Intel switched from Intel(R) to Intel® recently, so just match Intel. */
1365             || strstr(gl_renderer, "Intel")
1366             || strstr(gl_vendor_string, "Intel Inc."))
1367         return HW_VENDOR_INTEL;
1368
1369     if (strstr(gl_vendor_string, "Mesa")
1370             || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
1371             || strstr(gl_vendor_string, "VMware, Inc."))
1372         return HW_VENDOR_SOFTWARE;
1373
1374     FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string));
1375
1376     return HW_VENDOR_NVIDIA;
1377 }
1378
1379
1380
1381 static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info,
1382         const char *gl_renderer, unsigned int *vidmem)
1383 {
1384     if (WINE_D3D10_CAPABLE(gl_info))
1385     {
1386         /* Geforce 400 - highend */
1387         if (strstr(gl_renderer, "GTX 480"))
1388         {
1389             *vidmem = 1536;
1390             return CARD_NVIDIA_GEFORCE_GTX480;
1391         }
1392
1393         /* Geforce 400 - midend high */
1394         if (strstr(gl_renderer, "GTX 470"))
1395         {
1396             *vidmem = 1280;
1397             return CARD_NVIDIA_GEFORCE_GTX470;
1398         }
1399
1400         /* Geforce 400 - midend */
1401         if (strstr(gl_renderer, "GTX 460"))
1402         {
1403             *vidmem = 768;  /* 1024MB model also available */
1404             return CARD_NVIDIA_GEFORCE_GTX460;
1405         }
1406
1407         /* Geforce 300 highend mobile */
1408         if (strstr(gl_renderer, "GTS 350M")
1409                 || strstr(gl_renderer, "GTS 360M"))
1410         {
1411            *vidmem = 1024;
1412            return CARD_NVIDIA_GEFORCE_GTS350M;
1413         }
1414
1415         /* Geforce 300 midend mobile (Geforce GT 325M/330M use the same core) */
1416         if (strstr(gl_renderer, "GT 325M")
1417                 || strstr(gl_renderer, "GT 330M"))
1418         {
1419            *vidmem = 1024;
1420            return CARD_NVIDIA_GEFORCE_GT325M;
1421         }
1422
1423         /* Geforce 200 - highend */
1424         if (strstr(gl_renderer, "GTX 280")
1425                 || strstr(gl_renderer, "GTX 285")
1426                 || strstr(gl_renderer, "GTX 295"))
1427         {
1428             *vidmem = 1024;
1429             return CARD_NVIDIA_GEFORCE_GTX280;
1430         }
1431
1432         /* Geforce 200 - midend high */
1433         if (strstr(gl_renderer, "GTX 275"))
1434         {
1435             *vidmem = 896;
1436             return CARD_NVIDIA_GEFORCE_GTX275;
1437         }
1438
1439         /* Geforce 200 - midend */
1440         if (strstr(gl_renderer, "GTX 260"))
1441         {
1442             *vidmem = 1024;
1443             return CARD_NVIDIA_GEFORCE_GTX260;
1444         }
1445         /* Geforce 200 - midend */
1446         if (strstr(gl_renderer, "GT 240"))
1447         {
1448            *vidmem = 512;
1449            return CARD_NVIDIA_GEFORCE_GT240;
1450         }
1451
1452         /* Geforce 200 lowend */
1453         if (strstr(gl_renderer, "GT 220"))
1454         {
1455            *vidmem = 512; /* The GT 220 has 512-1024MB */
1456            return CARD_NVIDIA_GEFORCE_GT220;
1457         }
1458         /* Geforce 200 lowend (Geforce 305/310 use the same core) */
1459         if (strstr(gl_renderer, "Geforce 210")
1460                 || strstr(gl_renderer, "G 210")
1461                 || strstr(gl_renderer, "Geforce 305")
1462                 || strstr(gl_renderer, "Geforce 310"))
1463         {
1464            *vidmem = 512;
1465            return CARD_NVIDIA_GEFORCE_210;
1466         }
1467
1468         /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */
1469         if (strstr(gl_renderer, "9800")
1470                 || strstr(gl_renderer, "GTS 150")
1471                 || strstr(gl_renderer, "GTS 250"))
1472         {
1473             *vidmem = 512;
1474             return CARD_NVIDIA_GEFORCE_9800GT;
1475         }
1476
1477         /* Geforce9 - midend (GT 140 uses the same core as the 9600GT) */
1478         if (strstr(gl_renderer, "9600")
1479                 || strstr(gl_renderer, "GT 140"))
1480         {
1481             *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */
1482             return CARD_NVIDIA_GEFORCE_9600GT;
1483         }
1484
1485         /* Geforce9 - midend low / Geforce 200 - low */
1486         if (strstr(gl_renderer, "9500")
1487                 || strstr(gl_renderer, "GT 120")
1488                 || strstr(gl_renderer, "GT 130"))
1489         {
1490             *vidmem = 256; /* The 9500GT has 256-1024MB */
1491             return CARD_NVIDIA_GEFORCE_9500GT;
1492         }
1493
1494         /* Geforce9 - lowend */
1495         if (strstr(gl_renderer, "9400"))
1496         {
1497             *vidmem = 256; /* The 9400GT has 256-1024MB */
1498             return CARD_NVIDIA_GEFORCE_9400GT;
1499         }
1500
1501         /* Geforce9 - lowend low */
1502         if (strstr(gl_renderer, "9100")
1503                 || strstr(gl_renderer, "9200")
1504                 || strstr(gl_renderer, "9300")
1505                 || strstr(gl_renderer, "G 100"))
1506         {
1507             *vidmem = 256; /* The 9100-9300 cards have 256MB */
1508             return CARD_NVIDIA_GEFORCE_9200;
1509         }
1510
1511         /* Geforce8 - highend high*/
1512         if (strstr(gl_renderer, "8800 GTX"))
1513         {
1514             *vidmem = 768;
1515             return CARD_NVIDIA_GEFORCE_8800GTX;
1516         }
1517
1518         /* Geforce8 - highend */
1519         if (strstr(gl_renderer, "8800"))
1520         {
1521             *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */
1522             return CARD_NVIDIA_GEFORCE_8800GTS;
1523         }
1524
1525         /* Geforce8 - midend mobile */
1526         if (strstr(gl_renderer, "8600 M"))
1527         {
1528             *vidmem = 512;
1529             return CARD_NVIDIA_GEFORCE_8600MGT;
1530         }
1531
1532         /* Geforce8 - midend */
1533         if (strstr(gl_renderer, "8600")
1534                 || strstr(gl_renderer, "8700"))
1535         {
1536             *vidmem = 256;
1537             return CARD_NVIDIA_GEFORCE_8600GT;
1538         }
1539
1540         /* Geforce8 - mid-lowend */
1541         if (strstr(gl_renderer, "8400")
1542                 || strstr(gl_renderer, "8500"))
1543         {
1544             *vidmem = 128; /* 128-256MB for a 8400, 256-512MB for a 8500 */
1545             return CARD_NVIDIA_GEFORCE_8400GS;
1546         }
1547
1548         /* Geforce8 - lowend */
1549         if (strstr(gl_renderer, "8100")
1550                 || strstr(gl_renderer, "8200")
1551                 || strstr(gl_renderer, "8300"))
1552         {
1553             *vidmem = 128; /* 128-256MB for a 8300 */
1554             return CARD_NVIDIA_GEFORCE_8300GS;
1555         }
1556
1557         /* Geforce8-compatible fall back if the GPU is not in the list yet */
1558         *vidmem = 128;
1559         return CARD_NVIDIA_GEFORCE_8300GS;
1560     }
1561
1562     /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
1563      * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
1564      */
1565     if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3])
1566     {
1567         /* Geforce7 - highend */
1568         if (strstr(gl_renderer, "7800")
1569                 || strstr(gl_renderer, "7900")
1570                 || strstr(gl_renderer, "7950")
1571                 || strstr(gl_renderer, "Quadro FX 4")
1572                 || strstr(gl_renderer, "Quadro FX 5"))
1573         {
1574             *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */
1575             return CARD_NVIDIA_GEFORCE_7800GT;
1576         }
1577
1578         /* Geforce7 midend */
1579         if (strstr(gl_renderer, "7600")
1580                 || strstr(gl_renderer, "7700"))
1581         {
1582             *vidmem = 256; /* The 7600 uses 256-512MB */
1583             return CARD_NVIDIA_GEFORCE_7600;
1584         }
1585
1586         /* Geforce7 lower medium */
1587         if (strstr(gl_renderer, "7400"))
1588         {
1589             *vidmem = 256; /* The 7400 uses 256-512MB */
1590             return CARD_NVIDIA_GEFORCE_7400;
1591         }
1592
1593         /* Geforce7 lowend */
1594         if (strstr(gl_renderer, "7300"))
1595         {
1596             *vidmem = 256; /* Mac Pros with this card have 256 MB */
1597             return CARD_NVIDIA_GEFORCE_7300;
1598         }
1599
1600         /* Geforce6 highend */
1601         if (strstr(gl_renderer, "6800"))
1602         {
1603             *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */
1604             return CARD_NVIDIA_GEFORCE_6800;
1605         }
1606
1607         /* Geforce6 - midend */
1608         if (strstr(gl_renderer, "6600")
1609                 || strstr(gl_renderer, "6610")
1610                 || strstr(gl_renderer, "6700"))
1611         {
1612             *vidmem = 128; /* A 6600GT has 128-256MB */
1613             return CARD_NVIDIA_GEFORCE_6600GT;
1614         }
1615
1616         /* Geforce6/7 lowend */
1617         *vidmem = 64; /* */
1618         return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */
1619     }
1620
1621     if (WINE_D3D9_CAPABLE(gl_info))
1622     {
1623         /* GeforceFX - highend */
1624         if (strstr(gl_renderer, "5800")
1625                 || strstr(gl_renderer, "5900")
1626                 || strstr(gl_renderer, "5950")
1627                 || strstr(gl_renderer, "Quadro FX"))
1628         {
1629             *vidmem = 256; /* 5800-5900 cards use 256MB */
1630             return CARD_NVIDIA_GEFORCEFX_5800;
1631         }
1632
1633         /* GeforceFX - midend */
1634         if (strstr(gl_renderer, "5600")
1635                 || strstr(gl_renderer, "5650")
1636                 || strstr(gl_renderer, "5700")
1637                 || strstr(gl_renderer, "5750"))
1638         {
1639             *vidmem = 128; /* A 5600 uses 128-256MB */
1640             return CARD_NVIDIA_GEFORCEFX_5600;
1641         }
1642
1643         /* GeforceFX - lowend */
1644         *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */
1645         return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */
1646     }
1647
1648     if (WINE_D3D8_CAPABLE(gl_info))
1649     {
1650         if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4"))
1651         {
1652             *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */
1653             return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */
1654         }
1655
1656         *vidmem = 64; /* Geforce3 cards have 64-128MB */
1657         return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */
1658     }
1659
1660     if (WINE_D3D7_CAPABLE(gl_info))
1661     {
1662         if (strstr(gl_renderer, "GeForce4 MX"))
1663         {
1664             /* Most Geforce4MX GPUs have at least 64MB of memory, some
1665              * early models had 32MB but most have 64MB or even 128MB. */
1666             *vidmem = 64;
1667             return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */
1668         }
1669
1670         if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR"))
1671         {
1672             *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */
1673             return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */
1674         }
1675
1676         if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2"))
1677         {
1678             *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */
1679             return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */
1680         }
1681
1682         /* Most Geforce1 cards have 32MB, there are also some rare 16
1683          * and 64MB (Dell) models. */
1684         *vidmem = 32;
1685         return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */
1686     }
1687
1688     if (strstr(gl_renderer, "TNT2"))
1689     {
1690         *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */
1691         return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */
1692     }
1693
1694     *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */
1695     return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */
1696
1697 }
1698
1699 static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info,
1700         const char *gl_renderer, unsigned int *vidmem)
1701 {
1702     /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
1703      *
1704      * Beware: renderer string do not match exact card model,
1705      * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
1706     if (WINE_D3D10_CAPABLE(gl_info))
1707     {
1708         /* Radeon EG CYPRESS XT / PRO HD5800 - highend */
1709         if (strstr(gl_renderer, "HD 5800")          /* Radeon EG CYPRESS HD58xx generic renderer string */
1710                 || strstr(gl_renderer, "HD 5850")   /* Radeon EG CYPRESS XT */
1711                 || strstr(gl_renderer, "HD 5870"))  /* Radeon EG CYPRESS PRO */
1712         {
1713             *vidmem = 1024; /* note: HD58xx cards use 1024MB  */
1714             return CARD_ATI_RADEON_HD5800;
1715         }
1716
1717         /* Radeon EG JUNIPER XT / LE HD5700 - midend */
1718         if (strstr(gl_renderer, "HD 5700")          /* Radeon EG JUNIPER HD57xx generic renderer string */
1719                 || strstr(gl_renderer, "HD 5750")   /* Radeon EG JUNIPER LE */
1720                 || strstr(gl_renderer, "HD 5770"))  /* Radeon EG JUNIPER XT */
1721         {
1722             *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB  */
1723             return CARD_ATI_RADEON_HD5700;
1724         }
1725
1726         /* Radeon R7xx HD4800 - highend */
1727         if (strstr(gl_renderer, "HD 4800")          /* Radeon RV7xx HD48xx generic renderer string */
1728                 || strstr(gl_renderer, "HD 4830")   /* Radeon RV770 */
1729                 || strstr(gl_renderer, "HD 4850")   /* Radeon RV770 */
1730                 || strstr(gl_renderer, "HD 4870")   /* Radeon RV770 */
1731                 || strstr(gl_renderer, "HD 4890"))  /* Radeon RV790 */
1732         {
1733             *vidmem = 512; /* note: HD4890 cards use 1024MB */
1734             return CARD_ATI_RADEON_HD4800;
1735         }
1736
1737         /* Radeon R740 HD4700 - midend */
1738         if (strstr(gl_renderer, "HD 4700")          /* Radeon RV770 */
1739                 || strstr(gl_renderer, "HD 4770"))  /* Radeon RV740 */
1740         {
1741             *vidmem = 512;
1742             return CARD_ATI_RADEON_HD4700;
1743         }
1744
1745         /* Radeon R730 HD4600 - midend */
1746         if (strstr(gl_renderer, "HD 4600")          /* Radeon RV730 */
1747                 || strstr(gl_renderer, "HD 4650")   /* Radeon RV730 */
1748                 || strstr(gl_renderer, "HD 4670"))  /* Radeon RV730 */
1749         {
1750             *vidmem = 512;
1751             return CARD_ATI_RADEON_HD4600;
1752         }
1753
1754         /* Radeon R710 HD4500/HD4350 - lowend */
1755         if (strstr(gl_renderer, "HD 4350")          /* Radeon RV710 */
1756                 || strstr(gl_renderer, "HD 4550"))  /* Radeon RV710 */
1757         {
1758             *vidmem = 256;
1759             return CARD_ATI_RADEON_HD4350;
1760         }
1761
1762         /* Radeon R6xx HD2900/HD3800 - highend */
1763         if (strstr(gl_renderer, "HD 2900")
1764                 || strstr(gl_renderer, "HD 3870")
1765                 || strstr(gl_renderer, "HD 3850"))
1766         {
1767             *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
1768             return CARD_ATI_RADEON_HD2900;
1769         }
1770
1771         /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
1772         if (strstr(gl_renderer, "HD 2600")
1773                 || strstr(gl_renderer, "HD 3830")
1774                 || strstr(gl_renderer, "HD 3690")
1775                 || strstr(gl_renderer, "HD 3650"))
1776         {
1777             *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
1778             return CARD_ATI_RADEON_HD2600;
1779         }
1780
1781         /* Radeon R6xx HD2350/HD2400/HD3400 - lowend
1782          * Note HD2300=DX9, HD2350=DX10 */
1783         if (strstr(gl_renderer, "HD 2350")
1784                 || strstr(gl_renderer, "HD 2400")
1785                 || strstr(gl_renderer, "HD 3470")
1786                 || strstr(gl_renderer, "HD 3450")
1787                 || strstr(gl_renderer, "HD 3430")
1788                 || strstr(gl_renderer, "HD 3400"))
1789         {
1790             *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
1791             return CARD_ATI_RADEON_HD2350;
1792         }
1793
1794         /* Radeon R6xx/R7xx integrated */
1795         if (strstr(gl_renderer, "HD 3100")
1796                 || strstr(gl_renderer, "HD 3200")
1797                 || strstr(gl_renderer, "HD 3300"))
1798         {
1799             *vidmem = 128; /* 128MB */
1800             return CARD_ATI_RADEON_HD3200;
1801         }
1802
1803         /* Default for when no GPU has been found */
1804         *vidmem = 128; /* 128MB */
1805         return CARD_ATI_RADEON_HD3200;
1806     }
1807
1808     if (WINE_D3D8_CAPABLE(gl_info))
1809     {
1810         /* Radeon R5xx */
1811         if (strstr(gl_renderer, "X1600")
1812                 || strstr(gl_renderer, "X1650")
1813                 || strstr(gl_renderer, "X1800")
1814                 || strstr(gl_renderer, "X1900")
1815                 || strstr(gl_renderer, "X1950"))
1816         {
1817             *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
1818             return CARD_ATI_RADEON_X1600;
1819         }
1820
1821         /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300/X2500/HD2300 (lowend R5xx)
1822          * Note X2300/X2500/HD2300 are R5xx GPUs with a 2xxx naming but they are still DX9-only */
1823         if (strstr(gl_renderer, "X700")
1824                 || strstr(gl_renderer, "X800")
1825                 || strstr(gl_renderer, "X850")
1826                 || strstr(gl_renderer, "X1300")
1827                 || strstr(gl_renderer, "X1400")
1828                 || strstr(gl_renderer, "X1450")
1829                 || strstr(gl_renderer, "X1550")
1830                 || strstr(gl_renderer, "X2300")
1831                 || strstr(gl_renderer, "X2500")
1832                 || strstr(gl_renderer, "HD 2300")
1833                 )
1834         {
1835             *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
1836             return CARD_ATI_RADEON_X700;
1837         }
1838
1839         /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
1840         if (strstr(gl_renderer, "Radeon Xpress"))
1841         {
1842             *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
1843             return CARD_ATI_RADEON_XPRESS_200M;
1844         }
1845
1846         /* Radeon R3xx */
1847         *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
1848         return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
1849     }
1850
1851     if (WINE_D3D8_CAPABLE(gl_info))
1852     {
1853         *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
1854         return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
1855     }
1856
1857     if (WINE_D3D7_CAPABLE(gl_info))
1858     {
1859         *vidmem = 32; /* There are models with up to 64MB */
1860         return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
1861     }
1862
1863     *vidmem = 16; /* There are 16-32MB models */
1864     return CARD_ATI_RAGE_128PRO;
1865
1866 }
1867
1868 static enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info,
1869         const char *gl_renderer, unsigned int *vidmem)
1870 {
1871     if (strstr(gl_renderer, "X3100"))
1872     {
1873         /* MacOS calls the card GMA X3100, otherwise known as GM965/GL960 */
1874         *vidmem = 128;
1875         return CARD_INTEL_X3100;
1876     }
1877
1878     if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM"))
1879     {
1880         /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */
1881         *vidmem = 64;
1882         return CARD_INTEL_I945GM;
1883     }
1884
1885     if (strstr(gl_renderer, "915GM")) return CARD_INTEL_I915GM;
1886     if (strstr(gl_renderer, "915G")) return CARD_INTEL_I915G;
1887     if (strstr(gl_renderer, "865G")) return CARD_INTEL_I865G;
1888     if (strstr(gl_renderer, "855G")) return CARD_INTEL_I855G;
1889     if (strstr(gl_renderer, "830G")) return CARD_INTEL_I830G;
1890     return CARD_INTEL_I915G;
1891
1892 }
1893
1894 static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info *gl_info,
1895         const char *gl_renderer, unsigned int *vidmem)
1896 {
1897     /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
1898      *
1899      * Beware: renderer string do not match exact card model,
1900      * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
1901     if (strstr(gl_renderer, "Gallium"))
1902     {
1903         /* Radeon R7xx HD4800 - highend */
1904         if (strstr(gl_renderer, "R700")          /* Radeon R7xx HD48xx generic renderer string */
1905                 || strstr(gl_renderer, "RV770")  /* Radeon RV770 */
1906                 || strstr(gl_renderer, "RV790"))  /* Radeon RV790 */
1907         {
1908             *vidmem = 512; /* note: HD4890 cards use 1024MB */
1909             return CARD_ATI_RADEON_HD4800;
1910         }
1911
1912         /* Radeon R740 HD4700 - midend */
1913         if (strstr(gl_renderer, "RV740"))          /* Radeon RV740 */
1914         {
1915             *vidmem = 512;
1916             return CARD_ATI_RADEON_HD4700;
1917         }
1918
1919         /* Radeon R730 HD4600 - midend */
1920         if (strstr(gl_renderer, "RV730"))        /* Radeon RV730 */
1921         {
1922             *vidmem = 512;
1923             return CARD_ATI_RADEON_HD4600;
1924         }
1925
1926         /* Radeon R710 HD4500/HD4350 - lowend */
1927         if (strstr(gl_renderer, "RV710"))          /* Radeon RV710 */
1928         {
1929             *vidmem = 256;
1930             return CARD_ATI_RADEON_HD4350;
1931         }
1932
1933         /* Radeon R6xx HD2900/HD3800 - highend */
1934         if (strstr(gl_renderer, "R600")
1935                 || strstr(gl_renderer, "RV670")
1936                 || strstr(gl_renderer, "R680"))
1937         {
1938             *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
1939             return CARD_ATI_RADEON_HD2900;
1940         }
1941
1942         /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
1943         if (strstr(gl_renderer, "RV630")
1944                 || strstr(gl_renderer, "RV635"))
1945         {
1946             *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
1947             return CARD_ATI_RADEON_HD2600;
1948         }
1949
1950         /* Radeon R6xx HD2350/HD2400/HD3400 - lowend */
1951         if (strstr(gl_renderer, "RV610")
1952                 || strstr(gl_renderer, "RV620"))
1953         {
1954             *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
1955             return CARD_ATI_RADEON_HD2350;
1956         }
1957
1958         /* Radeon R6xx/R7xx integrated */
1959         if (strstr(gl_renderer, "RS780")
1960                 || strstr(gl_renderer, "RS880"))
1961         {
1962             *vidmem = 128; /* 128MB */
1963             return CARD_ATI_RADEON_HD3200;
1964         }
1965
1966         /* Radeon R5xx */
1967         if (strstr(gl_renderer, "RV530")
1968                 || strstr(gl_renderer, "RV535")
1969                 || strstr(gl_renderer, "RV560")
1970                 || strstr(gl_renderer, "R520")
1971                 || strstr(gl_renderer, "RV570")
1972                 || strstr(gl_renderer, "R580"))
1973         {
1974             *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
1975             return CARD_ATI_RADEON_X1600;
1976         }
1977
1978         /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
1979         if (strstr(gl_renderer, "R410")
1980                 || strstr(gl_renderer, "R420")
1981                 || strstr(gl_renderer, "R423")
1982                 || strstr(gl_renderer, "R430")
1983                 || strstr(gl_renderer, "R480")
1984                 || strstr(gl_renderer, "R481")
1985                 || strstr(gl_renderer, "RV410")
1986                 || strstr(gl_renderer, "RV515")
1987                 || strstr(gl_renderer, "RV516"))
1988         {
1989             *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
1990             return CARD_ATI_RADEON_X700;
1991         }
1992
1993         /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
1994         if (strstr(gl_renderer, "RS400")
1995                 || strstr(gl_renderer, "RS480")
1996                 || strstr(gl_renderer, "RS482")
1997                 || strstr(gl_renderer, "RS485")
1998                 || strstr(gl_renderer, "RS600")
1999                 || strstr(gl_renderer, "RS690")
2000                 || strstr(gl_renderer, "RS740"))
2001         {
2002             *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
2003             return CARD_ATI_RADEON_XPRESS_200M;
2004         }
2005
2006         /* Radeon R3xx */
2007         if (strstr(gl_renderer, "R300")
2008                 || strstr(gl_renderer, "RV350")
2009                 || strstr(gl_renderer, "RV351")
2010                 || strstr(gl_renderer, "RV360")
2011                 || strstr(gl_renderer, "RV370")
2012                 || strstr(gl_renderer, "R350")
2013                 || strstr(gl_renderer, "R360"))
2014         {
2015             *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
2016             return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
2017         }
2018     }
2019
2020     if (WINE_D3D9_CAPABLE(gl_info))
2021     {
2022         /* Radeon R7xx HD4800 - highend */
2023         if (strstr(gl_renderer, "(R700")          /* Radeon R7xx HD48xx generic renderer string */
2024                 || strstr(gl_renderer, "(RV770")  /* Radeon RV770 */
2025                 || strstr(gl_renderer, "(RV790"))  /* Radeon RV790 */
2026         {
2027             *vidmem = 512; /* note: HD4890 cards use 1024MB */
2028             return CARD_ATI_RADEON_HD4800;
2029         }
2030
2031         /* Radeon R740 HD4700 - midend */
2032         if (strstr(gl_renderer, "(RV740"))          /* Radeon RV740 */
2033         {
2034             *vidmem = 512;
2035             return CARD_ATI_RADEON_HD4700;
2036         }
2037
2038         /* Radeon R730 HD4600 - midend */
2039         if (strstr(gl_renderer, "(RV730"))        /* Radeon RV730 */
2040         {
2041             *vidmem = 512;
2042             return CARD_ATI_RADEON_HD4600;
2043         }
2044
2045         /* Radeon R710 HD4500/HD4350 - lowend */
2046         if (strstr(gl_renderer, "(RV710"))          /* Radeon RV710 */
2047         {
2048             *vidmem = 256;
2049             return CARD_ATI_RADEON_HD4350;
2050         }
2051
2052         /* Radeon R6xx HD2900/HD3800 - highend */
2053         if (strstr(gl_renderer, "(R600")
2054                 || strstr(gl_renderer, "(RV670")
2055                 || strstr(gl_renderer, "(R680"))
2056         {
2057             *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
2058             return CARD_ATI_RADEON_HD2900;
2059         }
2060
2061         /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
2062         if (strstr(gl_renderer, "(RV630")
2063                 || strstr(gl_renderer, "(RV635"))
2064         {
2065             *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
2066             return CARD_ATI_RADEON_HD2600;
2067         }
2068
2069         /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
2070         if (strstr(gl_renderer, "(RV610")
2071                 || strstr(gl_renderer, "(RV620"))
2072         {
2073             *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
2074             return CARD_ATI_RADEON_HD2350;
2075         }
2076
2077         /* Radeon R6xx/R7xx integrated */
2078         if (strstr(gl_renderer, "(RS780")
2079                 || strstr(gl_renderer, "(RS880"))
2080         {
2081             *vidmem = 128; /* 128MB */
2082             return CARD_ATI_RADEON_HD3200;
2083         }
2084     }
2085
2086     if (WINE_D3D8_CAPABLE(gl_info))
2087     {
2088         *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
2089         return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
2090     }
2091
2092     if (WINE_D3D7_CAPABLE(gl_info))
2093     {
2094         *vidmem = 32; /* There are models with up to 64MB */
2095         return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
2096     }
2097
2098     *vidmem = 16; /* There are 16-32MB models */
2099     return CARD_ATI_RAGE_128PRO;
2100
2101 }
2102
2103 static enum wined3d_pci_device select_card_nvidia_mesa(const struct wined3d_gl_info *gl_info,
2104         const char *gl_renderer, unsigned int *vidmem)
2105 {
2106     FIXME_(d3d_caps)("Card selection not handled for Mesa Nouveau driver\n");
2107     if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
2108     if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
2109     if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
2110     if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
2111     return CARD_NVIDIA_RIVA_128;
2112 }
2113
2114 static enum wined3d_pci_device select_card_intel_mesa(const struct wined3d_gl_info *gl_info,
2115         const char *gl_renderer, unsigned int *vidmem)
2116 {
2117     FIXME_(d3d_caps)("Card selection not handled for Mesa Intel driver\n");
2118     return CARD_INTEL_I915G;
2119 }
2120
2121
2122 struct vendor_card_selection
2123 {
2124     enum wined3d_gl_vendor gl_vendor;
2125     enum wined3d_pci_vendor card_vendor;
2126     const char *description;        /* Description of the card selector i.e. Apple OS/X Intel */
2127     enum wined3d_pci_device (*select_card)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
2128             unsigned int *vidmem );
2129 };
2130
2131 static const struct vendor_card_selection vendor_card_select_table[] =
2132 {
2133     {GL_VENDOR_NVIDIA, HW_VENDOR_NVIDIA,  "Nvidia binary driver",     select_card_nvidia_binary},
2134     {GL_VENDOR_APPLE,  HW_VENDOR_NVIDIA,  "Apple OSX NVidia binary driver",   select_card_nvidia_binary},
2135     {GL_VENDOR_APPLE,  HW_VENDOR_ATI,     "Apple OSX AMD/ATI binary driver",  select_card_ati_binary},
2136     {GL_VENDOR_APPLE,  HW_VENDOR_INTEL,   "Apple OSX Intel binary driver",    select_card_intel_binary},
2137     {GL_VENDOR_FGLRX,  HW_VENDOR_ATI,     "AMD/ATI binary driver",    select_card_ati_binary},
2138     {GL_VENDOR_MESA,   HW_VENDOR_ATI,     "Mesa AMD/ATI driver",      select_card_ati_mesa},
2139     {GL_VENDOR_MESA,   HW_VENDOR_NVIDIA,  "Mesa Nouveau driver",      select_card_nvidia_mesa},
2140     {GL_VENDOR_MESA,   HW_VENDOR_INTEL,   "Mesa Intel driver",        select_card_intel_mesa},
2141     {GL_VENDOR_INTEL,  HW_VENDOR_INTEL,   "Mesa Intel driver",        select_card_intel_mesa}
2142 };
2143
2144
2145 static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
2146         enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor, unsigned int *vidmem)
2147 {
2148     /* Above is a list of Nvidia and ATI GPUs. Both vendors have dozens of
2149      * different GPUs with roughly the same features. In most cases GPUs from a
2150      * certain family differ in clockspeeds, the amount of video memory and the
2151      * number of shader pipelines.
2152      *
2153      * A Direct3D device object contains the PCI id (vendor + device) of the
2154      * videocard which is used for rendering. Various applications use this
2155      * information to get a rough estimation of the features of the card and
2156      * some might use it for enabling 3d effects only on certain types of
2157      * videocards. In some cases games might even use it to work around bugs
2158      * which happen on certain videocards/driver combinations. The problem is
2159      * that OpenGL only exposes a rendering string containing the name of the
2160      * videocard and not the PCI id.
2161      *
2162      * Various games depend on the PCI id, so somehow we need to provide one.
2163      * A simple option is to parse the renderer string and translate this to
2164      * the right PCI id. This is a lot of work because there are more than 200
2165      * GPUs just for Nvidia. Various cards share the same renderer string, so
2166      * the amount of code might be 'small' but there are quite a number of
2167      * exceptions which would make this a pain to maintain. Another way would
2168      * be to query the PCI id from the operating system (assuming this is the
2169      * videocard which is used for rendering which is not always the case).
2170      * This would work but it is not very portable. Second it would not work
2171      * well in, let's say, a remote X situation in which the amount of 3d
2172      * features which can be used is limited.
2173      *
2174      * As said most games only use the PCI id to get an indication of the
2175      * capabilities of the card. It doesn't really matter if the given id is
2176      * the correct one if we return the id of a card with similar 3d features.
2177      *
2178      * The code below checks the OpenGL capabilities of a videocard and matches
2179      * that to a certain level of Direct3D functionality. Once a card passes
2180      * the Direct3D9 check, we know that the card (in case of Nvidia) is at
2181      * least a GeforceFX. To give a better estimate we do a basic check on the
2182      * renderer string but if that won't pass we return a default card. This
2183      * way is better than maintaining a full card database as even without a
2184      * full database we can return a card with similar features. Second the
2185      * size of the database can be made quite small because when you know what
2186      * type of 3d functionality a card has, you know to which GPU family the
2187      * GPU must belong. Because of this you only have to check a small part of
2188      * the renderer string to distinguishes between different models from that
2189      * family.
2190      *
2191      * The code also selects a default amount of video memory which we will
2192      * use for an estimation of the amount of free texture memory. In case of
2193      * real D3D the amount of texture memory includes video memory and system
2194      * memory (to be specific AGP memory or in case of PCIE TurboCache /
2195      * HyperMemory). We don't know how much system memory can be addressed by
2196      * the system but we can make a reasonable estimation about the amount of
2197      * video memory. If the value is slightly wrong it doesn't matter as we
2198      * didn't include AGP-like memory which makes the amount of addressable
2199      * memory higher and second OpenGL isn't that critical it moves to system
2200      * memory behind our backs if really needed. Note that the amount of video
2201      * memory can be overruled using a registry setting. */
2202
2203     int i;
2204
2205     for (i = 0; i < (sizeof(vendor_card_select_table) / sizeof(*vendor_card_select_table)); ++i)
2206     {
2207         if ((vendor_card_select_table[i].gl_vendor != *gl_vendor)
2208             || (vendor_card_select_table[i].card_vendor != *card_vendor))
2209                 continue;
2210         TRACE_(d3d_caps)("Applying card_selector \"%s\".\n", vendor_card_select_table[i].description);
2211         return vendor_card_select_table[i].select_card(gl_info, gl_renderer, vidmem);
2212     }
2213
2214     FIXME_(d3d_caps)("No card selector available for GL vendor %d and card vendor %04x.\n",
2215                      *gl_vendor, *card_vendor);
2216
2217     /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice
2218      * for Nvidia was because the hardware and drivers they make are of good quality. This makes
2219      * them a good generic choice. */
2220     *card_vendor = HW_VENDOR_NVIDIA;
2221     if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
2222     if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
2223     if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
2224     if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
2225     return CARD_NVIDIA_RIVA_128;
2226 }
2227
2228 static const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter)
2229 {
2230     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
2231     int vs_selected_mode, ps_selected_mode;
2232
2233     select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
2234     if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
2235             && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline;
2236     else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline;
2237     else if (gl_info->supported[NV_REGISTER_COMBINERS]
2238             && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline;
2239     else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline;
2240     else return &ffp_fragment_pipeline;
2241 }
2242
2243 static const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter)
2244 {
2245     int vs_selected_mode, ps_selected_mode;
2246
2247     select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
2248     if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
2249     if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
2250     return &none_shader_backend;
2251 }
2252
2253 static const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter)
2254 {
2255     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
2256     int vs_selected_mode, ps_selected_mode;
2257
2258     select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
2259     if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
2260             && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit;
2261     else return &ffp_blit;
2262 }
2263
2264 /* Context activation is done by the caller. */
2265 static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
2266 {
2267     struct wined3d_driver_info *driver_info = &adapter->driver_info;
2268     struct wined3d_gl_info *gl_info = &adapter->gl_info;
2269     const char *GL_Extensions    = NULL;
2270     const char *WGL_Extensions   = NULL;
2271     const char *gl_vendor_str, *gl_renderer_str, *gl_version_str;
2272     struct fragment_caps fragment_caps;
2273     enum wined3d_gl_vendor gl_vendor;
2274     enum wined3d_pci_vendor card_vendor;
2275     enum wined3d_pci_device device;
2276     GLint       gl_max;
2277     GLfloat     gl_floatv[2];
2278     unsigned    i;
2279     HDC         hdc;
2280     unsigned int vidmem=0;
2281     DWORD gl_version;
2282     size_t len;
2283
2284     TRACE_(d3d_caps)("(%p)\n", gl_info);
2285
2286     ENTER_GL();
2287
2288     gl_renderer_str = (const char *)glGetString(GL_RENDERER);
2289     TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_renderer_str));
2290     if (!gl_renderer_str)
2291     {
2292         LEAVE_GL();
2293         ERR_(d3d_caps)("Received a NULL GL_RENDERER.\n");
2294         return FALSE;
2295     }
2296
2297     gl_vendor_str = (const char *)glGetString(GL_VENDOR);
2298     TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_vendor_str));
2299     if (!gl_vendor_str)
2300     {
2301         LEAVE_GL();
2302         ERR_(d3d_caps)("Received a NULL GL_VENDOR.\n");
2303         return FALSE;
2304     }
2305
2306     /* Parse the GL_VERSION field into major and minor information */
2307     gl_version_str = (const char *)glGetString(GL_VERSION);
2308     TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_version_str));
2309     if (!gl_version_str)
2310     {
2311         LEAVE_GL();
2312         ERR_(d3d_caps)("Received a NULL GL_VERSION.\n");
2313         return FALSE;
2314     }
2315     gl_version = wined3d_parse_gl_version(gl_version_str);
2316
2317     /*
2318      * Initialize openGL extension related variables
2319      *  with Default values
2320      */
2321     memset(gl_info->supported, 0, sizeof(gl_info->supported));
2322     gl_info->limits.blends = 1;
2323     gl_info->limits.buffers = 1;
2324     gl_info->limits.textures = 1;
2325     gl_info->limits.fragment_samplers = 1;
2326     gl_info->limits.vertex_samplers = 0;
2327     gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers;
2328     gl_info->limits.sampler_stages = 1;
2329     gl_info->limits.glsl_vs_float_constants = 0;
2330     gl_info->limits.glsl_ps_float_constants = 0;
2331     gl_info->limits.arb_vs_float_constants = 0;
2332     gl_info->limits.arb_vs_native_constants = 0;
2333     gl_info->limits.arb_vs_instructions = 0;
2334     gl_info->limits.arb_vs_temps = 0;
2335     gl_info->limits.arb_ps_float_constants = 0;
2336     gl_info->limits.arb_ps_local_constants = 0;
2337     gl_info->limits.arb_ps_instructions = 0;
2338     gl_info->limits.arb_ps_temps = 0;
2339
2340     /* Retrieve opengl defaults */
2341     glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max);
2342     gl_info->limits.clipplanes = min(WINED3DMAXUSERCLIPPLANES, gl_max);
2343     TRACE_(d3d_caps)("ClipPlanes support - num Planes=%d\n", gl_max);
2344
2345     glGetIntegerv(GL_MAX_LIGHTS, &gl_max);
2346     gl_info->limits.lights = gl_max;
2347     TRACE_(d3d_caps)("Lights support - max lights=%d\n", gl_max);
2348
2349     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_max);
2350     gl_info->limits.texture_size = gl_max;
2351     TRACE_(d3d_caps)("Maximum texture size support - max texture size=%d\n", gl_max);
2352
2353     glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, gl_floatv);
2354     gl_info->limits.pointsize_min = gl_floatv[0];
2355     gl_info->limits.pointsize_max = gl_floatv[1];
2356     TRACE_(d3d_caps)("Maximum point size support - max point size=%f\n", gl_floatv[1]);
2357
2358     /* Parse the gl supported features, in theory enabling parts of our code appropriately. */
2359     GL_Extensions = (const char *)glGetString(GL_EXTENSIONS);
2360     if (!GL_Extensions)
2361     {
2362         LEAVE_GL();
2363         ERR_(d3d_caps)("Received a NULL GL_EXTENSIONS.\n");
2364         return FALSE;
2365     }
2366
2367     LEAVE_GL();
2368
2369     TRACE_(d3d_caps)("GL_Extensions reported:\n");
2370
2371     gl_info->supported[WINED3D_GL_EXT_NONE] = TRUE;
2372
2373     while (*GL_Extensions)
2374     {
2375         const char *start;
2376
2377         while (isspace(*GL_Extensions)) ++GL_Extensions;
2378         start = GL_Extensions;
2379         while (!isspace(*GL_Extensions) && *GL_Extensions) ++GL_Extensions;
2380
2381         len = GL_Extensions - start;
2382         if (!len) continue;
2383
2384         TRACE_(d3d_caps)("- %s\n", debugstr_an(start, len));
2385
2386         for (i = 0; i < (sizeof(EXTENSION_MAP) / sizeof(*EXTENSION_MAP)); ++i)
2387         {
2388             if (len == strlen(EXTENSION_MAP[i].extension_string)
2389                     && !memcmp(start, EXTENSION_MAP[i].extension_string, len))
2390             {
2391                 TRACE_(d3d_caps)(" FOUND: %s support.\n", EXTENSION_MAP[i].extension_string);
2392                 gl_info->supported[EXTENSION_MAP[i].extension] = TRUE;
2393                 break;
2394             }
2395         }
2396     }
2397
2398     /* Now work out what GL support this card really has */
2399 #define USE_GL_FUNC(type, pfn, ext, replace) \
2400 { \
2401     DWORD ver = ver_for_ext(ext); \
2402     if (gl_info->supported[ext]) gl_info->pfn = (type)pwglGetProcAddress(#pfn); \
2403     else if (ver && ver <= gl_version) gl_info->pfn = (type)pwglGetProcAddress(#replace); \
2404     else gl_info->pfn = NULL; \
2405 }
2406     GL_EXT_FUNCS_GEN;
2407 #undef USE_GL_FUNC
2408
2409 #define USE_GL_FUNC(type, pfn, ext, replace) gl_info->pfn = (type)pwglGetProcAddress(#pfn);
2410     WGL_EXT_FUNCS_GEN;
2411 #undef USE_GL_FUNC
2412
2413     ENTER_GL();
2414
2415     /* Now mark all the extensions supported which are included in the opengl core version. Do this *after*
2416      * loading the functions, otherwise the code above will load the extension entry points instead of the
2417      * core functions, which may not work. */
2418     for (i = 0; i < (sizeof(EXTENSION_MAP) / sizeof(*EXTENSION_MAP)); ++i)
2419     {
2420         if (!gl_info->supported[EXTENSION_MAP[i].extension]
2421                 && EXTENSION_MAP[i].version <= gl_version && EXTENSION_MAP[i].version)
2422         {
2423             TRACE_(d3d_caps)(" GL CORE: %s support.\n", EXTENSION_MAP[i].extension_string);
2424             gl_info->supported[EXTENSION_MAP[i].extension] = TRUE;
2425         }
2426     }
2427
2428     if (gl_version >= MAKEDWORD_VERSION(2, 0)) gl_info->supported[WINED3D_GL_VERSION_2_0] = TRUE;
2429
2430     if (gl_info->supported[APPLE_FENCE])
2431     {
2432         /* GL_NV_fence and GL_APPLE_fence provide the same functionality basically.
2433          * The apple extension interacts with some other apple exts. Disable the NV
2434          * extension if the apple one is support to prevent confusion in other parts
2435          * of the code. */
2436         gl_info->supported[NV_FENCE] = FALSE;
2437     }
2438     if (gl_info->supported[APPLE_FLOAT_PIXELS])
2439     {
2440         /* GL_APPLE_float_pixels == GL_ARB_texture_float + GL_ARB_half_float_pixel
2441          *
2442          * The enums are the same:
2443          * GL_RGBA16F_ARB     = GL_RGBA_FLOAT16_APPLE = 0x881A
2444          * GL_RGB16F_ARB      = GL_RGB_FLOAT16_APPLE  = 0x881B
2445          * GL_RGBA32F_ARB     = GL_RGBA_FLOAT32_APPLE = 0x8814
2446          * GL_RGB32F_ARB      = GL_RGB_FLOAT32_APPLE  = 0x8815
2447          * GL_HALF_FLOAT_ARB  = GL_HALF_APPLE         = 0x140B
2448          */
2449         if (!gl_info->supported[ARB_TEXTURE_FLOAT])
2450         {
2451             TRACE_(d3d_caps)(" IMPLIED: GL_ARB_texture_float support(from GL_APPLE_float_pixels.\n");
2452             gl_info->supported[ARB_TEXTURE_FLOAT] = TRUE;
2453         }
2454         if (!gl_info->supported[ARB_HALF_FLOAT_PIXEL])
2455         {
2456             TRACE_(d3d_caps)(" IMPLIED: GL_ARB_half_float_pixel support(from GL_APPLE_float_pixels.\n");
2457             gl_info->supported[ARB_HALF_FLOAT_PIXEL] = TRUE;
2458         }
2459     }
2460     if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
2461     {
2462         /* GL_ARB_map_buffer_range and GL_APPLE_flush_buffer_range provide the same
2463          * functionality. Prefer the ARB extension */
2464         gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] = FALSE;
2465     }
2466     if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
2467     {
2468         TRACE_(d3d_caps)(" IMPLIED: NVIDIA (NV) Texture Gen Reflection support.\n");
2469         gl_info->supported[NV_TEXGEN_REFLECTION] = TRUE;
2470     }
2471     if (!gl_info->supported[ARB_DEPTH_CLAMP] && gl_info->supported[NV_DEPTH_CLAMP])
2472     {
2473         TRACE_(d3d_caps)(" IMPLIED: ARB_depth_clamp support (by NV_depth_clamp).\n");
2474         gl_info->supported[ARB_DEPTH_CLAMP] = TRUE;
2475     }
2476     if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] && gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
2477     {
2478         TRACE_(d3d_caps)(" IMPLIED: ARB_vertex_array_bgra support (by EXT_vertex_array_bgra).\n");
2479         gl_info->supported[ARB_VERTEX_ARRAY_BGRA] = TRUE;
2480     }
2481     if (!gl_info->supported[ARB_TEXTURE_COMPRESSION_RGTC] && gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC])
2482     {
2483         TRACE_(d3d_caps)(" IMPLIED: ARB_texture_compression_rgtc support (by EXT_texture_compression_rgtc).\n");
2484         gl_info->supported[ARB_TEXTURE_COMPRESSION_RGTC] = TRUE;
2485     }
2486     if (gl_info->supported[NV_TEXTURE_SHADER2])
2487     {
2488         if (gl_info->supported[NV_REGISTER_COMBINERS])
2489         {
2490             /* Also disable ATI_FRAGMENT_SHADER if register combiners and texture_shader2
2491              * are supported. The nv extensions provide the same functionality as the
2492              * ATI one, and a bit more(signed pixelformats). */
2493             gl_info->supported[ATI_FRAGMENT_SHADER] = FALSE;
2494         }
2495     }
2496
2497     if (gl_info->supported[NV_REGISTER_COMBINERS])
2498     {
2499         glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &gl_max);
2500         gl_info->limits.general_combiners = gl_max;
2501         TRACE_(d3d_caps)("Max general combiners: %d.\n", gl_max);
2502     }
2503     if (gl_info->supported[ARB_DRAW_BUFFERS])
2504     {
2505         glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
2506         gl_info->limits.buffers = gl_max;
2507         TRACE_(d3d_caps)("Max draw buffers: %u.\n", gl_max);
2508     }
2509     if (gl_info->supported[ARB_MULTITEXTURE])
2510     {
2511         glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
2512         gl_info->limits.textures = min(MAX_TEXTURES, gl_max);
2513         TRACE_(d3d_caps)("Max textures: %d.\n", gl_info->limits.textures);
2514
2515         if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
2516         {
2517             GLint tmp;
2518             glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &tmp);
2519             gl_info->limits.fragment_samplers = min(MAX_FRAGMENT_SAMPLERS, tmp);
2520         }
2521         else
2522         {
2523             gl_info->limits.fragment_samplers = max(gl_info->limits.fragment_samplers, gl_max);
2524         }
2525         TRACE_(d3d_caps)("Max fragment samplers: %d.\n", gl_info->limits.fragment_samplers);
2526
2527         if (gl_info->supported[ARB_VERTEX_SHADER])
2528         {
2529             GLint tmp;
2530             glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &tmp);
2531             gl_info->limits.vertex_samplers = tmp;
2532             glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, &tmp);
2533             gl_info->limits.combined_samplers = tmp;
2534
2535             /* Loading GLSL sampler uniforms is much simpler if we can assume that the sampler setup
2536              * is known at shader link time. In a vertex shader + pixel shader combination this isn't
2537              * an issue because then the sampler setup only depends on the two shaders. If a pixel
2538              * shader is used with fixed function vertex processing we're fine too because fixed function
2539              * vertex processing doesn't use any samplers. If fixed function fragment processing is
2540              * used we have to make sure that all vertex sampler setups are valid together with all
2541              * possible fixed function fragment processing setups. This is true if vsamplers + MAX_TEXTURES
2542              * <= max_samplers. This is true on all d3d9 cards that support vtf(gf 6 and gf7 cards).
2543              * dx9 radeon cards do not support vertex texture fetch. DX10 cards have 128 samplers, and
2544              * dx9 is limited to 8 fixed function texture stages and 4 vertex samplers. DX10 does not have
2545              * a fixed function pipeline anymore.
2546              *
2547              * So this is just a check to check that our assumption holds true. If not, write a warning
2548              * and reduce the number of vertex samplers or probably disable vertex texture fetch. */
2549             if (gl_info->limits.vertex_samplers && gl_info->limits.combined_samplers < 12
2550                     && MAX_TEXTURES + gl_info->limits.vertex_samplers > gl_info->limits.combined_samplers)
2551             {
2552                 FIXME("OpenGL implementation supports %u vertex samplers and %u total samplers.\n",
2553                         gl_info->limits.vertex_samplers, gl_info->limits.combined_samplers);
2554                 FIXME("Expected vertex samplers + MAX_TEXTURES(=8) > combined_samplers.\n");
2555                 if (gl_info->limits.combined_samplers > MAX_TEXTURES)
2556                     gl_info->limits.vertex_samplers = gl_info->limits.combined_samplers - MAX_TEXTURES;
2557                 else
2558                     gl_info->limits.vertex_samplers = 0;
2559             }
2560         }
2561         else
2562         {
2563             gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers;
2564         }
2565         TRACE_(d3d_caps)("Max vertex samplers: %u.\n", gl_info->limits.vertex_samplers);
2566         TRACE_(d3d_caps)("Max combined samplers: %u.\n", gl_info->limits.combined_samplers);
2567     }
2568     if (gl_info->supported[ARB_VERTEX_BLEND])
2569     {
2570         glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &gl_max);
2571         gl_info->limits.blends = gl_max;
2572         TRACE_(d3d_caps)("Max blends: %u.\n", gl_info->limits.blends);
2573     }
2574     if (gl_info->supported[EXT_TEXTURE3D])
2575     {
2576         glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE_EXT, &gl_max);
2577         gl_info->limits.texture3d_size = gl_max;
2578         TRACE_(d3d_caps)("Max texture3D size: %d.\n", gl_info->limits.texture3d_size);
2579     }
2580     if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
2581     {
2582         glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max);
2583         gl_info->limits.anisotropy = gl_max;
2584         TRACE_(d3d_caps)("Max anisotropy: %d.\n", gl_info->limits.anisotropy);
2585     }
2586     if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
2587     {
2588         GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
2589         gl_info->limits.arb_ps_float_constants = gl_max;
2590         TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM float constants: %d.\n", gl_info->limits.arb_ps_float_constants);
2591         GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, &gl_max));
2592         gl_info->limits.arb_ps_native_constants = gl_max;
2593         TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native float constants: %d.\n",
2594                 gl_info->limits.arb_ps_native_constants);
2595         GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max));
2596         gl_info->limits.arb_ps_temps = gl_max;
2597         TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_ps_temps);
2598         GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max));
2599         gl_info->limits.arb_ps_instructions = gl_max;
2600         TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native instructions: %d.\n", gl_info->limits.arb_ps_instructions);
2601         GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &gl_max));
2602         gl_info->limits.arb_ps_local_constants = gl_max;
2603         TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM local parameters: %d.\n", gl_info->limits.arb_ps_instructions);
2604     }
2605     if (gl_info->supported[ARB_VERTEX_PROGRAM])
2606     {
2607         GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
2608         gl_info->limits.arb_vs_float_constants = gl_max;
2609         TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM float constants: %d.\n", gl_info->limits.arb_vs_float_constants);
2610         GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, &gl_max));
2611         gl_info->limits.arb_vs_native_constants = gl_max;
2612         TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native float constants: %d.\n",
2613                 gl_info->limits.arb_vs_native_constants);
2614         GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max));
2615         gl_info->limits.arb_vs_temps = gl_max;
2616         TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_vs_temps);
2617         GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max));
2618         gl_info->limits.arb_vs_instructions = gl_max;
2619         TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native instructions: %d.\n", gl_info->limits.arb_vs_instructions);
2620
2621         if (test_arb_vs_offset_limit(gl_info)) gl_info->quirks |= WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT;
2622     }
2623     if (gl_info->supported[ARB_VERTEX_SHADER])
2624     {
2625         glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max);
2626         gl_info->limits.glsl_vs_float_constants = gl_max / 4;
2627         TRACE_(d3d_caps)("Max ARB_VERTEX_SHADER float constants: %u.\n", gl_info->limits.glsl_vs_float_constants);
2628     }
2629     if (gl_info->supported[ARB_FRAGMENT_SHADER])
2630     {
2631         glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, &gl_max);
2632         gl_info->limits.glsl_ps_float_constants = gl_max / 4;
2633         TRACE_(d3d_caps)("Max ARB_FRAGMENT_SHADER float constants: %u.\n", gl_info->limits.glsl_ps_float_constants);
2634         glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &gl_max);
2635         gl_info->limits.glsl_varyings = gl_max;
2636         TRACE_(d3d_caps)("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_max, gl_max / 4);
2637     }
2638     if (gl_info->supported[ARB_SHADING_LANGUAGE_100])
2639     {
2640         const char *str = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB);
2641         unsigned int major, minor;
2642
2643         TRACE_(d3d_caps)("GLSL version string: %s.\n", debugstr_a(str));
2644
2645         /* The format of the GLSL version string is "major.minor[.release] [vendor info]". */
2646         sscanf(str, "%u.%u", &major, &minor);
2647         gl_info->glsl_version = MAKEDWORD_VERSION(major, minor);
2648     }
2649     if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
2650     {
2651         glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->limits.shininess);
2652     }
2653     else
2654     {
2655         gl_info->limits.shininess = 128.0f;
2656     }
2657     if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO])
2658     {
2659         /* If we have full NP2 texture support, disable
2660          * GL_ARB_texture_rectangle because we will never use it.
2661          * This saves a few redundant glDisable calls. */
2662         gl_info->supported[ARB_TEXTURE_RECTANGLE] = FALSE;
2663     }
2664     if (gl_info->supported[ATI_FRAGMENT_SHADER])
2665     {
2666         /* Disable NV_register_combiners and fragment shader if this is supported.
2667          * generally the NV extensions are preferred over the ATI ones, and this
2668          * extension is disabled if register_combiners and texture_shader2 are both
2669          * supported. So we reach this place only if we have incomplete NV dxlevel 8
2670          * fragment processing support. */
2671         gl_info->supported[NV_REGISTER_COMBINERS] = FALSE;
2672         gl_info->supported[NV_REGISTER_COMBINERS2] = FALSE;
2673         gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
2674         gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
2675     }
2676     if (gl_info->supported[NV_HALF_FLOAT])
2677     {
2678         /* GL_ARB_half_float_vertex is a subset of GL_NV_half_float. */
2679         gl_info->supported[ARB_HALF_FLOAT_VERTEX] = TRUE;
2680     }
2681     if (gl_info->supported[ARB_POINT_SPRITE])
2682     {
2683         gl_info->limits.point_sprite_units = gl_info->limits.textures;
2684     }
2685     else
2686     {
2687         gl_info->limits.point_sprite_units = 0;
2688     }
2689     checkGLcall("extension detection");
2690
2691     LEAVE_GL();
2692
2693     adapter->fragment_pipe = select_fragment_implementation(adapter);
2694     adapter->shader_backend = select_shader_backend(adapter);
2695     adapter->blitter = select_blit_implementation(adapter);
2696
2697     adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
2698     gl_info->limits.texture_stages = fragment_caps.MaxTextureBlendStages;
2699     TRACE_(d3d_caps)("Max texture stages: %u.\n", gl_info->limits.texture_stages);
2700
2701     /* In some cases the number of texture stages can be larger than the number
2702      * of samplers. The GF4 for example can use only 2 samplers (no fragment
2703      * shaders), but 8 texture stages (register combiners). */
2704     gl_info->limits.sampler_stages = max(gl_info->limits.fragment_samplers, gl_info->limits.texture_stages);
2705
2706     if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
2707     {
2708         gl_info->fbo_ops.glIsRenderbuffer = gl_info->glIsRenderbuffer;
2709         gl_info->fbo_ops.glBindRenderbuffer = gl_info->glBindRenderbuffer;
2710         gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->glDeleteRenderbuffers;
2711         gl_info->fbo_ops.glGenRenderbuffers = gl_info->glGenRenderbuffers;
2712         gl_info->fbo_ops.glRenderbufferStorage = gl_info->glRenderbufferStorage;
2713         gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->glRenderbufferStorageMultisample;
2714         gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->glGetRenderbufferParameteriv;
2715         gl_info->fbo_ops.glIsFramebuffer = gl_info->glIsFramebuffer;
2716         gl_info->fbo_ops.glBindFramebuffer = gl_info->glBindFramebuffer;
2717         gl_info->fbo_ops.glDeleteFramebuffers = gl_info->glDeleteFramebuffers;
2718         gl_info->fbo_ops.glGenFramebuffers = gl_info->glGenFramebuffers;
2719         gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->glCheckFramebufferStatus;
2720         gl_info->fbo_ops.glFramebufferTexture1D = gl_info->glFramebufferTexture1D;
2721         gl_info->fbo_ops.glFramebufferTexture2D = gl_info->glFramebufferTexture2D;
2722         gl_info->fbo_ops.glFramebufferTexture3D = gl_info->glFramebufferTexture3D;
2723         gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->glFramebufferRenderbuffer;
2724         gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv = gl_info->glGetFramebufferAttachmentParameteriv;
2725         gl_info->fbo_ops.glBlitFramebuffer = gl_info->glBlitFramebuffer;
2726         gl_info->fbo_ops.glGenerateMipmap = gl_info->glGenerateMipmap;
2727     }
2728     else
2729     {
2730         if (gl_info->supported[EXT_FRAMEBUFFER_OBJECT])
2731         {
2732             gl_info->fbo_ops.glIsRenderbuffer = gl_info->glIsRenderbufferEXT;
2733             gl_info->fbo_ops.glBindRenderbuffer = gl_info->glBindRenderbufferEXT;
2734             gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->glDeleteRenderbuffersEXT;
2735             gl_info->fbo_ops.glGenRenderbuffers = gl_info->glGenRenderbuffersEXT;
2736             gl_info->fbo_ops.glRenderbufferStorage = gl_info->glRenderbufferStorageEXT;
2737             gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->glGetRenderbufferParameterivEXT;
2738             gl_info->fbo_ops.glIsFramebuffer = gl_info->glIsFramebufferEXT;
2739             gl_info->fbo_ops.glBindFramebuffer = gl_info->glBindFramebufferEXT;
2740             gl_info->fbo_ops.glDeleteFramebuffers = gl_info->glDeleteFramebuffersEXT;
2741             gl_info->fbo_ops.glGenFramebuffers = gl_info->glGenFramebuffersEXT;
2742             gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->glCheckFramebufferStatusEXT;
2743             gl_info->fbo_ops.glFramebufferTexture1D = gl_info->glFramebufferTexture1DEXT;
2744             gl_info->fbo_ops.glFramebufferTexture2D = gl_info->glFramebufferTexture2DEXT;
2745             gl_info->fbo_ops.glFramebufferTexture3D = gl_info->glFramebufferTexture3DEXT;
2746             gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->glFramebufferRenderbufferEXT;
2747             gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv = gl_info->glGetFramebufferAttachmentParameterivEXT;
2748             gl_info->fbo_ops.glGenerateMipmap = gl_info->glGenerateMipmapEXT;
2749         }
2750         else if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
2751         {
2752             WARN_(d3d_caps)("Framebuffer objects not supported, falling back to backbuffer offscreen rendering mode.\n");
2753             wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
2754         }
2755         if (gl_info->supported[EXT_FRAMEBUFFER_BLIT])
2756         {
2757             gl_info->fbo_ops.glBlitFramebuffer = gl_info->glBlitFramebufferEXT;
2758         }
2759         if (gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE])
2760         {
2761             gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->glRenderbufferStorageMultisampleEXT;
2762         }
2763     }
2764
2765     /* MRTs are currently only supported when FBOs are used. */
2766     if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
2767     {
2768         gl_info->limits.buffers = 1;
2769     }
2770
2771     gl_vendor = wined3d_guess_gl_vendor(gl_info, gl_vendor_str, gl_renderer_str);
2772     card_vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str);
2773     TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x/0x%04x)\n", debugstr_a(gl_vendor_str), gl_vendor, card_vendor);
2774
2775     device = wined3d_guess_card(gl_info, gl_renderer_str, &gl_vendor, &card_vendor, &vidmem);
2776     TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", card_vendor, device);
2777
2778     /* If we have an estimate use it, else default to 64MB;  */
2779     if(vidmem)
2780         gl_info->vidmem = vidmem*1024*1024; /* convert from MBs to bytes */
2781     else
2782         gl_info->vidmem = WINE_DEFAULT_VIDMEM;
2783
2784     gl_info->wrap_lookup[WINED3DTADDRESS_WRAP - WINED3DTADDRESS_WRAP] = GL_REPEAT;
2785     gl_info->wrap_lookup[WINED3DTADDRESS_MIRROR - WINED3DTADDRESS_WRAP] =
2786             gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT] ? GL_MIRRORED_REPEAT_ARB : GL_REPEAT;
2787     gl_info->wrap_lookup[WINED3DTADDRESS_CLAMP - WINED3DTADDRESS_WRAP] = GL_CLAMP_TO_EDGE;
2788     gl_info->wrap_lookup[WINED3DTADDRESS_BORDER - WINED3DTADDRESS_WRAP] =
2789             gl_info->supported[ARB_TEXTURE_BORDER_CLAMP] ? GL_CLAMP_TO_BORDER_ARB : GL_REPEAT;
2790     gl_info->wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP] =
2791             gl_info->supported[ATI_TEXTURE_MIRROR_ONCE] ? GL_MIRROR_CLAMP_TO_EDGE_ATI : GL_REPEAT;
2792
2793     /* Make sure there's an active HDC else the WGL extensions will fail */
2794     hdc = pwglGetCurrentDC();
2795     if (hdc) {
2796         /* Not all GL drivers might offer WGL extensions e.g. VirtualBox */
2797         if(GL_EXTCALL(wglGetExtensionsStringARB))
2798             WGL_Extensions = GL_EXTCALL(wglGetExtensionsStringARB(hdc));
2799
2800         if (NULL == WGL_Extensions) {
2801             ERR("   WGL_Extensions returns NULL\n");
2802         } else {
2803             TRACE_(d3d_caps)("WGL_Extensions reported:\n");
2804             while (*WGL_Extensions != 0x00) {
2805                 const char *Start;
2806                 char ThisExtn[256];
2807
2808                 while (isspace(*WGL_Extensions)) WGL_Extensions++;
2809                 Start = WGL_Extensions;
2810                 while (!isspace(*WGL_Extensions) && *WGL_Extensions != 0x00) {
2811                     WGL_Extensions++;
2812                 }
2813
2814                 len = WGL_Extensions - Start;
2815                 if (len == 0 || len >= sizeof(ThisExtn))
2816                     continue;
2817
2818                 memcpy(ThisExtn, Start, len);
2819                 ThisExtn[len] = '\0';
2820                 TRACE_(d3d_caps)("- %s\n", debugstr_a(ThisExtn));
2821
2822                 if (!strcmp(ThisExtn, "WGL_ARB_pixel_format")) {
2823                     gl_info->supported[WGL_ARB_PIXEL_FORMAT] = TRUE;
2824                     TRACE_(d3d_caps)("FOUND: WGL_ARB_pixel_format support\n");
2825                 }
2826                 if (!strcmp(ThisExtn, "WGL_WINE_pixel_format_passthrough")) {
2827                     gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH] = TRUE;
2828                     TRACE_(d3d_caps)("FOUND: WGL_WINE_pixel_format_passthrough support\n");
2829                 }
2830             }
2831         }
2832     }
2833
2834     fixup_extensions(gl_info, gl_renderer_str, gl_vendor, card_vendor, device);
2835     init_driver_info(driver_info, card_vendor, device);
2836     add_gl_compat_wrappers(gl_info);
2837
2838     return TRUE;
2839 }
2840
2841 /**********************************************************
2842  * IWineD3D implementation follows
2843  **********************************************************/
2844
2845 static UINT     WINAPI IWineD3DImpl_GetAdapterCount (IWineD3D *iface) {
2846     IWineD3DImpl *This = (IWineD3DImpl *)iface;
2847
2848     TRACE_(d3d_caps)("(%p): Reporting %u adapters\n", This, This->adapter_count);
2849
2850     return This->adapter_count;
2851 }
2852
2853 static HRESULT WINAPI IWineD3DImpl_RegisterSoftwareDevice(IWineD3D *iface, void *init_function)
2854 {
2855     FIXME("iface %p, init_function %p stub!\n", iface, init_function);
2856
2857     return WINED3D_OK;
2858 }
2859
2860 static HMONITOR WINAPI IWineD3DImpl_GetAdapterMonitor(IWineD3D *iface, UINT Adapter) {
2861     IWineD3DImpl *This = (IWineD3DImpl *)iface;
2862
2863     TRACE_(d3d_caps)("(%p)->(%d)\n", This, Adapter);
2864
2865     if (Adapter >= IWineD3DImpl_GetAdapterCount(iface)) {
2866         return NULL;
2867     }
2868
2869     return MonitorFromPoint(This->adapters[Adapter].monitorPoint, MONITOR_DEFAULTTOPRIMARY);
2870 }
2871
2872 /* FIXME: GetAdapterModeCount and EnumAdapterModes currently only returns modes
2873      of the same bpp but different resolutions                                  */
2874
2875 /* Note: dx9 supplies a format. Calls from d3d8 supply WINED3DFMT_UNKNOWN */
2876 static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Adapter, enum wined3d_format_id format_id)
2877 {
2878     IWineD3DImpl *This = (IWineD3DImpl *)iface;
2879
2880     TRACE_(d3d_caps)("iface %p, adapter %u, format_id: %s.\n", iface, Adapter, debug_d3dformat(format_id));
2881
2882     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
2883         return 0;
2884     }
2885
2886     /* TODO: Store modes per adapter and read it from the adapter structure */
2887     if (Adapter == 0)
2888     {
2889         const struct wined3d_format *format = wined3d_get_format(&This->adapters[Adapter].gl_info, format_id);
2890         UINT format_bits = format->byte_count * CHAR_BIT;
2891         unsigned int i = 0;
2892         unsigned int j = 0;
2893         DEVMODEW mode;
2894
2895         memset(&mode, 0, sizeof(mode));
2896         mode.dmSize = sizeof(mode);
2897
2898         while (EnumDisplaySettingsExW(NULL, j, &mode, 0))
2899         {
2900             ++j;
2901
2902             if (format_id == WINED3DFMT_UNKNOWN)
2903             {
2904                 /* This is for D3D8, do not enumerate P8 here */
2905                 if (mode.dmBitsPerPel == 32 || mode.dmBitsPerPel == 16) ++i;
2906             }
2907             else if (mode.dmBitsPerPel == format_bits)
2908             {
2909                 ++i;
2910             }
2911         }
2912
2913         TRACE_(d3d_caps)("(%p}->(Adapter: %d) => %d (out of %d)\n", This, Adapter, i, j);
2914         return i;
2915     } else {
2916         FIXME_(d3d_caps)("Adapter not primary display\n");
2917     }
2918     return 0;
2919 }
2920
2921 /* Note: dx9 supplies a format. Calls from d3d8 supply WINED3DFMT_UNKNOWN */
2922 static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapter,
2923         enum wined3d_format_id format_id, UINT Mode, WINED3DDISPLAYMODE *pMode)
2924 {
2925     IWineD3DImpl *This = (IWineD3DImpl *)iface;
2926
2927     TRACE_(d3d_caps)("iface %p, adapter_idx %u, format %s, mode_idx %u, mode %p.\n",
2928             iface, Adapter, debug_d3dformat(format_id), Mode, pMode);
2929
2930     /* Validate the parameters as much as possible */
2931     if (!pMode || Adapter >= IWineD3DImpl_GetAdapterCount(iface)
2932             || Mode >= IWineD3DImpl_GetAdapterModeCount(iface, Adapter, format_id))
2933     {
2934         return WINED3DERR_INVALIDCALL;
2935     }
2936
2937     /* TODO: Store modes per adapter and read it from the adapter structure */
2938     if (Adapter == 0)
2939     {
2940         const struct wined3d_format *format = wined3d_get_format(&This->adapters[Adapter].gl_info, format_id);
2941         UINT format_bits = format->byte_count * CHAR_BIT;
2942         DEVMODEW DevModeW;
2943         int ModeIdx = 0;
2944         UINT i = 0;
2945         int j = 0;
2946
2947         ZeroMemory(&DevModeW, sizeof(DevModeW));
2948         DevModeW.dmSize = sizeof(DevModeW);
2949
2950         /* If we are filtering to a specific format (D3D9), then need to skip
2951            all unrelated modes, but if mode is irrelevant (D3D8), then we can
2952            just count through the ones with valid bit depths */
2953         while ((i<=Mode) && EnumDisplaySettingsExW(NULL, j++, &DevModeW, 0))
2954         {
2955             if (format_id == WINED3DFMT_UNKNOWN)
2956             {
2957                 /* This is for D3D8, do not enumerate P8 here */
2958                 if (DevModeW.dmBitsPerPel == 32 || DevModeW.dmBitsPerPel == 16) ++i;
2959             }
2960             else if (DevModeW.dmBitsPerPel == format_bits)
2961             {
2962                 ++i;
2963             }
2964         }
2965
2966         if (i == 0)
2967         {
2968             TRACE_(d3d_caps)("No modes found for format (%x - %s)\n", format_id, debug_d3dformat(format_id));
2969             return WINED3DERR_INVALIDCALL;
2970         }
2971         ModeIdx = j - 1;
2972
2973         /* Now get the display mode via the calculated index */
2974         if (EnumDisplaySettingsExW(NULL, ModeIdx, &DevModeW, 0)) {
2975             pMode->Width        = DevModeW.dmPelsWidth;
2976             pMode->Height       = DevModeW.dmPelsHeight;
2977             pMode->RefreshRate  = DEFAULT_REFRESH_RATE;
2978             if (DevModeW.dmFields & DM_DISPLAYFREQUENCY)
2979                 pMode->RefreshRate = DevModeW.dmDisplayFrequency;
2980
2981             if (format_id == WINED3DFMT_UNKNOWN)
2982                 pMode->Format = pixelformat_for_depth(DevModeW.dmBitsPerPel);
2983             else
2984                 pMode->Format = format_id;
2985         }
2986         else
2987         {
2988             TRACE_(d3d_caps)("Requested mode out of range %d\n", Mode);
2989             return WINED3DERR_INVALIDCALL;
2990         }
2991
2992         TRACE_(d3d_caps)("W %d H %d rr %d fmt (%x - %s) bpp %u\n", pMode->Width, pMode->Height,
2993                 pMode->RefreshRate, pMode->Format, debug_d3dformat(pMode->Format),
2994                 DevModeW.dmBitsPerPel);
2995
2996     }
2997     else
2998     {
2999         FIXME_(d3d_caps)("Adapter not primary display\n");
3000     }
3001
3002     return WINED3D_OK;
3003 }
3004
3005 static HRESULT WINAPI IWineD3DImpl_GetAdapterDisplayMode(IWineD3D *iface, UINT Adapter, WINED3DDISPLAYMODE *pMode)
3006 {
3007     TRACE("iface %p, adapter_idx %u, display_mode %p.\n", iface, Adapter, pMode);
3008
3009     if (NULL == pMode ||
3010         Adapter >= IWineD3D_GetAdapterCount(iface)) {
3011         return WINED3DERR_INVALIDCALL;
3012     }
3013
3014     if (Adapter == 0) { /* Display */
3015         int bpp = 0;
3016         DEVMODEW DevModeW;
3017
3018         ZeroMemory(&DevModeW, sizeof(DevModeW));
3019         DevModeW.dmSize = sizeof(DevModeW);
3020
3021         EnumDisplaySettingsExW(NULL, ENUM_CURRENT_SETTINGS, &DevModeW, 0);
3022         pMode->Width        = DevModeW.dmPelsWidth;
3023         pMode->Height       = DevModeW.dmPelsHeight;
3024         bpp                 = DevModeW.dmBitsPerPel;
3025         pMode->RefreshRate  = DEFAULT_REFRESH_RATE;
3026         if (DevModeW.dmFields&DM_DISPLAYFREQUENCY)
3027         {
3028             pMode->RefreshRate = DevModeW.dmDisplayFrequency;
3029         }
3030
3031         pMode->Format = pixelformat_for_depth(bpp);
3032     } else {
3033         FIXME_(d3d_caps)("Adapter not primary display\n");
3034     }
3035
3036     TRACE_(d3d_caps)("returning w:%d, h:%d, ref:%d, fmt:%s\n", pMode->Width,
3037           pMode->Height, pMode->RefreshRate, debug_d3dformat(pMode->Format));
3038     return WINED3D_OK;
3039 }
3040
3041 /* NOTE: due to structure differences between dx8 and dx9 D3DADAPTER_IDENTIFIER,
3042    and fields being inserted in the middle, a new structure is used in place    */
3043 static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Adapter, DWORD Flags,
3044                                                    WINED3DADAPTER_IDENTIFIER* pIdentifier) {
3045     IWineD3DImpl *This = (IWineD3DImpl *)iface;
3046     struct wined3d_adapter *adapter;
3047     size_t len;
3048
3049     TRACE_(d3d_caps)("(%p}->(Adapter: %d, Flags: %x, pId=%p)\n", This, Adapter, Flags, pIdentifier);
3050
3051     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
3052         return WINED3DERR_INVALIDCALL;
3053     }
3054
3055     adapter = &This->adapters[Adapter];
3056
3057     /* Return the information requested */
3058     TRACE_(d3d_caps)("device/Vendor Name and Version detection using FillGLCaps\n");
3059
3060     if (pIdentifier->driver_size)
3061     {
3062         const char *name = adapter->driver_info.name;
3063         len = min(strlen(name), pIdentifier->driver_size - 1);
3064         memcpy(pIdentifier->driver, name, len);
3065         pIdentifier->driver[len] = '\0';
3066     }
3067
3068     if (pIdentifier->description_size)
3069     {
3070         const char *description = adapter->driver_info.description;
3071         len = min(strlen(description), pIdentifier->description_size - 1);
3072         memcpy(pIdentifier->description, description, len);
3073         pIdentifier->description[len] = '\0';
3074     }
3075
3076     /* Note that d3d8 doesn't supply a device name. */
3077     if (pIdentifier->device_name_size)
3078     {
3079         static const char *device_name = "\\\\.\\DISPLAY1"; /* FIXME: May depend on desktop? */
3080
3081         len = strlen(device_name);
3082         if (len >= pIdentifier->device_name_size)
3083         {
3084             ERR("Device name size too small.\n");
3085             return WINED3DERR_INVALIDCALL;
3086         }
3087
3088         memcpy(pIdentifier->device_name, device_name, len);
3089         pIdentifier->device_name[len] = '\0';
3090     }
3091
3092     pIdentifier->driver_version.u.HighPart = adapter->driver_info.version_high;
3093     pIdentifier->driver_version.u.LowPart = adapter->driver_info.version_low;
3094     pIdentifier->vendor_id = adapter->driver_info.vendor;
3095     pIdentifier->device_id = adapter->driver_info.device;
3096     pIdentifier->subsystem_id = 0;
3097     pIdentifier->revision = 0;
3098     memcpy(&pIdentifier->device_identifier, &IID_D3DDEVICE_D3DUID, sizeof(pIdentifier->device_identifier));
3099     pIdentifier->whql_level = (Flags & WINED3DENUM_NO_WHQL_LEVEL) ? 0 : 1;
3100     memcpy(&pIdentifier->adapter_luid, &adapter->luid, sizeof(pIdentifier->adapter_luid));
3101     pIdentifier->video_memory = adapter->TextureRam;
3102
3103     return WINED3D_OK;
3104 }
3105
3106 static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined3d_gl_info *gl_info,
3107         const WineD3D_PixelFormat *cfg, const struct wined3d_format *format)
3108 {
3109     short redSize, greenSize, blueSize, alphaSize, colorBits;
3110
3111     if(!cfg)
3112         return FALSE;
3113
3114     /* Float formats need FBOs. If FBOs are used this function isn't called */
3115     if (format->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE;
3116
3117     if(cfg->iPixelType == WGL_TYPE_RGBA_ARB) { /* Integer RGBA formats */
3118         if (!getColorBits(format, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits))
3119         {
3120             ERR("Unable to check compatibility for format %s.\n", debug_d3dformat(format->id));
3121             return FALSE;
3122         }
3123
3124         if(cfg->redSize < redSize)
3125             return FALSE;
3126
3127         if(cfg->greenSize < greenSize)
3128             return FALSE;
3129
3130         if(cfg->blueSize < blueSize)
3131             return FALSE;
3132
3133         if(cfg->alphaSize < alphaSize)
3134             return FALSE;
3135
3136         return TRUE;
3137     }
3138
3139     /* Probably a RGBA_float or color index mode */
3140     return FALSE;
3141 }
3142
3143 static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3d_gl_info *gl_info,
3144         const WineD3D_PixelFormat *cfg, const struct wined3d_format *format)
3145 {
3146     short depthSize, stencilSize;
3147     BOOL lockable = FALSE;
3148
3149     if(!cfg)
3150         return FALSE;
3151
3152     if (!getDepthStencilBits(format, &depthSize, &stencilSize))
3153     {
3154         ERR("Unable to check compatibility for format %s.\n", debug_d3dformat(format->id));
3155         return FALSE;
3156     }
3157
3158     /* Float formats need FBOs. If FBOs are used this function isn't called */
3159     if (format->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE;
3160
3161     if ((format->id == WINED3DFMT_D16_LOCKABLE) || (format->id == WINED3DFMT_D32_FLOAT))
3162         lockable = TRUE;
3163
3164     /* On some modern cards like the Geforce8/9 GLX doesn't offer some dephthstencil formats which D3D9 reports.
3165      * We can safely report 'compatible' formats (e.g. D24 can be used for D16) as long as we aren't dealing with
3166      * a lockable format. This also helps D3D <= 7 as they expect D16 which isn't offered without this on Geforce8 cards. */
3167     if(!(cfg->depthSize == depthSize || (!lockable && cfg->depthSize > depthSize)))
3168         return FALSE;
3169
3170     /* Some cards like Intel i915 ones only offer D24S8 but lots of games also need a format without stencil, so
3171      * allow more stencil bits than requested. */
3172     if(cfg->stencilSize < stencilSize)
3173         return FALSE;
3174
3175     return TRUE;
3176 }
3177
3178 static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface,
3179         UINT Adapter, WINED3DDEVTYPE DeviceType, enum wined3d_format_id AdapterFormat,
3180         enum wined3d_format_id RenderTargetFormat, enum wined3d_format_id DepthStencilFormat)
3181 {
3182     IWineD3DImpl *This = (IWineD3DImpl *)iface;
3183     int nCfgs;
3184     const WineD3D_PixelFormat *cfgs;
3185     const struct wined3d_adapter *adapter;
3186     const struct wined3d_format *rt_format;
3187     const struct wined3d_format *ds_format;
3188     int it;
3189
3190     WARN_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%x,%s), AdptFmt:(%x,%s), RendrTgtFmt:(%x,%s), DepthStencilFmt:(%x,%s))\n",
3191            This, Adapter,
3192            DeviceType, debug_d3ddevicetype(DeviceType),
3193            AdapterFormat, debug_d3dformat(AdapterFormat),
3194            RenderTargetFormat, debug_d3dformat(RenderTargetFormat),
3195            DepthStencilFormat, debug_d3dformat(DepthStencilFormat));
3196
3197     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
3198         TRACE("(%p) Failed: Atapter (%u) higher than supported adapters (%u) returning WINED3DERR_INVALIDCALL\n", This, Adapter, IWineD3D_GetAdapterCount(iface));
3199         return WINED3DERR_INVALIDCALL;
3200     }
3201
3202     adapter = &This->adapters[Adapter];
3203     rt_format = wined3d_get_format(&adapter->gl_info, RenderTargetFormat);
3204     ds_format = wined3d_get_format(&adapter->gl_info, DepthStencilFormat);
3205     if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
3206     {
3207         if ((rt_format->Flags & WINED3DFMT_FLAG_RENDERTARGET)
3208                 && (ds_format->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)))
3209         {
3210             TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
3211             return WINED3D_OK;
3212         }
3213     }
3214     else
3215     {
3216         cfgs = adapter->cfgs;
3217         nCfgs = adapter->nCfgs;
3218         for (it = 0; it < nCfgs; ++it)
3219         {
3220             if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, &cfgs[it], rt_format))
3221             {
3222                 if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[it], ds_format))
3223                 {
3224                     TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
3225                     return WINED3D_OK;
3226                 }
3227             }
3228         }
3229     }
3230     WARN_(d3d_caps)("unsupported format pair: %s and %s\n", debug_d3dformat(RenderTargetFormat), debug_d3dformat(DepthStencilFormat));
3231
3232     return WINED3DERR_NOTAVAILABLE;
3233 }
3234
3235 static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, UINT Adapter,
3236         WINED3DDEVTYPE DeviceType, enum wined3d_format_id SurfaceFormat, BOOL Windowed,
3237         WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQualityLevels)
3238 {
3239     IWineD3DImpl *This = (IWineD3DImpl *)iface;
3240     const struct wined3d_adapter *adapter;
3241     const struct wined3d_format *format;
3242
3243     TRACE_(d3d_caps)("(%p)-> (Adptr:%d, DevType:(%x,%s), SurfFmt:(%x,%s), Win?%d, MultiSamp:%x, pQual:%p)\n",
3244           This,
3245           Adapter,
3246           DeviceType, debug_d3ddevicetype(DeviceType),
3247           SurfaceFormat, debug_d3dformat(SurfaceFormat),
3248           Windowed,
3249           MultiSampleType,
3250           pQualityLevels);
3251
3252     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
3253         return WINED3DERR_INVALIDCALL;
3254     }
3255
3256     /* TODO: handle Windowed, add more quality levels */
3257
3258     if (WINED3DMULTISAMPLE_NONE == MultiSampleType) {
3259         if(pQualityLevels) *pQualityLevels = 1;
3260         return WINED3D_OK;
3261     }
3262
3263     /* By default multisampling is disabled right now as it causes issues
3264      * on some Nvidia driver versions and it doesn't work well in combination
3265      * with FBOs yet. */
3266     if(!wined3d_settings.allow_multisampling)
3267         return WINED3DERR_NOTAVAILABLE;
3268
3269     adapter = &This->adapters[Adapter];
3270     format = wined3d_get_format(&adapter->gl_info, SurfaceFormat);
3271     if (!format) return WINED3DERR_INVALIDCALL;
3272
3273     if (format->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
3274     {
3275         int i, nCfgs;
3276         const WineD3D_PixelFormat *cfgs;
3277
3278         cfgs = adapter->cfgs;
3279         nCfgs = adapter->nCfgs;
3280         for(i=0; i<nCfgs; i++) {
3281             if(cfgs[i].numSamples != MultiSampleType)
3282                 continue;
3283
3284             if (!IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[i], format))
3285                 continue;
3286
3287             TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat));
3288
3289             if(pQualityLevels)
3290                 *pQualityLevels = 1; /* Guess at a value! */
3291             return WINED3D_OK;
3292         }
3293     }
3294     else if (format->Flags & WINED3DFMT_FLAG_RENDERTARGET)
3295     {
3296         short redSize, greenSize, blueSize, alphaSize, colorBits;
3297         int i, nCfgs;
3298         const WineD3D_PixelFormat *cfgs;
3299
3300         if (!getColorBits(format, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits))
3301         {
3302             ERR("Unable to color bits for format %#x, can't check multisampling capability!\n", SurfaceFormat);
3303             return WINED3DERR_NOTAVAILABLE;
3304         }
3305
3306         cfgs = adapter->cfgs;
3307         nCfgs = adapter->nCfgs;
3308         for(i=0; i<nCfgs; i++) {
3309             if(cfgs[i].numSamples != MultiSampleType)
3310                 continue;
3311             if(cfgs[i].redSize != redSize)
3312                 continue;
3313             if(cfgs[i].greenSize != greenSize)
3314                 continue;
3315             if(cfgs[i].blueSize != blueSize)
3316                 continue;
3317             /* Not all drivers report alpha-less formats since they use 32-bit anyway, so accept alpha even if we didn't ask for it. */
3318             if(alphaSize && cfgs[i].alphaSize != alphaSize)
3319                 continue;
3320             if (cfgs[i].colorSize != (format->byte_count << 3))
3321                 continue;
3322
3323             TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat));
3324
3325             if(pQualityLevels)
3326                 *pQualityLevels = 1; /* Guess at a value! */
3327             return WINED3D_OK;
3328         }
3329     }
3330     return WINED3DERR_NOTAVAILABLE;
3331 }
3332
3333 /* Check if we support bumpmapping for a format */
3334 static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format)
3335 {
3336     /* Ask the fixed function pipeline implementation if it can deal
3337      * with the conversion. If we've got a GL extension giving native
3338      * support this will be an identity conversion. */
3339     return (format->Flags & WINED3DFMT_FLAG_BUMPMAP)
3340             && adapter->fragment_pipe->color_fixup_supported(format->color_fixup);
3341 }
3342
3343 /* Check if the given DisplayFormat + DepthStencilFormat combination is valid for the Adapter */
3344 static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter,
3345         const struct wined3d_format *display_format, const struct wined3d_format *ds_format)
3346 {
3347     int it=0;
3348
3349     /* Only allow depth/stencil formats */
3350     if (!(ds_format->depth_size || ds_format->stencil_size)) return FALSE;
3351
3352     if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
3353     {
3354         /* With FBOs WGL limitations do not apply, but the format needs to be FBO attachable */
3355         if (ds_format->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) return TRUE;
3356     }
3357     else
3358     {
3359         /* Walk through all WGL pixel formats to find a match */
3360         for (it = 0; it < adapter->nCfgs; ++it)
3361         {
3362             WineD3D_PixelFormat *cfg = &adapter->cfgs[it];
3363             if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, cfg, display_format))
3364             {
3365                 if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, cfg, ds_format))
3366                 {
3367                     return TRUE;
3368                 }
3369             }
3370         }
3371     }
3372
3373     return FALSE;
3374 }
3375
3376 static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format)
3377 {
3378     /* The flags entry of a format contains the filtering capability */
3379     if (format->Flags & WINED3DFMT_FLAG_FILTERING) return TRUE;
3380
3381     return FALSE;
3382 }
3383
3384 /* Check the render target capabilities of a format */
3385 static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
3386         const struct wined3d_format *adapter_format, const struct wined3d_format *check_format)
3387 {
3388     /* Filter out non-RT formats */
3389     if (!(check_format->Flags & WINED3DFMT_FLAG_RENDERTARGET)) return FALSE;
3390     if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
3391     {
3392         WineD3D_PixelFormat *cfgs = adapter->cfgs;
3393         int it;
3394         short AdapterRed, AdapterGreen, AdapterBlue, AdapterAlpha, AdapterTotalSize;
3395         short CheckRed, CheckGreen, CheckBlue, CheckAlpha, CheckTotalSize;
3396
3397         getColorBits(adapter_format, &AdapterRed, &AdapterGreen, &AdapterBlue, &AdapterAlpha, &AdapterTotalSize);
3398         getColorBits(check_format, &CheckRed, &CheckGreen, &CheckBlue, &CheckAlpha, &CheckTotalSize);
3399
3400         /* In backbuffer mode the front and backbuffer share the same WGL pixelformat.
3401          * The format must match in RGB, alpha is allowed to be different. (Only the backbuffer can have alpha) */
3402         if(!((AdapterRed == CheckRed) && (AdapterGreen == CheckGreen) && (AdapterBlue == CheckBlue))) {
3403             TRACE_(d3d_caps)("[FAILED]\n");
3404             return FALSE;
3405         }
3406
3407         /* Check if there is a WGL pixel format matching the requirements, the format should also be window
3408          * drawable (not offscreen; e.g. Nvidia offers R5G6B5 for pbuffers even when X is running at 24bit) */
3409         for (it = 0; it < adapter->nCfgs; ++it)
3410         {
3411             if (cfgs[it].windowDrawable && IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info,
3412                     &cfgs[it], check_format))
3413             {
3414                 TRACE_(d3d_caps)("Pixel format %d is compatible with format %s.\n",
3415                         cfgs[it].iPixelFormat, debug_d3dformat(check_format->id));
3416                 return TRUE;
3417             }
3418         }
3419     }
3420     else if(wined3d_settings.offscreen_rendering_mode == ORM_FBO)
3421     {
3422         /* For now return TRUE for FBOs until we have some proper checks.
3423          * Note that this function will only be called when the format is around for texturing. */
3424         return TRUE;
3425     }
3426     return FALSE;
3427 }
3428
3429 static BOOL CheckSrgbReadCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format)
3430 {
3431     return adapter->gl_info.supported[EXT_TEXTURE_SRGB] && (format->Flags & WINED3DFMT_FLAG_SRGB_READ);
3432 }
3433
3434 static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format)
3435 {
3436     /* Only offer SRGB writing on X8R8G8B8/A8R8G8B8 when we use ARB or GLSL shaders as we are
3437      * doing the color fixup in shaders.
3438      * Note Windows drivers (at least on the Geforce 8800) also offer this on R5G6B5. */
3439     if (format->Flags & WINED3DFMT_FLAG_SRGB_WRITE)
3440     {
3441         int vs_selected_mode;
3442         int ps_selected_mode;
3443         select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
3444
3445         if((ps_selected_mode == SHADER_ARB) || (ps_selected_mode == SHADER_GLSL)) {
3446             TRACE_(d3d_caps)("[OK]\n");
3447             return TRUE;
3448         }
3449     }
3450
3451     TRACE_(d3d_caps)("[FAILED] - sRGB writes not supported by format %s.\n", debug_d3dformat(format->id));
3452     return FALSE;
3453 }
3454
3455 /* Check if a format support blending in combination with pixel shaders */
3456 static BOOL CheckPostPixelShaderBlendingCapability(struct wined3d_adapter *adapter,
3457         const struct wined3d_format *format)
3458 {
3459     /* The flags entry of a format contains the post pixel shader blending capability */
3460     if (format->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) return TRUE;
3461
3462     return FALSE;
3463 }
3464
3465 static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format)
3466 {
3467     /* OpenGL supports mipmapping on all formats basically. Wrapping is unsupported,
3468      * but we have to report mipmapping so we cannot reject this flag. Tests show that
3469      * windows reports WRAPANDMIP on unfilterable surfaces as well, apparently to show
3470      * that wrapping is supported. The lack of filtering will sort out the mipmapping
3471      * capability anyway.
3472      *
3473      * For now lets report this on all formats, but in the future we may want to
3474      * restrict it to some should games need that
3475      */
3476     return TRUE;
3477 }
3478
3479 /* Check if a texture format is supported on the given adapter */
3480 static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format)
3481 {
3482     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
3483
3484     switch (format->id)
3485     {
3486         /*****
3487          *  supported: RGB(A) formats
3488          */
3489         case WINED3DFMT_B8G8R8_UNORM: /* Enable for dx7, blacklisted for 8 and 9 above */
3490         case WINED3DFMT_B8G8R8A8_UNORM:
3491         case WINED3DFMT_B8G8R8X8_UNORM:
3492         case WINED3DFMT_B5G6R5_UNORM:
3493         case WINED3DFMT_B5G5R5X1_UNORM:
3494         case WINED3DFMT_B5G5R5A1_UNORM:
3495         case WINED3DFMT_B4G4R4A4_UNORM:
3496         case WINED3DFMT_A8_UNORM:
3497         case WINED3DFMT_B4G4R4X4_UNORM:
3498         case WINED3DFMT_R8G8B8A8_UNORM:
3499         case WINED3DFMT_R8G8B8X8_UNORM:
3500         case WINED3DFMT_B10G10R10A2_UNORM:
3501         case WINED3DFMT_R10G10B10A2_UNORM:
3502         case WINED3DFMT_R16G16_UNORM:
3503             TRACE_(d3d_caps)("[OK]\n");
3504             return TRUE;
3505
3506         case WINED3DFMT_B2G3R3_UNORM:
3507             TRACE_(d3d_caps)("[FAILED] - Not supported on Windows\n");
3508             return FALSE;
3509
3510         /*****
3511          *  Not supported: Palettized
3512          *  Only some Geforce/Voodoo3/G400 cards offer 8-bit textures in case of <=Direct3D7.
3513          *  Since it is not widely available, don't offer it. Further no Windows driver offers
3514          *  WINED3DFMT_P8_UINT_A8_NORM, so don't offer it either.
3515          */
3516         case WINED3DFMT_P8_UINT:
3517         case WINED3DFMT_P8_UINT_A8_UNORM:
3518             return FALSE;
3519
3520         /*****
3521          *  Supported: (Alpha)-Luminance
3522          */
3523         case WINED3DFMT_L8_UNORM:
3524         case WINED3DFMT_L8A8_UNORM:
3525         case WINED3DFMT_L16_UNORM:
3526             TRACE_(d3d_caps)("[OK]\n");
3527             return TRUE;
3528
3529         /* Not supported on Windows, thus disabled */
3530         case WINED3DFMT_L4A4_UNORM:
3531             TRACE_(d3d_caps)("[FAILED] - not supported on windows\n");
3532             return FALSE;
3533
3534         /*****
3535          *  Supported: Depth/Stencil formats
3536          */
3537         case WINED3DFMT_D16_LOCKABLE:
3538         case WINED3DFMT_D16_UNORM:
3539         case WINED3DFMT_S1_UINT_D15_UNORM:
3540         case WINED3DFMT_X8D24_UNORM:
3541         case WINED3DFMT_S4X4_UINT_D24_UNORM:
3542         case WINED3DFMT_D24_UNORM_S8_UINT:
3543         case WINED3DFMT_S8_UINT_D24_FLOAT:
3544         case WINED3DFMT_D32_UNORM:
3545         case WINED3DFMT_D32_FLOAT:
3546             return TRUE;
3547
3548         /*****
3549          *  Not supported everywhere(depends on GL_ATI_envmap_bumpmap or
3550          *  GL_NV_texture_shader). Emulated by shaders
3551          */
3552         case WINED3DFMT_R8G8_SNORM:
3553         case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
3554         case WINED3DFMT_R5G5_SNORM_L6_UNORM:
3555         case WINED3DFMT_R8G8B8A8_SNORM:
3556         case WINED3DFMT_R16G16_SNORM:
3557             /* Ask the shader backend if it can deal with the conversion. If
3558              * we've got a GL extension giving native support this will be an
3559              * identity conversion. */
3560             if (adapter->shader_backend->shader_color_fixup_supported(format->color_fixup))
3561             {
3562                 TRACE_(d3d_caps)("[OK]\n");
3563                 return TRUE;
3564             }
3565             TRACE_(d3d_caps)("[FAILED]\n");
3566             return FALSE;
3567
3568         case WINED3DFMT_DXT1:
3569         case WINED3DFMT_DXT2:
3570         case WINED3DFMT_DXT3:
3571         case WINED3DFMT_DXT4:
3572         case WINED3DFMT_DXT5:
3573             if (gl_info->supported[EXT_TEXTURE_COMPRESSION_S3TC])
3574             {
3575                 TRACE_(d3d_caps)("[OK]\n");
3576                 return TRUE;
3577             }
3578             TRACE_(d3d_caps)("[FAILED]\n");
3579             return FALSE;
3580
3581
3582         /*****
3583          *  Odd formats - not supported
3584          */
3585         case WINED3DFMT_VERTEXDATA:
3586         case WINED3DFMT_R16_UINT:
3587         case WINED3DFMT_R32_UINT:
3588         case WINED3DFMT_R16G16B16A16_SNORM:
3589         case WINED3DFMT_R10G10B10_SNORM_A2_UNORM:
3590         case WINED3DFMT_R10G11B11_SNORM:
3591             TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */
3592             return FALSE;
3593
3594         /*****
3595          *  WINED3DFMT_R8G8_SNORM_Cx: Not supported right now
3596          */
3597         case WINED3DFMT_R8G8_SNORM_Cx:
3598             TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */
3599             return FALSE;
3600
3601         /* YUV formats */
3602         case WINED3DFMT_UYVY:
3603         case WINED3DFMT_YUY2:
3604             if (gl_info->supported[APPLE_YCBCR_422])
3605             {
3606                 TRACE_(d3d_caps)("[OK]\n");
3607                 return TRUE;
3608             }
3609             TRACE_(d3d_caps)("[FAILED]\n");
3610             return FALSE;
3611         case WINED3DFMT_YV12:
3612             TRACE_(d3d_caps)("[FAILED]\n");
3613             return FALSE;
3614
3615             /* Not supported */
3616         case WINED3DFMT_R16G16B16A16_UNORM:
3617         case WINED3DFMT_B2G3R3A8_UNORM:
3618             TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */
3619             return FALSE;
3620
3621             /* Floating point formats */
3622         case WINED3DFMT_R16_FLOAT:
3623         case WINED3DFMT_R16G16_FLOAT:
3624         case WINED3DFMT_R16G16B16A16_FLOAT:
3625             if (gl_info->supported[ARB_TEXTURE_FLOAT] && gl_info->supported[ARB_HALF_FLOAT_PIXEL])
3626             {
3627                 TRACE_(d3d_caps)("[OK]\n");
3628                 return TRUE;
3629             }
3630             TRACE_(d3d_caps)("[FAILED]\n");
3631             return FALSE;
3632
3633         case WINED3DFMT_R32_FLOAT:
3634         case WINED3DFMT_R32G32_FLOAT:
3635         case WINED3DFMT_R32G32B32A32_FLOAT:
3636             if (gl_info->supported[ARB_TEXTURE_FLOAT])
3637             {
3638                 TRACE_(d3d_caps)("[OK]\n");
3639                 return TRUE;
3640             }
3641             TRACE_(d3d_caps)("[FAILED]\n");
3642             return FALSE;
3643
3644         /* ATI instancing hack: Although ATI cards do not support Shader Model 3.0, they support
3645          * instancing. To query if the card supports instancing CheckDeviceFormat with the special format
3646          * MAKEFOURCC('I','N','S','T') is used. Should a (broken) app check for this provide a proper return value.
3647          * We can do instancing with all shader versions, but we need vertex shaders.
3648          *
3649          * Additionally applications have to set the D3DRS_POINTSIZE render state to MAKEFOURCC('I','N','S','T') once
3650          * to enable instancing. WineD3D doesn't need that and just ignores it.
3651          *
3652          * With Shader Model 3.0 capable cards Instancing 'just works' in Windows.
3653          */
3654         case WINED3DFMT_INST:
3655             TRACE("ATI Instancing check hack\n");
3656             if (gl_info->supported[ARB_VERTEX_PROGRAM] || gl_info->supported[ARB_VERTEX_SHADER])
3657             {
3658                 TRACE_(d3d_caps)("[OK]\n");
3659                 return TRUE;
3660             }
3661             TRACE_(d3d_caps)("[FAILED]\n");
3662             return FALSE;
3663
3664         /* Some weird FOURCC formats */
3665         case WINED3DFMT_R8G8_B8G8:
3666         case WINED3DFMT_G8R8_G8B8:
3667         case WINED3DFMT_MULTI2_ARGB8:
3668             TRACE_(d3d_caps)("[FAILED]\n");
3669             return FALSE;
3670
3671         /* Vendor specific formats */
3672         case WINED3DFMT_ATI2N:
3673             if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC]
3674                     || gl_info->supported[ARB_TEXTURE_COMPRESSION_RGTC])
3675             {
3676                 if (adapter->shader_backend->shader_color_fixup_supported(format->color_fixup)
3677                         && adapter->fragment_pipe->color_fixup_supported(format->color_fixup))
3678                 {
3679                     TRACE_(d3d_caps)("[OK]\n");
3680                     return TRUE;
3681                 }
3682
3683                 TRACE_(d3d_caps)("[OK]\n");
3684                 return TRUE;
3685             }
3686             TRACE_(d3d_caps)("[FAILED]\n");
3687             return FALSE;
3688
3689         case WINED3DFMT_NVHU:
3690         case WINED3DFMT_NVHS:
3691             /* These formats seem to be similar to the HILO formats in GL_NV_texture_shader. NVHU
3692              * is said to be GL_UNSIGNED_HILO16, NVHS GL_SIGNED_HILO16. Rumours say that d3d computes
3693              * a 3rd channel similarly to D3DFMT_CxV8U8(So NVHS could be called D3DFMT_CxV16U16).
3694              * ATI refused to support formats which can easilly be emulated with pixel shaders, so
3695              * Applications have to deal with not having NVHS and NVHU.
3696              */
3697             TRACE_(d3d_caps)("[FAILED]\n");
3698             return FALSE;
3699
3700         case WINED3DFMT_UNKNOWN:
3701             return FALSE;
3702
3703         default:
3704             ERR("Unhandled format %s.\n", debug_d3dformat(format->id));
3705             break;
3706     }
3707     return FALSE;
3708 }
3709
3710 static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter,
3711         const struct wined3d_format *adapter_format,
3712         const struct wined3d_format *check_format,
3713         WINED3DSURFTYPE SurfaceType)
3714 {
3715     if (SurfaceType == SURFACE_GDI)
3716     {
3717         switch (check_format->id)
3718         {
3719             case WINED3DFMT_B8G8R8_UNORM:
3720             case WINED3DFMT_B8G8R8A8_UNORM:
3721             case WINED3DFMT_B8G8R8X8_UNORM:
3722             case WINED3DFMT_B5G6R5_UNORM:
3723             case WINED3DFMT_B5G5R5X1_UNORM:
3724             case WINED3DFMT_B5G5R5A1_UNORM:
3725             case WINED3DFMT_B4G4R4A4_UNORM:
3726             case WINED3DFMT_B2G3R3_UNORM:
3727             case WINED3DFMT_A8_UNORM:
3728             case WINED3DFMT_B2G3R3A8_UNORM:
3729             case WINED3DFMT_B4G4R4X4_UNORM:
3730             case WINED3DFMT_R10G10B10A2_UNORM:
3731             case WINED3DFMT_R8G8B8A8_UNORM:
3732             case WINED3DFMT_R8G8B8X8_UNORM:
3733             case WINED3DFMT_R16G16_UNORM:
3734             case WINED3DFMT_B10G10R10A2_UNORM:
3735             case WINED3DFMT_R16G16B16A16_UNORM:
3736             case WINED3DFMT_P8_UINT:
3737                 TRACE_(d3d_caps)("[OK]\n");
3738                 return TRUE;
3739             default:
3740                 TRACE_(d3d_caps)("[FAILED] - not available on GDI surfaces\n");
3741                 return FALSE;
3742         }
3743     }
3744
3745     /* All format that are supported for textures are supported for surfaces as well */
3746     if (CheckTextureCapability(adapter, check_format)) return TRUE;
3747     /* All depth stencil formats are supported on surfaces */
3748     if (CheckDepthStencilCapability(adapter, adapter_format, check_format)) return TRUE;
3749
3750     /* If opengl can't process the format natively, the blitter may be able to convert it */
3751     if (adapter->blitter->blit_supported(&adapter->gl_info, BLIT_OP_BLIT,
3752             NULL, WINED3DPOOL_DEFAULT, 0, check_format,
3753             NULL, WINED3DPOOL_DEFAULT, 0, adapter_format))
3754     {
3755         TRACE_(d3d_caps)("[OK]\n");
3756         return TRUE;
3757     }
3758
3759     /* Reject other formats */
3760     TRACE_(d3d_caps)("[FAILED]\n");
3761     return FALSE;
3762 }
3763
3764 static BOOL CheckVertexTextureCapability(struct wined3d_adapter *adapter,
3765         const struct wined3d_format *format)
3766 {
3767     return adapter->gl_info.limits.vertex_samplers && (format->Flags & WINED3DFMT_FLAG_VTF);
3768 }
3769
3770 static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
3771         enum wined3d_format_id AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType,
3772         enum wined3d_format_id CheckFormat, WINED3DSURFTYPE SurfaceType)
3773 {
3774     IWineD3DImpl *This = (IWineD3DImpl *)iface;
3775     struct wined3d_adapter *adapter = &This->adapters[Adapter];
3776     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
3777     const struct wined3d_format *format = wined3d_get_format(gl_info, CheckFormat);
3778     const struct wined3d_format *adapter_format = wined3d_get_format(gl_info, AdapterFormat);
3779     DWORD UsageCaps = 0;
3780
3781     TRACE_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%u,%s), AdptFmt:(%u,%s), Use:(%u,%s,%s), ResTyp:(%x,%s), CheckFmt:(%u,%s))\n",
3782           This,
3783           Adapter,
3784           DeviceType, debug_d3ddevicetype(DeviceType),
3785           AdapterFormat, debug_d3dformat(AdapterFormat),
3786           Usage, debug_d3dusage(Usage), debug_d3dusagequery(Usage),
3787           RType, debug_d3dresourcetype(RType),
3788           CheckFormat, debug_d3dformat(CheckFormat));
3789
3790     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
3791         return WINED3DERR_INVALIDCALL;
3792     }
3793
3794     switch (RType)
3795     {
3796         case WINED3DRTYPE_CUBETEXTURE:
3797             /* Cubetexture allows:
3798              *      - WINED3DUSAGE_AUTOGENMIPMAP
3799              *      - WINED3DUSAGE_DEPTHSTENCIL
3800              *      - WINED3DUSAGE_DYNAMIC
3801              *      - WINED3DUSAGE_NONSECURE (d3d9ex)
3802              *      - WINED3DUSAGE_RENDERTARGET
3803              *      - WINED3DUSAGE_SOFTWAREPROCESSING
3804              *      - WINED3DUSAGE_QUERY_WRAPANDMIP
3805              */
3806             if (SurfaceType != SURFACE_OPENGL)
3807             {
3808                 TRACE_(d3d_caps)("[FAILED]\n");
3809                 return WINED3DERR_NOTAVAILABLE;
3810             }
3811
3812             if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP])
3813             {
3814                 TRACE_(d3d_caps)("[FAILED] - No cube texture support\n");
3815                 return WINED3DERR_NOTAVAILABLE;
3816             }
3817
3818             if (!CheckTextureCapability(adapter, format))
3819             {
3820                 TRACE_(d3d_caps)("[FAILED] - Cube texture format not supported\n");
3821                 return WINED3DERR_NOTAVAILABLE;
3822             }
3823
3824             if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
3825             {
3826                 if (!gl_info->supported[SGIS_GENERATE_MIPMAP])
3827                     /* When autogenmipmap isn't around continue and return
3828                      * WINED3DOK_NOAUTOGEN instead of D3D_OK. */
3829                     TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
3830                 else
3831                     UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
3832             }
3833
3834             /* Always report dynamic locking. */
3835             if (Usage & WINED3DUSAGE_DYNAMIC)
3836                 UsageCaps |= WINED3DUSAGE_DYNAMIC;
3837
3838             if (Usage & WINED3DUSAGE_RENDERTARGET)
3839             {
3840                 if (!CheckRenderTargetCapability(adapter, adapter_format, format))
3841                 {
3842                     TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
3843                     return WINED3DERR_NOTAVAILABLE;
3844                 }
3845                 UsageCaps |= WINED3DUSAGE_RENDERTARGET;
3846             }
3847
3848             /* Always report software processing. */
3849             if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
3850                 UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
3851
3852             if (Usage & WINED3DUSAGE_QUERY_FILTER)
3853             {
3854                 if (!CheckFilterCapability(adapter, format))
3855                 {
3856                     TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
3857                     return WINED3DERR_NOTAVAILABLE;
3858                 }
3859                 UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
3860             }
3861
3862             if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
3863             {
3864                 if (!CheckPostPixelShaderBlendingCapability(adapter, format))
3865                 {
3866                     TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
3867                     return WINED3DERR_NOTAVAILABLE;
3868                 }
3869                 UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
3870             }
3871
3872             if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
3873             {
3874                 if (!CheckSrgbReadCapability(adapter, format))
3875                 {
3876                     TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
3877                     return WINED3DERR_NOTAVAILABLE;
3878                 }
3879                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
3880             }
3881
3882             if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
3883             {
3884                 if (!CheckSrgbWriteCapability(adapter, format))
3885                 {
3886                     TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
3887                     return WINED3DERR_NOTAVAILABLE;
3888                 }
3889                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
3890             }
3891
3892             if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
3893             {
3894                 if (!CheckVertexTextureCapability(adapter, format))
3895                 {
3896                     TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
3897                     return WINED3DERR_NOTAVAILABLE;
3898                 }
3899                 UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
3900             }
3901
3902             if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
3903             {
3904                 if (!CheckWrapAndMipCapability(adapter, format))
3905                 {
3906                     TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
3907                     return WINED3DERR_NOTAVAILABLE;
3908                 }
3909                 UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
3910             }
3911             break;
3912
3913         case WINED3DRTYPE_SURFACE:
3914             /* Surface allows:
3915              *      - WINED3DUSAGE_DEPTHSTENCIL
3916              *      - WINED3DUSAGE_NONSECURE (d3d9ex)
3917              *      - WINED3DUSAGE_RENDERTARGET
3918              */
3919             if (!CheckSurfaceCapability(adapter, adapter_format, format, SurfaceType))
3920             {
3921                 TRACE_(d3d_caps)("[FAILED] - Not supported for plain surfaces\n");
3922                 return WINED3DERR_NOTAVAILABLE;
3923             }
3924
3925             if (Usage & WINED3DUSAGE_DEPTHSTENCIL)
3926             {
3927                 if (!CheckDepthStencilCapability(adapter, adapter_format, format))
3928                 {
3929                     TRACE_(d3d_caps)("[FAILED] - No depthstencil support\n");
3930                     return WINED3DERR_NOTAVAILABLE;
3931                 }
3932                 UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
3933             }
3934
3935             if (Usage & WINED3DUSAGE_RENDERTARGET)
3936             {
3937                 if (!CheckRenderTargetCapability(adapter, adapter_format, format))
3938                 {
3939                     TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
3940                     return WINED3DERR_NOTAVAILABLE;
3941                 }
3942                 UsageCaps |= WINED3DUSAGE_RENDERTARGET;
3943             }
3944
3945             if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
3946             {
3947                 if (!CheckPostPixelShaderBlendingCapability(adapter, format))
3948                 {
3949                     TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
3950                     return WINED3DERR_NOTAVAILABLE;
3951                 }
3952                 UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
3953             }
3954             break;
3955
3956         case WINED3DRTYPE_TEXTURE:
3957             /* Texture allows:
3958              *      - WINED3DUSAGE_AUTOGENMIPMAP
3959              *      - WINED3DUSAGE_DEPTHSTENCIL
3960              *      - WINED3DUSAGE_DMAP
3961              *      - WINED3DUSAGE_DYNAMIC
3962              *      - WINED3DUSAGE_NONSECURE (d3d9ex)
3963              *      - WINED3DUSAGE_RENDERTARGET
3964              *      - WINED3DUSAGE_SOFTWAREPROCESSING
3965              *      - WINED3DUSAGE_TEXTAPI (d3d9ex)
3966              *      - WINED3DUSAGE_QUERY_WRAPANDMIP
3967              */
3968             if (SurfaceType != SURFACE_OPENGL)
3969             {
3970                 TRACE_(d3d_caps)("[FAILED]\n");
3971                 return WINED3DERR_NOTAVAILABLE;
3972             }
3973
3974             if (!CheckTextureCapability(adapter, format))
3975             {
3976                 TRACE_(d3d_caps)("[FAILED] - Texture format not supported\n");
3977                 return WINED3DERR_NOTAVAILABLE;
3978             }
3979
3980             if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
3981             {
3982                 if (!gl_info->supported[SGIS_GENERATE_MIPMAP])
3983                     /* When autogenmipmap isn't around continue and return
3984                      * WINED3DOK_NOAUTOGEN instead of D3D_OK. */
3985                     TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
3986                 else
3987                     UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
3988             }
3989
3990             /* Always report dynamic locking. */
3991             if (Usage & WINED3DUSAGE_DYNAMIC)
3992                 UsageCaps |= WINED3DUSAGE_DYNAMIC;
3993
3994             if (Usage & WINED3DUSAGE_RENDERTARGET)
3995             {
3996                 if (!CheckRenderTargetCapability(adapter, adapter_format, format))
3997                 {
3998                     TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
3999                     return WINED3DERR_NOTAVAILABLE;
4000                 }
4001                 UsageCaps |= WINED3DUSAGE_RENDERTARGET;
4002             }
4003
4004             /* Always report software processing. */
4005             if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
4006                 UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
4007
4008             if (Usage & WINED3DUSAGE_QUERY_FILTER)
4009             {
4010                 if (!CheckFilterCapability(adapter, format))
4011                 {
4012                     TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
4013                     return WINED3DERR_NOTAVAILABLE;
4014                 }
4015                 UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
4016             }
4017
4018             if (Usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP)
4019             {
4020                 if (!CheckBumpMapCapability(adapter, format))
4021                 {
4022                     TRACE_(d3d_caps)("[FAILED] - No legacy bumpmap support\n");
4023                     return WINED3DERR_NOTAVAILABLE;
4024                 }
4025                 UsageCaps |= WINED3DUSAGE_QUERY_LEGACYBUMPMAP;
4026             }
4027
4028             if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
4029             {
4030                 if (!CheckPostPixelShaderBlendingCapability(adapter, format))
4031                 {
4032                     TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
4033                     return WINED3DERR_NOTAVAILABLE;
4034                 }
4035                 UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
4036             }
4037
4038             if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
4039             {
4040                 if (!CheckSrgbReadCapability(adapter, format))
4041                 {
4042                     TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
4043                     return WINED3DERR_NOTAVAILABLE;
4044                 }
4045                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
4046             }
4047
4048             if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
4049             {
4050                 if (!CheckSrgbWriteCapability(adapter, format))
4051                 {
4052                     TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
4053                     return WINED3DERR_NOTAVAILABLE;
4054                 }
4055                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
4056             }
4057
4058             if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
4059             {
4060                 if (!CheckVertexTextureCapability(adapter, format))
4061                 {
4062                     TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
4063                     return WINED3DERR_NOTAVAILABLE;
4064                 }
4065                 UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
4066             }
4067
4068             if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
4069             {
4070                 if (!CheckWrapAndMipCapability(adapter, format))
4071                 {
4072                     TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
4073                     return WINED3DERR_NOTAVAILABLE;
4074                 }
4075                 UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
4076             }
4077
4078             if (Usage & WINED3DUSAGE_DEPTHSTENCIL)
4079             {
4080                 if (!CheckDepthStencilCapability(adapter, adapter_format, format))
4081                 {
4082                     TRACE_(d3d_caps)("[FAILED] - No depth stencil support\n");
4083                     return WINED3DERR_NOTAVAILABLE;
4084                 }
4085                 if ((format->Flags & WINED3DFMT_FLAG_SHADOW) && !gl_info->supported[ARB_SHADOW])
4086                 {
4087                     TRACE_(d3d_caps)("[FAILED] - No shadow sampler support.\n");
4088                     return WINED3DERR_NOTAVAILABLE;
4089                 }
4090                 UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
4091             }
4092             break;
4093
4094         case WINED3DRTYPE_VOLUMETEXTURE:
4095         case WINED3DRTYPE_VOLUME:
4096             /* Volume is to VolumeTexture what Surface is to Texture, but its
4097              * usage caps are not documented. Most driver seem to offer
4098              * (nearly) the same on Volume and VolumeTexture, so do that too.
4099              *
4100              * Volumetexture allows:
4101              *      - D3DUSAGE_DYNAMIC
4102              *      - D3DUSAGE_NONSECURE (d3d9ex)
4103              *      - D3DUSAGE_SOFTWAREPROCESSING
4104              *      - D3DUSAGE_QUERY_WRAPANDMIP
4105              */
4106             if (SurfaceType != SURFACE_OPENGL)
4107             {
4108                 TRACE_(d3d_caps)("[FAILED]\n");
4109                 return WINED3DERR_NOTAVAILABLE;
4110             }
4111
4112             if (!gl_info->supported[EXT_TEXTURE3D])
4113             {
4114                 TRACE_(d3d_caps)("[FAILED] - No volume texture support\n");
4115                 return WINED3DERR_NOTAVAILABLE;
4116             }
4117
4118             if (!CheckTextureCapability(adapter, format))
4119             {
4120                 TRACE_(d3d_caps)("[FAILED] - Format not supported\n");
4121                 return WINED3DERR_NOTAVAILABLE;
4122             }
4123
4124             /* Filter formats that need conversion; For one part, this
4125              * conversion is unimplemented, and volume textures are huge, so
4126              * it would be a big performance hit. Unless we hit an application
4127              * needing one of those formats, don't advertize them to avoid
4128              * leading applications into temptation. The windows drivers don't
4129              * support most of those formats on volumes anyway, except for
4130              * WINED3DFMT_R32_FLOAT. */
4131             switch (CheckFormat)
4132             {
4133                 case WINED3DFMT_P8_UINT:
4134                 case WINED3DFMT_L4A4_UNORM:
4135                 case WINED3DFMT_R32_FLOAT:
4136                 case WINED3DFMT_R16_FLOAT:
4137                 case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
4138                 case WINED3DFMT_R5G5_SNORM_L6_UNORM:
4139                 case WINED3DFMT_R16G16_UNORM:
4140                     TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
4141                     return WINED3DERR_NOTAVAILABLE;
4142
4143                 case WINED3DFMT_R8G8B8A8_SNORM:
4144                 case WINED3DFMT_R16G16_SNORM:
4145                     if (!gl_info->supported[NV_TEXTURE_SHADER])
4146                     {
4147                         TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
4148                         return WINED3DERR_NOTAVAILABLE;
4149                     }
4150                     break;
4151
4152                 case WINED3DFMT_R8G8_SNORM:
4153                     if (!gl_info->supported[NV_TEXTURE_SHADER])
4154                     {
4155                         TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
4156                         return WINED3DERR_NOTAVAILABLE;
4157                     }
4158                     break;
4159
4160                 case WINED3DFMT_DXT1:
4161                 case WINED3DFMT_DXT2:
4162                 case WINED3DFMT_DXT3:
4163                 case WINED3DFMT_DXT4:
4164                 case WINED3DFMT_DXT5:
4165                     /* The GL_EXT_texture_compression_s3tc spec requires that
4166                      * loading an s3tc compressed texture results in an error.
4167                      * While the D3D refrast does support s3tc volumes, at
4168                      * least the nvidia windows driver does not, so we're free
4169                      * not to support this format. */
4170                     TRACE_(d3d_caps)("[FAILED] - DXTn does not support 3D textures\n");
4171                     return WINED3DERR_NOTAVAILABLE;
4172
4173                 default:
4174                     /* Do nothing, continue with checking the format below */
4175                     break;
4176             }
4177
4178             /* Always report dynamic locking. */
4179             if (Usage & WINED3DUSAGE_DYNAMIC)
4180                 UsageCaps |= WINED3DUSAGE_DYNAMIC;
4181
4182             /* Always report software processing. */
4183             if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
4184                 UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
4185
4186             if (Usage & WINED3DUSAGE_QUERY_FILTER)
4187             {
4188                 if (!CheckFilterCapability(adapter, format))
4189                 {
4190                     TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
4191                     return WINED3DERR_NOTAVAILABLE;
4192                 }
4193                 UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
4194             }
4195
4196             if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
4197             {
4198                 if (!CheckPostPixelShaderBlendingCapability(adapter, format))
4199                 {
4200                     TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
4201                     return WINED3DERR_NOTAVAILABLE;
4202                 }
4203                 UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
4204             }
4205
4206             if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
4207             {
4208                 if (!CheckSrgbReadCapability(adapter, format))
4209                 {
4210                     TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
4211                     return WINED3DERR_NOTAVAILABLE;
4212                 }
4213                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
4214             }
4215
4216             if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
4217             {
4218                 if (!CheckSrgbWriteCapability(adapter, format))
4219                 {
4220                     TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
4221                     return WINED3DERR_NOTAVAILABLE;
4222                 }
4223                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
4224             }
4225
4226             if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
4227             {
4228                 if (!CheckVertexTextureCapability(adapter, format))
4229                 {
4230                     TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
4231                     return WINED3DERR_NOTAVAILABLE;
4232                 }
4233                 UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
4234             }
4235
4236             if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
4237             {
4238                 if (!CheckWrapAndMipCapability(adapter, format))
4239                 {
4240                     TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
4241                     return WINED3DERR_NOTAVAILABLE;
4242                 }
4243                 UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
4244             }
4245             break;
4246
4247         default:
4248             FIXME_(d3d_caps)("Unhandled resource type %s.\n", debug_d3dresourcetype(RType));
4249             return WINED3DERR_NOTAVAILABLE;
4250     }
4251
4252     /* When the UsageCaps exactly matches Usage return WINED3D_OK except for
4253      * the situation in which WINED3DUSAGE_AUTOGENMIPMAP isn't around, then
4254      * WINED3DOK_NOAUTOGEN is returned if all the other usage flags match. */
4255     if (UsageCaps == Usage)
4256         return WINED3D_OK;
4257     if (UsageCaps == (Usage & ~WINED3DUSAGE_AUTOGENMIPMAP))
4258         return WINED3DOK_NOAUTOGEN;
4259
4260     TRACE_(d3d_caps)("[FAILED] - Usage %#x requested for CheckFormat %s and RType %s but only %#x is available\n",
4261             Usage, debug_d3dformat(CheckFormat), debug_d3dresourcetype(RType), UsageCaps);
4262
4263     return WINED3DERR_NOTAVAILABLE;
4264 }
4265
4266 static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormatConversion(IWineD3D *iface, UINT adapter_idx,
4267         WINED3DDEVTYPE device_type, enum wined3d_format_id src_format, enum wined3d_format_id dst_format)
4268 {
4269     FIXME("iface %p, adapter_idx %u, device_type %s, src_format %s, dst_format %s stub!\n",
4270             iface, adapter_idx, debug_d3ddevicetype(device_type), debug_d3dformat(src_format),
4271             debug_d3dformat(dst_format));
4272
4273     return WINED3D_OK;
4274 }
4275
4276 static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT adapter_idx, WINED3DDEVTYPE device_type,
4277         enum wined3d_format_id display_format, enum wined3d_format_id backbuffer_format, BOOL windowed)
4278 {
4279     UINT mode_count;
4280     HRESULT hr;
4281
4282     TRACE("iface %p, adapter_idx %u, device_type %s, display_format %s, backbuffer_format %s, windowed %#x.\n",
4283             iface, adapter_idx, debug_d3ddevicetype(device_type), debug_d3dformat(display_format),
4284             debug_d3dformat(backbuffer_format), windowed);
4285
4286     if (adapter_idx >= IWineD3D_GetAdapterCount(iface))
4287     {
4288         WARN_(d3d_caps)("adapter_idx >= IWineD3D_GetAdapterCount(iface), returning WINED3DERR_INVALIDCALL\n");
4289         return WINED3DERR_INVALIDCALL;
4290     }
4291
4292     /* The task of this function is to check whether a certain display / backbuffer format
4293      * combination is available on the given adapter. In fullscreen mode microsoft specified
4294      * that the display format shouldn't provide alpha and that ignoring alpha the backbuffer
4295      * and display format should match exactly.
4296      * In windowed mode format conversion can occur and this depends on the driver. When format
4297      * conversion is done, this function should nevertheless fail and applications need to use
4298      * CheckDeviceFormatConversion.
4299      * At the moment we assume that fullscreen and windowed have the same capabilities. */
4300
4301     /* There are only 4 display formats. */
4302     if (!(display_format == WINED3DFMT_B5G6R5_UNORM
4303             || display_format == WINED3DFMT_B5G5R5X1_UNORM
4304             || display_format == WINED3DFMT_B8G8R8X8_UNORM
4305             || display_format == WINED3DFMT_B10G10R10A2_UNORM))
4306     {
4307         TRACE_(d3d_caps)("Format %s is not supported as display format.\n", debug_d3dformat(display_format));
4308         return WINED3DERR_NOTAVAILABLE;
4309     }
4310
4311     /* If the requested display format is not available, don't continue. */
4312     mode_count = IWineD3DImpl_GetAdapterModeCount(iface, adapter_idx, display_format);
4313     if (!mode_count)
4314     {
4315         TRACE_(d3d_caps)("No available modes for display format %s.\n", debug_d3dformat(display_format));
4316         return WINED3DERR_NOTAVAILABLE;
4317     }
4318
4319     /* Windowed mode allows you to specify WINED3DFMT_UNKNOWN for the backbuffer format,
4320      * it means 'reuse' the display format for the backbuffer. */
4321     if (!windowed && backbuffer_format == WINED3DFMT_UNKNOWN)
4322     {
4323         TRACE_(d3d_caps)("backbuffer_format WINED3FMT_UNKNOWN only available in windowed mode.\n");
4324         return WINED3DERR_NOTAVAILABLE;
4325     }
4326
4327     /* In FULLSCREEN mode WINED3DFMT_B5G6R5_UNORM can only be mixed with
4328      * backbuffer format WINED3DFMT_B5G6R5_UNORM. */
4329     if (display_format == WINED3DFMT_B5G6R5_UNORM && backbuffer_format != WINED3DFMT_B5G6R5_UNORM)
4330     {
4331         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n",
4332                 debug_d3dformat(display_format), debug_d3dformat(backbuffer_format));
4333         return WINED3DERR_NOTAVAILABLE;
4334     }
4335
4336     /* In FULLSCREEN mode WINED3DFMT_B5G5R5X1_UNORM can only be mixed with
4337      * backbuffer formats WINED3DFMT_B5G5R5X1_UNORM and
4338      * WINED3DFMT_B5G5R5A1_UNORM. */
4339     if (display_format == WINED3DFMT_B5G5R5X1_UNORM
4340             && !(backbuffer_format == WINED3DFMT_B5G5R5X1_UNORM || backbuffer_format == WINED3DFMT_B5G5R5A1_UNORM))
4341     {
4342         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n",
4343                 debug_d3dformat(display_format), debug_d3dformat(backbuffer_format));
4344         return WINED3DERR_NOTAVAILABLE;
4345     }
4346
4347     /* In FULLSCREEN mode WINED3DFMT_B8G8R8X8_UNORM can only be mixed with
4348      * backbuffer formats WINED3DFMT_B8G8R8X8_UNORM and
4349      * WINED3DFMT_B8G8R8A8_UNORM. */
4350     if (display_format == WINED3DFMT_B8G8R8X8_UNORM
4351             && !(backbuffer_format == WINED3DFMT_B8G8R8X8_UNORM || backbuffer_format == WINED3DFMT_B8G8R8A8_UNORM))
4352     {
4353         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n",
4354                 debug_d3dformat(display_format), debug_d3dformat(backbuffer_format));
4355         return WINED3DERR_NOTAVAILABLE;
4356     }
4357
4358     /* WINED3DFMT_B10G10R10A2_UNORM is only allowed in fullscreen mode and it
4359      * can only be mixed with backbuffer format WINED3DFMT_B10G10R10A2_UNORM. */
4360     if (display_format == WINED3DFMT_B10G10R10A2_UNORM
4361             && (backbuffer_format != WINED3DFMT_B10G10R10A2_UNORM || windowed))
4362     {
4363         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n",
4364                 debug_d3dformat(display_format), debug_d3dformat(backbuffer_format));
4365         return WINED3DERR_NOTAVAILABLE;
4366     }
4367
4368     /* Use CheckDeviceFormat to see if the backbuffer_format is usable with the given display_format */
4369     hr = IWineD3DImpl_CheckDeviceFormat(iface, adapter_idx, device_type, display_format,
4370             WINED3DUSAGE_RENDERTARGET, WINED3DRTYPE_SURFACE, backbuffer_format, SURFACE_OPENGL);
4371     if (FAILED(hr))
4372         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n",
4373                 debug_d3dformat(display_format), debug_d3dformat(backbuffer_format));
4374
4375     return hr;
4376 }
4377
4378 /* Note: d3d8 passes in a pointer to a D3DCAPS8 structure, which is a true
4379       subset of a D3DCAPS9 structure. However, it has to come via a void *
4380       as the d3d8 interface cannot import the d3d9 header                  */
4381 static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DCAPS* pCaps) {
4382
4383     IWineD3DImpl    *This = (IWineD3DImpl *)iface;
4384     struct wined3d_adapter *adapter = &This->adapters[Adapter];
4385     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
4386     int vs_selected_mode;
4387     int ps_selected_mode;
4388     struct shader_caps shader_caps;
4389     struct fragment_caps fragment_caps;
4390     DWORD ckey_caps, blit_caps, fx_caps, pal_caps;
4391
4392     TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
4393
4394     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
4395         return WINED3DERR_INVALIDCALL;
4396     }
4397
4398     select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
4399
4400     /* ------------------------------------------------
4401        The following fields apply to both d3d8 and d3d9
4402        ------------------------------------------------ */
4403     pCaps->DeviceType              = (DeviceType == WINED3DDEVTYPE_HAL) ? WINED3DDEVTYPE_HAL : WINED3DDEVTYPE_REF;  /* Not quite true, but use h/w supported by opengl I suppose */
4404     pCaps->AdapterOrdinal          = Adapter;
4405
4406     pCaps->Caps                    = 0;
4407     pCaps->Caps2                   = WINED3DCAPS2_CANRENDERWINDOWED |
4408                                      WINED3DCAPS2_FULLSCREENGAMMA |
4409                                      WINED3DCAPS2_DYNAMICTEXTURES;
4410     if (gl_info->supported[SGIS_GENERATE_MIPMAP])
4411     {
4412         pCaps->Caps2 |= WINED3DCAPS2_CANAUTOGENMIPMAP;
4413     }
4414
4415     pCaps->Caps3                   = WINED3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD |
4416                                      WINED3DCAPS3_COPY_TO_VIDMEM                   |
4417                                      WINED3DCAPS3_COPY_TO_SYSTEMMEM;
4418
4419     pCaps->PresentationIntervals   = WINED3DPRESENT_INTERVAL_IMMEDIATE  |
4420                                      WINED3DPRESENT_INTERVAL_ONE;
4421
4422     pCaps->CursorCaps              = WINED3DCURSORCAPS_COLOR            |
4423                                      WINED3DCURSORCAPS_LOWRES;
4424
4425     pCaps->DevCaps                 = WINED3DDEVCAPS_FLOATTLVERTEX       |
4426                                      WINED3DDEVCAPS_EXECUTESYSTEMMEMORY |
4427                                      WINED3DDEVCAPS_TLVERTEXSYSTEMMEMORY|
4428                                      WINED3DDEVCAPS_TLVERTEXVIDEOMEMORY |
4429                                      WINED3DDEVCAPS_DRAWPRIMTLVERTEX    |
4430                                      WINED3DDEVCAPS_HWTRANSFORMANDLIGHT |
4431                                      WINED3DDEVCAPS_EXECUTEVIDEOMEMORY  |
4432                                      WINED3DDEVCAPS_PUREDEVICE          |
4433                                      WINED3DDEVCAPS_HWRASTERIZATION     |
4434                                      WINED3DDEVCAPS_TEXTUREVIDEOMEMORY  |
4435                                      WINED3DDEVCAPS_TEXTURESYSTEMMEMORY |
4436                                      WINED3DDEVCAPS_CANRENDERAFTERFLIP  |
4437                                      WINED3DDEVCAPS_DRAWPRIMITIVES2     |
4438                                      WINED3DDEVCAPS_DRAWPRIMITIVES2EX   |
4439                                      WINED3DDEVCAPS_RTPATCHES;
4440
4441     pCaps->PrimitiveMiscCaps       = WINED3DPMISCCAPS_CULLNONE              |
4442                                      WINED3DPMISCCAPS_CULLCCW               |
4443                                      WINED3DPMISCCAPS_CULLCW                |
4444                                      WINED3DPMISCCAPS_COLORWRITEENABLE      |
4445                                      WINED3DPMISCCAPS_CLIPTLVERTS           |
4446                                      WINED3DPMISCCAPS_CLIPPLANESCALEDPOINTS |
4447                                      WINED3DPMISCCAPS_MASKZ                 |
4448                                      WINED3DPMISCCAPS_BLENDOP               |
4449                                      WINED3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING;
4450                                     /* TODO:
4451                                         WINED3DPMISCCAPS_NULLREFERENCE
4452                                         WINED3DPMISCCAPS_FOGANDSPECULARALPHA
4453                                         WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS
4454                                         WINED3DPMISCCAPS_FOGVERTEXCLAMPED */
4455
4456     if (gl_info->supported[EXT_BLEND_EQUATION_SEPARATE] && gl_info->supported[EXT_BLEND_FUNC_SEPARATE])
4457         pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND;
4458     if (gl_info->supported[EXT_DRAW_BUFFERS2])
4459         pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS;
4460
4461     pCaps->RasterCaps              = WINED3DPRASTERCAPS_DITHER    |
4462                                      WINED3DPRASTERCAPS_PAT       |
4463                                      WINED3DPRASTERCAPS_WFOG      |
4464                                      WINED3DPRASTERCAPS_ZFOG      |
4465                                      WINED3DPRASTERCAPS_FOGVERTEX |
4466                                      WINED3DPRASTERCAPS_FOGTABLE  |
4467                                      WINED3DPRASTERCAPS_STIPPLE   |
4468                                      WINED3DPRASTERCAPS_SUBPIXEL  |
4469                                      WINED3DPRASTERCAPS_ZTEST     |
4470                                      WINED3DPRASTERCAPS_SCISSORTEST   |
4471                                      WINED3DPRASTERCAPS_SLOPESCALEDEPTHBIAS |
4472                                      WINED3DPRASTERCAPS_DEPTHBIAS;
4473
4474     if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
4475     {
4476         pCaps->RasterCaps |= WINED3DPRASTERCAPS_ANISOTROPY    |
4477                              WINED3DPRASTERCAPS_ZBIAS         |
4478                              WINED3DPRASTERCAPS_MIPMAPLODBIAS;
4479     }
4480     if (gl_info->supported[NV_FOG_DISTANCE])
4481     {
4482         pCaps->RasterCaps         |= WINED3DPRASTERCAPS_FOGRANGE;
4483     }
4484                         /* FIXME Add:
4485                            WINED3DPRASTERCAPS_COLORPERSPECTIVE
4486                            WINED3DPRASTERCAPS_STRETCHBLTMULTISAMPLE
4487                            WINED3DPRASTERCAPS_ANTIALIASEDGES
4488                            WINED3DPRASTERCAPS_ZBUFFERLESSHSR
4489                            WINED3DPRASTERCAPS_WBUFFER */
4490
4491     pCaps->ZCmpCaps = WINED3DPCMPCAPS_ALWAYS       |
4492                       WINED3DPCMPCAPS_EQUAL        |
4493                       WINED3DPCMPCAPS_GREATER      |
4494                       WINED3DPCMPCAPS_GREATEREQUAL |
4495                       WINED3DPCMPCAPS_LESS         |
4496                       WINED3DPCMPCAPS_LESSEQUAL    |
4497                       WINED3DPCMPCAPS_NEVER        |
4498                       WINED3DPCMPCAPS_NOTEQUAL;
4499
4500     pCaps->SrcBlendCaps  = WINED3DPBLENDCAPS_BOTHINVSRCALPHA |
4501                            WINED3DPBLENDCAPS_BOTHSRCALPHA    |
4502                            WINED3DPBLENDCAPS_DESTALPHA       |
4503                            WINED3DPBLENDCAPS_DESTCOLOR       |
4504                            WINED3DPBLENDCAPS_INVDESTALPHA    |
4505                            WINED3DPBLENDCAPS_INVDESTCOLOR    |
4506                            WINED3DPBLENDCAPS_INVSRCALPHA     |
4507                            WINED3DPBLENDCAPS_INVSRCCOLOR     |
4508                            WINED3DPBLENDCAPS_ONE             |
4509                            WINED3DPBLENDCAPS_SRCALPHA        |
4510                            WINED3DPBLENDCAPS_SRCALPHASAT     |
4511                            WINED3DPBLENDCAPS_SRCCOLOR        |
4512                            WINED3DPBLENDCAPS_ZERO;
4513
4514     pCaps->DestBlendCaps = WINED3DPBLENDCAPS_DESTALPHA       |
4515                            WINED3DPBLENDCAPS_DESTCOLOR       |
4516                            WINED3DPBLENDCAPS_INVDESTALPHA    |
4517                            WINED3DPBLENDCAPS_INVDESTCOLOR    |
4518                            WINED3DPBLENDCAPS_INVSRCALPHA     |
4519                            WINED3DPBLENDCAPS_INVSRCCOLOR     |
4520                            WINED3DPBLENDCAPS_ONE             |
4521                            WINED3DPBLENDCAPS_SRCALPHA        |
4522                            WINED3DPBLENDCAPS_SRCCOLOR        |
4523                            WINED3DPBLENDCAPS_ZERO;
4524     /* NOTE: WINED3DPBLENDCAPS_SRCALPHASAT is not supported as dest blend factor,
4525      * according to the glBlendFunc manpage
4526      *
4527      * WINED3DPBLENDCAPS_BOTHINVSRCALPHA and WINED3DPBLENDCAPS_BOTHSRCALPHA are
4528      * legacy settings for srcblend only
4529      */
4530
4531     if (gl_info->supported[EXT_BLEND_COLOR])
4532     {
4533         pCaps->SrcBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR;
4534         pCaps->DestBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR;
4535     }
4536
4537
4538     pCaps->AlphaCmpCaps = WINED3DPCMPCAPS_ALWAYS       |
4539                           WINED3DPCMPCAPS_EQUAL        |
4540                           WINED3DPCMPCAPS_GREATER      |
4541                           WINED3DPCMPCAPS_GREATEREQUAL |
4542                           WINED3DPCMPCAPS_LESS         |
4543                           WINED3DPCMPCAPS_LESSEQUAL    |
4544                           WINED3DPCMPCAPS_NEVER        |
4545                           WINED3DPCMPCAPS_NOTEQUAL;
4546
4547     pCaps->ShadeCaps     = WINED3DPSHADECAPS_SPECULARGOURAUDRGB |
4548                            WINED3DPSHADECAPS_COLORGOURAUDRGB    |
4549                            WINED3DPSHADECAPS_ALPHAFLATBLEND     |
4550                            WINED3DPSHADECAPS_ALPHAGOURAUDBLEND  |
4551                            WINED3DPSHADECAPS_COLORFLATRGB       |
4552                            WINED3DPSHADECAPS_FOGFLAT            |
4553                            WINED3DPSHADECAPS_FOGGOURAUD         |
4554                            WINED3DPSHADECAPS_SPECULARFLATRGB;
4555
4556     pCaps->TextureCaps =  WINED3DPTEXTURECAPS_ALPHA              |
4557                           WINED3DPTEXTURECAPS_ALPHAPALETTE       |
4558                           WINED3DPTEXTURECAPS_TRANSPARENCY       |
4559                           WINED3DPTEXTURECAPS_BORDER             |
4560                           WINED3DPTEXTURECAPS_MIPMAP             |
4561                           WINED3DPTEXTURECAPS_PROJECTED          |
4562                           WINED3DPTEXTURECAPS_PERSPECTIVE;
4563
4564     if (!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO])
4565     {
4566         pCaps->TextureCaps |= WINED3DPTEXTURECAPS_POW2 |
4567                               WINED3DPTEXTURECAPS_NONPOW2CONDITIONAL;
4568     }
4569
4570     if (gl_info->supported[EXT_TEXTURE3D])
4571     {
4572         pCaps->TextureCaps |=  WINED3DPTEXTURECAPS_VOLUMEMAP      |
4573                                WINED3DPTEXTURECAPS_MIPVOLUMEMAP   |
4574                                WINED3DPTEXTURECAPS_VOLUMEMAP_POW2;
4575     }
4576
4577     if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
4578     {
4579         pCaps->TextureCaps |= WINED3DPTEXTURECAPS_CUBEMAP     |
4580                               WINED3DPTEXTURECAPS_MIPCUBEMAP    |
4581                               WINED3DPTEXTURECAPS_CUBEMAP_POW2;
4582
4583     }
4584
4585     pCaps->TextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR       |
4586                                WINED3DPTFILTERCAPS_MAGFPOINT        |
4587                                WINED3DPTFILTERCAPS_MINFLINEAR       |
4588                                WINED3DPTFILTERCAPS_MINFPOINT        |
4589                                WINED3DPTFILTERCAPS_MIPFLINEAR       |
4590                                WINED3DPTFILTERCAPS_MIPFPOINT        |
4591                                WINED3DPTFILTERCAPS_LINEAR           |
4592                                WINED3DPTFILTERCAPS_LINEARMIPLINEAR  |
4593                                WINED3DPTFILTERCAPS_LINEARMIPNEAREST |
4594                                WINED3DPTFILTERCAPS_MIPLINEAR        |
4595                                WINED3DPTFILTERCAPS_MIPNEAREST       |
4596                                WINED3DPTFILTERCAPS_NEAREST;
4597
4598     if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
4599     {
4600         pCaps->TextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC |
4601                                     WINED3DPTFILTERCAPS_MINFANISOTROPIC;
4602     }
4603
4604     if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
4605     {
4606         pCaps->CubeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR       |
4607                                        WINED3DPTFILTERCAPS_MAGFPOINT        |
4608                                        WINED3DPTFILTERCAPS_MINFLINEAR       |
4609                                        WINED3DPTFILTERCAPS_MINFPOINT        |
4610                                        WINED3DPTFILTERCAPS_MIPFLINEAR       |
4611                                        WINED3DPTFILTERCAPS_MIPFPOINT        |
4612                                        WINED3DPTFILTERCAPS_LINEAR           |
4613                                        WINED3DPTFILTERCAPS_LINEARMIPLINEAR  |
4614                                        WINED3DPTFILTERCAPS_LINEARMIPNEAREST |
4615                                        WINED3DPTFILTERCAPS_MIPLINEAR        |
4616                                        WINED3DPTFILTERCAPS_MIPNEAREST       |
4617                                        WINED3DPTFILTERCAPS_NEAREST;
4618
4619         if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
4620         {
4621             pCaps->CubeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC |
4622                                             WINED3DPTFILTERCAPS_MINFANISOTROPIC;
4623         }
4624     } else
4625         pCaps->CubeTextureFilterCaps = 0;
4626
4627     if (gl_info->supported[EXT_TEXTURE3D])
4628     {
4629         pCaps->VolumeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR       |
4630                                          WINED3DPTFILTERCAPS_MAGFPOINT        |
4631                                          WINED3DPTFILTERCAPS_MINFLINEAR       |
4632                                          WINED3DPTFILTERCAPS_MINFPOINT        |
4633                                          WINED3DPTFILTERCAPS_MIPFLINEAR       |
4634                                          WINED3DPTFILTERCAPS_MIPFPOINT        |
4635                                          WINED3DPTFILTERCAPS_LINEAR           |
4636                                          WINED3DPTFILTERCAPS_LINEARMIPLINEAR  |
4637                                          WINED3DPTFILTERCAPS_LINEARMIPNEAREST |
4638                                          WINED3DPTFILTERCAPS_MIPLINEAR        |
4639                                          WINED3DPTFILTERCAPS_MIPNEAREST       |
4640                                          WINED3DPTFILTERCAPS_NEAREST;
4641     } else
4642         pCaps->VolumeTextureFilterCaps = 0;
4643
4644     pCaps->TextureAddressCaps =  WINED3DPTADDRESSCAPS_INDEPENDENTUV |
4645                                  WINED3DPTADDRESSCAPS_CLAMP  |
4646                                  WINED3DPTADDRESSCAPS_WRAP;
4647
4648     if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
4649     {
4650         pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER;
4651     }
4652     if (gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT])
4653     {
4654         pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR;
4655     }
4656     if (gl_info->supported[ATI_TEXTURE_MIRROR_ONCE])
4657     {
4658         pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE;
4659     }
4660
4661     if (gl_info->supported[EXT_TEXTURE3D])
4662     {
4663         pCaps->VolumeTextureAddressCaps =  WINED3DPTADDRESSCAPS_INDEPENDENTUV |
4664                                            WINED3DPTADDRESSCAPS_CLAMP  |
4665                                            WINED3DPTADDRESSCAPS_WRAP;
4666         if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
4667         {
4668             pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER;
4669         }
4670         if (gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT])
4671         {
4672             pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR;
4673         }
4674         if (gl_info->supported[ATI_TEXTURE_MIRROR_ONCE])
4675         {
4676             pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE;
4677         }
4678     } else
4679         pCaps->VolumeTextureAddressCaps = 0;
4680
4681     pCaps->LineCaps = WINED3DLINECAPS_TEXTURE       |
4682                       WINED3DLINECAPS_ZTEST         |
4683                       WINED3DLINECAPS_BLEND         |
4684                       WINED3DLINECAPS_ALPHACMP      |
4685                       WINED3DLINECAPS_FOG;
4686     /* WINED3DLINECAPS_ANTIALIAS is not supported on Windows, and dx and gl seem to have a different
4687      * idea how generating the smoothing alpha values works; the result is different
4688      */
4689
4690     pCaps->MaxTextureWidth = gl_info->limits.texture_size;
4691     pCaps->MaxTextureHeight = gl_info->limits.texture_size;
4692
4693     if (gl_info->supported[EXT_TEXTURE3D])
4694         pCaps->MaxVolumeExtent = gl_info->limits.texture3d_size;
4695     else
4696         pCaps->MaxVolumeExtent = 0;
4697
4698     pCaps->MaxTextureRepeat = 32768;
4699     pCaps->MaxTextureAspectRatio = gl_info->limits.texture_size;
4700     pCaps->MaxVertexW = 1.0f;
4701
4702     pCaps->GuardBandLeft = 0.0f;
4703     pCaps->GuardBandTop = 0.0f;
4704     pCaps->GuardBandRight = 0.0f;
4705     pCaps->GuardBandBottom = 0.0f;
4706
4707     pCaps->ExtentsAdjust = 0.0f;
4708
4709     pCaps->StencilCaps =  WINED3DSTENCILCAPS_DECRSAT |
4710                           WINED3DSTENCILCAPS_INCRSAT |
4711                           WINED3DSTENCILCAPS_INVERT  |
4712                           WINED3DSTENCILCAPS_KEEP    |
4713                           WINED3DSTENCILCAPS_REPLACE |
4714                           WINED3DSTENCILCAPS_ZERO;
4715     if (gl_info->supported[EXT_STENCIL_WRAP])
4716     {
4717         pCaps->StencilCaps |= WINED3DSTENCILCAPS_DECR  |
4718                               WINED3DSTENCILCAPS_INCR;
4719     }
4720     if (gl_info->supported[EXT_STENCIL_TWO_SIDE] || gl_info->supported[ATI_SEPARATE_STENCIL])
4721     {
4722         pCaps->StencilCaps |= WINED3DSTENCILCAPS_TWOSIDED;
4723     }
4724
4725     pCaps->FVFCaps = WINED3DFVFCAPS_PSIZE | 0x0008; /* 8 texture coords */
4726
4727     pCaps->MaxUserClipPlanes = gl_info->limits.clipplanes;
4728     pCaps->MaxActiveLights = gl_info->limits.lights;
4729
4730     pCaps->MaxVertexBlendMatrices = gl_info->limits.blends;
4731     pCaps->MaxVertexBlendMatrixIndex   = 0;
4732
4733     pCaps->MaxAnisotropy = gl_info->limits.anisotropy;
4734     pCaps->MaxPointSize = gl_info->limits.pointsize_max;
4735
4736
4737     /* FIXME: Add D3DVTXPCAPS_TWEENING, D3DVTXPCAPS_TEXGEN_SPHEREMAP */
4738     pCaps->VertexProcessingCaps = WINED3DVTXPCAPS_DIRECTIONALLIGHTS |
4739                                   WINED3DVTXPCAPS_MATERIALSOURCE7   |
4740                                   WINED3DVTXPCAPS_POSITIONALLIGHTS  |
4741                                   WINED3DVTXPCAPS_LOCALVIEWER       |
4742                                   WINED3DVTXPCAPS_VERTEXFOG         |
4743                                   WINED3DVTXPCAPS_TEXGEN;
4744
4745     pCaps->MaxPrimitiveCount   = 0xFFFFF; /* For now set 2^20-1 which is used by most >=Geforce3/Radeon8500 cards */
4746     pCaps->MaxVertexIndex      = 0xFFFFF;
4747     pCaps->MaxStreams          = MAX_STREAMS;
4748     pCaps->MaxStreamStride     = 1024;
4749
4750     /* d3d9.dll sets D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES here because StretchRects is implemented in d3d9 */
4751     pCaps->DevCaps2                          = WINED3DDEVCAPS2_STREAMOFFSET |
4752                                                WINED3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET;
4753     pCaps->MaxNpatchTessellationLevel        = 0;
4754     pCaps->MasterAdapterOrdinal              = 0;
4755     pCaps->AdapterOrdinalInGroup             = 0;
4756     pCaps->NumberOfAdaptersInGroup           = 1;
4757
4758     pCaps->NumSimultaneousRTs = gl_info->limits.buffers;
4759
4760     pCaps->StretchRectFilterCaps             = WINED3DPTFILTERCAPS_MINFPOINT  |
4761                                                 WINED3DPTFILTERCAPS_MAGFPOINT  |
4762                                                 WINED3DPTFILTERCAPS_MINFLINEAR |
4763                                                 WINED3DPTFILTERCAPS_MAGFLINEAR;
4764     pCaps->VertexTextureFilterCaps           = 0;
4765
4766     adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
4767     adapter->fragment_pipe->get_caps(&adapter->gl_info, &fragment_caps);
4768
4769     /* Add shader misc caps. Only some of them belong to the shader parts of the pipeline */
4770     pCaps->PrimitiveMiscCaps |= fragment_caps.PrimitiveMiscCaps;
4771
4772     /* This takes care for disabling vertex shader or pixel shader caps while leaving the other one enabled.
4773      * Ignore shader model capabilities if disabled in config
4774      */
4775     if(vs_selected_mode == SHADER_NONE) {
4776         TRACE_(d3d_caps)("Vertex shader disabled in config, reporting version 0.0\n");
4777         pCaps->VertexShaderVersion          = WINED3DVS_VERSION(0,0);
4778         pCaps->MaxVertexShaderConst         = 0;
4779     } else {
4780         pCaps->VertexShaderVersion          = shader_caps.VertexShaderVersion;
4781         pCaps->MaxVertexShaderConst         = shader_caps.MaxVertexShaderConst;
4782     }
4783
4784     if(ps_selected_mode == SHADER_NONE) {
4785         TRACE_(d3d_caps)("Pixel shader disabled in config, reporting version 0.0\n");
4786         pCaps->PixelShaderVersion           = WINED3DPS_VERSION(0,0);
4787         pCaps->PixelShader1xMaxValue        = 0.0f;
4788     } else {
4789         pCaps->PixelShaderVersion           = shader_caps.PixelShaderVersion;
4790         pCaps->PixelShader1xMaxValue        = shader_caps.PixelShader1xMaxValue;
4791     }
4792
4793     pCaps->TextureOpCaps                    = fragment_caps.TextureOpCaps;
4794     pCaps->MaxTextureBlendStages            = fragment_caps.MaxTextureBlendStages;
4795     pCaps->MaxSimultaneousTextures          = fragment_caps.MaxSimultaneousTextures;
4796
4797     /* The following caps are shader specific, but they are things we cannot detect, or which
4798      * are the same among all shader models. So to avoid code duplication set the shader version
4799      * specific, but otherwise constant caps here
4800      */
4801     if(pCaps->VertexShaderVersion == WINED3DVS_VERSION(3,0)) {
4802         /* Where possible set the caps based on OpenGL extensions and if they aren't set (in case of software rendering)
4803         use the VS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum VS3.0 value. */
4804         pCaps->VS20Caps.Caps                     = WINED3DVS20CAPS_PREDICATION;
4805         pCaps->VS20Caps.DynamicFlowControlDepth  = WINED3DVS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* VS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */
4806         pCaps->VS20Caps.NumTemps = max(32, adapter->gl_info.limits.arb_vs_temps);
4807         pCaps->VS20Caps.StaticFlowControlDepth   = WINED3DVS20_MAX_STATICFLOWCONTROLDEPTH ; /* level of nesting in loops / if-statements; VS 3.0 requires MAX (4) */
4808
4809         pCaps->MaxVShaderInstructionsExecuted    = 65535; /* VS 3.0 needs at least 65535, some cards even use 2^32-1 */
4810         pCaps->MaxVertexShader30InstructionSlots = max(512, adapter->gl_info.limits.arb_vs_instructions);
4811     }
4812     else if (pCaps->VertexShaderVersion == WINED3DVS_VERSION(2,0))
4813     {
4814         pCaps->VS20Caps.Caps                     = 0;
4815         pCaps->VS20Caps.DynamicFlowControlDepth  = WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH;
4816         pCaps->VS20Caps.NumTemps = max(12, adapter->gl_info.limits.arb_vs_temps);
4817         pCaps->VS20Caps.StaticFlowControlDepth   = 1;
4818
4819         pCaps->MaxVShaderInstructionsExecuted    = 65535;
4820         pCaps->MaxVertexShader30InstructionSlots = 0;
4821     } else { /* VS 1.x */
4822         pCaps->VS20Caps.Caps                     = 0;
4823         pCaps->VS20Caps.DynamicFlowControlDepth  = 0;
4824         pCaps->VS20Caps.NumTemps                 = 0;
4825         pCaps->VS20Caps.StaticFlowControlDepth   = 0;
4826
4827         pCaps->MaxVShaderInstructionsExecuted    = 0;
4828         pCaps->MaxVertexShader30InstructionSlots = 0;
4829     }
4830
4831     if(pCaps->PixelShaderVersion == WINED3DPS_VERSION(3,0)) {
4832         /* Where possible set the caps based on OpenGL extensions and if they aren't set (in case of software rendering)
4833         use the PS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum PS 3.0 value. */
4834
4835         /* Caps is more or less undocumented on MSDN but it appears to be used for PS20Caps based on results from R9600/FX5900/Geforce6800 cards from Windows */
4836         pCaps->PS20Caps.Caps                     = WINED3DPS20CAPS_ARBITRARYSWIZZLE     |
4837                 WINED3DPS20CAPS_GRADIENTINSTRUCTIONS |
4838                 WINED3DPS20CAPS_PREDICATION          |
4839                 WINED3DPS20CAPS_NODEPENDENTREADLIMIT |
4840                 WINED3DPS20CAPS_NOTEXINSTRUCTIONLIMIT;
4841         pCaps->PS20Caps.DynamicFlowControlDepth  = WINED3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */
4842         pCaps->PS20Caps.NumTemps = max(32, adapter->gl_info.limits.arb_ps_temps);
4843         pCaps->PS20Caps.StaticFlowControlDepth   = WINED3DPS20_MAX_STATICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_STATICFLOWCONTROLDEPTH (4) */
4844         pCaps->PS20Caps.NumInstructionSlots      = WINED3DPS20_MAX_NUMINSTRUCTIONSLOTS; /* PS 3.0 requires MAX_NUMINSTRUCTIONSLOTS (512) */
4845
4846         pCaps->MaxPShaderInstructionsExecuted    = 65535;
4847         pCaps->MaxPixelShader30InstructionSlots = max(WINED3DMIN30SHADERINSTRUCTIONS,
4848                 adapter->gl_info.limits.arb_ps_instructions);
4849     }
4850     else if(pCaps->PixelShaderVersion == WINED3DPS_VERSION(2,0))
4851     {
4852         /* Below we assume PS2.0 specs, not extended 2.0a(GeforceFX)/2.0b(Radeon R3xx) ones */
4853         pCaps->PS20Caps.Caps                     = 0;
4854         pCaps->PS20Caps.DynamicFlowControlDepth  = 0; /* WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH = 0 */
4855         pCaps->PS20Caps.NumTemps = max(12, adapter->gl_info.limits.arb_ps_temps);
4856         pCaps->PS20Caps.StaticFlowControlDepth   = WINED3DPS20_MIN_STATICFLOWCONTROLDEPTH; /* Minimum: 1 */
4857         pCaps->PS20Caps.NumInstructionSlots      = WINED3DPS20_MIN_NUMINSTRUCTIONSLOTS; /* Minimum number (64 ALU + 32 Texture), a GeforceFX uses 512 */
4858
4859         pCaps->MaxPShaderInstructionsExecuted    = 512; /* Minimum value, a GeforceFX uses 1024 */
4860         pCaps->MaxPixelShader30InstructionSlots  = 0;
4861     } else { /* PS 1.x */
4862         pCaps->PS20Caps.Caps                     = 0;
4863         pCaps->PS20Caps.DynamicFlowControlDepth  = 0;
4864         pCaps->PS20Caps.NumTemps                 = 0;
4865         pCaps->PS20Caps.StaticFlowControlDepth   = 0;
4866         pCaps->PS20Caps.NumInstructionSlots      = 0;
4867
4868         pCaps->MaxPShaderInstructionsExecuted    = 0;
4869         pCaps->MaxPixelShader30InstructionSlots  = 0;
4870     }
4871
4872     if(pCaps->VertexShaderVersion >= WINED3DVS_VERSION(2,0)) {
4873         /* OpenGL supports all the formats below, perhaps not always
4874          * without conversion, but it supports them.
4875          * Further GLSL doesn't seem to have an official unsigned type so
4876          * don't advertise it yet as I'm not sure how we handle it.
4877          * We might need to add some clamping in the shader engine to
4878          * support it.
4879          * TODO: WINED3DDTCAPS_USHORT2N, WINED3DDTCAPS_USHORT4N, WINED3DDTCAPS_UDEC3, WINED3DDTCAPS_DEC3N */
4880         pCaps->DeclTypes = WINED3DDTCAPS_UBYTE4    |
4881                            WINED3DDTCAPS_UBYTE4N   |
4882                            WINED3DDTCAPS_SHORT2N   |
4883                            WINED3DDTCAPS_SHORT4N;
4884         if (gl_info->supported[ARB_HALF_FLOAT_VERTEX])
4885         {
4886             pCaps->DeclTypes |= WINED3DDTCAPS_FLOAT16_2 |
4887                                 WINED3DDTCAPS_FLOAT16_4;
4888         }
4889     } else
4890         pCaps->DeclTypes                         = 0;
4891
4892     /* Set DirectDraw helper Caps */
4893     ckey_caps =                         WINEDDCKEYCAPS_DESTBLT              |
4894                                         WINEDDCKEYCAPS_SRCBLT;
4895     fx_caps =                           WINEDDFXCAPS_BLTALPHA               |
4896                                         WINEDDFXCAPS_BLTMIRRORLEFTRIGHT     |
4897                                         WINEDDFXCAPS_BLTMIRRORUPDOWN        |
4898                                         WINEDDFXCAPS_BLTROTATION90          |
4899                                         WINEDDFXCAPS_BLTSHRINKX             |
4900                                         WINEDDFXCAPS_BLTSHRINKXN            |
4901                                         WINEDDFXCAPS_BLTSHRINKY             |
4902                                         WINEDDFXCAPS_BLTSHRINKXN            |
4903                                         WINEDDFXCAPS_BLTSTRETCHX            |
4904                                         WINEDDFXCAPS_BLTSTRETCHXN           |
4905                                         WINEDDFXCAPS_BLTSTRETCHY            |
4906                                         WINEDDFXCAPS_BLTSTRETCHYN;
4907     blit_caps =                         WINEDDCAPS_BLT                      |
4908                                         WINEDDCAPS_BLTCOLORFILL             |
4909                                         WINEDDCAPS_BLTDEPTHFILL             |
4910                                         WINEDDCAPS_BLTSTRETCH               |
4911                                         WINEDDCAPS_CANBLTSYSMEM             |
4912                                         WINEDDCAPS_CANCLIP                  |
4913                                         WINEDDCAPS_CANCLIPSTRETCHED         |
4914                                         WINEDDCAPS_COLORKEY                 |
4915                                         WINEDDCAPS_COLORKEYHWASSIST         |
4916                                         WINEDDCAPS_ALIGNBOUNDARYSRC;
4917     pal_caps =                          WINEDDPCAPS_8BIT                    |
4918                                         WINEDDPCAPS_PRIMARYSURFACE;
4919
4920     /* Fill the ddraw caps structure */
4921     pCaps->DirectDrawCaps.Caps =        WINEDDCAPS_GDI                      |
4922                                         WINEDDCAPS_PALETTE                  |
4923                                         blit_caps;
4924     pCaps->DirectDrawCaps.Caps2 =       WINEDDCAPS2_CERTIFIED                |
4925                                         WINEDDCAPS2_NOPAGELOCKREQUIRED       |
4926                                         WINEDDCAPS2_PRIMARYGAMMA             |
4927                                         WINEDDCAPS2_WIDESURFACES             |
4928                                         WINEDDCAPS2_CANRENDERWINDOWED;
4929     pCaps->DirectDrawCaps.CKeyCaps =    ckey_caps;
4930     pCaps->DirectDrawCaps.FXCaps =      fx_caps;
4931     pCaps->DirectDrawCaps.PalCaps =     pal_caps;
4932     pCaps->DirectDrawCaps.SVBCaps =     blit_caps;
4933     pCaps->DirectDrawCaps.SVBCKeyCaps = ckey_caps;
4934     pCaps->DirectDrawCaps.SVBFXCaps =   fx_caps;
4935     pCaps->DirectDrawCaps.VSBCaps =     blit_caps;
4936     pCaps->DirectDrawCaps.VSBCKeyCaps = ckey_caps;
4937     pCaps->DirectDrawCaps.VSBFXCaps =   fx_caps;
4938     pCaps->DirectDrawCaps.SSBCaps =     blit_caps;
4939     pCaps->DirectDrawCaps.SSBCKeyCaps = ckey_caps;
4940     pCaps->DirectDrawCaps.SSBFXCaps =   fx_caps;
4941
4942     pCaps->DirectDrawCaps.ddsCaps =     WINEDDSCAPS_ALPHA                   |
4943                                         WINEDDSCAPS_BACKBUFFER              |
4944                                         WINEDDSCAPS_FLIP                    |
4945                                         WINEDDSCAPS_FRONTBUFFER             |
4946                                         WINEDDSCAPS_OFFSCREENPLAIN          |
4947                                         WINEDDSCAPS_PALETTE                 |
4948                                         WINEDDSCAPS_PRIMARYSURFACE          |
4949                                         WINEDDSCAPS_SYSTEMMEMORY            |
4950                                         WINEDDSCAPS_VIDEOMEMORY             |
4951                                         WINEDDSCAPS_VISIBLE;
4952     pCaps->DirectDrawCaps.StrideAlign = DDRAW_PITCH_ALIGNMENT;
4953
4954     /* Set D3D caps if OpenGL is available. */
4955     if (adapter->opengl)
4956     {
4957         pCaps->DirectDrawCaps.ddsCaps |=WINEDDSCAPS_3DDEVICE                |
4958                                         WINEDDSCAPS_MIPMAP                  |
4959                                         WINEDDSCAPS_TEXTURE                 |
4960                                         WINEDDSCAPS_ZBUFFER;
4961         pCaps->DirectDrawCaps.Caps |=   WINEDDCAPS_3D;
4962     }
4963
4964     return WINED3D_OK;
4965 }
4966
4967 static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT adapter_idx, WINED3DDEVTYPE device_type,
4968         HWND focus_window, DWORD flags, IWineD3DDeviceParent *device_parent, IWineD3DDevice **device)
4969 {
4970     IWineD3DImpl *This = (IWineD3DImpl *)iface;
4971     IWineD3DDeviceImpl *object;
4972     HRESULT hr;
4973
4974     TRACE("iface %p, adapter_idx %u, device_type %#x, focus_window %p, flags %#x, device_parent %p, device %p.\n",
4975             iface, adapter_idx, device_type, focus_window, flags, device_parent, device);
4976
4977     /* Validate the adapter number. If no adapters are available(no GL), ignore the adapter
4978      * number and create a device without a 3D adapter for 2D only operation. */
4979     if (IWineD3D_GetAdapterCount(iface) && adapter_idx >= IWineD3D_GetAdapterCount(iface))
4980     {
4981         return WINED3DERR_INVALIDCALL;
4982     }
4983
4984     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
4985     if (!object)
4986     {
4987         ERR("Failed to allocate device memory.\n");
4988         return E_OUTOFMEMORY;
4989     }
4990
4991     hr = device_init(object, This, adapter_idx, device_type, focus_window, flags, device_parent);
4992     if (FAILED(hr))
4993     {
4994         WARN("Failed to initialize device, hr %#x.\n", hr);
4995         HeapFree(GetProcessHeap(), 0, object);
4996         return hr;
4997     }
4998
4999     TRACE("Created device %p.\n", object);
5000     *device = (IWineD3DDevice *)object;
5001
5002     IWineD3DDeviceParent_WineD3DDeviceCreated(device_parent, *device);
5003
5004     return WINED3D_OK;
5005 }
5006
5007 static void * WINAPI IWineD3DImpl_GetParent(IWineD3D *iface)
5008 {
5009     TRACE("iface %p.\n", iface);
5010
5011     return ((IWineD3DImpl *)iface)->parent;
5012 }
5013
5014 static void WINE_GLAPI invalid_func(const void *data)
5015 {
5016     ERR("Invalid vertex attribute function called\n");
5017     DebugBreak();
5018 }
5019
5020 static void WINE_GLAPI invalid_texcoord_func(GLenum unit, const void *data)
5021 {
5022     ERR("Invalid texcoord function called\n");
5023     DebugBreak();
5024 }
5025
5026 /* Helper functions for providing vertex data to opengl. The arrays are initialized based on
5027  * the extension detection and are used in drawStridedSlow
5028  */
5029 static void WINE_GLAPI position_d3dcolor(const void *data)
5030 {
5031     DWORD pos = *((const DWORD *)data);
5032
5033     FIXME("Add a test for fixed function position from d3dcolor type\n");
5034     glVertex4s(D3DCOLOR_B_R(pos),
5035                D3DCOLOR_B_G(pos),
5036                D3DCOLOR_B_B(pos),
5037                D3DCOLOR_B_A(pos));
5038 }
5039
5040 static void WINE_GLAPI position_float4(const void *data)
5041 {
5042     const GLfloat *pos = data;
5043
5044     if (pos[3] != 0.0f && pos[3] != 1.0f)
5045     {
5046         float w = 1.0f / pos[3];
5047
5048         glVertex4f(pos[0] * w, pos[1] * w, pos[2] * w, w);
5049     }
5050     else
5051     {
5052         glVertex3fv(pos);
5053     }
5054 }
5055
5056 static void WINE_GLAPI diffuse_d3dcolor(const void *data)
5057 {
5058     DWORD diffuseColor = *((const DWORD *)data);
5059
5060     glColor4ub(D3DCOLOR_B_R(diffuseColor),
5061                D3DCOLOR_B_G(diffuseColor),
5062                D3DCOLOR_B_B(diffuseColor),
5063                D3DCOLOR_B_A(diffuseColor));
5064 }
5065
5066 static void WINE_GLAPI specular_d3dcolor(const void *data)
5067 {
5068     DWORD specularColor = *((const DWORD *)data);
5069     GLbyte d[] = {D3DCOLOR_B_R(specularColor),
5070             D3DCOLOR_B_G(specularColor),
5071             D3DCOLOR_B_B(specularColor)};
5072
5073     specular_func_3ubv(d);
5074 }
5075
5076 static void WINE_GLAPI warn_no_specular_func(const void *data)
5077 {
5078     WARN("GL_EXT_secondary_color not supported\n");
5079 }
5080
5081 static void fillGLAttribFuncs(const struct wined3d_gl_info *gl_info)
5082 {
5083     position_funcs[WINED3D_FFP_EMIT_FLOAT1]      = invalid_func;
5084     position_funcs[WINED3D_FFP_EMIT_FLOAT2]      = invalid_func;
5085     position_funcs[WINED3D_FFP_EMIT_FLOAT3]      = (glAttribFunc)glVertex3fv;
5086     position_funcs[WINED3D_FFP_EMIT_FLOAT4]      = position_float4;
5087     position_funcs[WINED3D_FFP_EMIT_D3DCOLOR]    = position_d3dcolor;
5088     position_funcs[WINED3D_FFP_EMIT_UBYTE4]      = invalid_func;
5089     position_funcs[WINED3D_FFP_EMIT_SHORT2]      = invalid_func;
5090     position_funcs[WINED3D_FFP_EMIT_SHORT4]      = (glAttribFunc)glVertex2sv;
5091     position_funcs[WINED3D_FFP_EMIT_UBYTE4N]     = invalid_func;
5092     position_funcs[WINED3D_FFP_EMIT_SHORT2N]     = invalid_func;
5093     position_funcs[WINED3D_FFP_EMIT_SHORT4N]     = invalid_func;
5094     position_funcs[WINED3D_FFP_EMIT_USHORT2N]    = invalid_func;
5095     position_funcs[WINED3D_FFP_EMIT_USHORT4N]    = invalid_func;
5096     position_funcs[WINED3D_FFP_EMIT_UDEC3]       = invalid_func;
5097     position_funcs[WINED3D_FFP_EMIT_DEC3N]       = invalid_func;
5098     position_funcs[WINED3D_FFP_EMIT_FLOAT16_2]   = invalid_func;
5099     position_funcs[WINED3D_FFP_EMIT_FLOAT16_4]   = invalid_func;
5100
5101     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT1]       = invalid_func;
5102     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT2]       = invalid_func;
5103     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT3]       = (glAttribFunc)glColor3fv;
5104     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT4]       = (glAttribFunc)glColor4fv;
5105     diffuse_funcs[WINED3D_FFP_EMIT_D3DCOLOR]     = diffuse_d3dcolor;
5106     diffuse_funcs[WINED3D_FFP_EMIT_UBYTE4]       = invalid_func;
5107     diffuse_funcs[WINED3D_FFP_EMIT_SHORT2]       = invalid_func;
5108     diffuse_funcs[WINED3D_FFP_EMIT_SHORT4]       = invalid_func;
5109     diffuse_funcs[WINED3D_FFP_EMIT_UBYTE4N]      = (glAttribFunc)glColor4ubv;
5110     diffuse_funcs[WINED3D_FFP_EMIT_SHORT2N]      = invalid_func;
5111     diffuse_funcs[WINED3D_FFP_EMIT_SHORT4N]      = (glAttribFunc)glColor4sv;
5112     diffuse_funcs[WINED3D_FFP_EMIT_USHORT2N]     = invalid_func;
5113     diffuse_funcs[WINED3D_FFP_EMIT_USHORT4N]     = (glAttribFunc)glColor4usv;
5114     diffuse_funcs[WINED3D_FFP_EMIT_UDEC3]        = invalid_func;
5115     diffuse_funcs[WINED3D_FFP_EMIT_DEC3N]        = invalid_func;
5116     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT16_2]    = invalid_func;
5117     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT16_4]    = invalid_func;
5118
5119     /* No 4 component entry points here */
5120     specular_funcs[WINED3D_FFP_EMIT_FLOAT1]      = invalid_func;
5121     specular_funcs[WINED3D_FFP_EMIT_FLOAT2]      = invalid_func;
5122     if (gl_info->supported[EXT_SECONDARY_COLOR])
5123     {
5124         specular_funcs[WINED3D_FFP_EMIT_FLOAT3]  = (glAttribFunc)GL_EXTCALL(glSecondaryColor3fvEXT);
5125     }
5126     else
5127     {
5128         specular_funcs[WINED3D_FFP_EMIT_FLOAT3]  = warn_no_specular_func;
5129     }
5130     specular_funcs[WINED3D_FFP_EMIT_FLOAT4]      = invalid_func;
5131     if (gl_info->supported[EXT_SECONDARY_COLOR])
5132     {
5133         specular_func_3ubv = (glAttribFunc)GL_EXTCALL(glSecondaryColor3ubvEXT);
5134         specular_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = specular_d3dcolor;
5135     }
5136     else
5137     {
5138         specular_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = warn_no_specular_func;
5139     }
5140     specular_funcs[WINED3D_FFP_EMIT_UBYTE4]      = invalid_func;
5141     specular_funcs[WINED3D_FFP_EMIT_SHORT2]      = invalid_func;
5142     specular_funcs[WINED3D_FFP_EMIT_SHORT4]      = invalid_func;
5143     specular_funcs[WINED3D_FFP_EMIT_UBYTE4N]     = invalid_func;
5144     specular_funcs[WINED3D_FFP_EMIT_SHORT2N]     = invalid_func;
5145     specular_funcs[WINED3D_FFP_EMIT_SHORT4N]     = invalid_func;
5146     specular_funcs[WINED3D_FFP_EMIT_USHORT2N]    = invalid_func;
5147     specular_funcs[WINED3D_FFP_EMIT_USHORT4N]    = invalid_func;
5148     specular_funcs[WINED3D_FFP_EMIT_UDEC3]       = invalid_func;
5149     specular_funcs[WINED3D_FFP_EMIT_DEC3N]       = invalid_func;
5150     specular_funcs[WINED3D_FFP_EMIT_FLOAT16_2]   = invalid_func;
5151     specular_funcs[WINED3D_FFP_EMIT_FLOAT16_4]   = invalid_func;
5152
5153     /* Only 3 component entry points here. Test how others behave. Float4 normals are used
5154      * by one of our tests, trying to pass it to the pixel shader, which fails on Windows.
5155      */
5156     normal_funcs[WINED3D_FFP_EMIT_FLOAT1]         = invalid_func;
5157     normal_funcs[WINED3D_FFP_EMIT_FLOAT2]         = invalid_func;
5158     normal_funcs[WINED3D_FFP_EMIT_FLOAT3]         = (glAttribFunc)glNormal3fv;
5159     normal_funcs[WINED3D_FFP_EMIT_FLOAT4]         = (glAttribFunc)glNormal3fv; /* Just ignore the 4th value */
5160     normal_funcs[WINED3D_FFP_EMIT_D3DCOLOR]       = invalid_func;
5161     normal_funcs[WINED3D_FFP_EMIT_UBYTE4]         = invalid_func;
5162     normal_funcs[WINED3D_FFP_EMIT_SHORT2]         = invalid_func;
5163     normal_funcs[WINED3D_FFP_EMIT_SHORT4]         = invalid_func;
5164     normal_funcs[WINED3D_FFP_EMIT_UBYTE4N]        = invalid_func;
5165     normal_funcs[WINED3D_FFP_EMIT_SHORT2N]        = invalid_func;
5166     normal_funcs[WINED3D_FFP_EMIT_SHORT4N]        = invalid_func;
5167     normal_funcs[WINED3D_FFP_EMIT_USHORT2N]       = invalid_func;
5168     normal_funcs[WINED3D_FFP_EMIT_USHORT4N]       = invalid_func;
5169     normal_funcs[WINED3D_FFP_EMIT_UDEC3]          = invalid_func;
5170     normal_funcs[WINED3D_FFP_EMIT_DEC3N]          = invalid_func;
5171     normal_funcs[WINED3D_FFP_EMIT_FLOAT16_2]      = invalid_func;
5172     normal_funcs[WINED3D_FFP_EMIT_FLOAT16_4]      = invalid_func;
5173
5174     multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT1]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord1fvARB);
5175     multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT2]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2fvARB);
5176     multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT3]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord3fvARB);
5177     multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT4]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4fvARB);
5178     multi_texcoord_funcs[WINED3D_FFP_EMIT_D3DCOLOR]  = invalid_texcoord_func;
5179     multi_texcoord_funcs[WINED3D_FFP_EMIT_UBYTE4]    = invalid_texcoord_func;
5180     multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT2]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2svARB);
5181     multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT4]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4svARB);
5182     multi_texcoord_funcs[WINED3D_FFP_EMIT_UBYTE4N]   = invalid_texcoord_func;
5183     multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT2N]   = invalid_texcoord_func;
5184     multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT4N]   = invalid_texcoord_func;
5185     multi_texcoord_funcs[WINED3D_FFP_EMIT_USHORT2N]  = invalid_texcoord_func;
5186     multi_texcoord_funcs[WINED3D_FFP_EMIT_USHORT4N]  = invalid_texcoord_func;
5187     multi_texcoord_funcs[WINED3D_FFP_EMIT_UDEC3]     = invalid_texcoord_func;
5188     multi_texcoord_funcs[WINED3D_FFP_EMIT_DEC3N]     = invalid_texcoord_func;
5189     if (gl_info->supported[NV_HALF_FLOAT])
5190     {
5191         /* Not supported by ARB_HALF_FLOAT_VERTEX, so check for NV_HALF_FLOAT */
5192         multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2hvNV);
5193         multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4hvNV);
5194     } else {
5195         multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_texcoord_func;
5196         multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_texcoord_func;
5197     }
5198 }
5199
5200 /* Do not call while under the GL lock. */
5201 static BOOL InitAdapters(IWineD3DImpl *This)
5202 {
5203     static HMODULE mod_gl;
5204     BOOL ret;
5205     int ps_selected_mode, vs_selected_mode;
5206
5207     /* No need to hold any lock. The calling library makes sure only one thread calls
5208      * wined3d simultaneously
5209      */
5210
5211     TRACE("Initializing adapters\n");
5212
5213     if(!mod_gl) {
5214 #ifdef USE_WIN32_OPENGL
5215 #define USE_GL_FUNC(pfn) pfn = (void*)GetProcAddress(mod_gl, #pfn);
5216         mod_gl = LoadLibraryA("opengl32.dll");
5217         if(!mod_gl) {
5218             ERR("Can't load opengl32.dll!\n");
5219             goto nogl_adapter;
5220         }
5221 #else
5222 #define USE_GL_FUNC(pfn) pfn = (void*)pwglGetProcAddress(#pfn);
5223         /* To bypass the opengl32 thunks load wglGetProcAddress from gdi32 (glXGetProcAddress wrapper) instead of opengl32's */
5224         mod_gl = GetModuleHandleA("gdi32.dll");
5225 #endif
5226     }
5227
5228 /* Load WGL core functions from opengl32.dll */
5229 #define USE_WGL_FUNC(pfn) p##pfn = (void*)GetProcAddress(mod_gl, #pfn);
5230     WGL_FUNCS_GEN;
5231 #undef USE_WGL_FUNC
5232
5233     if(!pwglGetProcAddress) {
5234         ERR("Unable to load wglGetProcAddress!\n");
5235         goto nogl_adapter;
5236     }
5237
5238 /* Dynamically load all GL core functions */
5239     GL_FUNCS_GEN;
5240 #undef USE_GL_FUNC
5241
5242     /* Load glFinish and glFlush from opengl32.dll even if we're not using WIN32 opengl
5243      * otherwise because we have to use winex11.drv's override
5244      */
5245 #ifdef USE_WIN32_OPENGL
5246     wglFinish = (void*)GetProcAddress(mod_gl, "glFinish");
5247     wglFlush = (void*)GetProcAddress(mod_gl, "glFlush");
5248 #else
5249     wglFinish = (void*)pwglGetProcAddress("wglFinish");
5250     wglFlush = (void*)pwglGetProcAddress("wglFlush");
5251 #endif
5252
5253     glEnableWINE = glEnable;
5254     glDisableWINE = glDisable;
5255
5256     /* For now only one default adapter */
5257     {
5258         struct wined3d_adapter *adapter = &This->adapters[0];
5259         const struct wined3d_gl_info *gl_info = &adapter->gl_info;
5260         struct wined3d_fake_gl_ctx fake_gl_ctx = {0};
5261         int iPixelFormat;
5262         int res;
5263         int i;
5264         WineD3D_PixelFormat *cfgs;
5265         DISPLAY_DEVICEW DisplayDevice;
5266         HDC hdc;
5267
5268         TRACE("Initializing default adapter\n");
5269         adapter->ordinal = 0;
5270         adapter->monitorPoint.x = -1;
5271         adapter->monitorPoint.y = -1;
5272
5273         if (!AllocateLocallyUniqueId(&adapter->luid))
5274         {
5275             DWORD err = GetLastError();
5276             ERR("Failed to set adapter LUID (%#x).\n", err);
5277             goto nogl_adapter;
5278         }
5279         TRACE("Allocated LUID %08x:%08x for adapter.\n",
5280                 adapter->luid.HighPart, adapter->luid.LowPart);
5281
5282         if (!WineD3D_CreateFakeGLContext(&fake_gl_ctx))
5283         {
5284             ERR("Failed to get a gl context for default adapter\n");
5285             goto nogl_adapter;
5286         }
5287
5288         ret = IWineD3DImpl_FillGLCaps(adapter);
5289         if(!ret) {
5290             ERR("Failed to initialize gl caps for default adapter\n");
5291             WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
5292             goto nogl_adapter;
5293         }
5294         ret = initPixelFormats(&adapter->gl_info, adapter->driver_info.vendor);
5295         if(!ret) {
5296             ERR("Failed to init gl formats\n");
5297             WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
5298             goto nogl_adapter;
5299         }
5300
5301         hdc = fake_gl_ctx.dc;
5302
5303         /* Use the VideoRamSize registry setting when set */
5304         if(wined3d_settings.emulated_textureram)
5305             adapter->TextureRam = wined3d_settings.emulated_textureram;
5306         else
5307             adapter->TextureRam = adapter->gl_info.vidmem;
5308         adapter->UsedTextureRam = 0;
5309         TRACE("Emulating %dMB of texture ram\n", adapter->TextureRam/(1024*1024));
5310
5311         /* Initialize the Adapter's DeviceName which is required for ChangeDisplaySettings and friends */
5312         DisplayDevice.cb = sizeof(DisplayDevice);
5313         EnumDisplayDevicesW(NULL, 0 /* Adapter 0 = iDevNum 0 */, &DisplayDevice, 0);
5314         TRACE("DeviceName: %s\n", debugstr_w(DisplayDevice.DeviceName));
5315         strcpyW(adapter->DeviceName, DisplayDevice.DeviceName);
5316
5317         if (gl_info->supported[WGL_ARB_PIXEL_FORMAT])
5318         {
5319             int attribute;
5320             int attribs[11];
5321             int values[11];
5322             int nAttribs = 0;
5323
5324             attribute = WGL_NUMBER_PIXEL_FORMATS_ARB;
5325             GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, 0, 0, 1, &attribute, &adapter->nCfgs));
5326
5327             adapter->cfgs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, adapter->nCfgs *sizeof(WineD3D_PixelFormat));
5328             cfgs = adapter->cfgs;
5329             attribs[nAttribs++] = WGL_RED_BITS_ARB;
5330             attribs[nAttribs++] = WGL_GREEN_BITS_ARB;
5331             attribs[nAttribs++] = WGL_BLUE_BITS_ARB;
5332             attribs[nAttribs++] = WGL_ALPHA_BITS_ARB;
5333             attribs[nAttribs++] = WGL_COLOR_BITS_ARB;
5334             attribs[nAttribs++] = WGL_DEPTH_BITS_ARB;
5335             attribs[nAttribs++] = WGL_STENCIL_BITS_ARB;
5336             attribs[nAttribs++] = WGL_DRAW_TO_WINDOW_ARB;
5337             attribs[nAttribs++] = WGL_PIXEL_TYPE_ARB;
5338             attribs[nAttribs++] = WGL_DOUBLE_BUFFER_ARB;
5339             attribs[nAttribs++] = WGL_AUX_BUFFERS_ARB;
5340
5341             for (iPixelFormat=1; iPixelFormat <= adapter->nCfgs; ++iPixelFormat)
5342             {
5343                 res = GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, nAttribs, attribs, values));
5344
5345                 if(!res)
5346                     continue;
5347
5348                 /* Cache the pixel format */
5349                 cfgs->iPixelFormat = iPixelFormat;
5350                 cfgs->redSize = values[0];
5351                 cfgs->greenSize = values[1];
5352                 cfgs->blueSize = values[2];
5353                 cfgs->alphaSize = values[3];
5354                 cfgs->colorSize = values[4];
5355                 cfgs->depthSize = values[5];
5356                 cfgs->stencilSize = values[6];
5357                 cfgs->windowDrawable = values[7];
5358                 cfgs->iPixelType = values[8];
5359                 cfgs->doubleBuffer = values[9];
5360                 cfgs->auxBuffers = values[10];
5361
5362                 cfgs->numSamples = 0;
5363                 /* Check multisample support */
5364                 if (gl_info->supported[ARB_MULTISAMPLE])
5365                 {
5366                     int attrib[2] = {WGL_SAMPLE_BUFFERS_ARB, WGL_SAMPLES_ARB};
5367                     int value[2];
5368                     if(GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, 2, attrib, value))) {
5369                         /* value[0] = WGL_SAMPLE_BUFFERS_ARB which tells whether multisampling is supported.
5370                         * value[1] = number of multi sample buffers*/
5371                         if(value[0])
5372                             cfgs->numSamples = value[1];
5373                     }
5374                 }
5375
5376                 TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
5377                         "depth=%d, stencil=%d, samples=%d, windowDrawable=%d\n",
5378                         cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
5379                         cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
5380                         cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable);
5381                 cfgs++;
5382             }
5383         }
5384         else
5385         {
5386             int nCfgs = DescribePixelFormat(hdc, 0, 0, 0);
5387             adapter->cfgs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nCfgs*sizeof(WineD3D_PixelFormat));
5388             adapter->nCfgs = 0; /* We won't accept all formats e.g. software accelerated ones will be skipped */
5389
5390             cfgs = adapter->cfgs;
5391             for(iPixelFormat=1; iPixelFormat<=nCfgs; iPixelFormat++)
5392             {
5393                 PIXELFORMATDESCRIPTOR ppfd;
5394
5395                 res = DescribePixelFormat(hdc, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &ppfd);
5396                 if(!res)
5397                     continue;
5398
5399                 /* We only want HW acceleration using an OpenGL ICD driver.
5400                  * PFD_GENERIC_FORMAT = slow opengl 1.1 gdi software rendering
5401                  * PFD_GENERIC_ACCELERATED = partial hw acceleration using a MCD driver (e.g. 3dfx minigl)
5402                  */
5403                 if(ppfd.dwFlags & (PFD_GENERIC_FORMAT | PFD_GENERIC_ACCELERATED))
5404                 {
5405                     TRACE("Skipping iPixelFormat=%d because it isn't ICD accelerated\n", iPixelFormat);
5406                     continue;
5407                 }
5408
5409                 cfgs->iPixelFormat = iPixelFormat;
5410                 cfgs->redSize = ppfd.cRedBits;
5411                 cfgs->greenSize = ppfd.cGreenBits;
5412                 cfgs->blueSize = ppfd.cBlueBits;
5413                 cfgs->alphaSize = ppfd.cAlphaBits;
5414                 cfgs->colorSize = ppfd.cColorBits;
5415                 cfgs->depthSize = ppfd.cDepthBits;
5416                 cfgs->stencilSize = ppfd.cStencilBits;
5417                 cfgs->windowDrawable = (ppfd.dwFlags & PFD_DRAW_TO_WINDOW) ? 1 : 0;
5418                 cfgs->iPixelType = (ppfd.iPixelType == PFD_TYPE_RGBA) ? WGL_TYPE_RGBA_ARB : WGL_TYPE_COLORINDEX_ARB;
5419                 cfgs->doubleBuffer = (ppfd.dwFlags & PFD_DOUBLEBUFFER) ? 1 : 0;
5420                 cfgs->auxBuffers = ppfd.cAuxBuffers;
5421                 cfgs->numSamples = 0;
5422
5423                 TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
5424                         "depth=%d, stencil=%d, windowDrawable=%d\n",
5425                         cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
5426                         cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
5427                         cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable);
5428                 cfgs++;
5429                 adapter->nCfgs++;
5430             }
5431
5432             /* Yikes we haven't found any suitable formats. This should only happen in case of GDI software rendering which we can't use anyway as its 3D functionality is very, very limited */
5433             if(!adapter->nCfgs)
5434             {
5435                 ERR("Disabling Direct3D because no hardware accelerated pixel formats have been found!\n");
5436
5437                 WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
5438                 HeapFree(GetProcessHeap(), 0, adapter->cfgs);
5439                 goto nogl_adapter;
5440             }
5441         }
5442
5443         /* D16, D24X8 and D24S8 are common depth / depth+stencil formats. All drivers support them though this doesn't
5444          * mean that the format is offered in hardware. For instance Geforce8 cards don't have offer D16 in hardware
5445          * but just fake it using D24(X8?) which is fine. D3D also allows that.
5446          * Some display drivers (i915 on Linux) only report mixed depth+stencil formats like D24S8. MSDN clearly mentions
5447          * that only on lockable formats (e.g. D16_locked) the bit order is guaranteed and that on other formats the
5448          * driver is allowed to consume more bits EXCEPT for stencil bits.
5449          *
5450          * Mark an adapter with this broken stencil behavior.
5451          */
5452         adapter->brokenStencil = TRUE;
5453         for (i = 0, cfgs = adapter->cfgs; i < adapter->nCfgs; ++i)
5454         {
5455             /* Nearly all drivers offer depth formats without stencil, only on i915 this if-statement won't be entered. */
5456             if(cfgs[i].depthSize && !cfgs[i].stencilSize) {
5457                 adapter->brokenStencil = FALSE;
5458                 break;
5459             }
5460         }
5461
5462         WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
5463
5464         select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
5465         fillGLAttribFuncs(&adapter->gl_info);
5466         adapter->opengl = TRUE;
5467     }
5468     This->adapter_count = 1;
5469     TRACE("%u adapters successfully initialized\n", This->adapter_count);
5470
5471     return TRUE;
5472
5473 nogl_adapter:
5474     /* Initialize an adapter for ddraw-only memory counting */
5475     memset(This->adapters, 0, sizeof(This->adapters));
5476     This->adapters[0].ordinal = 0;
5477     This->adapters[0].opengl = FALSE;
5478     This->adapters[0].monitorPoint.x = -1;
5479     This->adapters[0].monitorPoint.y = -1;
5480
5481     This->adapters[0].driver_info.name = "Display";
5482     This->adapters[0].driver_info.description = "WineD3D DirectDraw Emulation";
5483     if(wined3d_settings.emulated_textureram) {
5484         This->adapters[0].TextureRam = wined3d_settings.emulated_textureram;
5485     } else {
5486         This->adapters[0].TextureRam = 8 * 1024 * 1024; /* This is plenty for a DDraw-only card */
5487     }
5488
5489     initPixelFormatsNoGL(&This->adapters[0].gl_info);
5490
5491     This->adapter_count = 1;
5492     return FALSE;
5493 }
5494
5495 /**********************************************************
5496  * IWineD3D VTbl follows
5497  **********************************************************/
5498
5499 static const struct IWineD3DVtbl IWineD3D_Vtbl =
5500 {
5501     /* IUnknown */
5502     IWineD3DImpl_QueryInterface,
5503     IWineD3DImpl_AddRef,
5504     IWineD3DImpl_Release,
5505     /* IWineD3D */
5506     IWineD3DImpl_GetParent,
5507     IWineD3DImpl_GetAdapterCount,
5508     IWineD3DImpl_RegisterSoftwareDevice,
5509     IWineD3DImpl_GetAdapterMonitor,
5510     IWineD3DImpl_GetAdapterModeCount,
5511     IWineD3DImpl_EnumAdapterModes,
5512     IWineD3DImpl_GetAdapterDisplayMode,
5513     IWineD3DImpl_GetAdapterIdentifier,
5514     IWineD3DImpl_CheckDeviceMultiSampleType,
5515     IWineD3DImpl_CheckDepthStencilMatch,
5516     IWineD3DImpl_CheckDeviceType,
5517     IWineD3DImpl_CheckDeviceFormat,
5518     IWineD3DImpl_CheckDeviceFormatConversion,
5519     IWineD3DImpl_GetDeviceCaps,
5520     IWineD3DImpl_CreateDevice
5521 };
5522
5523 static void STDMETHODCALLTYPE wined3d_null_wined3d_object_destroyed(void *parent) {}
5524
5525 const struct wined3d_parent_ops wined3d_null_parent_ops =
5526 {
5527     wined3d_null_wined3d_object_destroyed,
5528 };
5529
5530 /* Do not call while under the GL lock. */
5531 HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, void *parent)
5532 {
5533     wined3d->lpVtbl = &IWineD3D_Vtbl;
5534     wined3d->dxVersion = version;
5535     wined3d->ref = 1;
5536     wined3d->parent = parent;
5537
5538     if (!InitAdapters(wined3d))
5539     {
5540         WARN("Failed to initialize adapters.\n");
5541         if (version > 7)
5542         {
5543             MESSAGE("Direct3D%u is not available without OpenGL.\n", version);
5544             return E_FAIL;
5545         }
5546     }
5547
5548     return WINED3D_OK;
5549 }