protonscr

No longer working on Winlator Glibc after 2.6.1-260

dxvkclosed
doitsujin/dxvk#4975 · opened 2025-06-05 by KostasGangstar-AI · updated 2025-06-06 · 2 comments · github
KKostasGangstar-AI 2025-06-05 github

So basically this is the latest working DXVK master build on Winlator Glibc
https://github.com/doitsujin/dxvk/actions/runs/15419848402
Every master after this one doesn't work with the DirectX 9 test I tried and Fallout New Vegas
https://github.com/doitsujin/dxvk/actions/runs/15420006650

System information

  • GPU: Adreno 725
  • Driver:Turnip 25.2.0
  • Wine version: 9.16 Custom
  • DXVK version: All master builds after master 2.6.1-260
KK0bin maintainer 2025-06-05 github

Android is not a supported platform for DXVK. Please report this to whoever maintains whatever Winlator version you're using.

Lleegao 2025-06-05 github

@K0bin

I believe there's a legitimate hidden issue here (outside of the regression within Winlator), specifically with this commit: https://github.com/doitsujin/dxvk/commit/3e9246081853fd1d1adb5ebce86ea0b392f9202c

The semantic of handling failed vkCreateDevice in dxvk::DxvkAdapter::createDevice was changed from throwing an exception (which downstream code still expects) to silently returning a nullptr (which downstream does not expect and does not check):

E.g. in the past, an error would've been thrown: https://github.com/doitsujin/dxvk/blob/4f47cb21032926b1f136035e696dc286ebd3cdc7/src/dxvk/dxvk_adapter.cpp#L569

    if (vr != VK_SUCCESS)
      throw DxvkError("DxvkAdapter: Failed to create device");

Now, a nullptr device is returned: https://github.com/doitsujin/dxvk/blob/10c9ef05e08ca28af18366c7f163bf838828300c/src/dxvk/dxvk_adapter.cpp#L228

    if (vr) {
      Logger::err(str::format("Failed to create Vulkan device: ", vr));
      return nullptr;
    }

However, it's still being called with the expectation that it throws instead of returning a nullptr, e.g.: https://github.com/doitsujin/dxvk/blob/4f47cb21032926b1f136035e696dc286ebd3cdc7/src/d3d11/d3d11_main.cpp#L103

    try {
      // ...
      Com<D3D11DXGIDevice> device = new D3D11DXGIDevice(
        pAdapter, nullptr, nullptr,
        dxvkInstance, dxvkAdapter, dxvkDevice, <-- is now nullable
        devFeatureLevel, Flags);
      // ...
    } catch (const DxvkError& e) {
      Logger::err("D3D11InternalCreateDevice: Failed to create D3D11 device");
      return E_FAIL;
    }

The D3D11DXGIDevice constructor then triggers:

  D3D11DXGIDevice::D3D11DXGIDevice(
          IDXGIAdapter*       pAdapter,
          ID3D12Device*       pD3D12Device,
          ID3D12CommandQueue* pD3D12Queue,
          Rc<DxvkInstance>    pDxvkInstance,
          Rc<DxvkAdapter>     pDxvkAdapter,
          Rc<DxvkDevice>      pDxvkDevice,
          D3D_FEATURE_LEVEL   FeatureLevel,
          UINT                FeatureFlags)
  : m_dxgiAdapter   (pAdapter),
    // ...
    m_dxvkDevice    (pDxvkDevice), <-- now nullable
    m_d3d11Device   (this, FeatureLevel, FeatureFlags),
    // ...

The m_d3d11Device construction calls:

  D3D11Device::D3D11Device(
          D3D11DXGIDevice*    pContainer,
          D3D_FEATURE_LEVEL   FeatureLevel,
          UINT                FeatureFlags)
  : m_container         (pContainer),
    // ...
    m_dxvkDevice        (pContainer->GetDXVKDevice()), <-- now nullable
    m_dxvkAdapter       (m_dxvkDevice->adapter()),  <-- segfaults if dxvkDevice is null
    // ...

Should DxvkAdapter::createDevice keep throwing an exception?

Nothing extracted yet.