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