Batch #1484 by ragnarok-clanker: 0 byte-identical, 12 confirmed by peer review. - fn_09780 DirectDrawEnumeration::Devices: logic confirmed by peer review - fn_09781 DirectDrawEnumeration::DeviceCount: logic confirmed by peer review - fn_09782 DirectDrawEnumeration::DevicesSeen: logic confirmed by peer review - fn_09777 DirectDrawEnumeration::Enumerate: logic confirmed by peer review - fn_09778 DirectDrawEnumeration::Device: logic confirmed by peer review - fn_09779 DirectDrawEnumeration::Adapter: logic confirmed by peer review - fn_09783 DirectDrawEnumeration::Mode: logic confirmed by peer review - fn_09785 DirectDrawEnumeration::ClearModes: logic confirmed by peer review - fn_02331 EnumerateDisplayModesDX7: logic confirmed by peer review - fn_02326 EnumerateAdaptersDX7: logic confirmed by peer review - fn_02291 EnumerateDisplayModes: logic confirmed by peer review - fn_02283 EnumerateRenderAdapters: logic confirmed by peer review Reviewed-by: ragnarok-clanker
71 lines
2 KiB
C++
71 lines
2 KiB
C++
#include "Client/Registry.h"
|
|
#include "Render/DeviceSelection.h"
|
|
#include "Render/DisplayMode.h"
|
|
|
|
#include <algorithm>
|
|
#include <d3d9.h>
|
|
#include <utility>
|
|
|
|
// OFFSET: 0x0056A590
|
|
// FUNCTION: fn_02291
|
|
std::vector<DisplayMode> EnumerateDisplayModes(int backend, unsigned deviceIndex) {
|
|
if (backend == 1) {
|
|
return EnumerateDisplayModesDX7(deviceIndex);
|
|
}
|
|
|
|
if (backend == 2) {
|
|
return EnumerateDisplayModesDX9(deviceIndex);
|
|
}
|
|
|
|
return {};
|
|
}
|
|
|
|
// OFFSET: 0x0056DCF0
|
|
// FUNCTION: fn_02372
|
|
std::vector<DisplayMode> EnumerateDisplayModesDX9(UINT adapter) {
|
|
IDirect3D9Ex* direct3D = nullptr;
|
|
std::vector<DisplayMode> result;
|
|
|
|
if (SUCCEEDED(Direct3DCreate9Ex(D3D_SDK_VERSION, &direct3D))) {
|
|
const UINT count = direct3D->GetAdapterModeCount(adapter, D3DFMT_X8R8G8B8);
|
|
std::vector<std::pair<unsigned, unsigned>> dimensions;
|
|
dimensions.reserve(count);
|
|
|
|
for (UINT index = 0; index < count; ++index) {
|
|
D3DDISPLAYMODE mode;
|
|
|
|
if (SUCCEEDED(direct3D->EnumAdapterModes(adapter, D3DFMT_X8R8G8B8, index, &mode)) && mode.Height >= 664) {
|
|
dimensions.emplace_back(mode.Width, mode.Height);
|
|
}
|
|
}
|
|
|
|
std::sort(dimensions.begin(), dimensions.end());
|
|
dimensions.erase(std::unique(dimensions.begin(), dimensions.end()), dimensions.end());
|
|
result.reserve(dimensions.size());
|
|
|
|
for (const auto& [width, height] : dimensions) {
|
|
result.push_back({width, height, 32, std::to_string(width) + " x " + std::to_string(height)});
|
|
}
|
|
}
|
|
|
|
if (direct3D) {
|
|
direct3D->Release();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
// OFFSET: 0x0056A7E0
|
|
// FUNCTION: fn_02297
|
|
LSTATUS SaveDisplayDeviceSettings() {
|
|
HKEY key = nullptr;
|
|
LSTATUS status = RegCreateKeyExA(HKEY_LOCAL_MACHINE, g_subKey, 0, nullptr, 0, KEY_ALL_ACCESS, nullptr, &key, nullptr);
|
|
|
|
if (status == ERROR_SUCCESS) {
|
|
RegSetValueExA(key, "GUIDDEVICE", 0, REG_BINARY, g_guidDevice, 16);
|
|
RegSetValueExA(key, "GUIDDRIVER", 0, REG_BINARY, g_guidDriver, 16);
|
|
status = RegSetValueExA(key, "DEVICENAME", 0, REG_SZ, reinterpret_cast<const BYTE*>(g_deviceName), 40);
|
|
}
|
|
|
|
return status;
|
|
}
|