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) +