diff --git a/reactos/dll/cpl/CMakeLists.txt b/reactos/dll/cpl/CMakeLists.txt
index fc7aa6b536f..70a79d3e5ea 100644
--- a/reactos/dll/cpl/CMakeLists.txt
+++ b/reactos/dll/cpl/CMakeLists.txt
@@ -18,3 +18,4 @@ add_subdirectory(sysdm)
add_subdirectory(telephon)
add_subdirectory(timedate)
add_subdirectory(usrmgr)
+add_subdirectory(wined3dcfg)
diff --git a/reactos/dll/cpl/cpl.rbuild b/reactos/dll/cpl/cpl.rbuild
index 4f4e896d174..93359b8f8c6 100644
--- a/reactos/dll/cpl/cpl.rbuild
+++ b/reactos/dll/cpl/cpl.rbuild
@@ -55,4 +55,7 @@
+
+
+
\ No newline at end of file
diff --git a/reactos/dll/cpl/wined3dcfg/CMakeLists.txt b/reactos/dll/cpl/wined3dcfg/CMakeLists.txt
new file mode 100644
index 00000000000..3a942cc9e28
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/CMakeLists.txt
@@ -0,0 +1,22 @@
+
+set_rc_compiler()
+
+spec2def(wined3dcfg.cpl wined3dcfg.spec)
+
+add_library(wined3dcfg SHARED
+ wined3dcfg.c
+ general.c
+ wined3dcfg.rc
+ ${CMAKE_CURRENT_BINARY_DIR}/wined3dcfg.def)
+
+set_module_type(wined3dcfg cpl UNICODE)
+
+add_importlibs(wined3dcfg
+ msvcrt
+ user32
+ comctl32
+ advapi32
+ kernel32)
+
+add_pch(wined3dcfg wined3dcfg.h)
+add_cd_file(TARGET wined3dcfg DESTINATION reactos/system32 FOR all)
diff --git a/reactos/dll/cpl/wined3dcfg/general.c b/reactos/dll/cpl/wined3dcfg/general.c
new file mode 100644
index 00000000000..6314bf2e7a9
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/general.c
@@ -0,0 +1,163 @@
+#include "wined3dcfg.h"
+
+static LONG ReadSetting(HKEY hKey, PWCHAR szKey, PWCHAR szBuffer, DWORD dwSize)
+{
+ return RegQueryValueExW(hKey, szKey, NULL, NULL, (LPBYTE)szBuffer, &dwSize);
+}
+
+static VOID SaveSetting(HKEY hKey, PWCHAR szKey, PWCHAR szState)
+{
+ RegSetValueExW(hKey, szKey, 0, REG_SZ, (LPBYTE)szState, (wcslen(szState) + 1) * sizeof(WCHAR));
+}
+
+static VOID InitSettings(HWND hWndDlg)
+{
+ HKEY hKey;
+ WCHAR szBuffer[MAX_KEY_LENGTH];
+ DWORD dwSize = MAX_KEY_LENGTH;
+
+ if (RegOpenKeyExW(HKEY_CURRENT_USER,
+ KEY_WINE,
+ 0,
+ KEY_READ,
+ &hKey) != ERROR_SUCCESS)
+ {
+ return;
+ }
+
+ if(ReadSetting(hKey, KEY_GLSL, szBuffer, dwSize) == ERROR_SUCCESS)
+ CheckDlgButton(hWndDlg, IDC_GLSL, (wcscmp(VALUE_DISABLED, szBuffer) != 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ if(ReadSetting(hKey, KEY_MULTISAMPLING, szBuffer, dwSize) == ERROR_SUCCESS)
+ CheckDlgButton(hWndDlg, IDC_MULTISAMPLING, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ if(ReadSetting(hKey, KEY_PIXELSHADERS, szBuffer, dwSize) == ERROR_SUCCESS)
+ CheckDlgButton(hWndDlg, IDC_PIXELSHADERS, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ if(ReadSetting(hKey, KEY_STRICTDRAWORDERING, szBuffer, dwSize) == ERROR_SUCCESS)
+ CheckDlgButton(hWndDlg, IDC_STRICTDRAWORDERING, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ if(ReadSetting(hKey, KEY_VERTEXSHADERS, szBuffer, dwSize) == ERROR_SUCCESS)
+ CheckDlgButton(hWndDlg, IDC_VERTEXSHADERS, (wcscmp(VALUE_NONE, szBuffer) != 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_ADDSTRING, 0, (LPARAM)VALUE_FBO);
+ SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_ADDSTRING, 0, (LPARAM)VALUE_BACKBUFFER);
+
+ SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETITEMDATA, ITEM_FBO, (LPARAM)ITEM_FBO);
+ SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETITEMDATA, ITEM_BACKBUFFER, (LPARAM)ITEM_BACKBUFFER);
+
+ if(ReadSetting(hKey, KEY_OFFSCREEN, szBuffer, dwSize) == ERROR_SUCCESS && !wcscmp(VALUE_BACKBUFFER, szBuffer))
+ SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETCURSEL, 1, 0);
+ else
+ SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETCURSEL, 0, 0);
+
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_READTEX);
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_READDRAW);
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_DISABLED);
+
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_READTEX, (LPARAM)ITEM_READTEX);
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_READDRAW, (LPARAM)ITEM_READDRAW);
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_DISABLED, (LPARAM)ITEM_DISABLED);
+
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 0, 0);
+
+ if(ReadSetting(hKey, KEY_LOCKING, szBuffer, dwSize) == ERROR_SUCCESS)
+ {
+ if(!wcscmp(VALUE_READDRAW, szBuffer))
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 1, 0);
+ else if(!wcscmp(VALUE_DISABLED, szBuffer))
+ SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 2, 0);
+ }
+
+ RegCloseKey(hKey);
+}
+
+static VOID WriteSettings(HWND hWndDlg)
+{
+ HKEY hKey;
+ INT iCurSel;
+
+ if (RegOpenKeyExW(HKEY_CURRENT_USER,
+ KEY_WINE,
+ 0,
+ KEY_WRITE,
+ &hKey) != ERROR_SUCCESS)
+ {
+ return;
+ }
+
+ SaveSetting(hKey, KEY_GLSL, (IsDlgButtonChecked(hWndDlg, IDC_GLSL) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
+ SaveSetting(hKey, KEY_MULTISAMPLING, (IsDlgButtonChecked(hWndDlg, IDC_MULTISAMPLING) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
+ SaveSetting(hKey, KEY_PIXELSHADERS, (IsDlgButtonChecked(hWndDlg, IDC_PIXELSHADERS) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
+ SaveSetting(hKey, KEY_STRICTDRAWORDERING, (IsDlgButtonChecked(hWndDlg, IDC_STRICTDRAWORDERING) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
+ SaveSetting(hKey, KEY_VERTEXSHADERS, (IsDlgButtonChecked(hWndDlg, IDC_VERTEXSHADERS) == BST_CHECKED) ? VALUE_ENABLED : VALUE_NONE);
+
+ iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_GETCURSEL, 0, 0);
+
+ if(iCurSel != CB_ERR)
+ {
+ iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_GETITEMDATA, (WPARAM)iCurSel, 0);
+
+ if(iCurSel == ITEM_READDRAW)
+ SaveSetting(hKey, KEY_LOCKING, VALUE_READDRAW);
+ else if(iCurSel == ITEM_DISABLED)
+ SaveSetting(hKey, KEY_LOCKING, VALUE_DISABLED);
+ else
+ SaveSetting(hKey, KEY_LOCKING, VALUE_READTEX);
+ }
+
+ iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_GETCURSEL, 0, 0);
+
+ if(iCurSel != CB_ERR)
+ {
+ iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_GETITEMDATA, (WPARAM)iCurSel, 0);
+
+ if(iCurSel == ITEM_BACKBUFFER)
+ SaveSetting(hKey, KEY_OFFSCREEN, VALUE_BACKBUFFER);
+ else
+ SaveSetting(hKey, KEY_OFFSCREEN, VALUE_FBO);
+ }
+
+ RegCloseKey(hKey);
+}
+
+
+INT_PTR CALLBACK GeneralPageProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ LPPSHNOTIFY lppsn;
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ InitSettings(hWndDlg);
+ return TRUE;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_GLSL:
+ case IDC_LOCKING:
+ case IDC_MULTISAMPLING:
+ case IDC_OFFSCREEN:
+ case IDC_PIXELSHADERS:
+ case IDC_STRICTDRAWORDERING:
+ case IDC_VERTEXSHADERS:
+ PropSheet_Changed(GetParent(hWndDlg), hWndDlg);
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case WM_NOTIFY:
+ lppsn = (LPPSHNOTIFY)lParam;
+ if (lppsn->hdr.code == PSN_APPLY)
+ {
+ WriteSettings(hWndDlg);
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
diff --git a/reactos/dll/cpl/wined3dcfg/lang/en-US.rc b/reactos/dll/cpl/wined3dcfg/lang/en-US.rc
new file mode 100644
index 00000000000..704df8b832a
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/lang/en-US.rc
@@ -0,0 +1,27 @@
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+IDD_PROPPAGEGENERAL DIALOGEX 0, 0, 246, 228
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ ICON IDI_CPLICON, IDI_CPLICON, 8, 5, 21, 20
+ GROUPBOX "Shaders", -1, 5, 35, 230, 65
+ AUTOCHECKBOX "Enable &GLSL", IDC_GLSL, 15, 50, 150, 10
+ AUTOCHECKBOX "Enable &pixel shaders", IDC_PIXELSHADERS, 15, 65, 150, 10
+ AUTOCHECKBOX "Enable &Vertex shaders", IDC_VERTEXSHADERS, 15, 80, 150, 10
+ GROUPBOX "Rendering", -1, 5, 110, 230, 85
+ AUTOCHECKBOX "Force &multisampling", IDC_MULTISAMPLING, 15, 125, 150, 10
+ AUTOCHECKBOX "Force &strict draw ordering", IDC_STRICTDRAWORDERING, 15, 140, 150, 10
+ LTEXT "Offscreen rendering:", -1, 15, 157, 80, 10
+ COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 50, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST
+ LTEXT "Render target locking:", -1, 15, 175, 72, 10, SS_LEFT
+ COMBOBOX IDC_LOCKING, 95, 173, 90, 50, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST
+END
+
+
+STRINGTABLE
+BEGIN
+ IDS_CPLNAME "WineD3D"
+ IDS_CPLDESCRIPTION "Configures WineD3D runtime settings."
+END
diff --git a/reactos/dll/cpl/wined3dcfg/resource.h b/reactos/dll/cpl/wined3dcfg/resource.h
new file mode 100644
index 00000000000..c28e97242a2
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/resource.h
@@ -0,0 +1,23 @@
+#pragma once
+
+/* Icons */
+#define IDI_CPLICON 1
+
+/* Dialogs */
+#define IDD_PROPPAGEGENERAL 100
+
+/* Controls */
+#define IDC_PIXELSHADERS 1001
+#define IDC_GLSL 1002
+#define IDC_VERTEXSHADERS 1003
+#define IDC_MULTISAMPLING 1004
+#define IDC_STRICTDRAWORDERING 1005
+#define IDC_OFFSCREEN 1006
+#define IDC_LOCKING 1007
+
+
+/* Strings */
+#define IDS_CPLNAME 10000
+#define IDS_CPLDESCRIPTION 10001
+
+/* EOF */
diff --git a/reactos/dll/cpl/wined3dcfg/resources/wined3dcfg.ico b/reactos/dll/cpl/wined3dcfg/resources/wined3dcfg.ico
new file mode 100644
index 00000000000..75c14de6b97
Binary files /dev/null and b/reactos/dll/cpl/wined3dcfg/resources/wined3dcfg.ico differ
diff --git a/reactos/dll/cpl/wined3dcfg/rsrc.rc b/reactos/dll/cpl/wined3dcfg/rsrc.rc
new file mode 100644
index 00000000000..f110487549d
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/rsrc.rc
@@ -0,0 +1,6 @@
+#include
+#include "resource.h"
+
+// UTF-8
+#pragma code_page(65001)
+#include "lang/en-US.rc"
diff --git a/reactos/dll/cpl/wined3dcfg/wined3dcfg.c b/reactos/dll/cpl/wined3dcfg/wined3dcfg.c
new file mode 100644
index 00000000000..98b1eafdd6a
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/wined3dcfg.c
@@ -0,0 +1,77 @@
+#include "wined3dcfg.h"
+
+HINSTANCE hApplet = 0;
+
+LONG CALLBACK AppletInit(HWND hWnd)
+{
+ PROPSHEETPAGEW psp;
+ PROPSHEETHEADERW psh;
+ WCHAR szCaption[1024];
+
+ LoadStringW(hApplet, IDS_CPLNAME, szCaption, sizeof(szCaption) / sizeof(WCHAR));
+
+ ZeroMemory(&psp, sizeof(PROPSHEETPAGE));
+ psp.dwSize = sizeof(PROPSHEETPAGE);
+ psp.dwFlags = PSP_DEFAULT;
+ psp.hInstance = hApplet;
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGEGENERAL);
+ psp.pfnDlgProc = GeneralPageProc;
+
+ ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
+ psh.dwSize = sizeof(PROPSHEETHEADER);
+ psh.dwFlags = PSH_PROPSHEETPAGE;
+ psh.hwndParent = hWnd;
+ psh.hInstance = hApplet;
+ psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLICON));
+ psh.pszCaption = szCaption;
+ psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
+ psh.nStartPage = 0;
+ psh.ppsp = &psp;
+
+ return (LONG)(PropertySheet(&psh) != -1);
+}
+
+LONG CALLBACK CPlApplet(HWND hWnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
+{
+ switch (uMsg)
+ {
+ case CPL_INIT:
+ return TRUE;
+
+ case CPL_GETCOUNT:
+ return 1;
+
+ case CPL_INQUIRE:
+ {
+ CPLINFO *CPlInfo = (CPLINFO*)lParam2;
+ CPlInfo->lData = 0;
+ CPlInfo->idIcon = IDI_CPLICON;
+ CPlInfo->idInfo = IDS_CPLDESCRIPTION;
+ CPlInfo->idName = IDS_CPLNAME;
+ }
+ break;
+
+ case CPL_DBLCLK:
+ AppletInit(hWnd);
+ break;
+ }
+
+ return FALSE;
+}
+
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
+{
+ UNREFERENCED_PARAMETER(lpvReserved);
+
+ switch (dwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ case DLL_THREAD_ATTACH:
+ hApplet = hinstDLL;
+ break;
+ }
+
+ return TRUE;
+}
+
diff --git a/reactos/dll/cpl/wined3dcfg/wined3dcfg.h b/reactos/dll/cpl/wined3dcfg/wined3dcfg.h
new file mode 100644
index 00000000000..480c07f5c6a
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/wined3dcfg.h
@@ -0,0 +1,37 @@
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "resource.h"
+
+#define MAX_KEY_LENGTH 256
+
+#define ITEM_FBO 0
+#define ITEM_BACKBUFFER 1
+
+#define ITEM_READTEX 0
+#define ITEM_READDRAW 1
+#define ITEM_DISABLED 2
+
+#define VALUE_READTEX L"readtex"
+#define VALUE_READDRAW L"readdraw"
+#define VALUE_ENABLED L"enabled"
+#define VALUE_DISABLED L"disabled"
+#define VALUE_NONE L"none"
+#define VALUE_BACKBUFFER L"backbuffer"
+#define VALUE_FBO L"fbo"
+
+#define KEY_WINE L"Software\\Wine\\Direct3D"
+
+#define KEY_GLSL L"UseGLSL"
+#define KEY_VERTEXSHADERS L"VertexShaderMode"
+#define KEY_PIXELSHADERS L"PixelShaderMode"
+#define KEY_STRICTDRAWORDERING L"StrictDrawOrdering"
+#define KEY_OFFSCREEN L"OffscreenRenderingMode"
+#define KEY_MULTISAMPLING L"Multisampling"
+#define KEY_LOCKING L"RenderTargetLockMode"
+
+INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
diff --git a/reactos/dll/cpl/wined3dcfg/wined3dcfg.rbuild b/reactos/dll/cpl/wined3dcfg/wined3dcfg.rbuild
new file mode 100644
index 00000000000..5ffd603acc5
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/wined3dcfg.rbuild
@@ -0,0 +1,14 @@
+
+
+
+
+ .
+ user32
+ comctl32
+ advapi32
+ kernel32
+ wined3dcfg.c
+ general.c
+ wined3dcfg.rc
+ wined3dcfg.h
+
diff --git a/reactos/dll/cpl/wined3dcfg/wined3dcfg.rc b/reactos/dll/cpl/wined3dcfg/wined3dcfg.rc
new file mode 100644
index 00000000000..5fafaec5340
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/wined3dcfg.rc
@@ -0,0 +1,15 @@
+#include
+#include "resource.h"
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS WineD3D Configuration Control Panel\0"
+#define REACTOS_STR_INTERNAL_NAME "WineD3Dcfg\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "WineD3Dcfg.cpl\0"
+#include
+
+/* Icons */
+IDI_CPLICON ICON "resources/wined3dcfg.ico"
+
+#include "rsrc.rc"
diff --git a/reactos/dll/cpl/wined3dcfg/wined3dcfg.spec b/reactos/dll/cpl/wined3dcfg/wined3dcfg.spec
new file mode 100644
index 00000000000..93898831339
--- /dev/null
+++ b/reactos/dll/cpl/wined3dcfg/wined3dcfg.spec
@@ -0,0 +1,2 @@
+@ stdcall CPlApplet(ptr long ptr ptr)
+