mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxgi] Generate adapter LUIDs if Vulkan does not provide them
Needed because winevulkan does not provide adapter LUIDs. Fixes various wine test failures, and will be required to get D3D12 (vkd3d) to work on top of our DXGI implementation.
This commit is contained in:
parent
73b9846c4f
commit
1366fce0f8
@ -12,6 +12,30 @@
|
|||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
|
static LUID GetAdapterLUID(UINT Adapter) {
|
||||||
|
static std::mutex s_mutex;
|
||||||
|
static std::vector<LUID> s_luids;
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> lock(s_mutex);
|
||||||
|
uint32_t newLuidCount = Adapter + 1;
|
||||||
|
|
||||||
|
while (s_luids.size() < newLuidCount) {
|
||||||
|
LUID luid = { 0, 0 };
|
||||||
|
|
||||||
|
if (!AllocateLocallyUniqueId(&luid))
|
||||||
|
Logger::err("DXGI: Failed to allocate LUID");
|
||||||
|
|
||||||
|
|
||||||
|
Logger::info(str::format("DXGI: Adapter LUID ", s_luids.size(), ": ",
|
||||||
|
std::hex, luid.HighPart, ":", luid.LowPart, std::dec));
|
||||||
|
|
||||||
|
s_luids.push_back(luid);
|
||||||
|
}
|
||||||
|
|
||||||
|
return s_luids[Adapter];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DxgiVkAdapter::DxgiVkAdapter(DxgiAdapter* pAdapter)
|
DxgiVkAdapter::DxgiVkAdapter(DxgiAdapter* pAdapter)
|
||||||
: m_adapter(pAdapter) {
|
: m_adapter(pAdapter) {
|
||||||
|
|
||||||
@ -53,10 +77,12 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxgiAdapter::DxgiAdapter(
|
DxgiAdapter::DxgiAdapter(
|
||||||
DxgiFactory* factory,
|
DxgiFactory* factory,
|
||||||
const Rc<DxvkAdapter>& adapter)
|
const Rc<DxvkAdapter>& adapter,
|
||||||
|
UINT index)
|
||||||
: m_factory (factory),
|
: m_factory (factory),
|
||||||
m_adapter (adapter),
|
m_adapter (adapter),
|
||||||
m_interop (this) {
|
m_interop (this),
|
||||||
|
m_index (index) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,6 +297,9 @@ namespace dxvk {
|
|||||||
|
|
||||||
if (deviceId.deviceLUIDValid)
|
if (deviceId.deviceLUIDValid)
|
||||||
std::memcpy(&pDesc->AdapterLuid, deviceId.deviceLUID, VK_LUID_SIZE);
|
std::memcpy(&pDesc->AdapterLuid, deviceId.deviceLUID, VK_LUID_SIZE);
|
||||||
|
else
|
||||||
|
pDesc->AdapterLuid = GetAdapterLUID(m_index);
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,8 +44,10 @@ namespace dxvk {
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
DxgiAdapter(
|
DxgiAdapter(
|
||||||
DxgiFactory* factory,
|
DxgiFactory* factory,
|
||||||
const Rc<DxvkAdapter>& adapter);
|
const Rc<DxvkAdapter>& adapter,
|
||||||
|
UINT index);
|
||||||
|
|
||||||
~DxgiAdapter();
|
~DxgiAdapter();
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE QueryInterface(
|
HRESULT STDMETHODCALLTYPE QueryInterface(
|
||||||
@ -105,6 +107,7 @@ namespace dxvk {
|
|||||||
Rc<DxvkAdapter> m_adapter;
|
Rc<DxvkAdapter> m_adapter;
|
||||||
DxgiVkAdapter m_interop;
|
DxgiVkAdapter m_interop;
|
||||||
|
|
||||||
|
UINT m_index;
|
||||||
UINT64 m_memReservation[2] = { 0, 0 };
|
UINT64 m_memReservation[2] = { 0, 0 };
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include "dxgi_swapchain.h"
|
#include "dxgi_swapchain.h"
|
||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
DxgiFactory::DxgiFactory(UINT Flags)
|
DxgiFactory::DxgiFactory(UINT Flags)
|
||||||
: m_instance (new DxvkInstance()),
|
: m_instance (new DxvkInstance()),
|
||||||
m_monitorInfo (this),
|
m_monitorInfo (this),
|
||||||
@ -192,7 +192,7 @@ namespace dxvk {
|
|||||||
if (dxvkAdapter == nullptr)
|
if (dxvkAdapter == nullptr)
|
||||||
return DXGI_ERROR_NOT_FOUND;
|
return DXGI_ERROR_NOT_FOUND;
|
||||||
|
|
||||||
*ppAdapter = ref(new DxgiAdapter(this, dxvkAdapter));
|
*ppAdapter = ref(new DxgiAdapter(this, dxvkAdapter, Adapter));
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user