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