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