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