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