From 4e91c4b08fcbf430cccd05aa8a467f20bc266b7e Mon Sep 17 00:00:00 2001 From: Maciej Plewka Date: Thu, 15 Jun 2023 15:06:26 +0000 Subject: [PATCH] fix: Use virtual map calls to gmm only for compressed formats Signed-off-by: Maciej Plewka --- .../gmm_client_context_wddm.cpp | 22 +++++++++++++++---- .../client_context/map_gpu_va_gmm.h | 9 ++++---- .../source/os_interface/windows/wddm/wddm.cpp | 7 +++--- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/shared/source/gmm_helper/client_context/gmm_client_context_wddm.cpp b/shared/source/gmm_helper/client_context/gmm_client_context_wddm.cpp index aece314c2a..ab7143e08a 100644 --- a/shared/source/gmm_helper/client_context/gmm_client_context_wddm.cpp +++ b/shared/source/gmm_helper/client_context/gmm_client_context_wddm.cpp @@ -7,15 +7,29 @@ #include "shared/source/gmm_helper/client_context/gmm_client_context.h" #include "shared/source/gmm_helper/client_context/map_gpu_va_gmm.h" +#include "shared/source/gmm_helper/resource_info.h" +#include "shared/source/os_interface/windows/gdi_interface.h" namespace NEO { uint64_t GmmClientContext::mapGpuVirtualAddress(MapGpuVirtualAddressGmm *pMapGpuVa) { - GMM_MAPGPUVIRTUALADDRESS gmmMapAddress = {pMapGpuVa->mapGpuVirtualAddressParams, 1, pMapGpuVa->resourceInfoHandle, pMapGpuVa->outVirtualAddress}; - return clientContext->MapGpuVirtualAddress(&gmmMapAddress); + auto gmmResourceFlags = pMapGpuVa->resourceInfoHandle->getResourceFlags()->Info; + if (gmmResourceFlags.MediaCompressed || gmmResourceFlags.RenderCompressed) { + auto gmmResourceInfo = pMapGpuVa->resourceInfoHandle->peekGmmResourceInfo(); + GMM_MAPGPUVIRTUALADDRESS gmmMapAddress = {pMapGpuVa->mapGpuVirtualAddressParams, 1, &gmmResourceInfo, pMapGpuVa->outVirtualAddress}; + return clientContext->MapGpuVirtualAddress(&gmmMapAddress); + } else { + return pMapGpuVa->gdi->mapGpuVirtualAddress(pMapGpuVa->mapGpuVirtualAddressParams); + } } uint64_t GmmClientContext::freeGpuVirtualAddress(FreeGpuVirtualAddressGmm *pFreeGpuVa) { - GMM_FREEGPUVIRTUALADDRESS gmmFreeAddress = {pFreeGpuVa->hAdapter, pFreeGpuVa->baseAddress, pFreeGpuVa->size, 1, pFreeGpuVa->resourceInfoHandle}; - return clientContext->FreeGpuVirtualAddress(&gmmFreeAddress); + auto gmmResourceFlags = pFreeGpuVa->resourceInfoHandle->getResourceFlags()->Info; + if (gmmResourceFlags.MediaCompressed || gmmResourceFlags.RenderCompressed) { + auto gmmResourceInfo = pFreeGpuVa->resourceInfoHandle->peekGmmResourceInfo(); + GMM_FREEGPUVIRTUALADDRESS gmmFreeAddress = {pFreeGpuVa->hAdapter, pFreeGpuVa->baseAddress, pFreeGpuVa->size, 1, &gmmResourceInfo}; + return clientContext->FreeGpuVirtualAddress(&gmmFreeAddress); + } else { + return 0; + } } } // namespace NEO diff --git a/shared/source/gmm_helper/client_context/map_gpu_va_gmm.h b/shared/source/gmm_helper/client_context/map_gpu_va_gmm.h index 7ff22be3bd..1b09fd9a5e 100644 --- a/shared/source/gmm_helper/client_context/map_gpu_va_gmm.h +++ b/shared/source/gmm_helper/client_context/map_gpu_va_gmm.h @@ -10,23 +10,24 @@ namespace NEO { class Gdi; +class GmmResourceInfo; class MapGpuVirtualAddressGmm { public: - MapGpuVirtualAddressGmm(D3DDDI_MAPGPUVIRTUALADDRESS *mapGpuVirtualAddressParams, GMM_RESOURCE_INFO **resourceInfoHandle, D3DGPU_VIRTUAL_ADDRESS *outVirtualAddress, Gdi *gdi) : mapGpuVirtualAddressParams(mapGpuVirtualAddressParams), resourceInfoHandle(resourceInfoHandle), outVirtualAddress(outVirtualAddress), gdi(gdi) {} + MapGpuVirtualAddressGmm(D3DDDI_MAPGPUVIRTUALADDRESS *mapGpuVirtualAddressParams, GmmResourceInfo *resourceInfoHandle, D3DGPU_VIRTUAL_ADDRESS *outVirtualAddress, Gdi *gdi) : mapGpuVirtualAddressParams(mapGpuVirtualAddressParams), resourceInfoHandle(resourceInfoHandle), outVirtualAddress(outVirtualAddress), gdi(gdi) {} D3DDDI_MAPGPUVIRTUALADDRESS *mapGpuVirtualAddressParams; - GMM_RESOURCE_INFO **resourceInfoHandle; + GmmResourceInfo *resourceInfoHandle; D3DGPU_VIRTUAL_ADDRESS *outVirtualAddress; Gdi *gdi; }; class FreeGpuVirtualAddressGmm { public: - FreeGpuVirtualAddressGmm(D3DKMT_HANDLE hAdapter, D3DGPU_VIRTUAL_ADDRESS baseAddress, D3DGPU_SIZE_T size, GMM_RESOURCE_INFO **resourceInfoHandle, Gdi *gdi) : hAdapter(hAdapter), baseAddress(baseAddress), size(size), resourceInfoHandle(resourceInfoHandle), gdi(gdi) {} + FreeGpuVirtualAddressGmm(D3DKMT_HANDLE hAdapter, D3DGPU_VIRTUAL_ADDRESS baseAddress, D3DGPU_SIZE_T size, GmmResourceInfo *resourceInfoHandle, Gdi *gdi) : hAdapter(hAdapter), baseAddress(baseAddress), size(size), resourceInfoHandle(resourceInfoHandle), gdi(gdi) {} D3DKMT_HANDLE hAdapter; D3DGPU_VIRTUAL_ADDRESS baseAddress; D3DGPU_SIZE_T size; - GMM_RESOURCE_INFO **resourceInfoHandle; + GmmResourceInfo *resourceInfoHandle; Gdi *gdi; }; diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index cc540e8360..8d10174213 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -542,8 +542,8 @@ bool Wddm::mapGpuVirtualAddress(Gmm *gmm, D3DKMT_HANDLE handle, D3DGPU_VIRTUAL_A mapGPUVA.MaximumAddress = maximumAddress; applyAdditionalMapGPUVAFields(mapGPUVA, gmm); - auto resourceInfo = gmm->gmmResourceInfo->peekGmmResourceInfo(); - MapGpuVirtualAddressGmm gmmMapGpuVa = {&mapGPUVA, &resourceInfo, &gpuPtr, getGdi()}; + + MapGpuVirtualAddressGmm gmmMapGpuVa = {&mapGPUVA, gmm->gmmResourceInfo.get(), &gpuPtr, getGdi()}; auto status = gmm->getGmmHelper()->getClientContext()->mapGpuVirtualAddress(&gmmMapGpuVa); auto gmmHelper = gmm->getGmmHelper(); @@ -597,8 +597,7 @@ NTSTATUS Wddm::reserveGpuVirtualAddress(D3DGPU_VIRTUAL_ADDRESS baseAddress, uint64_t Wddm::freeGmmGpuVirtualAddress(Gmm *gmm, D3DGPU_VIRTUAL_ADDRESS &gpuPtr, uint64_t size) { uint64_t status = STATUS_SUCCESS; - auto resourceInfo = gmm->gmmResourceInfo->peekGmmResourceInfo(); - FreeGpuVirtualAddressGmm freeGpuva = {getAdapter(), rootDeviceEnvironment.getGmmHelper()->decanonize(gpuPtr), size, &resourceInfo, getGdi()}; + FreeGpuVirtualAddressGmm freeGpuva = {getAdapter(), rootDeviceEnvironment.getGmmHelper()->decanonize(gpuPtr), size, gmm->gmmResourceInfo.get(), getGdi()}; status = gmm->getGmmHelper()->getClientContext()->freeGpuVirtualAddress(&freeGpuva); return status; }