diff options
author | thexai <58434170+thexai@users.noreply.github.com> | 2023-08-06 19:10:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-06 19:10:11 +0200 |
commit | bcb774f785c7e99b47292b6fc44b307ec6d4ab17 (patch) | |
tree | 9030ff79d67dfc383ce0f58154bfa6e802349f48 | |
parent | bd39be048b740ae7c7f03e9784877e87c9232e7c (diff) | |
parent | 17b768facaa6f1839616db4708ea7f362691266e (diff) |
Merge pull request #23585 from thexai/get-adapter-desc
[Windows] improve GetAdapterDesc() - return struct by value
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp | 29 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp | 6 | ||||
-rw-r--r-- | xbmc/rendering/dx/DeviceResources.cpp | 26 | ||||
-rw-r--r-- | xbmc/rendering/dx/DeviceResources.h | 2 | ||||
-rw-r--r-- | xbmc/rendering/dx/RenderSystemDX.cpp | 3 |
5 files changed, 26 insertions, 40 deletions
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp index ffaa06604e..f4fbc6be30 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp @@ -332,12 +332,10 @@ bool CContext::CreateContext() D3D11_SDK_VERSION, &pD3DDevice, &d3dFeatureLevel, &pD3DDeviceContext); if (SUCCEEDED(hr)) { - DXGI_ADAPTER_DESC aDesc; - DX::DeviceResources::Get()->GetAdapter()->GetDesc(&aDesc); - - CLog::LogF(LOGINFO, "device for decoding created on adapter '{}' with {}", - KODI::PLATFORM::WINDOWS::FromW(aDesc.Description), - DX::GetFeatureLevelDescription(d3dFeatureLevel)); + CLog::LogF( + LOGINFO, "device for decoding created on adapter '{}' with {}", + KODI::PLATFORM::WINDOWS::FromW(DX::DeviceResources::Get()->GetAdapterDesc().Description), + DX::GetFeatureLevelDescription(d3dFeatureLevel)); #ifdef _DEBUG if (FAILED(pD3DDevice.As(&m_d3d11Debug))) @@ -704,8 +702,7 @@ bool CContext::Reset() { if (Check()) { - DXGI_ADAPTER_DESC appDesc = {}; - DX::DeviceResources::Get()->GetAdapterDesc(&appDesc); + const DXGI_ADAPTER_DESC appDesc = DX::DeviceResources::Get()->GetAdapterDesc(); ComPtr<IDXGIDevice> ctxDevice; ComPtr<IDXGIAdapter> ctxAdapter; @@ -1212,8 +1209,7 @@ static bool CheckH264L41(AVCodecContext* avctx) static bool IsL41LimitedATI() { - DXGI_ADAPTER_DESC AIdentifier = {}; - DX::DeviceResources::Get()->GetAdapterDesc(&AIdentifier); + const DXGI_ADAPTER_DESC AIdentifier = DX::DeviceResources::Get()->GetAdapterDesc(); if (AIdentifier.VendorId == PCIV_AMD) { @@ -1229,8 +1225,7 @@ static bool IsL41LimitedATI() static bool HasVP3WidthBug(AVCodecContext* avctx) { // Some nVidia VP3 hardware cannot do certain macroblock widths - DXGI_ADAPTER_DESC AIdentifier = {}; - DX::DeviceResources::Get()->GetAdapterDesc(&AIdentifier); + const DXGI_ADAPTER_DESC AIdentifier = DX::DeviceResources::Get()->GetAdapterDesc(); if (AIdentifier.VendorId == PCIV_NVIDIA && !CDVDCodecUtils::IsVP3CompatibleWidth(avctx->coded_width)) @@ -1245,8 +1240,8 @@ static bool HasVP3WidthBug(AVCodecContext* avctx) static bool HasATIMP2Bug(AVCodecContext* avctx) { - DXGI_ADAPTER_DESC AIdentifier = {}; - DX::DeviceResources::Get()->GetAdapterDesc(&AIdentifier); + const DXGI_ADAPTER_DESC AIdentifier = DX::DeviceResources::Get()->GetAdapterDesc(); + if (AIdentifier.VendorId != PCIV_AMD) return false; @@ -1260,8 +1255,7 @@ static bool HasATIMP2Bug(AVCodecContext* avctx) static bool HasAMDH264SDiBug(AVCodecContext* avctx) { - DXGI_ADAPTER_DESC AIdentifier = {}; - DX::DeviceResources::Get()->GetAdapterDesc(&AIdentifier); + const DXGI_ADAPTER_DESC AIdentifier = DX::DeviceResources::Get()->GetAdapterDesc(); if (AIdentifier.VendorId != PCIV_AMD) return false; @@ -1364,8 +1358,7 @@ bool CDecoder::Open(AVCodecContext* avctx, AVCodecContext* mainctx, enum AVPixel m_refs = 2 + m_shared; // 1 decode + 1 safety + display m_surface_alignment = 16; - DXGI_ADAPTER_DESC ad = {}; - DX::DeviceResources::Get()->GetAdapterDesc(&ad); + const DXGI_ADAPTER_DESC ad = DX::DeviceResources::Get()->GetAdapterDesc(); size_t videoMem = ad.SharedSystemMemory + ad.DedicatedVideoMemory + ad.DedicatedSystemMemory; CLog::LogF(LOGINFO, "Total video memory available is {} MB (dedicated = {} MB, shared = {} MB)", diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp index 3d3767b05e..798deabcb6 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp @@ -185,8 +185,7 @@ bool CProcessorHD::OpenProcessor() // AMD/HDR (as of 2023-06-16): processor tone maps by default and modifies high code values // We want "passthrough" of the signal and to do our own tone mapping when needed. // Disable the functionality by pretending that the display supports all PQ levels (0-10000) - DXGI_ADAPTER_DESC ad{}; - DX::DeviceResources::Get()->GetAdapterDesc(&ad); + const DXGI_ADAPTER_DESC ad = DX::DeviceResources::Get()->GetAdapterDesc(); bool streamIsHDR = (m_color_primaries == AVCOL_PRI_BT2020) && (m_color_transfer == AVCOL_TRC_SMPTE2084 || m_color_transfer == AVCOL_TRC_ARIB_STD_B67); @@ -453,8 +452,7 @@ void CProcessorHD::TryEnableVideoSuperResolution() if (!m_pVideoContext || !m_pVideoProcessor) return; - DXGI_ADAPTER_DESC ad{}; - DX::DeviceResources::Get()->GetAdapterDesc(&ad); + const DXGI_ADAPTER_DESC ad = DX::DeviceResources::Get()->GetAdapterDesc(); if (ad.VendorId == PCIV_Intel) { diff --git a/xbmc/rendering/dx/DeviceResources.cpp b/xbmc/rendering/dx/DeviceResources.cpp index fca6770345..8cfe5cf62c 100644 --- a/xbmc/rendering/dx/DeviceResources.cpp +++ b/xbmc/rendering/dx/DeviceResources.cpp @@ -131,15 +131,19 @@ void DX::DeviceResources::GetOutput(IDXGIOutput** ppOutput) const *ppOutput = pOutput.Detach(); } -void DX::DeviceResources::GetAdapterDesc(DXGI_ADAPTER_DESC* desc) const +DXGI_ADAPTER_DESC DX::DeviceResources::GetAdapterDesc() const { + DXGI_ADAPTER_DESC desc{}; + if (m_adapter) - m_adapter->GetDesc(desc); + m_adapter->GetDesc(&desc); // GetDesc() returns VendorId == 0 in Xbox however, we need to know that // GPU is AMD to apply workarounds in DXVA.cpp CheckCompatibility() same as desktop if (CSysInfo::GetWindowsDeviceFamily() == CSysInfo::Xbox) - desc->VendorId = PCIV_AMD; + desc.VendorId = PCIV_AMD; + + return desc; } void DX::DeviceResources::GetDisplayMode(DXGI_MODE_DESC* mode) const @@ -620,12 +624,9 @@ void DX::DeviceResources::ResizeBuffers() // Xbox needs 10 bit swapchain to output true 4K resolution #ifdef TARGET_WINDOWS_DESKTOP - DXGI_ADAPTER_DESC ad = {}; - GetAdapterDesc(&ad); - // Some AMD graphics has issues with 10 bit in SDR. // Enabled by default only in Intel and NVIDIA with latest drivers/hardware - if (m_d3dFeatureLevel < D3D_FEATURE_LEVEL_12_1 || ad.VendorId == PCIV_AMD) + if (m_d3dFeatureLevel < D3D_FEATURE_LEVEL_12_1 || GetAdapterDesc().VendorId == PCIV_AMD) use10bit = false; #endif @@ -1151,8 +1152,7 @@ void DX::DeviceResources::CheckDXVA2SharedDecoderSurfaces() if (!m_NV12SharedTexturesSupport) return; - DXGI_ADAPTER_DESC ad = {}; - GetAdapterDesc(&ad); + const DXGI_ADAPTER_DESC ad = GetAdapterDesc(); m_DXVA2SharedDecoderSurfaces = ad.VendorId == PCIV_Intel || @@ -1182,8 +1182,7 @@ void DX::DeviceResources::CheckDXVA2SharedDecoderSurfaces() VideoDriverInfo DX::DeviceResources::GetVideoDriverVersion() { - DXGI_ADAPTER_DESC ad = {}; - GetAdapterDesc(&ad); + const DXGI_ADAPTER_DESC ad = GetAdapterDesc(); VideoDriverInfo driver = CWIN32Util::GetVideoDriverInfo(ad.VendorId, ad.Description); @@ -1319,10 +1318,7 @@ void DX::DeviceResources::SetHdrColorSpace(const DXGI_COLOR_SPACE_TYPE colorSpac if (m_usedSwapChain && m_IsTransferPQ != (colorSpace == DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020)) { - DXGI_ADAPTER_DESC ad{}; - GetAdapterDesc(&ad); - - if (ad.VendorId == PCIV_AMD) + if (GetAdapterDesc().VendorId == PCIV_AMD) { // Temporary release, can't hold references during swap chain re-creation swapChain3 = nullptr; diff --git a/xbmc/rendering/dx/DeviceResources.h b/xbmc/rendering/dx/DeviceResources.h index d72ea9f9f6..01fa76a659 100644 --- a/xbmc/rendering/dx/DeviceResources.h +++ b/xbmc/rendering/dx/DeviceResources.h @@ -68,7 +68,7 @@ namespace DX CD3DTexture& GetBackBuffer() { return m_backBufferTex; } void GetOutput(IDXGIOutput** ppOutput) const; - void GetAdapterDesc(DXGI_ADAPTER_DESC *desc) const; + DXGI_ADAPTER_DESC GetAdapterDesc() const; void GetDisplayMode(DXGI_MODE_DESC *mode) const; D3D11_VIEWPORT GetScreenViewport() const { return m_screenViewport; } diff --git a/xbmc/rendering/dx/RenderSystemDX.cpp b/xbmc/rendering/dx/RenderSystemDX.cpp index 0607a9a1ac..dd369e284c 100644 --- a/xbmc/rendering/dx/RenderSystemDX.cpp +++ b/xbmc/rendering/dx/RenderSystemDX.cpp @@ -88,8 +88,7 @@ bool CRenderSystemDX::InitRenderSystem() CPoint camPoint = { outputSize.Width * 0.5f, outputSize.Height * 0.5f }; SetCameraPosition(camPoint, outputSize.Width, outputSize.Height); - DXGI_ADAPTER_DESC AIdentifier = {}; - m_deviceResources->GetAdapterDesc(&AIdentifier); + const DXGI_ADAPTER_DESC AIdentifier = m_deviceResources->GetAdapterDesc(); m_RenderRenderer = KODI::PLATFORM::WINDOWS::FromW(AIdentifier.Description); uint32_t version = 0; for (uint32_t decimal = m_deviceResources->GetDeviceFeatureLevel() >> 8, round = 0; decimal > 0; decimal >>= 4, ++round) |