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