setupapi/tests: Fix some typos.
[wine] / dlls / wined3d / wined3d_main.c
1 /*
2  * Direct3D wine internal interface main
3  *
4  * Copyright 2002-2003 The wine-d3d team
5  * Copyright 2002-2003 Raphael Junqueira
6  * Copyright 2004      Jason Edmeades
7  * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24 #include "config.h"
25
26 #include "initguid.h"
27 #include "wined3d_private.h"
28
29 WINE_DEFAULT_DEBUG_CHANNEL(wine_d3d);
30
31 int num_lock = 0;
32 void (*wine_tsx11_lock_ptr)(void) = NULL;
33 void (*wine_tsx11_unlock_ptr)(void) = NULL;
34
35
36 /* When updating default value here, make sure to update winecfg as well,
37  * where appropriate. */
38 wined3d_settings_t wined3d_settings = 
39 {
40     VS_HW,          /* Hardware by default */
41     PS_HW,          /* Hardware by default */
42     VBO_HW,         /* Hardware by default */
43     TRUE,           /* Use of GLSL enabled by default */
44     ORM_BACKBUFFER, /* Use the backbuffer to do offscreen rendering */
45     RTL_AUTO,       /* Automatically determine best locking method */
46     0,              /* The default of memory is set in FillGLCaps */
47     NULL,           /* No wine logo by default */
48     FALSE           /* Disable multisampling for now due to Nvidia driver bugs which happens for some users */
49 };
50
51 IWineD3D* WINAPI WineDirect3DCreate(UINT SDKVersion, UINT dxVersion, IUnknown *parent) {
52     IWineD3DImpl* object;
53
54     if (!InitAdapters()) {
55         WARN("Failed to initialize direct3d adapters, Direct3D will not be available\n");
56         if(dxVersion > 7) {
57             ERR("Direct3D%d is not available without opengl\n", dxVersion);
58             return NULL;
59         }
60     }
61
62     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DImpl));
63     object->lpVtbl = &IWineD3D_Vtbl;
64     object->dxVersion = dxVersion;
65     object->ref = 1;
66     object->parent = parent;
67
68     TRACE("Created WineD3D object @ %p for d3d%d support\n", object, dxVersion);
69
70     return (IWineD3D *)object;
71 }
72
73 static inline DWORD get_config_key(HKEY defkey, HKEY appkey, const char* name, char* buffer, DWORD size)
74 {
75     if (0 != appkey && !RegQueryValueExA( appkey, name, 0, NULL, (LPBYTE) buffer, &size )) return 0;
76     if (0 != defkey && !RegQueryValueExA( defkey, name, 0, NULL, (LPBYTE) buffer, &size )) return 0;
77     return ERROR_FILE_NOT_FOUND;
78 }
79
80 static void wined3d_do_nothing(void)
81 {
82 }
83
84 /* At process attach */
85 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
86 {
87     TRACE("WineD3D DLLMain Reason=%d\n", fdwReason);
88     if (fdwReason == DLL_PROCESS_ATTACH)
89     {
90        HMODULE mod;
91        char buffer[MAX_PATH+10];
92        DWORD size = sizeof(buffer);
93        HKEY hkey = 0;
94        HKEY appkey = 0;
95        DWORD len;
96        WNDCLASSA wc;
97
98        atifs_shader_backend.shader_dll_load_init();
99        glsl_shader_backend.shader_dll_load_init();
100        arb_program_shader_backend.shader_dll_load_init();
101        none_shader_backend.shader_dll_load_init();
102
103        /* We need our own window class for a fake window which we use to retrieve GL capabilities */
104        /* We might need CS_OWNDC in the future if we notice strange things on Windows.
105         * Various articles/posts about OpenGL problems on Windows recommend this. */
106        wc.style                = CS_HREDRAW | CS_VREDRAW;
107        wc.lpfnWndProc          = DefWindowProcA;
108        wc.cbClsExtra           = 0;
109        wc.cbWndExtra           = 0;
110        wc.hInstance            = hInstDLL;
111        wc.hIcon                = LoadIconA(NULL, (LPCSTR)IDI_WINLOGO);
112        wc.hCursor              = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
113        wc.hbrBackground        = NULL;
114        wc.lpszMenuName         = NULL;
115        wc.lpszClassName        = "WineD3D_OpenGL";
116
117        if (!RegisterClassA(&wc) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
118        {
119            ERR("Failed to register window class 'WineD3D_OpenGL'!\n");
120            return FALSE;
121        }
122
123        DisableThreadLibraryCalls(hInstDLL);
124
125        mod = GetModuleHandleA( "winex11.drv" );
126        if (mod)
127        {
128            wine_tsx11_lock_ptr   = (void *)GetProcAddress( mod, "wine_tsx11_lock" );
129            wine_tsx11_unlock_ptr = (void *)GetProcAddress( mod, "wine_tsx11_unlock" );
130        }
131        else /* We are most likely on Windows */
132        {
133            wine_tsx11_lock_ptr   = wined3d_do_nothing;
134            wine_tsx11_unlock_ptr = wined3d_do_nothing;
135        }
136        /* @@ Wine registry key: HKCU\Software\Wine\Direct3D */
137        if ( RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\Direct3D", &hkey ) ) hkey = 0;
138
139        len = GetModuleFileNameA( 0, buffer, MAX_PATH );
140        if (len && len < MAX_PATH)
141        {
142             HKEY tmpkey;
143             /* @@ Wine registry key: HKCU\Software\Wine\AppDefaults\app.exe\Direct3D */
144             if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\AppDefaults", &tmpkey ))
145             {
146                 char *p, *appname = buffer;
147                 if ((p = strrchr( appname, '/' ))) appname = p + 1;
148                 if ((p = strrchr( appname, '\\' ))) appname = p + 1;
149                 strcat( appname, "\\Direct3D" );
150                 TRACE("appname = [%s]\n", appname);
151                 if (RegOpenKeyA( tmpkey, appname, &appkey )) appkey = 0;
152                 RegCloseKey( tmpkey );
153             }
154        }
155
156        if ( 0 != hkey || 0 != appkey )
157        {
158             if ( !get_config_key( hkey, appkey, "VertexShaderMode", buffer, size) )
159             {
160                 if (!strcmp(buffer,"none"))
161                 {
162                     TRACE("Disable vertex shaders\n");
163                     wined3d_settings.vs_mode = VS_NONE;
164                 }
165             }
166             if ( !get_config_key( hkey, appkey, "PixelShaderMode", buffer, size) )
167             {
168                 if (!strcmp(buffer,"enabled"))
169                 {
170                     TRACE("Allow pixel shaders\n");
171                     wined3d_settings.ps_mode = PS_HW;
172                 }
173                 if (!strcmp(buffer,"disabled"))
174                 {
175                     TRACE("Disable pixel shaders\n");
176                     wined3d_settings.ps_mode = PS_NONE;
177                 }
178             }
179             if ( !get_config_key( hkey, appkey, "VertexBufferMode", buffer, size) )
180             {
181                 if (!strcmp(buffer,"none"))
182                 {
183                     TRACE("Disable Vertex Buffer Hardware support\n");
184                     wined3d_settings.vbo_mode = VBO_NONE;
185                 }
186                 else if (!strcmp(buffer,"hardware"))
187                 {
188                     TRACE("Allow Vertex Buffer Hardware support\n");
189                     wined3d_settings.vbo_mode = VBO_HW;
190                 }
191             }
192             if ( !get_config_key( hkey, appkey, "UseGLSL", buffer, size) )
193             {
194                 if (!strcmp(buffer,"disabled"))
195                 {
196                     TRACE("Use of GL Shading Language disabled\n");
197                     wined3d_settings.glslRequested = FALSE;
198                 }
199             }
200             if ( !get_config_key( hkey, appkey, "OffscreenRenderingMode", buffer, size) )
201             {
202                 if (!strcmp(buffer,"backbuffer"))
203                 {
204                     TRACE("Using the backbuffer for offscreen rendering\n");
205                     wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
206                 }
207                 else if (!strcmp(buffer,"pbuffer"))
208                 {
209                     TRACE("Using PBuffers for offscreen rendering\n");
210                     wined3d_settings.offscreen_rendering_mode = ORM_PBUFFER;
211                 }
212                 else if (!strcmp(buffer,"fbo"))
213                 {
214                     TRACE("Using FBOs for offscreen rendering\n");
215                     wined3d_settings.offscreen_rendering_mode = ORM_FBO;
216                 }
217             }
218             if ( !get_config_key( hkey, appkey, "RenderTargetLockMode", buffer, size) )
219             {
220                 if (!strcmp(buffer,"disabled"))
221                 {
222                     TRACE("Disabling render target locking\n");
223                     wined3d_settings.rendertargetlock_mode = RTL_DISABLE;
224                 }
225                 else if (!strcmp(buffer,"readdraw"))
226                 {
227                     TRACE("Using glReadPixels for render target reading and glDrawPixels for writing\n");
228                     wined3d_settings.rendertargetlock_mode = RTL_READDRAW;
229                 }
230                 else if (!strcmp(buffer,"readtex"))
231                 {
232                     TRACE("Using glReadPixels for render target reading and textures for writing\n");
233                     wined3d_settings.rendertargetlock_mode = RTL_READTEX;
234                 }
235                 else if (!strcmp(buffer,"texdraw"))
236                 {
237                     TRACE("Using textures for render target reading and glDrawPixels for writing\n");
238                     wined3d_settings.rendertargetlock_mode = RTL_TEXDRAW;
239                 }
240                 else if (!strcmp(buffer,"textex"))
241                 {
242                     TRACE("Reading render targets via textures and writing via textures\n");
243                     wined3d_settings.rendertargetlock_mode = RTL_TEXTEX;
244                 }
245             }
246             if ( !get_config_key( hkey, appkey, "VideoMemorySize", buffer, size) )
247             {
248                 int TmpVideoMemorySize = atoi(buffer);
249                 if(TmpVideoMemorySize > 0)
250                 {
251                     wined3d_settings.emulated_textureram = TmpVideoMemorySize *1024*1024;
252                     TRACE("Use %iMB = %d byte for emulated_textureram\n",
253                             TmpVideoMemorySize,
254                             wined3d_settings.emulated_textureram);
255                 }
256                 else
257                     ERR("VideoMemorySize is %i but must be >0\n", TmpVideoMemorySize);
258             }
259             if ( !get_config_key( hkey, appkey, "WineLogo", buffer, size) )
260             {
261                 wined3d_settings.logo = HeapAlloc(GetProcessHeap(), 0, strlen(buffer) + 1);
262                 if(wined3d_settings.logo) strcpy(wined3d_settings.logo, buffer);
263             }
264             if ( !get_config_key( hkey, appkey, "Multisampling", buffer, size) )
265             {
266                 if (!strcmp(buffer,"enabled"))
267                 {
268                     TRACE("Allow multisampling\n");
269                     wined3d_settings.allow_multisampling = TRUE;
270                 }
271             }
272        }
273        if (wined3d_settings.vs_mode == VS_HW)
274            TRACE("Allow HW vertex shaders\n");
275        if (wined3d_settings.ps_mode == PS_NONE)
276            TRACE("Disable pixel shaders\n");
277        if (wined3d_settings.vbo_mode == VBO_NONE)
278            TRACE("Disable Vertex Buffer Hardware support\n");
279        if (wined3d_settings.glslRequested)
280            TRACE("If supported by your system, GL Shading Language will be used\n");
281
282        if (appkey) RegCloseKey( appkey );
283        if (hkey) RegCloseKey( hkey );
284     }
285     return TRUE;
286 }