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