wined3d: Recognize some more Radeon cards.
[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.gl_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) { /* Display */
2775         const struct wined3d_format_desc *format_desc = getFormatDescEntry(format_id, &This->adapters[Adapter].gl_info);
2776         UINT format_bits = format_desc->byte_count * CHAR_BIT;
2777         unsigned int i = 0;
2778         unsigned int j = 0;
2779         DEVMODEW mode;
2780
2781         memset(&mode, 0, sizeof(mode));
2782         mode.dmSize = sizeof(mode);
2783
2784         while (EnumDisplaySettingsExW(NULL, j, &mode, 0))
2785         {
2786             ++j;
2787
2788             if (format_id == WINED3DFMT_UNKNOWN)
2789             {
2790                 /* This is for D3D8, do not enumerate P8 here */
2791                 if (mode.dmBitsPerPel == 32 || mode.dmBitsPerPel == 16) ++i;
2792             }
2793             else if (mode.dmBitsPerPel == format_bits)
2794             {
2795                 ++i;
2796             }
2797         }
2798
2799         TRACE_(d3d_caps)("(%p}->(Adapter: %d) => %d (out of %d)\n", This, Adapter, i, j);
2800         return i;
2801     } else {
2802         FIXME_(d3d_caps)("Adapter not primary display\n");
2803     }
2804     return 0;
2805 }
2806
2807 /* Note: dx9 supplies a format. Calls from d3d8 supply WINED3DFMT_UNKNOWN */
2808 static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapter,
2809         enum wined3d_format_id format_id, UINT Mode, WINED3DDISPLAYMODE *pMode)
2810 {
2811     IWineD3DImpl *This = (IWineD3DImpl *)iface;
2812
2813     TRACE_(d3d_caps)("iface %p, adapter_idx %u, format %s, mode_idx %u, mode %p.\n",
2814             iface, Adapter, debug_d3dformat(format_id), Mode, pMode);
2815
2816     /* Validate the parameters as much as possible */
2817     if (!pMode || Adapter >= IWineD3DImpl_GetAdapterCount(iface)
2818             || Mode >= IWineD3DImpl_GetAdapterModeCount(iface, Adapter, format_id))
2819     {
2820         return WINED3DERR_INVALIDCALL;
2821     }
2822
2823     /* TODO: Store modes per adapter and read it from the adapter structure */
2824     if (Adapter == 0)
2825     {
2826         const struct wined3d_format_desc *format_desc = getFormatDescEntry(format_id, &This->adapters[Adapter].gl_info);
2827         UINT format_bits = format_desc->byte_count * CHAR_BIT;
2828         DEVMODEW DevModeW;
2829         int ModeIdx = 0;
2830         UINT i = 0;
2831         int j = 0;
2832
2833         ZeroMemory(&DevModeW, sizeof(DevModeW));
2834         DevModeW.dmSize = sizeof(DevModeW);
2835
2836         /* If we are filtering to a specific format (D3D9), then need to skip
2837            all unrelated modes, but if mode is irrelevant (D3D8), then we can
2838            just count through the ones with valid bit depths */
2839         while ((i<=Mode) && EnumDisplaySettingsExW(NULL, j++, &DevModeW, 0))
2840         {
2841             if (format_id == WINED3DFMT_UNKNOWN)
2842             {
2843                 /* This is for D3D8, do not enumerate P8 here */
2844                 if (DevModeW.dmBitsPerPel == 32 || DevModeW.dmBitsPerPel == 16) ++i;
2845             }
2846             else if (DevModeW.dmBitsPerPel == format_bits)
2847             {
2848                 ++i;
2849             }
2850         }
2851
2852         if (i == 0)
2853         {
2854             TRACE_(d3d_caps)("No modes found for format (%x - %s)\n", format_id, debug_d3dformat(format_id));
2855             return WINED3DERR_INVALIDCALL;
2856         }
2857         ModeIdx = j - 1;
2858
2859         /* Now get the display mode via the calculated index */
2860         if (EnumDisplaySettingsExW(NULL, ModeIdx, &DevModeW, 0)) {
2861             pMode->Width        = DevModeW.dmPelsWidth;
2862             pMode->Height       = DevModeW.dmPelsHeight;
2863             pMode->RefreshRate  = DEFAULT_REFRESH_RATE;
2864             if (DevModeW.dmFields & DM_DISPLAYFREQUENCY)
2865                 pMode->RefreshRate = DevModeW.dmDisplayFrequency;
2866
2867             if (format_id == WINED3DFMT_UNKNOWN)
2868                 pMode->Format = pixelformat_for_depth(DevModeW.dmBitsPerPel);
2869             else
2870                 pMode->Format = format_id;
2871         }
2872         else
2873         {
2874             TRACE_(d3d_caps)("Requested mode out of range %d\n", Mode);
2875             return WINED3DERR_INVALIDCALL;
2876         }
2877
2878         TRACE_(d3d_caps)("W %d H %d rr %d fmt (%x - %s) bpp %u\n", pMode->Width, pMode->Height,
2879                 pMode->RefreshRate, pMode->Format, debug_d3dformat(pMode->Format),
2880                 DevModeW.dmBitsPerPel);
2881
2882     }
2883     else
2884     {
2885         FIXME_(d3d_caps)("Adapter not primary display\n");
2886     }
2887
2888     return WINED3D_OK;
2889 }
2890
2891 static HRESULT WINAPI IWineD3DImpl_GetAdapterDisplayMode(IWineD3D *iface, UINT Adapter, WINED3DDISPLAYMODE *pMode)
2892 {
2893     TRACE("iface %p, adapter_idx %u, display_mode %p.\n", iface, Adapter, pMode);
2894
2895     if (NULL == pMode ||
2896         Adapter >= IWineD3D_GetAdapterCount(iface)) {
2897         return WINED3DERR_INVALIDCALL;
2898     }
2899
2900     if (Adapter == 0) { /* Display */
2901         int bpp = 0;
2902         DEVMODEW DevModeW;
2903
2904         ZeroMemory(&DevModeW, sizeof(DevModeW));
2905         DevModeW.dmSize = sizeof(DevModeW);
2906
2907         EnumDisplaySettingsExW(NULL, ENUM_CURRENT_SETTINGS, &DevModeW, 0);
2908         pMode->Width        = DevModeW.dmPelsWidth;
2909         pMode->Height       = DevModeW.dmPelsHeight;
2910         bpp                 = DevModeW.dmBitsPerPel;
2911         pMode->RefreshRate  = DEFAULT_REFRESH_RATE;
2912         if (DevModeW.dmFields&DM_DISPLAYFREQUENCY)
2913         {
2914             pMode->RefreshRate = DevModeW.dmDisplayFrequency;
2915         }
2916
2917         pMode->Format = pixelformat_for_depth(bpp);
2918     } else {
2919         FIXME_(d3d_caps)("Adapter not primary display\n");
2920     }
2921
2922     TRACE_(d3d_caps)("returning w:%d, h:%d, ref:%d, fmt:%s\n", pMode->Width,
2923           pMode->Height, pMode->RefreshRate, debug_d3dformat(pMode->Format));
2924     return WINED3D_OK;
2925 }
2926
2927 /* NOTE: due to structure differences between dx8 and dx9 D3DADAPTER_IDENTIFIER,
2928    and fields being inserted in the middle, a new structure is used in place    */
2929 static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Adapter, DWORD Flags,
2930                                                    WINED3DADAPTER_IDENTIFIER* pIdentifier) {
2931     IWineD3DImpl *This = (IWineD3DImpl *)iface;
2932     struct wined3d_adapter *adapter;
2933     size_t len;
2934
2935     TRACE_(d3d_caps)("(%p}->(Adapter: %d, Flags: %x, pId=%p)\n", This, Adapter, Flags, pIdentifier);
2936
2937     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
2938         return WINED3DERR_INVALIDCALL;
2939     }
2940
2941     adapter = &This->adapters[Adapter];
2942
2943     /* Return the information requested */
2944     TRACE_(d3d_caps)("device/Vendor Name and Version detection using FillGLCaps\n");
2945
2946     if (pIdentifier->driver_size)
2947     {
2948         const char *name = adapter->driver_info.name;
2949         len = min(strlen(name), pIdentifier->driver_size - 1);
2950         memcpy(pIdentifier->driver, name, len);
2951         pIdentifier->driver[len] = '\0';
2952     }
2953
2954     if (pIdentifier->description_size)
2955     {
2956         const char *description = adapter->driver_info.description;
2957         len = min(strlen(description), pIdentifier->description_size - 1);
2958         memcpy(pIdentifier->description, description, len);
2959         pIdentifier->description[len] = '\0';
2960     }
2961
2962     /* Note that d3d8 doesn't supply a device name. */
2963     if (pIdentifier->device_name_size)
2964     {
2965         static const char *device_name = "\\\\.\\DISPLAY1"; /* FIXME: May depend on desktop? */
2966
2967         len = strlen(device_name);
2968         if (len >= pIdentifier->device_name_size)
2969         {
2970             ERR("Device name size too small.\n");
2971             return WINED3DERR_INVALIDCALL;
2972         }
2973
2974         memcpy(pIdentifier->device_name, device_name, len);
2975         pIdentifier->device_name[len] = '\0';
2976     }
2977
2978     pIdentifier->driver_version.u.HighPart = adapter->driver_info.version_high;
2979     pIdentifier->driver_version.u.LowPart = adapter->driver_info.version_low;
2980     pIdentifier->vendor_id = adapter->driver_info.vendor;
2981     pIdentifier->device_id = adapter->driver_info.device;
2982     pIdentifier->subsystem_id = 0;
2983     pIdentifier->revision = 0;
2984     memcpy(&pIdentifier->device_identifier, &IID_D3DDEVICE_D3DUID, sizeof(pIdentifier->device_identifier));
2985     pIdentifier->whql_level = (Flags & WINED3DENUM_NO_WHQL_LEVEL) ? 0 : 1;
2986     memcpy(&pIdentifier->adapter_luid, &adapter->luid, sizeof(pIdentifier->adapter_luid));
2987     pIdentifier->video_memory = adapter->TextureRam;
2988
2989     return WINED3D_OK;
2990 }
2991
2992 static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined3d_gl_info *gl_info,
2993         const WineD3D_PixelFormat *cfg, const struct wined3d_format_desc *format_desc)
2994 {
2995     short redSize, greenSize, blueSize, alphaSize, colorBits;
2996
2997     if(!cfg)
2998         return FALSE;
2999
3000     /* Float formats need FBOs. If FBOs are used this function isn't called */
3001     if (format_desc->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE;
3002
3003     if(cfg->iPixelType == WGL_TYPE_RGBA_ARB) { /* Integer RGBA formats */
3004         if (!getColorBits(format_desc, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits))
3005         {
3006             ERR("Unable to check compatibility for format %s.\n", debug_d3dformat(format_desc->id));
3007             return FALSE;
3008         }
3009
3010         if(cfg->redSize < redSize)
3011             return FALSE;
3012
3013         if(cfg->greenSize < greenSize)
3014             return FALSE;
3015
3016         if(cfg->blueSize < blueSize)
3017             return FALSE;
3018
3019         if(cfg->alphaSize < alphaSize)
3020             return FALSE;
3021
3022         return TRUE;
3023     }
3024
3025     /* Probably a RGBA_float or color index mode */
3026     return FALSE;
3027 }
3028
3029 static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3d_gl_info *gl_info,
3030         const WineD3D_PixelFormat *cfg, const struct wined3d_format_desc *format_desc)
3031 {
3032     short depthSize, stencilSize;
3033     BOOL lockable = FALSE;
3034
3035     if(!cfg)
3036         return FALSE;
3037
3038     if (!getDepthStencilBits(format_desc, &depthSize, &stencilSize))
3039     {
3040         ERR("Unable to check compatibility for format %s.\n", debug_d3dformat(format_desc->id));
3041         return FALSE;
3042     }
3043
3044     /* Float formats need FBOs. If FBOs are used this function isn't called */
3045     if (format_desc->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE;
3046
3047     if ((format_desc->id == WINED3DFMT_D16_LOCKABLE) || (format_desc->id == WINED3DFMT_D32_FLOAT))
3048         lockable = TRUE;
3049
3050     /* On some modern cards like the Geforce8/9 GLX doesn't offer some dephthstencil formats which D3D9 reports.
3051      * We can safely report 'compatible' formats (e.g. D24 can be used for D16) as long as we aren't dealing with
3052      * a lockable format. This also helps D3D <= 7 as they expect D16 which isn't offered without this on Geforce8 cards. */
3053     if(!(cfg->depthSize == depthSize || (!lockable && cfg->depthSize > depthSize)))
3054         return FALSE;
3055
3056     /* Some cards like Intel i915 ones only offer D24S8 but lots of games also need a format without stencil, so
3057      * allow more stencil bits than requested. */
3058     if(cfg->stencilSize < stencilSize)
3059         return FALSE;
3060
3061     return TRUE;
3062 }
3063
3064 static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface,
3065         UINT Adapter, WINED3DDEVTYPE DeviceType, enum wined3d_format_id AdapterFormat,
3066         enum wined3d_format_id RenderTargetFormat, enum wined3d_format_id DepthStencilFormat)
3067 {
3068     IWineD3DImpl *This = (IWineD3DImpl *)iface;
3069     int nCfgs;
3070     const WineD3D_PixelFormat *cfgs;
3071     const struct wined3d_adapter *adapter;
3072     const struct wined3d_format_desc *rt_format_desc;
3073     const struct wined3d_format_desc *ds_format_desc;
3074     int it;
3075
3076     WARN_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%x,%s), AdptFmt:(%x,%s), RendrTgtFmt:(%x,%s), DepthStencilFmt:(%x,%s))\n",
3077            This, Adapter,
3078            DeviceType, debug_d3ddevicetype(DeviceType),
3079            AdapterFormat, debug_d3dformat(AdapterFormat),
3080            RenderTargetFormat, debug_d3dformat(RenderTargetFormat),
3081            DepthStencilFormat, debug_d3dformat(DepthStencilFormat));
3082
3083     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
3084         TRACE("(%p) Failed: Atapter (%u) higher than supported adapters (%u) returning WINED3DERR_INVALIDCALL\n", This, Adapter, IWineD3D_GetAdapterCount(iface));
3085         return WINED3DERR_INVALIDCALL;
3086     }
3087
3088     adapter = &This->adapters[Adapter];
3089     rt_format_desc = getFormatDescEntry(RenderTargetFormat, &adapter->gl_info);
3090     ds_format_desc = getFormatDescEntry(DepthStencilFormat, &adapter->gl_info);
3091     if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
3092     {
3093         if ((rt_format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET) &&
3094             (ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) {
3095             TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
3096             return WINED3D_OK;
3097         }
3098     }
3099     else
3100     {
3101         cfgs = adapter->cfgs;
3102         nCfgs = adapter->nCfgs;
3103         for (it = 0; it < nCfgs; ++it) {
3104             if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, &cfgs[it], rt_format_desc))
3105             {
3106                 if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[it], ds_format_desc))
3107                 {
3108                     TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
3109                     return WINED3D_OK;
3110                 }
3111             }
3112         }
3113     }
3114     WARN_(d3d_caps)("unsupported format pair: %s and %s\n", debug_d3dformat(RenderTargetFormat), debug_d3dformat(DepthStencilFormat));
3115
3116     return WINED3DERR_NOTAVAILABLE;
3117 }
3118
3119 static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, UINT Adapter,
3120         WINED3DDEVTYPE DeviceType, enum wined3d_format_id SurfaceFormat, BOOL Windowed,
3121         WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQualityLevels)
3122 {
3123     IWineD3DImpl *This = (IWineD3DImpl *)iface;
3124     const struct wined3d_format_desc *glDesc;
3125     const struct wined3d_adapter *adapter;
3126
3127     TRACE_(d3d_caps)("(%p)-> (Adptr:%d, DevType:(%x,%s), SurfFmt:(%x,%s), Win?%d, MultiSamp:%x, pQual:%p)\n",
3128           This,
3129           Adapter,
3130           DeviceType, debug_d3ddevicetype(DeviceType),
3131           SurfaceFormat, debug_d3dformat(SurfaceFormat),
3132           Windowed,
3133           MultiSampleType,
3134           pQualityLevels);
3135
3136     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
3137         return WINED3DERR_INVALIDCALL;
3138     }
3139
3140     /* TODO: handle Windowed, add more quality levels */
3141
3142     if (WINED3DMULTISAMPLE_NONE == MultiSampleType) {
3143         if(pQualityLevels) *pQualityLevels = 1;
3144         return WINED3D_OK;
3145     }
3146
3147     /* By default multisampling is disabled right now as it causes issues
3148      * on some Nvidia driver versions and it doesn't work well in combination
3149      * with FBOs yet. */
3150     if(!wined3d_settings.allow_multisampling)
3151         return WINED3DERR_NOTAVAILABLE;
3152
3153     adapter = &This->adapters[Adapter];
3154     glDesc = getFormatDescEntry(SurfaceFormat, &adapter->gl_info);
3155     if (!glDesc) return WINED3DERR_INVALIDCALL;
3156
3157     if(glDesc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) {
3158         int i, nCfgs;
3159         const WineD3D_PixelFormat *cfgs;
3160
3161         cfgs = adapter->cfgs;
3162         nCfgs = adapter->nCfgs;
3163         for(i=0; i<nCfgs; i++) {
3164             if(cfgs[i].numSamples != MultiSampleType)
3165                 continue;
3166
3167             if (!IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[i], glDesc))
3168                 continue;
3169
3170             TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat));
3171
3172             if(pQualityLevels)
3173                 *pQualityLevels = 1; /* Guess at a value! */
3174             return WINED3D_OK;
3175         }
3176     }
3177     else if(glDesc->Flags & WINED3DFMT_FLAG_RENDERTARGET) {
3178         short redSize, greenSize, blueSize, alphaSize, colorBits;
3179         int i, nCfgs;
3180         const WineD3D_PixelFormat *cfgs;
3181
3182         if (!getColorBits(glDesc, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits))
3183         {
3184             ERR("Unable to color bits for format %#x, can't check multisampling capability!\n", SurfaceFormat);
3185             return WINED3DERR_NOTAVAILABLE;
3186         }
3187
3188         cfgs = adapter->cfgs;
3189         nCfgs = adapter->nCfgs;
3190         for(i=0; i<nCfgs; i++) {
3191             if(cfgs[i].numSamples != MultiSampleType)
3192                 continue;
3193             if(cfgs[i].redSize != redSize)
3194                 continue;
3195             if(cfgs[i].greenSize != greenSize)
3196                 continue;
3197             if(cfgs[i].blueSize != blueSize)
3198                 continue;
3199             /* Not all drivers report alpha-less formats since they use 32-bit anyway, so accept alpha even if we didn't ask for it. */
3200             if(alphaSize && cfgs[i].alphaSize != alphaSize)
3201                 continue;
3202             if(cfgs[i].colorSize != (glDesc->byte_count << 3))
3203                 continue;
3204
3205             TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat));
3206
3207             if(pQualityLevels)
3208                 *pQualityLevels = 1; /* Guess at a value! */
3209             return WINED3D_OK;
3210         }
3211     }
3212     return WINED3DERR_NOTAVAILABLE;
3213 }
3214
3215 static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
3216         enum wined3d_format_id DisplayFormat, enum wined3d_format_id BackBufferFormat, BOOL Windowed)
3217 {
3218     HRESULT hr = WINED3DERR_NOTAVAILABLE;
3219     UINT nmodes;
3220
3221     TRACE("iface %p, adapter_idx %u, device_type %s, display_format %s, backbuffer_format %s, windowed %#x.\n",
3222             iface, Adapter, debug_d3ddevicetype(DeviceType), debug_d3dformat(DisplayFormat),
3223             debug_d3dformat(BackBufferFormat), Windowed);
3224
3225     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
3226         WARN_(d3d_caps)("Adapter >= IWineD3D_GetAdapterCount(iface), returning WINED3DERR_INVALIDCALL\n");
3227         return WINED3DERR_INVALIDCALL;
3228     }
3229
3230     /* The task of this function is to check whether a certain display / backbuffer format
3231      * combination is available on the given adapter. In fullscreen mode microsoft specified
3232      * that the display format shouldn't provide alpha and that ignoring alpha the backbuffer
3233      * and display format should match exactly.
3234      * In windowed mode format conversion can occur and this depends on the driver. When format
3235      * conversion is done, this function should nevertheless fail and applications need to use
3236      * CheckDeviceFormatConversion.
3237      * At the moment we assume that fullscreen and windowed have the same capabilities */
3238
3239     /* There are only 4 display formats */
3240     if (!(DisplayFormat == WINED3DFMT_B5G6R5_UNORM
3241             || DisplayFormat == WINED3DFMT_B5G5R5X1_UNORM
3242             || DisplayFormat == WINED3DFMT_B8G8R8X8_UNORM
3243             || DisplayFormat == WINED3DFMT_B10G10R10A2_UNORM))
3244     {
3245         TRACE_(d3d_caps)("Format %s unsupported as display format\n", debug_d3dformat(DisplayFormat));
3246         return WINED3DERR_NOTAVAILABLE;
3247     }
3248
3249     /* If the requested DisplayFormat is not available, don't continue */
3250     nmodes = IWineD3DImpl_GetAdapterModeCount(iface, Adapter, DisplayFormat);
3251     if(!nmodes) {
3252         TRACE_(d3d_caps)("No available modes for display format %s\n", debug_d3dformat(DisplayFormat));
3253         return WINED3DERR_NOTAVAILABLE;
3254     }
3255
3256     /* Windowed mode allows you to specify WINED3DFMT_UNKNOWN for the backbufferformat, it means 'reuse' the display format for the backbuffer */
3257     if(!Windowed && BackBufferFormat == WINED3DFMT_UNKNOWN) {
3258         TRACE_(d3d_caps)("BackBufferFormat WINED3FMT_UNKNOWN not available in Windowed mode\n");
3259         return WINED3DERR_NOTAVAILABLE;
3260     }
3261
3262     /* In FULLSCREEN mode R5G6B5 can only be mixed with backbuffer format R5G6B5 */
3263     if (DisplayFormat == WINED3DFMT_B5G6R5_UNORM && BackBufferFormat != WINED3DFMT_B5G6R5_UNORM)
3264     {
3265         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat));
3266         return WINED3DERR_NOTAVAILABLE;
3267     }
3268
3269     /* In FULLSCREEN mode X1R5G5B5 can only be mixed with backbuffer format *1R5G5B5 */
3270     if (DisplayFormat == WINED3DFMT_B5G5R5X1_UNORM
3271             && !(BackBufferFormat == WINED3DFMT_B5G5R5X1_UNORM || BackBufferFormat == WINED3DFMT_B5G5R5A1_UNORM))
3272     {
3273         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat));
3274         return WINED3DERR_NOTAVAILABLE;
3275     }
3276
3277     /* In FULLSCREEN mode X8R8G8B8 can only be mixed with backbuffer format *8R8G8B8 */
3278     if (DisplayFormat == WINED3DFMT_B8G8R8X8_UNORM
3279             && !(BackBufferFormat == WINED3DFMT_B8G8R8X8_UNORM || BackBufferFormat == WINED3DFMT_B8G8R8A8_UNORM))
3280     {
3281         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat));
3282         return WINED3DERR_NOTAVAILABLE;
3283     }
3284
3285     /* A2R10G10B10 is only allowed in fullscreen mode and it can only be mixed with backbuffer format A2R10G10B10 */
3286     if (DisplayFormat == WINED3DFMT_B10G10R10A2_UNORM
3287             && (BackBufferFormat != WINED3DFMT_B10G10R10A2_UNORM || Windowed))
3288     {
3289         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat));
3290         return WINED3DERR_NOTAVAILABLE;
3291     }
3292
3293     /* Use CheckDeviceFormat to see if the BackBufferFormat is usable with the given DisplayFormat */
3294     hr = IWineD3DImpl_CheckDeviceFormat(iface, Adapter, DeviceType, DisplayFormat, WINED3DUSAGE_RENDERTARGET, WINED3DRTYPE_SURFACE, BackBufferFormat, SURFACE_OPENGL);
3295     if(FAILED(hr))
3296         TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat));
3297
3298     return hr;
3299 }
3300
3301
3302 /* Check if we support bumpmapping for a format */
3303 static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
3304 {
3305     /* Ask the fixed function pipeline implementation if it can deal
3306      * with the conversion. If we've got a GL extension giving native
3307      * support this will be an identity conversion. */
3308     return (format_desc->Flags & WINED3DFMT_FLAG_BUMPMAP)
3309             && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup);
3310 }
3311
3312 /* Check if the given DisplayFormat + DepthStencilFormat combination is valid for the Adapter */
3313 static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter,
3314         const struct wined3d_format_desc *display_format_desc, const struct wined3d_format_desc *ds_format_desc)
3315 {
3316     int it=0;
3317
3318     /* Only allow depth/stencil formats */
3319     if (!(ds_format_desc->depth_size || ds_format_desc->stencil_size)) return FALSE;
3320
3321     if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
3322     {
3323         /* With FBOs WGL limitations do not apply, but the format needs to be FBO attachable */
3324         if (ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) return TRUE;
3325     }
3326     else
3327     {
3328         /* Walk through all WGL pixel formats to find a match */
3329         for (it = 0; it < adapter->nCfgs; ++it)
3330         {
3331             WineD3D_PixelFormat *cfg = &adapter->cfgs[it];
3332             if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, cfg, display_format_desc))
3333             {
3334                 if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, cfg, ds_format_desc))
3335                 {
3336                     return TRUE;
3337                 }
3338             }
3339         }
3340     }
3341
3342     return FALSE;
3343 }
3344
3345 static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
3346 {
3347     /* The flags entry of a format contains the filtering capability */
3348     if (format_desc->Flags & WINED3DFMT_FLAG_FILTERING) return TRUE;
3349
3350     return FALSE;
3351 }
3352
3353 /* Check the render target capabilities of a format */
3354 static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
3355         const struct wined3d_format_desc *adapter_format_desc, const struct wined3d_format_desc *check_format_desc)
3356 {
3357     /* Filter out non-RT formats */
3358     if (!(check_format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET)) return FALSE;
3359     if(wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) {
3360         WineD3D_PixelFormat *cfgs = adapter->cfgs;
3361         int it;
3362         short AdapterRed, AdapterGreen, AdapterBlue, AdapterAlpha, AdapterTotalSize;
3363         short CheckRed, CheckGreen, CheckBlue, CheckAlpha, CheckTotalSize;
3364
3365         getColorBits(adapter_format_desc, &AdapterRed, &AdapterGreen, &AdapterBlue, &AdapterAlpha, &AdapterTotalSize);
3366         getColorBits(check_format_desc, &CheckRed, &CheckGreen, &CheckBlue, &CheckAlpha, &CheckTotalSize);
3367
3368         /* In backbuffer mode the front and backbuffer share the same WGL pixelformat.
3369          * The format must match in RGB, alpha is allowed to be different. (Only the backbuffer can have alpha) */
3370         if(!((AdapterRed == CheckRed) && (AdapterGreen == CheckGreen) && (AdapterBlue == CheckBlue))) {
3371             TRACE_(d3d_caps)("[FAILED]\n");
3372             return FALSE;
3373         }
3374
3375         /* Check if there is a WGL pixel format matching the requirements, the format should also be window
3376          * drawable (not offscreen; e.g. Nvidia offers R5G6B5 for pbuffers even when X is running at 24bit) */
3377         for (it = 0; it < adapter->nCfgs; ++it)
3378         {
3379             if (cfgs[it].windowDrawable && IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info,
3380                     &cfgs[it], check_format_desc))
3381             {
3382                 TRACE_(d3d_caps)("Pixel format %d is compatible with format %s.\n",
3383                         cfgs[it].iPixelFormat, debug_d3dformat(check_format_desc->id));
3384                 return TRUE;
3385             }
3386         }
3387     }
3388     else if(wined3d_settings.offscreen_rendering_mode == ORM_FBO)
3389     {
3390         /* For now return TRUE for FBOs until we have some proper checks.
3391          * Note that this function will only be called when the format is around for texturing. */
3392         return TRUE;
3393     }
3394     return FALSE;
3395 }
3396
3397 static BOOL CheckSrgbReadCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
3398 {
3399     return adapter->gl_info.supported[EXT_TEXTURE_SRGB]
3400             && (format_desc->Flags & WINED3DFMT_FLAG_SRGB_READ);
3401 }
3402
3403 static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
3404 {
3405     /* Only offer SRGB writing on X8R8G8B8/A8R8G8B8 when we use ARB or GLSL shaders as we are
3406      * doing the color fixup in shaders.
3407      * Note Windows drivers (at least on the Geforce 8800) also offer this on R5G6B5. */
3408     if (format_desc->Flags & WINED3DFMT_FLAG_SRGB_WRITE)
3409     {
3410         int vs_selected_mode;
3411         int ps_selected_mode;
3412         select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
3413
3414         if((ps_selected_mode == SHADER_ARB) || (ps_selected_mode == SHADER_GLSL)) {
3415             TRACE_(d3d_caps)("[OK]\n");
3416             return TRUE;
3417         }
3418     }
3419
3420     TRACE_(d3d_caps)("[FAILED] - sRGB writes not supported by format %s.\n", debug_d3dformat(format_desc->id));
3421     return FALSE;
3422 }
3423
3424 /* Check if a format support blending in combination with pixel shaders */
3425 static BOOL CheckPostPixelShaderBlendingCapability(struct wined3d_adapter *adapter,
3426         const struct wined3d_format_desc *format_desc)
3427 {
3428     /* The flags entry of a format contains the post pixel shader blending capability */
3429     if (format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) return TRUE;
3430
3431     return FALSE;
3432 }
3433
3434 static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
3435 {
3436     /* OpenGL supports mipmapping on all formats basically. Wrapping is unsupported,
3437      * but we have to report mipmapping so we cannot reject this flag. Tests show that
3438      * windows reports WRAPANDMIP on unfilterable surfaces as well, apparently to show
3439      * that wrapping is supported. The lack of filtering will sort out the mipmapping
3440      * capability anyway.
3441      *
3442      * For now lets report this on all formats, but in the future we may want to
3443      * restrict it to some should games need that
3444      */
3445     return TRUE;
3446 }
3447
3448 /* Check if a texture format is supported on the given adapter */
3449 static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
3450 {
3451     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
3452
3453     switch (format_desc->id)
3454     {
3455         /*****
3456          *  supported: RGB(A) formats
3457          */
3458         case WINED3DFMT_B8G8R8_UNORM: /* Enable for dx7, blacklisted for 8 and 9 above */
3459         case WINED3DFMT_B8G8R8A8_UNORM:
3460         case WINED3DFMT_B8G8R8X8_UNORM:
3461         case WINED3DFMT_B5G6R5_UNORM:
3462         case WINED3DFMT_B5G5R5X1_UNORM:
3463         case WINED3DFMT_B5G5R5A1_UNORM:
3464         case WINED3DFMT_B4G4R4A4_UNORM:
3465         case WINED3DFMT_A8_UNORM:
3466         case WINED3DFMT_B4G4R4X4_UNORM:
3467         case WINED3DFMT_R8G8B8A8_UNORM:
3468         case WINED3DFMT_R8G8B8X8_UNORM:
3469         case WINED3DFMT_B10G10R10A2_UNORM:
3470         case WINED3DFMT_R10G10B10A2_UNORM:
3471         case WINED3DFMT_R16G16_UNORM:
3472             TRACE_(d3d_caps)("[OK]\n");
3473             return TRUE;
3474
3475         case WINED3DFMT_B2G3R3_UNORM:
3476             TRACE_(d3d_caps)("[FAILED] - Not supported on Windows\n");
3477             return FALSE;
3478
3479         /*****
3480          *  Not supported: Palettized
3481          *  Only some Geforce/Voodoo3/G400 cards offer 8-bit textures in case of <=Direct3D7.
3482          *  Since it is not widely available, don't offer it. Further no Windows driver offers
3483          *  WINED3DFMT_P8_UINT_A8_NORM, so don't offer it either.
3484          */
3485         case WINED3DFMT_P8_UINT:
3486         case WINED3DFMT_P8_UINT_A8_UNORM:
3487             return FALSE;
3488
3489         /*****
3490          *  Supported: (Alpha)-Luminance
3491          */
3492         case WINED3DFMT_L8_UNORM:
3493         case WINED3DFMT_L8A8_UNORM:
3494         case WINED3DFMT_L16_UNORM:
3495             TRACE_(d3d_caps)("[OK]\n");
3496             return TRUE;
3497
3498         /* Not supported on Windows, thus disabled */
3499         case WINED3DFMT_L4A4_UNORM:
3500             TRACE_(d3d_caps)("[FAILED] - not supported on windows\n");
3501             return FALSE;
3502
3503         /*****
3504          *  Supported: Depth/Stencil formats
3505          */
3506         case WINED3DFMT_D16_LOCKABLE:
3507         case WINED3DFMT_D16_UNORM:
3508         case WINED3DFMT_S1_UINT_D15_UNORM:
3509         case WINED3DFMT_X8D24_UNORM:
3510         case WINED3DFMT_S4X4_UINT_D24_UNORM:
3511         case WINED3DFMT_D24_UNORM_S8_UINT:
3512         case WINED3DFMT_S8_UINT_D24_FLOAT:
3513         case WINED3DFMT_D32_UNORM:
3514         case WINED3DFMT_D32_FLOAT:
3515             return TRUE;
3516
3517         /*****
3518          *  Not supported everywhere(depends on GL_ATI_envmap_bumpmap or
3519          *  GL_NV_texture_shader). Emulated by shaders
3520          */
3521         case WINED3DFMT_R8G8_SNORM:
3522         case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
3523         case WINED3DFMT_R5G5_SNORM_L6_UNORM:
3524         case WINED3DFMT_R8G8B8A8_SNORM:
3525         case WINED3DFMT_R16G16_SNORM:
3526             /* Ask the shader backend if it can deal with the conversion. If
3527              * we've got a GL extension giving native support this will be an
3528              * identity conversion. */
3529             if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
3530             {
3531                 TRACE_(d3d_caps)("[OK]\n");
3532                 return TRUE;
3533             }
3534             TRACE_(d3d_caps)("[FAILED]\n");
3535             return FALSE;
3536
3537         case WINED3DFMT_DXT1:
3538         case WINED3DFMT_DXT2:
3539         case WINED3DFMT_DXT3:
3540         case WINED3DFMT_DXT4:
3541         case WINED3DFMT_DXT5:
3542             if (gl_info->supported[EXT_TEXTURE_COMPRESSION_S3TC])
3543             {
3544                 TRACE_(d3d_caps)("[OK]\n");
3545                 return TRUE;
3546             }
3547             TRACE_(d3d_caps)("[FAILED]\n");
3548             return FALSE;
3549
3550
3551         /*****
3552          *  Odd formats - not supported
3553          */
3554         case WINED3DFMT_VERTEXDATA:
3555         case WINED3DFMT_R16_UINT:
3556         case WINED3DFMT_R32_UINT:
3557         case WINED3DFMT_R16G16B16A16_SNORM:
3558         case WINED3DFMT_R10G10B10_SNORM_A2_UNORM:
3559         case WINED3DFMT_R10G11B11_SNORM:
3560             TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */
3561             return FALSE;
3562
3563         /*****
3564          *  WINED3DFMT_R8G8_SNORM_Cx: Not supported right now
3565          */
3566         case WINED3DFMT_R8G8_SNORM_Cx:
3567             TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */
3568             return FALSE;
3569
3570         /* YUV formats */
3571         case WINED3DFMT_UYVY:
3572         case WINED3DFMT_YUY2:
3573             if (gl_info->supported[APPLE_YCBCR_422])
3574             {
3575                 TRACE_(d3d_caps)("[OK]\n");
3576                 return TRUE;
3577             }
3578             TRACE_(d3d_caps)("[FAILED]\n");
3579             return FALSE;
3580         case WINED3DFMT_YV12:
3581             TRACE_(d3d_caps)("[FAILED]\n");
3582             return FALSE;
3583
3584             /* Not supported */
3585         case WINED3DFMT_R16G16B16A16_UNORM:
3586         case WINED3DFMT_B2G3R3A8_UNORM:
3587             TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */
3588             return FALSE;
3589
3590             /* Floating point formats */
3591         case WINED3DFMT_R16_FLOAT:
3592         case WINED3DFMT_R16G16_FLOAT:
3593         case WINED3DFMT_R16G16B16A16_FLOAT:
3594             if (gl_info->supported[ARB_TEXTURE_FLOAT] && gl_info->supported[ARB_HALF_FLOAT_PIXEL])
3595             {
3596                 TRACE_(d3d_caps)("[OK]\n");
3597                 return TRUE;
3598             }
3599             TRACE_(d3d_caps)("[FAILED]\n");
3600             return FALSE;
3601
3602         case WINED3DFMT_R32_FLOAT:
3603         case WINED3DFMT_R32G32_FLOAT:
3604         case WINED3DFMT_R32G32B32A32_FLOAT:
3605             if (gl_info->supported[ARB_TEXTURE_FLOAT])
3606             {
3607                 TRACE_(d3d_caps)("[OK]\n");
3608                 return TRUE;
3609             }
3610             TRACE_(d3d_caps)("[FAILED]\n");
3611             return FALSE;
3612
3613         /* ATI instancing hack: Although ATI cards do not support Shader Model 3.0, they support
3614          * instancing. To query if the card supports instancing CheckDeviceFormat with the special format
3615          * MAKEFOURCC('I','N','S','T') is used. Should a (broken) app check for this provide a proper return value.
3616          * We can do instancing with all shader versions, but we need vertex shaders.
3617          *
3618          * Additionally applications have to set the D3DRS_POINTSIZE render state to MAKEFOURCC('I','N','S','T') once
3619          * to enable instancing. WineD3D doesn't need that and just ignores it.
3620          *
3621          * With Shader Model 3.0 capable cards Instancing 'just works' in Windows.
3622          */
3623         case WINED3DFMT_INST:
3624             TRACE("ATI Instancing check hack\n");
3625             if (gl_info->supported[ARB_VERTEX_PROGRAM] || gl_info->supported[ARB_VERTEX_SHADER])
3626             {
3627                 TRACE_(d3d_caps)("[OK]\n");
3628                 return TRUE;
3629             }
3630             TRACE_(d3d_caps)("[FAILED]\n");
3631             return FALSE;
3632
3633         /* Some weird FOURCC formats */
3634         case WINED3DFMT_R8G8_B8G8:
3635         case WINED3DFMT_G8R8_G8B8:
3636         case WINED3DFMT_MULTI2_ARGB8:
3637             TRACE_(d3d_caps)("[FAILED]\n");
3638             return FALSE;
3639
3640         /* Vendor specific formats */
3641         case WINED3DFMT_ATI2N:
3642             if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC]
3643                     || gl_info->supported[ARB_TEXTURE_COMPRESSION_RGTC])
3644             {
3645                 if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
3646                         && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
3647                 {
3648                     TRACE_(d3d_caps)("[OK]\n");
3649                     return TRUE;
3650                 }
3651
3652                 TRACE_(d3d_caps)("[OK]\n");
3653                 return TRUE;
3654             }
3655             TRACE_(d3d_caps)("[FAILED]\n");
3656             return FALSE;
3657
3658         case WINED3DFMT_NVHU:
3659         case WINED3DFMT_NVHS:
3660             /* These formats seem to be similar to the HILO formats in GL_NV_texture_shader. NVHU
3661              * is said to be GL_UNSIGNED_HILO16, NVHS GL_SIGNED_HILO16. Rumours say that d3d computes
3662              * a 3rd channel similarly to D3DFMT_CxV8U8(So NVHS could be called D3DFMT_CxV16U16).
3663              * ATI refused to support formats which can easilly be emulated with pixel shaders, so
3664              * Applications have to deal with not having NVHS and NVHU.
3665              */
3666             TRACE_(d3d_caps)("[FAILED]\n");
3667             return FALSE;
3668
3669         case WINED3DFMT_UNKNOWN:
3670             return FALSE;
3671
3672         default:
3673             ERR("Unhandled format %s.\n", debug_d3dformat(format_desc->id));
3674             break;
3675     }
3676     return FALSE;
3677 }
3678
3679 static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter,
3680         const struct wined3d_format_desc *adapter_format_desc,
3681         const struct wined3d_format_desc *check_format_desc,
3682         WINED3DSURFTYPE SurfaceType)
3683 {
3684     if (SurfaceType == SURFACE_GDI)
3685     {
3686         switch (check_format_desc->id)
3687         {
3688             case WINED3DFMT_B8G8R8_UNORM:
3689             case WINED3DFMT_B8G8R8A8_UNORM:
3690             case WINED3DFMT_B8G8R8X8_UNORM:
3691             case WINED3DFMT_B5G6R5_UNORM:
3692             case WINED3DFMT_B5G5R5X1_UNORM:
3693             case WINED3DFMT_B5G5R5A1_UNORM:
3694             case WINED3DFMT_B4G4R4A4_UNORM:
3695             case WINED3DFMT_B2G3R3_UNORM:
3696             case WINED3DFMT_A8_UNORM:
3697             case WINED3DFMT_B2G3R3A8_UNORM:
3698             case WINED3DFMT_B4G4R4X4_UNORM:
3699             case WINED3DFMT_R10G10B10A2_UNORM:
3700             case WINED3DFMT_R8G8B8A8_UNORM:
3701             case WINED3DFMT_R8G8B8X8_UNORM:
3702             case WINED3DFMT_R16G16_UNORM:
3703             case WINED3DFMT_B10G10R10A2_UNORM:
3704             case WINED3DFMT_R16G16B16A16_UNORM:
3705             case WINED3DFMT_P8_UINT:
3706                 TRACE_(d3d_caps)("[OK]\n");
3707                 return TRUE;
3708             default:
3709                 TRACE_(d3d_caps)("[FAILED] - not available on GDI surfaces\n");
3710                 return FALSE;
3711         }
3712     }
3713
3714     /* All format that are supported for textures are supported for surfaces as well */
3715     if (CheckTextureCapability(adapter, check_format_desc)) return TRUE;
3716     /* All depth stencil formats are supported on surfaces */
3717     if (CheckDepthStencilCapability(adapter, adapter_format_desc, check_format_desc)) return TRUE;
3718
3719     /* If opengl can't process the format natively, the blitter may be able to convert it */
3720     if (adapter->blitter->blit_supported(&adapter->gl_info, BLIT_OP_BLIT,
3721                                          NULL, WINED3DPOOL_DEFAULT, 0, check_format_desc,
3722                                          NULL, WINED3DPOOL_DEFAULT, 0, adapter_format_desc))
3723     {
3724         TRACE_(d3d_caps)("[OK]\n");
3725         return TRUE;
3726     }
3727
3728     /* Reject other formats */
3729     TRACE_(d3d_caps)("[FAILED]\n");
3730     return FALSE;
3731 }
3732
3733 static BOOL CheckVertexTextureCapability(struct wined3d_adapter *adapter,
3734         const struct wined3d_format_desc *format_desc)
3735 {
3736     return adapter->gl_info.limits.vertex_samplers
3737             && (format_desc->Flags & WINED3DFMT_FLAG_VTF);
3738 }
3739
3740 static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
3741         enum wined3d_format_id AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType,
3742         enum wined3d_format_id CheckFormat, WINED3DSURFTYPE SurfaceType)
3743 {
3744     IWineD3DImpl *This = (IWineD3DImpl *)iface;
3745     struct wined3d_adapter *adapter = &This->adapters[Adapter];
3746     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
3747     const struct wined3d_format_desc *format_desc = getFormatDescEntry(CheckFormat, gl_info);
3748     const struct wined3d_format_desc *adapter_format_desc = getFormatDescEntry(AdapterFormat, gl_info);
3749     DWORD UsageCaps = 0;
3750
3751     TRACE_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%u,%s), AdptFmt:(%u,%s), Use:(%u,%s,%s), ResTyp:(%x,%s), CheckFmt:(%u,%s))\n",
3752           This,
3753           Adapter,
3754           DeviceType, debug_d3ddevicetype(DeviceType),
3755           AdapterFormat, debug_d3dformat(AdapterFormat),
3756           Usage, debug_d3dusage(Usage), debug_d3dusagequery(Usage),
3757           RType, debug_d3dresourcetype(RType),
3758           CheckFormat, debug_d3dformat(CheckFormat));
3759
3760     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
3761         return WINED3DERR_INVALIDCALL;
3762     }
3763
3764     switch (RType)
3765     {
3766         case WINED3DRTYPE_CUBETEXTURE:
3767             /* Cubetexture allows:
3768              *      - WINED3DUSAGE_AUTOGENMIPMAP
3769              *      - WINED3DUSAGE_DEPTHSTENCIL
3770              *      - WINED3DUSAGE_DYNAMIC
3771              *      - WINED3DUSAGE_NONSECURE (d3d9ex)
3772              *      - WINED3DUSAGE_RENDERTARGET
3773              *      - WINED3DUSAGE_SOFTWAREPROCESSING
3774              *      - WINED3DUSAGE_QUERY_WRAPANDMIP
3775              */
3776             if (SurfaceType != SURFACE_OPENGL)
3777             {
3778                 TRACE_(d3d_caps)("[FAILED]\n");
3779                 return WINED3DERR_NOTAVAILABLE;
3780             }
3781
3782             if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP])
3783             {
3784                 TRACE_(d3d_caps)("[FAILED] - No cube texture support\n");
3785                 return WINED3DERR_NOTAVAILABLE;
3786             }
3787
3788             if (!CheckTextureCapability(adapter, format_desc))
3789             {
3790                 TRACE_(d3d_caps)("[FAILED] - Cube texture format not supported\n");
3791                 return WINED3DERR_NOTAVAILABLE;
3792             }
3793
3794             if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
3795             {
3796                 if (!gl_info->supported[SGIS_GENERATE_MIPMAP])
3797                     /* When autogenmipmap isn't around continue and return
3798                      * WINED3DOK_NOAUTOGEN instead of D3D_OK. */
3799                     TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
3800                 else
3801                     UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
3802             }
3803
3804             /* Always report dynamic locking. */
3805             if (Usage & WINED3DUSAGE_DYNAMIC)
3806                 UsageCaps |= WINED3DUSAGE_DYNAMIC;
3807
3808             if (Usage & WINED3DUSAGE_RENDERTARGET)
3809             {
3810                 if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
3811                 {
3812                     TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
3813                     return WINED3DERR_NOTAVAILABLE;
3814                 }
3815                 UsageCaps |= WINED3DUSAGE_RENDERTARGET;
3816             }
3817
3818             /* Always report software processing. */
3819             if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
3820                 UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
3821
3822             if (Usage & WINED3DUSAGE_QUERY_FILTER)
3823             {
3824                 if (!CheckFilterCapability(adapter, format_desc))
3825                 {
3826                     TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
3827                     return WINED3DERR_NOTAVAILABLE;
3828                 }
3829                 UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
3830             }
3831
3832             if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
3833             {
3834                 if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
3835                 {
3836                     TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
3837                     return WINED3DERR_NOTAVAILABLE;
3838                 }
3839                 UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
3840             }
3841
3842             if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
3843             {
3844                 if (!CheckSrgbReadCapability(adapter, format_desc))
3845                 {
3846                     TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
3847                     return WINED3DERR_NOTAVAILABLE;
3848                 }
3849                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
3850             }
3851
3852             if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
3853             {
3854                 if (!CheckSrgbWriteCapability(adapter, format_desc))
3855                 {
3856                     TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
3857                     return WINED3DERR_NOTAVAILABLE;
3858                 }
3859                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
3860             }
3861
3862             if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
3863             {
3864                 if (!CheckVertexTextureCapability(adapter, format_desc))
3865                 {
3866                     TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
3867                     return WINED3DERR_NOTAVAILABLE;
3868                 }
3869                 UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
3870             }
3871
3872             if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
3873             {
3874                 if (!CheckWrapAndMipCapability(adapter, format_desc))
3875                 {
3876                     TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
3877                     return WINED3DERR_NOTAVAILABLE;
3878                 }
3879                 UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
3880             }
3881             break;
3882
3883         case WINED3DRTYPE_SURFACE:
3884             /* Surface allows:
3885              *      - WINED3DUSAGE_DEPTHSTENCIL
3886              *      - WINED3DUSAGE_NONSECURE (d3d9ex)
3887              *      - WINED3DUSAGE_RENDERTARGET
3888              */
3889             if (!CheckSurfaceCapability(adapter, adapter_format_desc, format_desc, SurfaceType))
3890             {
3891                 TRACE_(d3d_caps)("[FAILED] - Not supported for plain surfaces\n");
3892                 return WINED3DERR_NOTAVAILABLE;
3893             }
3894
3895             if (Usage & WINED3DUSAGE_DEPTHSTENCIL)
3896             {
3897                 if (!CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
3898                 {
3899                     TRACE_(d3d_caps)("[FAILED] - No depthstencil support\n");
3900                     return WINED3DERR_NOTAVAILABLE;
3901                 }
3902                 UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
3903             }
3904
3905             if (Usage & WINED3DUSAGE_RENDERTARGET)
3906             {
3907                 if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
3908                 {
3909                     TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
3910                     return WINED3DERR_NOTAVAILABLE;
3911                 }
3912                 UsageCaps |= WINED3DUSAGE_RENDERTARGET;
3913             }
3914
3915             if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
3916             {
3917                 if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
3918                 {
3919                     TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
3920                     return WINED3DERR_NOTAVAILABLE;
3921                 }
3922                 UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
3923             }
3924             break;
3925
3926         case WINED3DRTYPE_TEXTURE:
3927             /* Texture allows:
3928              *      - WINED3DUSAGE_AUTOGENMIPMAP
3929              *      - WINED3DUSAGE_DEPTHSTENCIL
3930              *      - WINED3DUSAGE_DMAP
3931              *      - WINED3DUSAGE_DYNAMIC
3932              *      - WINED3DUSAGE_NONSECURE (d3d9ex)
3933              *      - WINED3DUSAGE_RENDERTARGET
3934              *      - WINED3DUSAGE_SOFTWAREPROCESSING
3935              *      - WINED3DUSAGE_TEXTAPI (d3d9ex)
3936              *      - WINED3DUSAGE_QUERY_WRAPANDMIP
3937              */
3938             if (SurfaceType != SURFACE_OPENGL)
3939             {
3940                 TRACE_(d3d_caps)("[FAILED]\n");
3941                 return WINED3DERR_NOTAVAILABLE;
3942             }
3943
3944             if (!CheckTextureCapability(adapter, format_desc))
3945             {
3946                 TRACE_(d3d_caps)("[FAILED] - Texture format not supported\n");
3947                 return WINED3DERR_NOTAVAILABLE;
3948             }
3949
3950             if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
3951             {
3952                 if (!gl_info->supported[SGIS_GENERATE_MIPMAP])
3953                     /* When autogenmipmap isn't around continue and return
3954                      * WINED3DOK_NOAUTOGEN instead of D3D_OK. */
3955                     TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
3956                 else
3957                     UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
3958             }
3959
3960             /* Always report dynamic locking. */
3961             if (Usage & WINED3DUSAGE_DYNAMIC)
3962                 UsageCaps |= WINED3DUSAGE_DYNAMIC;
3963
3964             if (Usage & WINED3DUSAGE_RENDERTARGET)
3965             {
3966                 if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
3967                 {
3968                     TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
3969                     return WINED3DERR_NOTAVAILABLE;
3970                 }
3971                 UsageCaps |= WINED3DUSAGE_RENDERTARGET;
3972             }
3973
3974             /* Always report software processing. */
3975             if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
3976                 UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
3977
3978             if (Usage & WINED3DUSAGE_QUERY_FILTER)
3979             {
3980                 if (!CheckFilterCapability(adapter, format_desc))
3981                 {
3982                     TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
3983                     return WINED3DERR_NOTAVAILABLE;
3984                 }
3985                 UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
3986             }
3987
3988             if (Usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP)
3989             {
3990                 if (!CheckBumpMapCapability(adapter, format_desc))
3991                 {
3992                     TRACE_(d3d_caps)("[FAILED] - No legacy bumpmap support\n");
3993                     return WINED3DERR_NOTAVAILABLE;
3994                 }
3995                 UsageCaps |= WINED3DUSAGE_QUERY_LEGACYBUMPMAP;
3996             }
3997
3998             if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
3999             {
4000                 if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
4001                 {
4002                     TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
4003                     return WINED3DERR_NOTAVAILABLE;
4004                 }
4005                 UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
4006             }
4007
4008             if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
4009             {
4010                 if (!CheckSrgbReadCapability(adapter, format_desc))
4011                 {
4012                     TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
4013                     return WINED3DERR_NOTAVAILABLE;
4014                 }
4015                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
4016             }
4017
4018             if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
4019             {
4020                 if (!CheckSrgbWriteCapability(adapter, format_desc))
4021                 {
4022                     TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
4023                     return WINED3DERR_NOTAVAILABLE;
4024                 }
4025                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
4026             }
4027
4028             if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
4029             {
4030                 if (!CheckVertexTextureCapability(adapter, format_desc))
4031                 {
4032                     TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
4033                     return WINED3DERR_NOTAVAILABLE;
4034                 }
4035                 UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
4036             }
4037
4038             if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
4039             {
4040                 if (!CheckWrapAndMipCapability(adapter, format_desc))
4041                 {
4042                     TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
4043                     return WINED3DERR_NOTAVAILABLE;
4044                 }
4045                 UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
4046             }
4047
4048             if (Usage & WINED3DUSAGE_DEPTHSTENCIL)
4049             {
4050                 if (!CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
4051                 {
4052                     TRACE_(d3d_caps)("[FAILED] - No depth stencil support\n");
4053                     return WINED3DERR_NOTAVAILABLE;
4054                 }
4055                 if ((format_desc->Flags & WINED3DFMT_FLAG_SHADOW) && !gl_info->supported[ARB_SHADOW])
4056                 {
4057                     TRACE_(d3d_caps)("[FAILED] - No shadow sampler support.\n");
4058                     return WINED3DERR_NOTAVAILABLE;
4059                 }
4060                 UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
4061             }
4062             break;
4063
4064         case WINED3DRTYPE_VOLUMETEXTURE:
4065         case WINED3DRTYPE_VOLUME:
4066             /* Volume is to VolumeTexture what Surface is to Texture, but its
4067              * usage caps are not documented. Most driver seem to offer
4068              * (nearly) the same on Volume and VolumeTexture, so do that too.
4069              *
4070              * Volumetexture allows:
4071              *      - D3DUSAGE_DYNAMIC
4072              *      - D3DUSAGE_NONSECURE (d3d9ex)
4073              *      - D3DUSAGE_SOFTWAREPROCESSING
4074              *      - D3DUSAGE_QUERY_WRAPANDMIP
4075              */
4076             if (SurfaceType != SURFACE_OPENGL)
4077             {
4078                 TRACE_(d3d_caps)("[FAILED]\n");
4079                 return WINED3DERR_NOTAVAILABLE;
4080             }
4081
4082             if (!gl_info->supported[EXT_TEXTURE3D])
4083             {
4084                 TRACE_(d3d_caps)("[FAILED] - No volume texture support\n");
4085                 return WINED3DERR_NOTAVAILABLE;
4086             }
4087
4088             if (!CheckTextureCapability(adapter, format_desc))
4089             {
4090                 TRACE_(d3d_caps)("[FAILED] - Format not supported\n");
4091                 return WINED3DERR_NOTAVAILABLE;
4092             }
4093
4094             /* Filter formats that need conversion; For one part, this
4095              * conversion is unimplemented, and volume textures are huge, so
4096              * it would be a big performance hit. Unless we hit an application
4097              * needing one of those formats, don't advertize them to avoid
4098              * leading applications into temptation. The windows drivers don't
4099              * support most of those formats on volumes anyway, except for
4100              * WINED3DFMT_R32_FLOAT. */
4101             switch (CheckFormat)
4102             {
4103                 case WINED3DFMT_P8_UINT:
4104                 case WINED3DFMT_L4A4_UNORM:
4105                 case WINED3DFMT_R32_FLOAT:
4106                 case WINED3DFMT_R16_FLOAT:
4107                 case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
4108                 case WINED3DFMT_R5G5_SNORM_L6_UNORM:
4109                 case WINED3DFMT_R16G16_UNORM:
4110                     TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
4111                     return WINED3DERR_NOTAVAILABLE;
4112
4113                 case WINED3DFMT_R8G8B8A8_SNORM:
4114                 case WINED3DFMT_R16G16_SNORM:
4115                     if (!gl_info->supported[NV_TEXTURE_SHADER])
4116                     {
4117                         TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
4118                         return WINED3DERR_NOTAVAILABLE;
4119                     }
4120                     break;
4121
4122                 case WINED3DFMT_R8G8_SNORM:
4123                     if (!gl_info->supported[NV_TEXTURE_SHADER])
4124                     {
4125                         TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
4126                         return WINED3DERR_NOTAVAILABLE;
4127                     }
4128                     break;
4129
4130                 case WINED3DFMT_DXT1:
4131                 case WINED3DFMT_DXT2:
4132                 case WINED3DFMT_DXT3:
4133                 case WINED3DFMT_DXT4:
4134                 case WINED3DFMT_DXT5:
4135                     /* The GL_EXT_texture_compression_s3tc spec requires that
4136                      * loading an s3tc compressed texture results in an error.
4137                      * While the D3D refrast does support s3tc volumes, at
4138                      * least the nvidia windows driver does not, so we're free
4139                      * not to support this format. */
4140                     TRACE_(d3d_caps)("[FAILED] - DXTn does not support 3D textures\n");
4141                     return WINED3DERR_NOTAVAILABLE;
4142
4143                 default:
4144                     /* Do nothing, continue with checking the format below */
4145                     break;
4146             }
4147
4148             /* Always report dynamic locking. */
4149             if (Usage & WINED3DUSAGE_DYNAMIC)
4150                 UsageCaps |= WINED3DUSAGE_DYNAMIC;
4151
4152             /* Always report software processing. */
4153             if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
4154                 UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
4155
4156             if (Usage & WINED3DUSAGE_QUERY_FILTER)
4157             {
4158                 if (!CheckFilterCapability(adapter, format_desc))
4159                 {
4160                     TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
4161                     return WINED3DERR_NOTAVAILABLE;
4162                 }
4163                 UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
4164             }
4165
4166             if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
4167             {
4168                 if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
4169                 {
4170                     TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
4171                     return WINED3DERR_NOTAVAILABLE;
4172                 }
4173                 UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
4174             }
4175
4176             if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
4177             {
4178                 if (!CheckSrgbReadCapability(adapter, format_desc))
4179                 {
4180                     TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
4181                     return WINED3DERR_NOTAVAILABLE;
4182                 }
4183                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
4184             }
4185
4186             if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
4187             {
4188                 if (!CheckSrgbWriteCapability(adapter, format_desc))
4189                 {
4190                     TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
4191                     return WINED3DERR_NOTAVAILABLE;
4192                 }
4193                 UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
4194             }
4195
4196             if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
4197             {
4198                 if (!CheckVertexTextureCapability(adapter, format_desc))
4199                 {
4200                     TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
4201                     return WINED3DERR_NOTAVAILABLE;
4202                 }
4203                 UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
4204             }
4205
4206             if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
4207             {
4208                 if (!CheckWrapAndMipCapability(adapter, format_desc))
4209                 {
4210                     TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
4211                     return WINED3DERR_NOTAVAILABLE;
4212                 }
4213                 UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
4214             }
4215             break;
4216
4217         default:
4218             FIXME_(d3d_caps)("Unhandled resource type %s.\n", debug_d3dresourcetype(RType));
4219             return WINED3DERR_NOTAVAILABLE;
4220     }
4221
4222     /* When the UsageCaps exactly matches Usage return WINED3D_OK except for
4223      * the situation in which WINED3DUSAGE_AUTOGENMIPMAP isn't around, then
4224      * WINED3DOK_NOAUTOGEN is returned if all the other usage flags match. */
4225     if (UsageCaps == Usage)
4226         return WINED3D_OK;
4227     if (UsageCaps == (Usage & ~WINED3DUSAGE_AUTOGENMIPMAP))
4228         return WINED3DOK_NOAUTOGEN;
4229
4230     TRACE_(d3d_caps)("[FAILED] - Usage %#x requested for CheckFormat %s and RType %s but only %#x is available\n",
4231             Usage, debug_d3dformat(CheckFormat), debug_d3dresourcetype(RType), UsageCaps);
4232
4233     return WINED3DERR_NOTAVAILABLE;
4234 }
4235
4236 static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormatConversion(IWineD3D *iface, UINT adapter_idx,
4237         WINED3DDEVTYPE device_type, enum wined3d_format_id src_format, enum wined3d_format_id dst_format)
4238 {
4239     FIXME("iface %p, adapter_idx %u, device_type %s, src_format %s, dst_format %s stub!\n",
4240             iface, adapter_idx, debug_d3ddevicetype(device_type), debug_d3dformat(src_format),
4241             debug_d3dformat(dst_format));
4242
4243     return WINED3D_OK;
4244 }
4245
4246 /* Note: d3d8 passes in a pointer to a D3DCAPS8 structure, which is a true
4247       subset of a D3DCAPS9 structure. However, it has to come via a void *
4248       as the d3d8 interface cannot import the d3d9 header                  */
4249 static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DCAPS* pCaps) {
4250
4251     IWineD3DImpl    *This = (IWineD3DImpl *)iface;
4252     struct wined3d_adapter *adapter = &This->adapters[Adapter];
4253     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
4254     int vs_selected_mode;
4255     int ps_selected_mode;
4256     struct shader_caps shader_caps;
4257     struct fragment_caps fragment_caps;
4258     DWORD ckey_caps, blit_caps, fx_caps;
4259
4260     TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
4261
4262     if (Adapter >= IWineD3D_GetAdapterCount(iface)) {
4263         return WINED3DERR_INVALIDCALL;
4264     }
4265
4266     select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
4267
4268     /* ------------------------------------------------
4269        The following fields apply to both d3d8 and d3d9
4270        ------------------------------------------------ */
4271     pCaps->DeviceType              = (DeviceType == WINED3DDEVTYPE_HAL) ? WINED3DDEVTYPE_HAL : WINED3DDEVTYPE_REF;  /* Not quite true, but use h/w supported by opengl I suppose */
4272     pCaps->AdapterOrdinal          = Adapter;
4273
4274     pCaps->Caps                    = 0;
4275     pCaps->Caps2                   = WINED3DCAPS2_CANRENDERWINDOWED |
4276                                      WINED3DCAPS2_FULLSCREENGAMMA |
4277                                      WINED3DCAPS2_DYNAMICTEXTURES;
4278     if (gl_info->supported[SGIS_GENERATE_MIPMAP])
4279     {
4280         pCaps->Caps2 |= WINED3DCAPS2_CANAUTOGENMIPMAP;
4281     }
4282
4283     pCaps->Caps3                   = WINED3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD |
4284                                      WINED3DCAPS3_COPY_TO_VIDMEM                   |
4285                                      WINED3DCAPS3_COPY_TO_SYSTEMMEM;
4286
4287     pCaps->PresentationIntervals   = WINED3DPRESENT_INTERVAL_IMMEDIATE  |
4288                                      WINED3DPRESENT_INTERVAL_ONE;
4289
4290     pCaps->CursorCaps              = WINED3DCURSORCAPS_COLOR            |
4291                                      WINED3DCURSORCAPS_LOWRES;
4292
4293     pCaps->DevCaps                 = WINED3DDEVCAPS_FLOATTLVERTEX       |
4294                                      WINED3DDEVCAPS_EXECUTESYSTEMMEMORY |
4295                                      WINED3DDEVCAPS_TLVERTEXSYSTEMMEMORY|
4296                                      WINED3DDEVCAPS_TLVERTEXVIDEOMEMORY |
4297                                      WINED3DDEVCAPS_DRAWPRIMTLVERTEX    |
4298                                      WINED3DDEVCAPS_HWTRANSFORMANDLIGHT |
4299                                      WINED3DDEVCAPS_EXECUTEVIDEOMEMORY  |
4300                                      WINED3DDEVCAPS_PUREDEVICE          |
4301                                      WINED3DDEVCAPS_HWRASTERIZATION     |
4302                                      WINED3DDEVCAPS_TEXTUREVIDEOMEMORY  |
4303                                      WINED3DDEVCAPS_TEXTURESYSTEMMEMORY |
4304                                      WINED3DDEVCAPS_CANRENDERAFTERFLIP  |
4305                                      WINED3DDEVCAPS_DRAWPRIMITIVES2     |
4306                                      WINED3DDEVCAPS_DRAWPRIMITIVES2EX   |
4307                                      WINED3DDEVCAPS_RTPATCHES;
4308
4309     pCaps->PrimitiveMiscCaps       = WINED3DPMISCCAPS_CULLNONE              |
4310                                      WINED3DPMISCCAPS_CULLCCW               |
4311                                      WINED3DPMISCCAPS_CULLCW                |
4312                                      WINED3DPMISCCAPS_COLORWRITEENABLE      |
4313                                      WINED3DPMISCCAPS_CLIPTLVERTS           |
4314                                      WINED3DPMISCCAPS_CLIPPLANESCALEDPOINTS |
4315                                      WINED3DPMISCCAPS_MASKZ                 |
4316                                      WINED3DPMISCCAPS_BLENDOP               |
4317                                      WINED3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING;
4318                                     /* TODO:
4319                                         WINED3DPMISCCAPS_NULLREFERENCE
4320                                         WINED3DPMISCCAPS_FOGANDSPECULARALPHA
4321                                         WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS
4322                                         WINED3DPMISCCAPS_FOGVERTEXCLAMPED */
4323
4324     if (gl_info->supported[EXT_BLEND_EQUATION_SEPARATE] && gl_info->supported[EXT_BLEND_FUNC_SEPARATE])
4325         pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND;
4326     if (gl_info->supported[EXT_DRAW_BUFFERS2])
4327         pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS;
4328
4329     pCaps->RasterCaps              = WINED3DPRASTERCAPS_DITHER    |
4330                                      WINED3DPRASTERCAPS_PAT       |
4331                                      WINED3DPRASTERCAPS_WFOG      |
4332                                      WINED3DPRASTERCAPS_ZFOG      |
4333                                      WINED3DPRASTERCAPS_FOGVERTEX |
4334                                      WINED3DPRASTERCAPS_FOGTABLE  |
4335                                      WINED3DPRASTERCAPS_STIPPLE   |
4336                                      WINED3DPRASTERCAPS_SUBPIXEL  |
4337                                      WINED3DPRASTERCAPS_ZTEST     |
4338                                      WINED3DPRASTERCAPS_SCISSORTEST   |
4339                                      WINED3DPRASTERCAPS_SLOPESCALEDEPTHBIAS |
4340                                      WINED3DPRASTERCAPS_DEPTHBIAS;
4341
4342     if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
4343     {
4344         pCaps->RasterCaps |= WINED3DPRASTERCAPS_ANISOTROPY    |
4345                              WINED3DPRASTERCAPS_ZBIAS         |
4346                              WINED3DPRASTERCAPS_MIPMAPLODBIAS;
4347     }
4348     if (gl_info->supported[NV_FOG_DISTANCE])
4349     {
4350         pCaps->RasterCaps         |= WINED3DPRASTERCAPS_FOGRANGE;
4351     }
4352                         /* FIXME Add:
4353                            WINED3DPRASTERCAPS_COLORPERSPECTIVE
4354                            WINED3DPRASTERCAPS_STRETCHBLTMULTISAMPLE
4355                            WINED3DPRASTERCAPS_ANTIALIASEDGES
4356                            WINED3DPRASTERCAPS_ZBUFFERLESSHSR
4357                            WINED3DPRASTERCAPS_WBUFFER */
4358
4359     pCaps->ZCmpCaps = WINED3DPCMPCAPS_ALWAYS       |
4360                       WINED3DPCMPCAPS_EQUAL        |
4361                       WINED3DPCMPCAPS_GREATER      |
4362                       WINED3DPCMPCAPS_GREATEREQUAL |
4363                       WINED3DPCMPCAPS_LESS         |
4364                       WINED3DPCMPCAPS_LESSEQUAL    |
4365                       WINED3DPCMPCAPS_NEVER        |
4366                       WINED3DPCMPCAPS_NOTEQUAL;
4367
4368     pCaps->SrcBlendCaps  = WINED3DPBLENDCAPS_BOTHINVSRCALPHA |
4369                            WINED3DPBLENDCAPS_BOTHSRCALPHA    |
4370                            WINED3DPBLENDCAPS_DESTALPHA       |
4371                            WINED3DPBLENDCAPS_DESTCOLOR       |
4372                            WINED3DPBLENDCAPS_INVDESTALPHA    |
4373                            WINED3DPBLENDCAPS_INVDESTCOLOR    |
4374                            WINED3DPBLENDCAPS_INVSRCALPHA     |
4375                            WINED3DPBLENDCAPS_INVSRCCOLOR     |
4376                            WINED3DPBLENDCAPS_ONE             |
4377                            WINED3DPBLENDCAPS_SRCALPHA        |
4378                            WINED3DPBLENDCAPS_SRCALPHASAT     |
4379                            WINED3DPBLENDCAPS_SRCCOLOR        |
4380                            WINED3DPBLENDCAPS_ZERO;
4381
4382     pCaps->DestBlendCaps = WINED3DPBLENDCAPS_DESTALPHA       |
4383                            WINED3DPBLENDCAPS_DESTCOLOR       |
4384                            WINED3DPBLENDCAPS_INVDESTALPHA    |
4385                            WINED3DPBLENDCAPS_INVDESTCOLOR    |
4386                            WINED3DPBLENDCAPS_INVSRCALPHA     |
4387                            WINED3DPBLENDCAPS_INVSRCCOLOR     |
4388                            WINED3DPBLENDCAPS_ONE             |
4389                            WINED3DPBLENDCAPS_SRCALPHA        |
4390                            WINED3DPBLENDCAPS_SRCCOLOR        |
4391                            WINED3DPBLENDCAPS_ZERO;
4392     /* NOTE: WINED3DPBLENDCAPS_SRCALPHASAT is not supported as dest blend factor,
4393      * according to the glBlendFunc manpage
4394      *
4395      * WINED3DPBLENDCAPS_BOTHINVSRCALPHA and WINED3DPBLENDCAPS_BOTHSRCALPHA are
4396      * legacy settings for srcblend only
4397      */
4398
4399     if (gl_info->supported[EXT_BLEND_COLOR])
4400     {
4401         pCaps->SrcBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR;
4402         pCaps->DestBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR;
4403     }
4404
4405
4406     pCaps->AlphaCmpCaps = WINED3DPCMPCAPS_ALWAYS       |
4407                           WINED3DPCMPCAPS_EQUAL        |
4408                           WINED3DPCMPCAPS_GREATER      |
4409                           WINED3DPCMPCAPS_GREATEREQUAL |
4410                           WINED3DPCMPCAPS_LESS         |
4411                           WINED3DPCMPCAPS_LESSEQUAL    |
4412                           WINED3DPCMPCAPS_NEVER        |
4413                           WINED3DPCMPCAPS_NOTEQUAL;
4414
4415     pCaps->ShadeCaps     = WINED3DPSHADECAPS_SPECULARGOURAUDRGB |
4416                            WINED3DPSHADECAPS_COLORGOURAUDRGB    |
4417                            WINED3DPSHADECAPS_ALPHAFLATBLEND     |
4418                            WINED3DPSHADECAPS_ALPHAGOURAUDBLEND  |
4419                            WINED3DPSHADECAPS_COLORFLATRGB       |
4420                            WINED3DPSHADECAPS_FOGFLAT            |
4421                            WINED3DPSHADECAPS_FOGGOURAUD         |
4422                            WINED3DPSHADECAPS_SPECULARFLATRGB;
4423
4424     pCaps->TextureCaps =  WINED3DPTEXTURECAPS_ALPHA              |
4425                           WINED3DPTEXTURECAPS_ALPHAPALETTE       |
4426                           WINED3DPTEXTURECAPS_TRANSPARENCY       |
4427                           WINED3DPTEXTURECAPS_BORDER             |
4428                           WINED3DPTEXTURECAPS_MIPMAP             |
4429                           WINED3DPTEXTURECAPS_PROJECTED          |
4430                           WINED3DPTEXTURECAPS_PERSPECTIVE;
4431
4432     if (!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO])
4433     {
4434         pCaps->TextureCaps |= WINED3DPTEXTURECAPS_POW2 |
4435                               WINED3DPTEXTURECAPS_NONPOW2CONDITIONAL;
4436     }
4437
4438     if (gl_info->supported[EXT_TEXTURE3D])
4439     {
4440         pCaps->TextureCaps |=  WINED3DPTEXTURECAPS_VOLUMEMAP      |
4441                                WINED3DPTEXTURECAPS_MIPVOLUMEMAP   |
4442                                WINED3DPTEXTURECAPS_VOLUMEMAP_POW2;
4443     }
4444
4445     if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
4446     {
4447         pCaps->TextureCaps |= WINED3DPTEXTURECAPS_CUBEMAP     |
4448                               WINED3DPTEXTURECAPS_MIPCUBEMAP    |
4449                               WINED3DPTEXTURECAPS_CUBEMAP_POW2;
4450
4451     }
4452
4453     pCaps->TextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR       |
4454                                WINED3DPTFILTERCAPS_MAGFPOINT        |
4455                                WINED3DPTFILTERCAPS_MINFLINEAR       |
4456                                WINED3DPTFILTERCAPS_MINFPOINT        |
4457                                WINED3DPTFILTERCAPS_MIPFLINEAR       |
4458                                WINED3DPTFILTERCAPS_MIPFPOINT        |
4459                                WINED3DPTFILTERCAPS_LINEAR           |
4460                                WINED3DPTFILTERCAPS_LINEARMIPLINEAR  |
4461                                WINED3DPTFILTERCAPS_LINEARMIPNEAREST |
4462                                WINED3DPTFILTERCAPS_MIPLINEAR        |
4463                                WINED3DPTFILTERCAPS_MIPNEAREST       |
4464                                WINED3DPTFILTERCAPS_NEAREST;
4465
4466     if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
4467     {
4468         pCaps->TextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC |
4469                                     WINED3DPTFILTERCAPS_MINFANISOTROPIC;
4470     }
4471
4472     if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
4473     {
4474         pCaps->CubeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR       |
4475                                        WINED3DPTFILTERCAPS_MAGFPOINT        |
4476                                        WINED3DPTFILTERCAPS_MINFLINEAR       |
4477                                        WINED3DPTFILTERCAPS_MINFPOINT        |
4478                                        WINED3DPTFILTERCAPS_MIPFLINEAR       |
4479                                        WINED3DPTFILTERCAPS_MIPFPOINT        |
4480                                        WINED3DPTFILTERCAPS_LINEAR           |
4481                                        WINED3DPTFILTERCAPS_LINEARMIPLINEAR  |
4482                                        WINED3DPTFILTERCAPS_LINEARMIPNEAREST |
4483                                        WINED3DPTFILTERCAPS_MIPLINEAR        |
4484                                        WINED3DPTFILTERCAPS_MIPNEAREST       |
4485                                        WINED3DPTFILTERCAPS_NEAREST;
4486
4487         if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
4488         {
4489             pCaps->CubeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC |
4490                                             WINED3DPTFILTERCAPS_MINFANISOTROPIC;
4491         }
4492     } else
4493         pCaps->CubeTextureFilterCaps = 0;
4494
4495     if (gl_info->supported[EXT_TEXTURE3D])
4496     {
4497         pCaps->VolumeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR       |
4498                                          WINED3DPTFILTERCAPS_MAGFPOINT        |
4499                                          WINED3DPTFILTERCAPS_MINFLINEAR       |
4500                                          WINED3DPTFILTERCAPS_MINFPOINT        |
4501                                          WINED3DPTFILTERCAPS_MIPFLINEAR       |
4502                                          WINED3DPTFILTERCAPS_MIPFPOINT        |
4503                                          WINED3DPTFILTERCAPS_LINEAR           |
4504                                          WINED3DPTFILTERCAPS_LINEARMIPLINEAR  |
4505                                          WINED3DPTFILTERCAPS_LINEARMIPNEAREST |
4506                                          WINED3DPTFILTERCAPS_MIPLINEAR        |
4507                                          WINED3DPTFILTERCAPS_MIPNEAREST       |
4508                                          WINED3DPTFILTERCAPS_NEAREST;
4509     } else
4510         pCaps->VolumeTextureFilterCaps = 0;
4511
4512     pCaps->TextureAddressCaps =  WINED3DPTADDRESSCAPS_INDEPENDENTUV |
4513                                  WINED3DPTADDRESSCAPS_CLAMP  |
4514                                  WINED3DPTADDRESSCAPS_WRAP;
4515
4516     if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
4517     {
4518         pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER;
4519     }
4520     if (gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT])
4521     {
4522         pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR;
4523     }
4524     if (gl_info->supported[ATI_TEXTURE_MIRROR_ONCE])
4525     {
4526         pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE;
4527     }
4528
4529     if (gl_info->supported[EXT_TEXTURE3D])
4530     {
4531         pCaps->VolumeTextureAddressCaps =  WINED3DPTADDRESSCAPS_INDEPENDENTUV |
4532                                            WINED3DPTADDRESSCAPS_CLAMP  |
4533                                            WINED3DPTADDRESSCAPS_WRAP;
4534         if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
4535         {
4536             pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER;
4537         }
4538         if (gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT])
4539         {
4540             pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR;
4541         }
4542         if (gl_info->supported[ATI_TEXTURE_MIRROR_ONCE])
4543         {
4544             pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE;
4545         }
4546     } else
4547         pCaps->VolumeTextureAddressCaps = 0;
4548
4549     pCaps->LineCaps = WINED3DLINECAPS_TEXTURE       |
4550                       WINED3DLINECAPS_ZTEST         |
4551                       WINED3DLINECAPS_BLEND         |
4552                       WINED3DLINECAPS_ALPHACMP      |
4553                       WINED3DLINECAPS_FOG;
4554     /* WINED3DLINECAPS_ANTIALIAS is not supported on Windows, and dx and gl seem to have a different
4555      * idea how generating the smoothing alpha values works; the result is different
4556      */
4557
4558     pCaps->MaxTextureWidth = gl_info->limits.texture_size;
4559     pCaps->MaxTextureHeight = gl_info->limits.texture_size;
4560
4561     if (gl_info->supported[EXT_TEXTURE3D])
4562         pCaps->MaxVolumeExtent = gl_info->limits.texture3d_size;
4563     else
4564         pCaps->MaxVolumeExtent = 0;
4565
4566     pCaps->MaxTextureRepeat = 32768;
4567     pCaps->MaxTextureAspectRatio = gl_info->limits.texture_size;
4568     pCaps->MaxVertexW = 1.0f;
4569
4570     pCaps->GuardBandLeft = 0.0f;
4571     pCaps->GuardBandTop = 0.0f;
4572     pCaps->GuardBandRight = 0.0f;
4573     pCaps->GuardBandBottom = 0.0f;
4574
4575     pCaps->ExtentsAdjust = 0.0f;
4576
4577     pCaps->StencilCaps =  WINED3DSTENCILCAPS_DECRSAT |
4578                           WINED3DSTENCILCAPS_INCRSAT |
4579                           WINED3DSTENCILCAPS_INVERT  |
4580                           WINED3DSTENCILCAPS_KEEP    |
4581                           WINED3DSTENCILCAPS_REPLACE |
4582                           WINED3DSTENCILCAPS_ZERO;
4583     if (gl_info->supported[EXT_STENCIL_WRAP])
4584     {
4585         pCaps->StencilCaps |= WINED3DSTENCILCAPS_DECR  |
4586                               WINED3DSTENCILCAPS_INCR;
4587     }
4588     if (gl_info->supported[EXT_STENCIL_TWO_SIDE] || gl_info->supported[ATI_SEPARATE_STENCIL])
4589     {
4590         pCaps->StencilCaps |= WINED3DSTENCILCAPS_TWOSIDED;
4591     }
4592
4593     pCaps->FVFCaps = WINED3DFVFCAPS_PSIZE | 0x0008; /* 8 texture coords */
4594
4595     pCaps->MaxUserClipPlanes = gl_info->limits.clipplanes;
4596     pCaps->MaxActiveLights = gl_info->limits.lights;
4597
4598     pCaps->MaxVertexBlendMatrices = gl_info->limits.blends;
4599     pCaps->MaxVertexBlendMatrixIndex   = 0;
4600
4601     pCaps->MaxAnisotropy = gl_info->limits.anisotropy;
4602     pCaps->MaxPointSize = gl_info->limits.pointsize_max;
4603
4604
4605     /* FIXME: Add D3DVTXPCAPS_TWEENING, D3DVTXPCAPS_TEXGEN_SPHEREMAP */
4606     pCaps->VertexProcessingCaps = WINED3DVTXPCAPS_DIRECTIONALLIGHTS |
4607                                   WINED3DVTXPCAPS_MATERIALSOURCE7   |
4608                                   WINED3DVTXPCAPS_POSITIONALLIGHTS  |
4609                                   WINED3DVTXPCAPS_LOCALVIEWER       |
4610                                   WINED3DVTXPCAPS_VERTEXFOG         |
4611                                   WINED3DVTXPCAPS_TEXGEN;
4612
4613     pCaps->MaxPrimitiveCount   = 0xFFFFF; /* For now set 2^20-1 which is used by most >=Geforce3/Radeon8500 cards */
4614     pCaps->MaxVertexIndex      = 0xFFFFF;
4615     pCaps->MaxStreams          = MAX_STREAMS;
4616     pCaps->MaxStreamStride     = 1024;
4617
4618     /* d3d9.dll sets D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES here because StretchRects is implemented in d3d9 */
4619     pCaps->DevCaps2                          = WINED3DDEVCAPS2_STREAMOFFSET |
4620                                                WINED3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET;
4621     pCaps->MaxNpatchTessellationLevel        = 0;
4622     pCaps->MasterAdapterOrdinal              = 0;
4623     pCaps->AdapterOrdinalInGroup             = 0;
4624     pCaps->NumberOfAdaptersInGroup           = 1;
4625
4626     pCaps->NumSimultaneousRTs = gl_info->limits.buffers;
4627
4628     pCaps->StretchRectFilterCaps             = WINED3DPTFILTERCAPS_MINFPOINT  |
4629                                                 WINED3DPTFILTERCAPS_MAGFPOINT  |
4630                                                 WINED3DPTFILTERCAPS_MINFLINEAR |
4631                                                 WINED3DPTFILTERCAPS_MAGFLINEAR;
4632     pCaps->VertexTextureFilterCaps           = 0;
4633
4634     adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
4635     adapter->fragment_pipe->get_caps(&adapter->gl_info, &fragment_caps);
4636
4637     /* Add shader misc caps. Only some of them belong to the shader parts of the pipeline */
4638     pCaps->PrimitiveMiscCaps |= fragment_caps.PrimitiveMiscCaps;
4639
4640     /* This takes care for disabling vertex shader or pixel shader caps while leaving the other one enabled.
4641      * Ignore shader model capabilities if disabled in config
4642      */
4643     if(vs_selected_mode == SHADER_NONE) {
4644         TRACE_(d3d_caps)("Vertex shader disabled in config, reporting version 0.0\n");
4645         pCaps->VertexShaderVersion          = WINED3DVS_VERSION(0,0);
4646         pCaps->MaxVertexShaderConst         = 0;
4647     } else {
4648         pCaps->VertexShaderVersion          = shader_caps.VertexShaderVersion;
4649         pCaps->MaxVertexShaderConst         = shader_caps.MaxVertexShaderConst;
4650     }
4651
4652     if(ps_selected_mode == SHADER_NONE) {
4653         TRACE_(d3d_caps)("Pixel shader disabled in config, reporting version 0.0\n");
4654         pCaps->PixelShaderVersion           = WINED3DPS_VERSION(0,0);
4655         pCaps->PixelShader1xMaxValue        = 0.0f;
4656     } else {
4657         pCaps->PixelShaderVersion           = shader_caps.PixelShaderVersion;
4658         pCaps->PixelShader1xMaxValue        = shader_caps.PixelShader1xMaxValue;
4659     }
4660
4661     pCaps->TextureOpCaps                    = fragment_caps.TextureOpCaps;
4662     pCaps->MaxTextureBlendStages            = fragment_caps.MaxTextureBlendStages;
4663     pCaps->MaxSimultaneousTextures          = fragment_caps.MaxSimultaneousTextures;
4664
4665     /* The following caps are shader specific, but they are things we cannot detect, or which
4666      * are the same among all shader models. So to avoid code duplication set the shader version
4667      * specific, but otherwise constant caps here
4668      */
4669     if(pCaps->VertexShaderVersion == WINED3DVS_VERSION(3,0)) {
4670         /* Where possible set the caps based on OpenGL extensions and if they aren't set (in case of software rendering)
4671         use the VS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum VS3.0 value. */
4672         pCaps->VS20Caps.Caps                     = WINED3DVS20CAPS_PREDICATION;
4673         pCaps->VS20Caps.DynamicFlowControlDepth  = WINED3DVS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* VS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */
4674         pCaps->VS20Caps.NumTemps = max(32, adapter->gl_info.limits.arb_vs_temps);
4675         pCaps->VS20Caps.StaticFlowControlDepth   = WINED3DVS20_MAX_STATICFLOWCONTROLDEPTH ; /* level of nesting in loops / if-statements; VS 3.0 requires MAX (4) */
4676
4677         pCaps->MaxVShaderInstructionsExecuted    = 65535; /* VS 3.0 needs at least 65535, some cards even use 2^32-1 */
4678         pCaps->MaxVertexShader30InstructionSlots = max(512, adapter->gl_info.limits.arb_vs_instructions);
4679     }
4680     else if (pCaps->VertexShaderVersion == WINED3DVS_VERSION(2,0))
4681     {
4682         pCaps->VS20Caps.Caps                     = 0;
4683         pCaps->VS20Caps.DynamicFlowControlDepth  = WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH;
4684         pCaps->VS20Caps.NumTemps = max(12, adapter->gl_info.limits.arb_vs_temps);
4685         pCaps->VS20Caps.StaticFlowControlDepth   = 1;
4686
4687         pCaps->MaxVShaderInstructionsExecuted    = 65535;
4688         pCaps->MaxVertexShader30InstructionSlots = 0;
4689     } else { /* VS 1.x */
4690         pCaps->VS20Caps.Caps                     = 0;
4691         pCaps->VS20Caps.DynamicFlowControlDepth  = 0;
4692         pCaps->VS20Caps.NumTemps                 = 0;
4693         pCaps->VS20Caps.StaticFlowControlDepth   = 0;
4694
4695         pCaps->MaxVShaderInstructionsExecuted    = 0;
4696         pCaps->MaxVertexShader30InstructionSlots = 0;
4697     }
4698
4699     if(pCaps->PixelShaderVersion == WINED3DPS_VERSION(3,0)) {
4700         /* Where possible set the caps based on OpenGL extensions and if they aren't set (in case of software rendering)
4701         use the PS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum PS 3.0 value. */
4702
4703         /* 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 */
4704         pCaps->PS20Caps.Caps                     = WINED3DPS20CAPS_ARBITRARYSWIZZLE     |
4705                 WINED3DPS20CAPS_GRADIENTINSTRUCTIONS |
4706                 WINED3DPS20CAPS_PREDICATION          |
4707                 WINED3DPS20CAPS_NODEPENDENTREADLIMIT |
4708                 WINED3DPS20CAPS_NOTEXINSTRUCTIONLIMIT;
4709         pCaps->PS20Caps.DynamicFlowControlDepth  = WINED3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */
4710         pCaps->PS20Caps.NumTemps = max(32, adapter->gl_info.limits.arb_ps_temps);
4711         pCaps->PS20Caps.StaticFlowControlDepth   = WINED3DPS20_MAX_STATICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_STATICFLOWCONTROLDEPTH (4) */
4712         pCaps->PS20Caps.NumInstructionSlots      = WINED3DPS20_MAX_NUMINSTRUCTIONSLOTS; /* PS 3.0 requires MAX_NUMINSTRUCTIONSLOTS (512) */
4713
4714         pCaps->MaxPShaderInstructionsExecuted    = 65535;
4715         pCaps->MaxPixelShader30InstructionSlots = max(WINED3DMIN30SHADERINSTRUCTIONS,
4716                 adapter->gl_info.limits.arb_ps_instructions);
4717     }
4718     else if(pCaps->PixelShaderVersion == WINED3DPS_VERSION(2,0))
4719     {
4720         /* Below we assume PS2.0 specs, not extended 2.0a(GeforceFX)/2.0b(Radeon R3xx) ones */
4721         pCaps->PS20Caps.Caps                     = 0;
4722         pCaps->PS20Caps.DynamicFlowControlDepth  = 0; /* WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH = 0 */
4723         pCaps->PS20Caps.NumTemps = max(12, adapter->gl_info.limits.arb_ps_temps);
4724         pCaps->PS20Caps.StaticFlowControlDepth   = WINED3DPS20_MIN_STATICFLOWCONTROLDEPTH; /* Minimum: 1 */
4725         pCaps->PS20Caps.NumInstructionSlots      = WINED3DPS20_MIN_NUMINSTRUCTIONSLOTS; /* Minimum number (64 ALU + 32 Texture), a GeforceFX uses 512 */
4726
4727         pCaps->MaxPShaderInstructionsExecuted    = 512; /* Minimum value, a GeforceFX uses 1024 */
4728         pCaps->MaxPixelShader30InstructionSlots  = 0;
4729     } else { /* PS 1.x */
4730         pCaps->PS20Caps.Caps                     = 0;
4731         pCaps->PS20Caps.DynamicFlowControlDepth  = 0;
4732         pCaps->PS20Caps.NumTemps                 = 0;
4733         pCaps->PS20Caps.StaticFlowControlDepth   = 0;
4734         pCaps->PS20Caps.NumInstructionSlots      = 0;
4735
4736         pCaps->MaxPShaderInstructionsExecuted    = 0;
4737         pCaps->MaxPixelShader30InstructionSlots  = 0;
4738     }
4739
4740     if(pCaps->VertexShaderVersion >= WINED3DVS_VERSION(2,0)) {
4741         /* OpenGL supports all the formats below, perhaps not always
4742          * without conversion, but it supports them.
4743          * Further GLSL doesn't seem to have an official unsigned type so
4744          * don't advertise it yet as I'm not sure how we handle it.
4745          * We might need to add some clamping in the shader engine to
4746          * support it.
4747          * TODO: WINED3DDTCAPS_USHORT2N, WINED3DDTCAPS_USHORT4N, WINED3DDTCAPS_UDEC3, WINED3DDTCAPS_DEC3N */
4748         pCaps->DeclTypes = WINED3DDTCAPS_UBYTE4    |
4749                            WINED3DDTCAPS_UBYTE4N   |
4750                            WINED3DDTCAPS_SHORT2N   |
4751                            WINED3DDTCAPS_SHORT4N;
4752         if (gl_info->supported[ARB_HALF_FLOAT_VERTEX])
4753         {
4754             pCaps->DeclTypes |= WINED3DDTCAPS_FLOAT16_2 |
4755                                 WINED3DDTCAPS_FLOAT16_4;
4756         }
4757     } else
4758         pCaps->DeclTypes                         = 0;
4759
4760     /* Set DirectDraw helper Caps */
4761     ckey_caps =                         WINEDDCKEYCAPS_DESTBLT              |
4762                                         WINEDDCKEYCAPS_SRCBLT;
4763     fx_caps =                           WINEDDFXCAPS_BLTALPHA               |
4764                                         WINEDDFXCAPS_BLTMIRRORLEFTRIGHT     |
4765                                         WINEDDFXCAPS_BLTMIRRORUPDOWN        |
4766                                         WINEDDFXCAPS_BLTROTATION90          |
4767                                         WINEDDFXCAPS_BLTSHRINKX             |
4768                                         WINEDDFXCAPS_BLTSHRINKXN            |
4769                                         WINEDDFXCAPS_BLTSHRINKY             |
4770                                         WINEDDFXCAPS_BLTSHRINKXN            |
4771                                         WINEDDFXCAPS_BLTSTRETCHX            |
4772                                         WINEDDFXCAPS_BLTSTRETCHXN           |
4773                                         WINEDDFXCAPS_BLTSTRETCHY            |
4774                                         WINEDDFXCAPS_BLTSTRETCHYN;
4775     blit_caps =                         WINEDDCAPS_BLT                      |
4776                                         WINEDDCAPS_BLTCOLORFILL             |
4777                                         WINEDDCAPS_BLTDEPTHFILL             |
4778                                         WINEDDCAPS_BLTSTRETCH               |
4779                                         WINEDDCAPS_CANBLTSYSMEM             |
4780                                         WINEDDCAPS_CANCLIP                  |
4781                                         WINEDDCAPS_CANCLIPSTRETCHED         |
4782                                         WINEDDCAPS_COLORKEY                 |
4783                                         WINEDDCAPS_COLORKEYHWASSIST         |
4784                                         WINEDDCAPS_ALIGNBOUNDARYSRC;
4785
4786     /* Fill the ddraw caps structure */
4787     pCaps->DirectDrawCaps.Caps =        WINEDDCAPS_GDI                      |
4788                                         WINEDDCAPS_PALETTE                  |
4789                                         blit_caps;
4790     pCaps->DirectDrawCaps.Caps2 =       WINEDDCAPS2_CERTIFIED                |
4791                                         WINEDDCAPS2_NOPAGELOCKREQUIRED       |
4792                                         WINEDDCAPS2_PRIMARYGAMMA             |
4793                                         WINEDDCAPS2_WIDESURFACES             |
4794                                         WINEDDCAPS2_CANRENDERWINDOWED;
4795     pCaps->DirectDrawCaps.SVBCaps =     blit_caps;
4796     pCaps->DirectDrawCaps.SVBCKeyCaps = ckey_caps;
4797     pCaps->DirectDrawCaps.SVBFXCaps =   fx_caps;
4798     pCaps->DirectDrawCaps.VSBCaps =     blit_caps;
4799     pCaps->DirectDrawCaps.VSBCKeyCaps = ckey_caps;
4800     pCaps->DirectDrawCaps.VSBFXCaps =   fx_caps;
4801     pCaps->DirectDrawCaps.SSBCaps =     blit_caps;
4802     pCaps->DirectDrawCaps.SSBCKeyCaps = ckey_caps;
4803     pCaps->DirectDrawCaps.SSBFXCaps =   fx_caps;
4804
4805     pCaps->DirectDrawCaps.ddsCaps =     WINEDDSCAPS_ALPHA                   |
4806                                         WINEDDSCAPS_BACKBUFFER              |
4807                                         WINEDDSCAPS_FLIP                    |
4808                                         WINEDDSCAPS_FRONTBUFFER             |
4809                                         WINEDDSCAPS_OFFSCREENPLAIN          |
4810                                         WINEDDSCAPS_PALETTE                 |
4811                                         WINEDDSCAPS_PRIMARYSURFACE          |
4812                                         WINEDDSCAPS_SYSTEMMEMORY            |
4813                                         WINEDDSCAPS_VIDEOMEMORY             |
4814                                         WINEDDSCAPS_VISIBLE;
4815     pCaps->DirectDrawCaps.StrideAlign = DDRAW_PITCH_ALIGNMENT;
4816
4817     /* Set D3D caps if OpenGL is available. */
4818     if (adapter->opengl)
4819     {
4820         pCaps->DirectDrawCaps.ddsCaps |=WINEDDSCAPS_3DDEVICE                |
4821                                         WINEDDSCAPS_MIPMAP                  |
4822                                         WINEDDSCAPS_TEXTURE                 |
4823                                         WINEDDSCAPS_ZBUFFER;
4824         pCaps->DirectDrawCaps.Caps |=   WINEDDCAPS_3D;
4825     }
4826
4827     return WINED3D_OK;
4828 }
4829
4830 static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT adapter_idx,
4831         WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags, IUnknown *parent,
4832         IWineD3DDeviceParent *device_parent, IWineD3DDevice **device)
4833 {
4834     IWineD3DImpl *This = (IWineD3DImpl *)iface;
4835     IWineD3DDeviceImpl *object;
4836     HRESULT hr;
4837
4838     TRACE("iface %p, adapter_idx %u, device_type %#x, focus_window %p, flags %#x.\n"
4839             "parent %p, device_parent %p, device %p.\n",
4840             iface, adapter_idx, device_type, focus_window, flags,
4841             parent, device_parent, device);
4842
4843     /* Validate the adapter number. If no adapters are available(no GL), ignore the adapter
4844      * number and create a device without a 3D adapter for 2D only operation. */
4845     if (IWineD3D_GetAdapterCount(iface) && adapter_idx >= IWineD3D_GetAdapterCount(iface))
4846     {
4847         return WINED3DERR_INVALIDCALL;
4848     }
4849
4850     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
4851     if (!object)
4852     {
4853         ERR("Failed to allocate device memory.\n");
4854         return E_OUTOFMEMORY;
4855     }
4856
4857     hr = device_init(object, This, adapter_idx, device_type, focus_window, flags, parent, device_parent);
4858     if (FAILED(hr))
4859     {
4860         WARN("Failed to initialize device, hr %#x.\n", hr);
4861         HeapFree(GetProcessHeap(), 0, object);
4862         return hr;
4863     }
4864
4865     TRACE("Created device %p.\n", object);
4866     *device = (IWineD3DDevice *)object;
4867
4868     IWineD3DDeviceParent_WineD3DDeviceCreated(device_parent, *device);
4869
4870     return WINED3D_OK;
4871 }
4872
4873 static HRESULT WINAPI IWineD3DImpl_GetParent(IWineD3D *iface, IUnknown **pParent) {
4874     IWineD3DImpl *This = (IWineD3DImpl *)iface;
4875     IUnknown_AddRef(This->parent);
4876     *pParent = This->parent;
4877     return WINED3D_OK;
4878 }
4879
4880 static void WINE_GLAPI invalid_func(const void *data)
4881 {
4882     ERR("Invalid vertex attribute function called\n");
4883     DebugBreak();
4884 }
4885
4886 static void WINE_GLAPI invalid_texcoord_func(GLenum unit, const void *data)
4887 {
4888     ERR("Invalid texcoord function called\n");
4889     DebugBreak();
4890 }
4891
4892 /* Helper functions for providing vertex data to opengl. The arrays are initialized based on
4893  * the extension detection and are used in drawStridedSlow
4894  */
4895 static void WINE_GLAPI position_d3dcolor(const void *data)
4896 {
4897     DWORD pos = *((const DWORD *)data);
4898
4899     FIXME("Add a test for fixed function position from d3dcolor type\n");
4900     glVertex4s(D3DCOLOR_B_R(pos),
4901                D3DCOLOR_B_G(pos),
4902                D3DCOLOR_B_B(pos),
4903                D3DCOLOR_B_A(pos));
4904 }
4905
4906 static void WINE_GLAPI position_float4(const void *data)
4907 {
4908     const GLfloat *pos = data;
4909
4910     if (pos[3] != 0.0f && pos[3] != 1.0f)
4911     {
4912         float w = 1.0f / pos[3];
4913
4914         glVertex4f(pos[0] * w, pos[1] * w, pos[2] * w, w);
4915     }
4916     else
4917     {
4918         glVertex3fv(pos);
4919     }
4920 }
4921
4922 static void WINE_GLAPI diffuse_d3dcolor(const void *data)
4923 {
4924     DWORD diffuseColor = *((const DWORD *)data);
4925
4926     glColor4ub(D3DCOLOR_B_R(diffuseColor),
4927                D3DCOLOR_B_G(diffuseColor),
4928                D3DCOLOR_B_B(diffuseColor),
4929                D3DCOLOR_B_A(diffuseColor));
4930 }
4931
4932 static void WINE_GLAPI specular_d3dcolor(const void *data)
4933 {
4934     DWORD specularColor = *((const DWORD *)data);
4935     GLbyte d[] = {D3DCOLOR_B_R(specularColor),
4936             D3DCOLOR_B_G(specularColor),
4937             D3DCOLOR_B_B(specularColor)};
4938
4939     specular_func_3ubv(d);
4940 }
4941
4942 static void WINE_GLAPI warn_no_specular_func(const void *data)
4943 {
4944     WARN("GL_EXT_secondary_color not supported\n");
4945 }
4946
4947 static void fillGLAttribFuncs(const struct wined3d_gl_info *gl_info)
4948 {
4949     position_funcs[WINED3D_FFP_EMIT_FLOAT1]      = invalid_func;
4950     position_funcs[WINED3D_FFP_EMIT_FLOAT2]      = invalid_func;
4951     position_funcs[WINED3D_FFP_EMIT_FLOAT3]      = (glAttribFunc)glVertex3fv;
4952     position_funcs[WINED3D_FFP_EMIT_FLOAT4]      = position_float4;
4953     position_funcs[WINED3D_FFP_EMIT_D3DCOLOR]    = position_d3dcolor;
4954     position_funcs[WINED3D_FFP_EMIT_UBYTE4]      = invalid_func;
4955     position_funcs[WINED3D_FFP_EMIT_SHORT2]      = invalid_func;
4956     position_funcs[WINED3D_FFP_EMIT_SHORT4]      = (glAttribFunc)glVertex2sv;
4957     position_funcs[WINED3D_FFP_EMIT_UBYTE4N]     = invalid_func;
4958     position_funcs[WINED3D_FFP_EMIT_SHORT2N]     = invalid_func;
4959     position_funcs[WINED3D_FFP_EMIT_SHORT4N]     = invalid_func;
4960     position_funcs[WINED3D_FFP_EMIT_USHORT2N]    = invalid_func;
4961     position_funcs[WINED3D_FFP_EMIT_USHORT4N]    = invalid_func;
4962     position_funcs[WINED3D_FFP_EMIT_UDEC3]       = invalid_func;
4963     position_funcs[WINED3D_FFP_EMIT_DEC3N]       = invalid_func;
4964     position_funcs[WINED3D_FFP_EMIT_FLOAT16_2]   = invalid_func;
4965     position_funcs[WINED3D_FFP_EMIT_FLOAT16_4]   = invalid_func;
4966
4967     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT1]       = invalid_func;
4968     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT2]       = invalid_func;
4969     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT3]       = (glAttribFunc)glColor3fv;
4970     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT4]       = (glAttribFunc)glColor4fv;
4971     diffuse_funcs[WINED3D_FFP_EMIT_D3DCOLOR]     = diffuse_d3dcolor;
4972     diffuse_funcs[WINED3D_FFP_EMIT_UBYTE4]       = invalid_func;
4973     diffuse_funcs[WINED3D_FFP_EMIT_SHORT2]       = invalid_func;
4974     diffuse_funcs[WINED3D_FFP_EMIT_SHORT4]       = invalid_func;
4975     diffuse_funcs[WINED3D_FFP_EMIT_UBYTE4N]      = (glAttribFunc)glColor4ubv;
4976     diffuse_funcs[WINED3D_FFP_EMIT_SHORT2N]      = invalid_func;
4977     diffuse_funcs[WINED3D_FFP_EMIT_SHORT4N]      = (glAttribFunc)glColor4sv;
4978     diffuse_funcs[WINED3D_FFP_EMIT_USHORT2N]     = invalid_func;
4979     diffuse_funcs[WINED3D_FFP_EMIT_USHORT4N]     = (glAttribFunc)glColor4usv;
4980     diffuse_funcs[WINED3D_FFP_EMIT_UDEC3]        = invalid_func;
4981     diffuse_funcs[WINED3D_FFP_EMIT_DEC3N]        = invalid_func;
4982     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT16_2]    = invalid_func;
4983     diffuse_funcs[WINED3D_FFP_EMIT_FLOAT16_4]    = invalid_func;
4984
4985     /* No 4 component entry points here */
4986     specular_funcs[WINED3D_FFP_EMIT_FLOAT1]      = invalid_func;
4987     specular_funcs[WINED3D_FFP_EMIT_FLOAT2]      = invalid_func;
4988     if (gl_info->supported[EXT_SECONDARY_COLOR])
4989     {
4990         specular_funcs[WINED3D_FFP_EMIT_FLOAT3]  = (glAttribFunc)GL_EXTCALL(glSecondaryColor3fvEXT);
4991     }
4992     else
4993     {
4994         specular_funcs[WINED3D_FFP_EMIT_FLOAT3]  = warn_no_specular_func;
4995     }
4996     specular_funcs[WINED3D_FFP_EMIT_FLOAT4]      = invalid_func;
4997     if (gl_info->supported[EXT_SECONDARY_COLOR])
4998     {
4999         specular_func_3ubv = (glAttribFunc)GL_EXTCALL(glSecondaryColor3ubvEXT);
5000         specular_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = specular_d3dcolor;
5001     }
5002     else
5003     {
5004         specular_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = warn_no_specular_func;
5005     }
5006     specular_funcs[WINED3D_FFP_EMIT_UBYTE4]      = invalid_func;
5007     specular_funcs[WINED3D_FFP_EMIT_SHORT2]      = invalid_func;
5008     specular_funcs[WINED3D_FFP_EMIT_SHORT4]      = invalid_func;
5009     specular_funcs[WINED3D_FFP_EMIT_UBYTE4N]     = invalid_func;
5010     specular_funcs[WINED3D_FFP_EMIT_SHORT2N]     = invalid_func;
5011     specular_funcs[WINED3D_FFP_EMIT_SHORT4N]     = invalid_func;
5012     specular_funcs[WINED3D_FFP_EMIT_USHORT2N]    = invalid_func;
5013     specular_funcs[WINED3D_FFP_EMIT_USHORT4N]    = invalid_func;
5014     specular_funcs[WINED3D_FFP_EMIT_UDEC3]       = invalid_func;
5015     specular_funcs[WINED3D_FFP_EMIT_DEC3N]       = invalid_func;
5016     specular_funcs[WINED3D_FFP_EMIT_FLOAT16_2]   = invalid_func;
5017     specular_funcs[WINED3D_FFP_EMIT_FLOAT16_4]   = invalid_func;
5018
5019     /* Only 3 component entry points here. Test how others behave. Float4 normals are used
5020      * by one of our tests, trying to pass it to the pixel shader, which fails on Windows.
5021      */
5022     normal_funcs[WINED3D_FFP_EMIT_FLOAT1]         = invalid_func;
5023     normal_funcs[WINED3D_FFP_EMIT_FLOAT2]         = invalid_func;
5024     normal_funcs[WINED3D_FFP_EMIT_FLOAT3]         = (glAttribFunc)glNormal3fv;
5025     normal_funcs[WINED3D_FFP_EMIT_FLOAT4]         = (glAttribFunc)glNormal3fv; /* Just ignore the 4th value */
5026     normal_funcs[WINED3D_FFP_EMIT_D3DCOLOR]       = invalid_func;
5027     normal_funcs[WINED3D_FFP_EMIT_UBYTE4]         = invalid_func;
5028     normal_funcs[WINED3D_FFP_EMIT_SHORT2]         = invalid_func;
5029     normal_funcs[WINED3D_FFP_EMIT_SHORT4]         = invalid_func;
5030     normal_funcs[WINED3D_FFP_EMIT_UBYTE4N]        = invalid_func;
5031     normal_funcs[WINED3D_FFP_EMIT_SHORT2N]        = invalid_func;
5032     normal_funcs[WINED3D_FFP_EMIT_SHORT4N]        = invalid_func;
5033     normal_funcs[WINED3D_FFP_EMIT_USHORT2N]       = invalid_func;
5034     normal_funcs[WINED3D_FFP_EMIT_USHORT4N]       = invalid_func;
5035     normal_funcs[WINED3D_FFP_EMIT_UDEC3]          = invalid_func;
5036     normal_funcs[WINED3D_FFP_EMIT_DEC3N]          = invalid_func;
5037     normal_funcs[WINED3D_FFP_EMIT_FLOAT16_2]      = invalid_func;
5038     normal_funcs[WINED3D_FFP_EMIT_FLOAT16_4]      = invalid_func;
5039
5040     multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT1]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord1fvARB);
5041     multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT2]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2fvARB);
5042     multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT3]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord3fvARB);
5043     multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT4]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4fvARB);
5044     multi_texcoord_funcs[WINED3D_FFP_EMIT_D3DCOLOR]  = invalid_texcoord_func;
5045     multi_texcoord_funcs[WINED3D_FFP_EMIT_UBYTE4]    = invalid_texcoord_func;
5046     multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT2]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2svARB);
5047     multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT4]    = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4svARB);
5048     multi_texcoord_funcs[WINED3D_FFP_EMIT_UBYTE4N]   = invalid_texcoord_func;
5049     multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT2N]   = invalid_texcoord_func;
5050     multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT4N]   = invalid_texcoord_func;
5051     multi_texcoord_funcs[WINED3D_FFP_EMIT_USHORT2N]  = invalid_texcoord_func;
5052     multi_texcoord_funcs[WINED3D_FFP_EMIT_USHORT4N]  = invalid_texcoord_func;
5053     multi_texcoord_funcs[WINED3D_FFP_EMIT_UDEC3]     = invalid_texcoord_func;
5054     multi_texcoord_funcs[WINED3D_FFP_EMIT_DEC3N]     = invalid_texcoord_func;
5055     if (gl_info->supported[NV_HALF_FLOAT])
5056     {
5057         /* Not supported by ARB_HALF_FLOAT_VERTEX, so check for NV_HALF_FLOAT */
5058         multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2hvNV);
5059         multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4hvNV);
5060     } else {
5061         multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_texcoord_func;
5062         multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_texcoord_func;
5063     }
5064 }
5065
5066 static BOOL InitAdapters(IWineD3DImpl *This)
5067 {
5068     static HMODULE mod_gl;
5069     BOOL ret;
5070     int ps_selected_mode, vs_selected_mode;
5071
5072     /* No need to hold any lock. The calling library makes sure only one thread calls
5073      * wined3d simultaneously
5074      */
5075
5076     TRACE("Initializing adapters\n");
5077
5078     if(!mod_gl) {
5079 #ifdef USE_WIN32_OPENGL
5080 #define USE_GL_FUNC(pfn) pfn = (void*)GetProcAddress(mod_gl, #pfn);
5081         mod_gl = LoadLibraryA("opengl32.dll");
5082         if(!mod_gl) {
5083             ERR("Can't load opengl32.dll!\n");
5084             goto nogl_adapter;
5085         }
5086 #else
5087 #define USE_GL_FUNC(pfn) pfn = (void*)pwglGetProcAddress(#pfn);
5088         /* To bypass the opengl32 thunks load wglGetProcAddress from gdi32 (glXGetProcAddress wrapper) instead of opengl32's */
5089         mod_gl = GetModuleHandleA("gdi32.dll");
5090 #endif
5091     }
5092
5093 /* Load WGL core functions from opengl32.dll */
5094 #define USE_WGL_FUNC(pfn) p##pfn = (void*)GetProcAddress(mod_gl, #pfn);
5095     WGL_FUNCS_GEN;
5096 #undef USE_WGL_FUNC
5097
5098     if(!pwglGetProcAddress) {
5099         ERR("Unable to load wglGetProcAddress!\n");
5100         goto nogl_adapter;
5101     }
5102
5103 /* Dynamically load all GL core functions */
5104     GL_FUNCS_GEN;
5105 #undef USE_GL_FUNC
5106
5107     /* Load glFinish and glFlush from opengl32.dll even if we're not using WIN32 opengl
5108      * otherwise because we have to use winex11.drv's override
5109      */
5110 #ifdef USE_WIN32_OPENGL
5111     wglFinish = (void*)GetProcAddress(mod_gl, "glFinish");
5112     wglFlush = (void*)GetProcAddress(mod_gl, "glFlush");
5113 #else
5114     wglFinish = (void*)pwglGetProcAddress("wglFinish");
5115     wglFlush = (void*)pwglGetProcAddress("wglFlush");
5116 #endif
5117
5118     glEnableWINE = glEnable;
5119     glDisableWINE = glDisable;
5120
5121     /* For now only one default adapter */
5122     {
5123         struct wined3d_adapter *adapter = &This->adapters[0];
5124         const struct wined3d_gl_info *gl_info = &adapter->gl_info;
5125         struct wined3d_fake_gl_ctx fake_gl_ctx = {0};
5126         int iPixelFormat;
5127         int res;
5128         int i;
5129         WineD3D_PixelFormat *cfgs;
5130         DISPLAY_DEVICEW DisplayDevice;
5131         HDC hdc;
5132
5133         TRACE("Initializing default adapter\n");
5134         adapter->ordinal = 0;
5135         adapter->monitorPoint.x = -1;
5136         adapter->monitorPoint.y = -1;
5137
5138         if (!AllocateLocallyUniqueId(&adapter->luid))
5139         {
5140             DWORD err = GetLastError();
5141             ERR("Failed to set adapter LUID (%#x).\n", err);
5142             goto nogl_adapter;
5143         }
5144         TRACE("Allocated LUID %08x:%08x for adapter.\n",
5145                 adapter->luid.HighPart, adapter->luid.LowPart);
5146
5147         if (!WineD3D_CreateFakeGLContext(&fake_gl_ctx))
5148         {
5149             ERR("Failed to get a gl context for default adapter\n");
5150             goto nogl_adapter;
5151         }
5152
5153         ret = IWineD3DImpl_FillGLCaps(adapter);
5154         if(!ret) {
5155             ERR("Failed to initialize gl caps for default adapter\n");
5156             WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
5157             goto nogl_adapter;
5158         }
5159         ret = initPixelFormats(&adapter->gl_info, adapter->driver_info.vendor);
5160         if(!ret) {
5161             ERR("Failed to init gl formats\n");
5162             WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
5163             goto nogl_adapter;
5164         }
5165
5166         hdc = fake_gl_ctx.dc;
5167
5168         /* Use the VideoRamSize registry setting when set */
5169         if(wined3d_settings.emulated_textureram)
5170             adapter->TextureRam = wined3d_settings.emulated_textureram;
5171         else
5172             adapter->TextureRam = adapter->gl_info.vidmem;
5173         adapter->UsedTextureRam = 0;
5174         TRACE("Emulating %dMB of texture ram\n", adapter->TextureRam/(1024*1024));
5175
5176         /* Initialize the Adapter's DeviceName which is required for ChangeDisplaySettings and friends */
5177         DisplayDevice.cb = sizeof(DisplayDevice);
5178         EnumDisplayDevicesW(NULL, 0 /* Adapter 0 = iDevNum 0 */, &DisplayDevice, 0);
5179         TRACE("DeviceName: %s\n", debugstr_w(DisplayDevice.DeviceName));
5180         strcpyW(adapter->DeviceName, DisplayDevice.DeviceName);
5181
5182         if (gl_info->supported[WGL_ARB_PIXEL_FORMAT])
5183         {
5184             int attribute;
5185             int attribs[11];
5186             int values[11];
5187             int nAttribs = 0;
5188
5189             attribute = WGL_NUMBER_PIXEL_FORMATS_ARB;
5190             GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, 0, 0, 1, &attribute, &adapter->nCfgs));
5191
5192             adapter->cfgs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, adapter->nCfgs *sizeof(WineD3D_PixelFormat));
5193             cfgs = adapter->cfgs;
5194             attribs[nAttribs++] = WGL_RED_BITS_ARB;
5195             attribs[nAttribs++] = WGL_GREEN_BITS_ARB;
5196             attribs[nAttribs++] = WGL_BLUE_BITS_ARB;
5197             attribs[nAttribs++] = WGL_ALPHA_BITS_ARB;
5198             attribs[nAttribs++] = WGL_COLOR_BITS_ARB;
5199             attribs[nAttribs++] = WGL_DEPTH_BITS_ARB;
5200             attribs[nAttribs++] = WGL_STENCIL_BITS_ARB;
5201             attribs[nAttribs++] = WGL_DRAW_TO_WINDOW_ARB;
5202             attribs[nAttribs++] = WGL_PIXEL_TYPE_ARB;
5203             attribs[nAttribs++] = WGL_DOUBLE_BUFFER_ARB;
5204             attribs[nAttribs++] = WGL_AUX_BUFFERS_ARB;
5205
5206             for (iPixelFormat=1; iPixelFormat <= adapter->nCfgs; ++iPixelFormat)
5207             {
5208                 res = GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, nAttribs, attribs, values));
5209
5210                 if(!res)
5211                     continue;
5212
5213                 /* Cache the pixel format */
5214                 cfgs->iPixelFormat = iPixelFormat;
5215                 cfgs->redSize = values[0];
5216                 cfgs->greenSize = values[1];
5217                 cfgs->blueSize = values[2];
5218                 cfgs->alphaSize = values[3];
5219                 cfgs->colorSize = values[4];
5220                 cfgs->depthSize = values[5];
5221                 cfgs->stencilSize = values[6];
5222                 cfgs->windowDrawable = values[7];
5223                 cfgs->iPixelType = values[8];
5224                 cfgs->doubleBuffer = values[9];
5225                 cfgs->auxBuffers = values[10];
5226
5227                 cfgs->numSamples = 0;
5228                 /* Check multisample support */
5229                 if (gl_info->supported[ARB_MULTISAMPLE])
5230                 {
5231                     int attrib[2] = {WGL_SAMPLE_BUFFERS_ARB, WGL_SAMPLES_ARB};
5232                     int value[2];
5233                     if(GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, 2, attrib, value))) {
5234                         /* value[0] = WGL_SAMPLE_BUFFERS_ARB which tells whether multisampling is supported.
5235                         * value[1] = number of multi sample buffers*/
5236                         if(value[0])
5237                             cfgs->numSamples = value[1];
5238                     }
5239                 }
5240
5241                 TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
5242                         "depth=%d, stencil=%d, samples=%d, windowDrawable=%d\n",
5243                         cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
5244                         cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
5245                         cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable);
5246                 cfgs++;
5247             }
5248         }
5249         else
5250         {
5251             int nCfgs = DescribePixelFormat(hdc, 0, 0, 0);
5252             adapter->cfgs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nCfgs*sizeof(WineD3D_PixelFormat));
5253             adapter->nCfgs = 0; /* We won't accept all formats e.g. software accelerated ones will be skipped */
5254
5255             cfgs = adapter->cfgs;
5256             for(iPixelFormat=1; iPixelFormat<=nCfgs; iPixelFormat++)
5257             {
5258                 PIXELFORMATDESCRIPTOR ppfd;
5259
5260                 res = DescribePixelFormat(hdc, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &ppfd);
5261                 if(!res)
5262                     continue;
5263
5264                 /* We only want HW acceleration using an OpenGL ICD driver.
5265                  * PFD_GENERIC_FORMAT = slow opengl 1.1 gdi software rendering
5266                  * PFD_GENERIC_ACCELERATED = partial hw acceleration using a MCD driver (e.g. 3dfx minigl)
5267                  */
5268                 if(ppfd.dwFlags & (PFD_GENERIC_FORMAT | PFD_GENERIC_ACCELERATED))
5269                 {
5270                     TRACE("Skipping iPixelFormat=%d because it isn't ICD accelerated\n", iPixelFormat);
5271                     continue;
5272                 }
5273
5274                 cfgs->iPixelFormat = iPixelFormat;
5275                 cfgs->redSize = ppfd.cRedBits;
5276                 cfgs->greenSize = ppfd.cGreenBits;
5277                 cfgs->blueSize = ppfd.cBlueBits;
5278                 cfgs->alphaSize = ppfd.cAlphaBits;
5279                 cfgs->colorSize = ppfd.cColorBits;
5280                 cfgs->depthSize = ppfd.cDepthBits;
5281                 cfgs->stencilSize = ppfd.cStencilBits;
5282                 cfgs->windowDrawable = (ppfd.dwFlags & PFD_DRAW_TO_WINDOW) ? 1 : 0;
5283                 cfgs->iPixelType = (ppfd.iPixelType == PFD_TYPE_RGBA) ? WGL_TYPE_RGBA_ARB : WGL_TYPE_COLORINDEX_ARB;
5284                 cfgs->doubleBuffer = (ppfd.dwFlags & PFD_DOUBLEBUFFER) ? 1 : 0;
5285                 cfgs->auxBuffers = ppfd.cAuxBuffers;
5286                 cfgs->numSamples = 0;
5287
5288                 TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
5289                         "depth=%d, stencil=%d, windowDrawable=%d\n",
5290                         cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
5291                         cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
5292                         cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable);
5293                 cfgs++;
5294                 adapter->nCfgs++;
5295             }
5296
5297             /* 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 */
5298             if(!adapter->nCfgs)
5299             {
5300                 ERR("Disabling Direct3D because no hardware accelerated pixel formats have been found!\n");
5301
5302                 WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
5303                 HeapFree(GetProcessHeap(), 0, adapter->cfgs);
5304                 goto nogl_adapter;
5305             }
5306         }
5307
5308         /* D16, D24X8 and D24S8 are common depth / depth+stencil formats. All drivers support them though this doesn't
5309          * mean that the format is offered in hardware. For instance Geforce8 cards don't have offer D16 in hardware
5310          * but just fake it using D24(X8?) which is fine. D3D also allows that.
5311          * Some display drivers (i915 on Linux) only report mixed depth+stencil formats like D24S8. MSDN clearly mentions
5312          * that only on lockable formats (e.g. D16_locked) the bit order is guaranteed and that on other formats the
5313          * driver is allowed to consume more bits EXCEPT for stencil bits.
5314          *
5315          * Mark an adapter with this broken stencil behavior.
5316          */
5317         adapter->brokenStencil = TRUE;
5318         for (i = 0, cfgs = adapter->cfgs; i < adapter->nCfgs; ++i)
5319         {
5320             /* Nearly all drivers offer depth formats without stencil, only on i915 this if-statement won't be entered. */
5321             if(cfgs[i].depthSize && !cfgs[i].stencilSize) {
5322                 adapter->brokenStencil = FALSE;
5323                 break;
5324             }
5325         }
5326
5327         WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
5328
5329         select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
5330         fillGLAttribFuncs(&adapter->gl_info);
5331         adapter->opengl = TRUE;
5332     }
5333     This->adapter_count = 1;
5334     TRACE("%u adapters successfully initialized\n", This->adapter_count);
5335
5336     return TRUE;
5337
5338 nogl_adapter:
5339     /* Initialize an adapter for ddraw-only memory counting */
5340     memset(This->adapters, 0, sizeof(This->adapters));
5341     This->adapters[0].ordinal = 0;
5342     This->adapters[0].opengl = FALSE;
5343     This->adapters[0].monitorPoint.x = -1;
5344     This->adapters[0].monitorPoint.y = -1;
5345
5346     This->adapters[0].driver_info.name = "Display";
5347     This->adapters[0].driver_info.description = "WineD3D DirectDraw Emulation";
5348     if(wined3d_settings.emulated_textureram) {
5349         This->adapters[0].TextureRam = wined3d_settings.emulated_textureram;
5350     } else {
5351         This->adapters[0].TextureRam = 8 * 1024 * 1024; /* This is plenty for a DDraw-only card */
5352     }
5353
5354     initPixelFormatsNoGL(&This->adapters[0].gl_info);
5355
5356     This->adapter_count = 1;
5357     return FALSE;
5358 }
5359
5360 /**********************************************************
5361  * IWineD3D VTbl follows
5362  **********************************************************/
5363
5364 static const struct IWineD3DVtbl IWineD3D_Vtbl =
5365 {
5366     /* IUnknown */
5367     IWineD3DImpl_QueryInterface,
5368     IWineD3DImpl_AddRef,
5369     IWineD3DImpl_Release,
5370     /* IWineD3D */
5371     IWineD3DImpl_GetParent,
5372     IWineD3DImpl_GetAdapterCount,
5373     IWineD3DImpl_RegisterSoftwareDevice,
5374     IWineD3DImpl_GetAdapterMonitor,
5375     IWineD3DImpl_GetAdapterModeCount,
5376     IWineD3DImpl_EnumAdapterModes,
5377     IWineD3DImpl_GetAdapterDisplayMode,
5378     IWineD3DImpl_GetAdapterIdentifier,
5379     IWineD3DImpl_CheckDeviceMultiSampleType,
5380     IWineD3DImpl_CheckDepthStencilMatch,
5381     IWineD3DImpl_CheckDeviceType,
5382     IWineD3DImpl_CheckDeviceFormat,
5383     IWineD3DImpl_CheckDeviceFormatConversion,
5384     IWineD3DImpl_GetDeviceCaps,
5385     IWineD3DImpl_CreateDevice
5386 };
5387
5388 static void STDMETHODCALLTYPE wined3d_null_wined3d_object_destroyed(void *parent) {}
5389
5390 const struct wined3d_parent_ops wined3d_null_parent_ops =
5391 {
5392     wined3d_null_wined3d_object_destroyed,
5393 };
5394
5395 HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, IUnknown *parent)
5396 {
5397     wined3d->lpVtbl = &IWineD3D_Vtbl;
5398     wined3d->dxVersion = version;
5399     wined3d->ref = 1;
5400     wined3d->parent = parent;
5401
5402     if (!InitAdapters(wined3d))
5403     {
5404         WARN("Failed to initialize adapters.\n");
5405         if (version > 7)
5406         {
5407             MESSAGE("Direct3D%u is not available without OpenGL.\n", version);
5408             return E_FAIL;
5409         }
5410     }
5411
5412     return WINED3D_OK;
5413 }