diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1a7798fe8..7d0ab3560 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,11 +4,12 @@ Dash Faction Changelog Version 1.9.2 (not released yet) -------------------------------- [@is-this-c](https://github.com/is-this-c) +- Fix Dash Faction Launcher's querying of MSAA levels in Direct3D 11 - Set `rf::gr::text_2d_mode` to ignore fog - Fix `gr_d3d_bitmap`, so `gr_d3d_set_state` is called earlier - Fix a potential crash, after a client quits a game, if Directd3D 11 is enabled -- Improve compatibility with Alpine Faction servers -- Fix `PgUp`, `PgDown`, `End`, and `Home` on numeric keypads +- Improve compatibility with Alpine Faction's network protocol +- Fix Num Pad `PgUp`, `PgDown`, `End`, and `Home` Version 1.9.1 (released 2025-07-05) -------------------------------- diff --git a/game_patch/graphics/gr.cpp b/game_patch/graphics/gr.cpp index 5ce721e73..d2a90866d 100644 --- a/game_patch/graphics/gr.cpp +++ b/game_patch/graphics/gr.cpp @@ -332,5 +332,6 @@ void gr_apply_patch() lod_distance_scale_cmd.register_cmd(); // Fix `rf::gr::text_2d_mode`. - AsmWriter{0x0050BB40}.push(static_cast(rf::gr::FOG_NOT_ALLOWED)); + constexpr uint8_t TEXT_FOG_TYPE = static_cast(rf::gr::FOG_NOT_ALLOWED); + AsmWriter{0x0050BB40}.push(TEXT_FOG_TYPE); } diff --git a/launcher_common/VideoDeviceInfoProviderD3D11.cpp b/launcher_common/VideoDeviceInfoProviderD3D11.cpp index 128c3e400..479607b94 100644 --- a/launcher_common/VideoDeviceInfoProviderD3D11.cpp +++ b/launcher_common/VideoDeviceInfoProviderD3D11.cpp @@ -15,7 +15,7 @@ class VideoDeviceInfoProviderD3D11 : public VideoDeviceInfoProvider ~VideoDeviceInfoProviderD3D11() override = default; std::vector get_adapters() override; std::set get_resolutions(unsigned adapter, unsigned format) override; - std::set get_multisample_types(unsigned adapter, unsigned format, bool windowed) override; + std::set get_multisample_types(unsigned adapter, unsigned format, bool windowed) override; bool has_anisotropy_support(unsigned adapter) override; unsigned get_format_from_bpp(unsigned bpp) override @@ -123,30 +123,47 @@ std::set VideoDeviceInfoProviderD3D11::get_ return result; } -std::set VideoDeviceInfoProviderD3D11::get_multisample_types( - unsigned adapter, unsigned format, [[maybe_unused]] bool windowed +std::set VideoDeviceInfoProviderD3D11::get_multisample_types( + const unsigned adapter, + const unsigned format, + [[maybe_unused]] const bool windowed ) { - - ComPtr dxgi_adapter; + ComPtr dxgi_adapter{}; HRESULT hr = m_factory->EnumAdapters(adapter, &dxgi_adapter); if (FAILED(hr)) { xlog::error("EnumAdapters failed: {:x}", hr); return {}; } - ComPtr d3d11_device; - hr = m_D3D11CreateDevice(dxgi_adapter, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &d3d11_device, nullptr, nullptr); + ComPtr d3d11_device{}; + hr = m_D3D11CreateDevice( + dxgi_adapter, + D3D_DRIVER_TYPE_UNKNOWN, + nullptr, + 0, + nullptr, + 0, + D3D11_SDK_VERSION, + &d3d11_device, + nullptr, + nullptr + ); if (FAILED(hr)) { xlog::error("D3D11CreateDevice failed: {:x}", hr); return {}; } - std::set result; - for (unsigned i = 2; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; i *= 2) { - UINT quality_levels; - HRESULT hr = d3d11_device->CheckMultisampleQualityLevels(static_cast(format), i, &quality_levels); - if (SUCCEEDED(hr)) + std::set result{}; + for (uint32_t i = 2; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; i <<= 1) { + UINT quality_levels = 0; + const HRESULT hr = d3d11_device->CheckMultisampleQualityLevels( + static_cast(format), + i, + &quality_levels + ); + if (SUCCEEDED(hr) && quality_levels > 0) { result.insert(i); + } } return result; } diff --git a/launcher_common/VideoDeviceInfoProviderD3D8.cpp b/launcher_common/VideoDeviceInfoProviderD3D8.cpp index 370303671..7a00ff677 100644 --- a/launcher_common/VideoDeviceInfoProviderD3D8.cpp +++ b/launcher_common/VideoDeviceInfoProviderD3D8.cpp @@ -14,7 +14,7 @@ class VideoDeviceInfoProviderD3D8 : public VideoDeviceInfoProvider ~VideoDeviceInfoProviderD3D8() override = default; std::vector get_adapters() override; std::set get_resolutions(unsigned adapter, unsigned format) override; - std::set get_multisample_types(unsigned adapter, unsigned format, bool windowed) override; + std::set get_multisample_types(unsigned adapter, unsigned format, bool windowed) override; bool has_anisotropy_support(unsigned adapter) override; unsigned get_format_from_bpp(unsigned bpp) override @@ -83,14 +83,23 @@ std::set VideoDeviceInfoProviderD3D8::get_r return result; } -std::set VideoDeviceInfoProviderD3D8::get_multisample_types(unsigned adapter, unsigned format, bool windowed) +std::set VideoDeviceInfoProviderD3D8::get_multisample_types( + const unsigned adapter, + const unsigned format, + const bool windowed) { - std::set result; - for (unsigned i = 2; i < 16; ++i) { - HRESULT hr = m_d3d->CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, static_cast(format), windowed, - static_cast(i)); - if (SUCCEEDED(hr)) + std::set result{}; + for (uint32_t i = 2; i <= 16; ++i) { + const HRESULT hr = m_d3d->CheckDeviceMultiSampleType( + adapter, + D3DDEVTYPE_HAL, + static_cast(format), + windowed, + static_cast(i) + ); + if (SUCCEEDED(hr)) { result.insert(i); + } } return result; } diff --git a/launcher_common/VideoDeviceInfoProviderD3D9.cpp b/launcher_common/VideoDeviceInfoProviderD3D9.cpp index 8ee22162a..ce8f65d47 100644 --- a/launcher_common/VideoDeviceInfoProviderD3D9.cpp +++ b/launcher_common/VideoDeviceInfoProviderD3D9.cpp @@ -14,7 +14,7 @@ class VideoDeviceInfoProviderD3D9 : public VideoDeviceInfoProvider ~VideoDeviceInfoProviderD3D9() override = default; std::vector get_adapters() override; std::set get_resolutions(unsigned adapter, unsigned format) override; - std::set get_multisample_types(unsigned adapter, unsigned format, bool windowed) override; + std::set get_multisample_types(unsigned adapter, unsigned format, bool windowed) override; bool has_anisotropy_support(unsigned adapter) override; unsigned get_format_from_bpp(unsigned bpp) override @@ -83,14 +83,25 @@ std::set VideoDeviceInfoProviderD3D9::get_r return result; } -std::set VideoDeviceInfoProviderD3D9::get_multisample_types(unsigned adapter, unsigned format, bool windowed) -{ - std::set result; - for (unsigned i = 2; i <= 16; ++i) { - HRESULT hr = m_d3d->CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, static_cast(format), windowed, - static_cast(i), nullptr); - if (SUCCEEDED(hr)) +std::set VideoDeviceInfoProviderD3D9::get_multisample_types( + const unsigned adapter, + const unsigned format, + const bool windowed +) { + std::set result{}; + for (uint32_t i = 2; i <= 16; ++i) { + DWORD quality_levels = 0; + const HRESULT hr = m_d3d->CheckDeviceMultiSampleType( + adapter, + D3DDEVTYPE_HAL, + static_cast(format), + windowed, + static_cast(i), + &quality_levels + ); + if (SUCCEEDED(hr) && quality_levels > 0) { result.insert(i); + } } return result; } diff --git a/launcher_common/include/launcher_common/VideoDeviceInfoProvider.h b/launcher_common/include/launcher_common/VideoDeviceInfoProvider.h index 358b18020..782e0aa5b 100644 --- a/launcher_common/include/launcher_common/VideoDeviceInfoProvider.h +++ b/launcher_common/include/launcher_common/VideoDeviceInfoProvider.h @@ -23,7 +23,7 @@ class VideoDeviceInfoProvider virtual std::vector get_adapters() = 0; virtual unsigned get_format_from_bpp(unsigned bpp) = 0; virtual std::set get_resolutions(unsigned adapter, unsigned format) = 0; - virtual std::set get_multisample_types(unsigned adapter, unsigned format, bool windowed) = 0; + virtual std::set get_multisample_types(uint32_t adapter, uint32_t format, bool windowed) = 0; virtual bool has_anisotropy_support(unsigned adapter) = 0; };