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