mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-07 16:54:14 +01:00
[dxgi] Implement IDXGIAdapter3
This commit is contained in:
parent
171251bc83
commit
81bb561c75
@ -36,6 +36,7 @@ namespace dxvk {
|
|||||||
|| riid == __uuidof(IDXGIAdapter)
|
|| riid == __uuidof(IDXGIAdapter)
|
||||||
|| riid == __uuidof(IDXGIAdapter1)
|
|| riid == __uuidof(IDXGIAdapter1)
|
||||||
|| riid == __uuidof(IDXGIAdapter2)
|
|| riid == __uuidof(IDXGIAdapter2)
|
||||||
|
|| riid == __uuidof(IDXGIAdapter3)
|
||||||
|| riid == __uuidof(IDXGIVkAdapter)) {
|
|| riid == __uuidof(IDXGIVkAdapter)) {
|
||||||
*ppvObject = ref(this);
|
*ppvObject = ref(this);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -208,6 +209,95 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE DxgiAdapter::QueryVideoMemoryInfo(
|
||||||
|
UINT NodeIndex,
|
||||||
|
DXGI_MEMORY_SEGMENT_GROUP MemorySegmentGroup,
|
||||||
|
DXGI_QUERY_VIDEO_MEMORY_INFO* pVideoMemoryInfo) {
|
||||||
|
if (NodeIndex > 0 || !pVideoMemoryInfo)
|
||||||
|
return DXGI_ERROR_INVALID_CALL;
|
||||||
|
|
||||||
|
if (MemorySegmentGroup != DXGI_MEMORY_SEGMENT_GROUP_LOCAL
|
||||||
|
&& MemorySegmentGroup != DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL)
|
||||||
|
return DXGI_ERROR_INVALID_CALL;
|
||||||
|
|
||||||
|
DxvkAdapterMemoryInfo memInfo = m_adapter->getMemoryHeapInfo();
|
||||||
|
|
||||||
|
VkMemoryHeapFlags heapFlagMask = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
|
||||||
|
VkMemoryHeapFlags heapFlags = 0;
|
||||||
|
|
||||||
|
if (MemorySegmentGroup == DXGI_MEMORY_SEGMENT_GROUP_LOCAL)
|
||||||
|
heapFlags |= VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
|
||||||
|
|
||||||
|
pVideoMemoryInfo->Budget = 0;
|
||||||
|
pVideoMemoryInfo->CurrentUsage = 0;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < memInfo.heapCount; i++) {
|
||||||
|
if ((memInfo.heaps[i].heapFlags & heapFlagMask) != heapFlags)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pVideoMemoryInfo->Budget += memInfo.heaps[i].memoryAvailable;
|
||||||
|
pVideoMemoryInfo->CurrentUsage += memInfo.heaps[i].memoryAllocated;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We don't implement reservation, but the observable
|
||||||
|
// behaviour should match that of Windows drivers
|
||||||
|
uint32_t segmentId = uint32_t(MemorySegmentGroup);
|
||||||
|
|
||||||
|
pVideoMemoryInfo->AvailableForReservation = pVideoMemoryInfo->Budget / 2;
|
||||||
|
pVideoMemoryInfo->CurrentReservation = m_memReservation[segmentId];
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE DxgiAdapter::SetVideoMemoryReservation(
|
||||||
|
UINT NodeIndex,
|
||||||
|
DXGI_MEMORY_SEGMENT_GROUP MemorySegmentGroup,
|
||||||
|
UINT64 Reservation) {
|
||||||
|
DXGI_QUERY_VIDEO_MEMORY_INFO info;
|
||||||
|
|
||||||
|
HRESULT hr = QueryVideoMemoryInfo(
|
||||||
|
NodeIndex, MemorySegmentGroup, &info);
|
||||||
|
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
if (Reservation > info.AvailableForReservation)
|
||||||
|
return DXGI_ERROR_INVALID_CALL;
|
||||||
|
|
||||||
|
uint32_t segmentId = uint32_t(MemorySegmentGroup);
|
||||||
|
m_memReservation[segmentId] = Reservation;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE DxgiAdapter::RegisterHardwareContentProtectionTeardownStatusEvent(
|
||||||
|
HANDLE hEvent,
|
||||||
|
DWORD* pdwCookie) {
|
||||||
|
Logger::err("DxgiAdapter::RegisterHardwareContentProtectionTeardownStatusEvent: Not implemented");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE DxgiAdapter::RegisterVideoMemoryBudgetChangeNotificationEvent(
|
||||||
|
HANDLE hEvent,
|
||||||
|
DWORD* pdwCookie) {
|
||||||
|
Logger::err("DxgiAdapter::RegisterVideoMemoryBudgetChangeNotificationEvent: Not implemented");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void STDMETHODCALLTYPE DxgiAdapter::UnregisterHardwareContentProtectionTeardownStatus(
|
||||||
|
DWORD dwCookie) {
|
||||||
|
Logger::err("DxgiAdapter::UnregisterHardwareContentProtectionTeardownStatus: Not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void STDMETHODCALLTYPE DxgiAdapter::UnregisterVideoMemoryBudgetChangeNotification(
|
||||||
|
DWORD dwCookie) {
|
||||||
|
Logger::err("DxgiAdapter::UnregisterVideoMemoryBudgetChangeNotification: Not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkAdapter> STDMETHODCALLTYPE DxgiAdapter::GetDXVKAdapter() {
|
Rc<DxvkAdapter> STDMETHODCALLTYPE DxgiAdapter::GetDXVKAdapter() {
|
||||||
return m_adapter;
|
return m_adapter;
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,30 @@ namespace dxvk {
|
|||||||
HRESULT STDMETHODCALLTYPE GetDesc2(
|
HRESULT STDMETHODCALLTYPE GetDesc2(
|
||||||
DXGI_ADAPTER_DESC2* pDesc) final;
|
DXGI_ADAPTER_DESC2* pDesc) final;
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE QueryVideoMemoryInfo(
|
||||||
|
UINT NodeIndex,
|
||||||
|
DXGI_MEMORY_SEGMENT_GROUP MemorySegmentGroup,
|
||||||
|
DXGI_QUERY_VIDEO_MEMORY_INFO* pVideoMemoryInfo) final;
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE SetVideoMemoryReservation(
|
||||||
|
UINT NodeIndex,
|
||||||
|
DXGI_MEMORY_SEGMENT_GROUP MemorySegmentGroup,
|
||||||
|
UINT64 Reservation) final;
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE RegisterHardwareContentProtectionTeardownStatusEvent(
|
||||||
|
HANDLE hEvent,
|
||||||
|
DWORD* pdwCookie) final;
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE RegisterVideoMemoryBudgetChangeNotificationEvent(
|
||||||
|
HANDLE hEvent,
|
||||||
|
DWORD* pdwCookie) final;
|
||||||
|
|
||||||
|
void STDMETHODCALLTYPE UnregisterHardwareContentProtectionTeardownStatus(
|
||||||
|
DWORD dwCookie) final;
|
||||||
|
|
||||||
|
void STDMETHODCALLTYPE UnregisterVideoMemoryBudgetChangeNotification(
|
||||||
|
DWORD dwCookie) final;
|
||||||
|
|
||||||
Rc<DxvkAdapter> STDMETHODCALLTYPE GetDXVKAdapter() final;
|
Rc<DxvkAdapter> STDMETHODCALLTYPE GetDXVKAdapter() final;
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CreateDevice(
|
HRESULT STDMETHODCALLTYPE CreateDevice(
|
||||||
@ -81,6 +105,7 @@ namespace dxvk {
|
|||||||
Rc<DxvkAdapter> m_adapter;
|
Rc<DxvkAdapter> m_adapter;
|
||||||
|
|
||||||
DXGIVkFormatTable m_formats;
|
DXGIVkFormatTable m_formats;
|
||||||
|
UINT64 m_memReservation[2] = { 0, 0 };
|
||||||
|
|
||||||
std::mutex m_outputMutex;
|
std::mutex m_outputMutex;
|
||||||
OutputMap m_outputData;
|
OutputMap m_outputData;
|
||||||
|
@ -89,7 +89,7 @@ IDXGIVkDevice : public IDXGIDevice3 {
|
|||||||
* this interface.
|
* this interface.
|
||||||
*/
|
*/
|
||||||
MIDL_INTERFACE("907bf281-ea3c-43b4-a8e4-9f231107b4ff")
|
MIDL_INTERFACE("907bf281-ea3c-43b4-a8e4-9f231107b4ff")
|
||||||
IDXGIVkAdapter : public IDXGIAdapter2 {
|
IDXGIVkAdapter : public IDXGIAdapter3 {
|
||||||
static const GUID guid;
|
static const GUID guid;
|
||||||
|
|
||||||
virtual dxvk::Rc<dxvk::DxvkAdapter> STDMETHODCALLTYPE GetDXVKAdapter() = 0;
|
virtual dxvk::Rc<dxvk::DxvkAdapter> STDMETHODCALLTYPE GetDXVKAdapter() = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user