2018-05-08 13:19:26 +02:00
|
|
|
/*
|
2025-01-29 03:12:26 +00:00
|
|
|
* Copyright (C) 2018-2025 Intel Corporation
|
2018-09-18 09:11:08 +02:00
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
|
*
|
|
|
|
|
*/
|
2018-05-08 13:19:26 +02:00
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2020-04-02 11:28:38 +02:00
|
|
|
#include "shared/source/helpers/constants.h"
|
2020-02-23 22:44:01 +01:00
|
|
|
#include "shared/source/memory_manager/host_ptr_defines.h"
|
|
|
|
|
#include "shared/source/os_interface/windows/wddm/wddm.h"
|
|
|
|
|
#include "shared/source/os_interface/windows/wddm_residency_allocations_container.h"
|
|
|
|
|
#include "shared/source/os_interface/windows/windows_defs.h"
|
2023-01-24 12:14:14 +00:00
|
|
|
#include "shared/source/utilities/stackvec.h"
|
2021-07-06 15:44:16 +02:00
|
|
|
#include "shared/test/common/mocks/wddm_mock_helpers.h"
|
2021-12-28 13:04:55 +01:00
|
|
|
#include "shared/test/common/test_macros/mock_method_macros.h"
|
2019-02-27 11:39:32 +01:00
|
|
|
|
2021-12-28 13:04:55 +01:00
|
|
|
#include <limits>
|
|
|
|
|
#include <memory>
|
2023-08-17 08:17:57 +00:00
|
|
|
#include <unordered_set>
|
2018-05-08 13:19:26 +02:00
|
|
|
|
2019-03-26 11:59:46 +01:00
|
|
|
namespace NEO {
|
2024-08-06 04:21:42 +00:00
|
|
|
|
|
|
|
|
extern NTSTATUS (*pCallEscape)(D3DKMT_ESCAPE &escapeCommand);
|
|
|
|
|
extern uint32_t (*pGetTimestampFrequency)();
|
|
|
|
|
extern bool (*pPerfOpenEuStallStream)(uint32_t sampleRate, uint32_t minBufferSize);
|
|
|
|
|
extern bool (*pPerfDisableEuStallStream)();
|
2025-11-04 01:32:39 +01:00
|
|
|
extern bool (*pPerfReadEuStallStream)(uint8_t *pRawData, size_t *pRawDataSize);
|
2024-08-06 04:21:42 +00:00
|
|
|
|
2018-06-21 11:36:47 +02:00
|
|
|
class GraphicsAllocation;
|
|
|
|
|
|
2022-12-08 14:23:49 +00:00
|
|
|
inline constexpr auto virtualAllocAddress = is64bit ? 0x7FFFF0000000 : 0xFF000000;
|
2019-11-27 11:44:32 +01:00
|
|
|
|
2018-08-14 11:05:17 +02:00
|
|
|
class WddmMock : public Wddm {
|
2018-05-08 13:19:26 +02:00
|
|
|
public:
|
2019-10-15 15:05:47 +02:00
|
|
|
using Wddm::adapterBDF;
|
2022-08-04 11:29:25 +00:00
|
|
|
using Wddm::additionalAdapterInfoOptions;
|
2022-07-25 21:33:42 +00:00
|
|
|
using Wddm::adjustEvictNeededParameter;
|
2023-05-29 14:06:01 +00:00
|
|
|
using Wddm::checkDeviceState;
|
2020-03-17 12:19:38 +01:00
|
|
|
using Wddm::createPagingFenceLogger;
|
2018-08-14 11:05:17 +02:00
|
|
|
using Wddm::currentPagingFenceValue;
|
2019-07-29 14:32:37 +02:00
|
|
|
using Wddm::dedicatedVideoMemory;
|
2018-05-08 13:19:26 +02:00
|
|
|
using Wddm::device;
|
2020-08-05 13:58:44 +02:00
|
|
|
using Wddm::deviceRegistryPath;
|
2021-05-26 23:45:38 +02:00
|
|
|
using Wddm::enablePreemptionRegValue;
|
2018-08-14 11:05:17 +02:00
|
|
|
using Wddm::featureTable;
|
2022-08-10 23:03:13 +00:00
|
|
|
using Wddm::forceEvictOnlyIfNecessary;
|
2023-05-29 14:06:01 +00:00
|
|
|
using Wddm::getDeviceState;
|
2025-01-30 19:43:45 +00:00
|
|
|
using Wddm::getReadOnlyFlagValue;
|
2018-05-08 13:19:26 +02:00
|
|
|
using Wddm::getSystemInfo;
|
2024-03-06 10:03:52 +00:00
|
|
|
using Wddm::gfxFeatureTable;
|
2023-05-19 14:42:28 +00:00
|
|
|
using Wddm::gfxPlatform;
|
2024-03-06 10:03:52 +00:00
|
|
|
using Wddm::gfxWorkaroundTable;
|
2018-05-08 21:57:36 +02:00
|
|
|
using Wddm::gmmMemory;
|
2020-02-05 10:49:54 +01:00
|
|
|
using Wddm::hwDeviceId;
|
2025-02-06 12:52:06 +00:00
|
|
|
using Wddm::isReadOnlyFlagFallbackAvailable;
|
|
|
|
|
using Wddm::isReadOnlyFlagFallbackSupported;
|
2025-05-27 09:50:14 +00:00
|
|
|
using Wddm::lmemBarSize;
|
2019-03-18 10:06:01 +01:00
|
|
|
using Wddm::mapGpuVirtualAddress;
|
2020-01-07 07:42:40 +01:00
|
|
|
using Wddm::minAddress;
|
2018-08-14 11:05:17 +02:00
|
|
|
using Wddm::pagingFenceAddress;
|
2023-11-02 14:37:19 +00:00
|
|
|
using Wddm::pagingFenceDelayTime;
|
2018-05-08 13:19:26 +02:00
|
|
|
using Wddm::pagingQueue;
|
2022-08-22 12:11:44 +00:00
|
|
|
using Wddm::platformSupportsEvictIfNecessary;
|
2022-08-04 11:29:25 +00:00
|
|
|
using Wddm::populateAdditionalAdapterInfoOptions;
|
2022-10-31 13:57:24 +00:00
|
|
|
using Wddm::populateIpVersion;
|
2020-03-17 12:19:38 +01:00
|
|
|
using Wddm::residencyLogger;
|
2020-07-06 14:42:48 +02:00
|
|
|
using Wddm::rootDeviceEnvironment;
|
2025-05-27 09:50:14 +00:00
|
|
|
using Wddm::segmentId;
|
2023-06-29 12:53:36 +00:00
|
|
|
using Wddm::setNewResourceBoundToPageTable;
|
2022-08-22 12:11:44 +00:00
|
|
|
using Wddm::setPlatformSupportEvictIfNecessaryFlag;
|
2019-01-16 15:09:33 +01:00
|
|
|
using Wddm::temporaryResources;
|
2021-02-01 18:37:13 +00:00
|
|
|
using Wddm::timestampFrequency;
|
2018-08-10 16:41:44 +02:00
|
|
|
using Wddm::wddmInterface;
|
2018-05-08 13:19:26 +02:00
|
|
|
|
2021-10-21 12:37:31 +00:00
|
|
|
WddmMock(std::unique_ptr<HwDeviceIdWddm> &&hwDeviceId, RootDeviceEnvironment &rootDeviceEnvironment) : Wddm(std::move(hwDeviceId), rootDeviceEnvironment) {}
|
2019-11-06 18:14:30 +01:00
|
|
|
WddmMock(RootDeviceEnvironment &rootDeviceEnvironment);
|
2022-11-24 11:30:57 +01:00
|
|
|
~WddmMock() override;
|
2018-05-08 13:19:26 +02:00
|
|
|
|
2024-04-12 11:05:44 +00:00
|
|
|
bool mapGpuVirtualAddress(Gmm *gmm, D3DKMT_HANDLE handle, D3DGPU_VIRTUAL_ADDRESS minimumAddress, D3DGPU_VIRTUAL_ADDRESS maximumAddress, D3DGPU_VIRTUAL_ADDRESS preferredAddress, D3DGPU_VIRTUAL_ADDRESS &gpuPtr, AllocationType type) override;
|
2019-03-18 10:06:01 +01:00
|
|
|
bool mapGpuVirtualAddress(WddmAllocation *allocation);
|
2019-01-24 16:25:26 +01:00
|
|
|
bool freeGpuVirtualAddress(D3DGPU_VIRTUAL_ADDRESS &gpuPtr, uint64_t size) override;
|
2021-08-30 14:57:25 +00:00
|
|
|
NTSTATUS createAllocation(const void *alignedCpuPtr, const Gmm *gmm, D3DKMT_HANDLE &outHandle, D3DKMT_HANDLE &outResource, uint64_t *outSharedHandle) override;
|
2025-08-16 01:44:40 +00:00
|
|
|
NTSTATUS createAllocation(const void *alignedCpuPtr, const Gmm *gmm, D3DKMT_HANDLE &outHandle, D3DKMT_HANDLE &outResource, uint64_t *outSharedHandle, bool createNTHandle) override;
|
2021-07-14 16:51:47 +02:00
|
|
|
bool createAllocation(const Gmm *gmm, D3DKMT_HANDLE &outHandle) override;
|
2019-03-05 14:21:57 +01:00
|
|
|
bool destroyAllocations(const D3DKMT_HANDLE *handles, uint32_t allocationCount, D3DKMT_HANDLE resourceHandle) override;
|
2019-03-05 15:00:45 +01:00
|
|
|
|
|
|
|
|
NTSTATUS createAllocation(WddmAllocation *wddmAllocation);
|
|
|
|
|
bool createAllocation64k(WddmAllocation *wddmAllocation);
|
2018-08-27 15:48:29 +02:00
|
|
|
bool destroyAllocation(WddmAllocation *alloc, OsContextWin *osContext);
|
2024-06-18 12:10:24 +00:00
|
|
|
bool openSharedHandle(const MemoryManager::OsHandleData &osHandleData, WddmAllocation *alloc) override;
|
2019-03-01 12:21:30 +01:00
|
|
|
bool createContext(OsContextWin &osContext) override;
|
2023-01-02 08:41:11 +00:00
|
|
|
void applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData, OsContextWin &osContext) override;
|
2018-05-08 13:19:26 +02:00
|
|
|
bool destroyContext(D3DKMT_HANDLE context) override;
|
|
|
|
|
bool queryAdapterInfo() override;
|
2019-12-16 15:42:13 +01:00
|
|
|
bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) override;
|
2018-08-21 17:36:08 +02:00
|
|
|
bool waitOnGPU(D3DKMT_HANDLE context) override;
|
2020-03-17 12:19:38 +01:00
|
|
|
void *lockResource(const D3DKMT_HANDLE &handle, bool applyMakeResidentPriorToLock, size_t size) override;
|
2025-05-27 07:41:23 +00:00
|
|
|
void unlockResource(const D3DKMT_HANDLE &handle, bool applyMakeResidentPriorToLock) override;
|
2018-05-08 13:19:26 +02:00
|
|
|
void setHwContextId(unsigned long hwContextId);
|
|
|
|
|
void setHeap32(uint64_t base, uint64_t size);
|
|
|
|
|
GMM_GFX_PARTITIONING *getGfxPartitionPtr();
|
2023-09-08 12:08:28 +00:00
|
|
|
bool waitFromCpu(uint64_t lastFenceValue, const MonitoredFence &monitoredFence, bool busyWait) override;
|
2021-09-27 15:17:26 +02:00
|
|
|
void *virtualAlloc(void *inPtr, size_t size, bool topDownHint) override;
|
|
|
|
|
void virtualFree(void *ptr, size_t size) override;
|
2018-05-08 13:19:26 +02:00
|
|
|
void releaseReservedAddress(void *reservedAddress) override;
|
2025-10-24 09:25:41 +02:00
|
|
|
VOID *registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmResidencyController &residencyController) override;
|
2023-04-26 20:16:48 +00:00
|
|
|
NTSTATUS reserveGpuVirtualAddress(D3DGPU_VIRTUAL_ADDRESS baseAddress, D3DGPU_VIRTUAL_ADDRESS minimumAddress, D3DGPU_VIRTUAL_ADDRESS maximumAddress, D3DGPU_SIZE_T size, D3DGPU_VIRTUAL_ADDRESS *reservedAddress) override;
|
2022-11-24 11:30:57 +01:00
|
|
|
bool reserveValidAddressRange(size_t size, void *&reservedMem) override;
|
2018-08-24 15:23:45 +02:00
|
|
|
PLATFORM *getGfxPlatform() { return gfxPlatform.get(); }
|
2024-08-07 13:42:56 +00:00
|
|
|
volatile uint64_t *getPagingFenceAddress() override;
|
2023-11-07 14:09:43 +00:00
|
|
|
void waitOnPagingFenceFromCpu(bool isKmdWaitNeeded) override;
|
2023-11-02 14:37:19 +00:00
|
|
|
void delayPagingFenceFromCpu(int64_t delayTime) override;
|
2020-03-17 12:19:38 +01:00
|
|
|
void createPagingFenceLogger() override;
|
2020-08-10 09:41:15 +02:00
|
|
|
bool verifyAdapterLuid(LUID adapterLuid) const override {
|
|
|
|
|
if (callBaseVerifyAdapterLuid) {
|
|
|
|
|
return Wddm::verifyAdapterLuid(adapterLuid);
|
|
|
|
|
}
|
|
|
|
|
return verifyAdapterLuidReturnValue;
|
|
|
|
|
}
|
2022-05-11 14:08:18 +00:00
|
|
|
LUID getAdapterLuid() { return hwDeviceId->getAdapterLuid(); }
|
2021-04-19 19:53:46 +00:00
|
|
|
bool setAllocationPriority(const D3DKMT_HANDLE *handles, uint32_t allocationCount, uint32_t priority) override;
|
2018-05-08 13:19:26 +02:00
|
|
|
|
|
|
|
|
bool configureDeviceAddressSpace() {
|
|
|
|
|
configureDeviceAddressSpaceResult.called++;
|
2022-08-04 11:29:25 +00:00
|
|
|
// create context cant be called before configureDeviceAddressSpace
|
2018-05-08 13:19:26 +02:00
|
|
|
if (createContextResult.called > 0) {
|
|
|
|
|
return configureDeviceAddressSpaceResult.success = false;
|
|
|
|
|
} else {
|
2018-08-23 11:29:39 +02:00
|
|
|
return configureDeviceAddressSpaceResult.success = Wddm::configureDeviceAddressSpace();
|
2018-05-08 13:19:26 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-31 16:52:41 +02:00
|
|
|
uint32_t counterVerifyNTHandle = 0;
|
|
|
|
|
uint32_t counterVerifySharedHandle = 0;
|
|
|
|
|
bool verifyNTHandle(HANDLE handle) override {
|
|
|
|
|
++counterVerifyNTHandle;
|
|
|
|
|
return Wddm::verifyNTHandle(handle);
|
|
|
|
|
}
|
|
|
|
|
bool verifySharedHandle(D3DKMT_HANDLE osHandle) override {
|
|
|
|
|
++counterVerifySharedHandle;
|
|
|
|
|
return Wddm::verifySharedHandle(osHandle);
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-16 14:30:07 +00:00
|
|
|
bool isShutdownInProgress() override {
|
|
|
|
|
return shutdownStatus;
|
|
|
|
|
};
|
|
|
|
|
|
2020-02-05 10:49:54 +01:00
|
|
|
void resetGdi(Gdi *gdi);
|
2022-01-11 10:00:36 +01:00
|
|
|
bool makeResident(const D3DKMT_HANDLE *handles, uint32_t count, bool cantTrimFurther, uint64_t *numberOfBytesToTrim, size_t totalSize) override;
|
2022-07-18 13:25:50 +00:00
|
|
|
bool evict(const D3DKMT_HANDLE *handles, uint32_t num, uint64_t &sizeToTrim, bool evictNeeded) override;
|
2022-01-11 10:00:36 +01:00
|
|
|
NTSTATUS createAllocationsAndMapGpuVa(OsHandleStorage &osHandles) override;
|
2024-08-06 04:21:42 +00:00
|
|
|
NTSTATUS escape(D3DKMT_ESCAPE &escapeCommand) override;
|
|
|
|
|
uint32_t getTimestampFrequency() const override;
|
|
|
|
|
bool perfOpenEuStallStream(uint32_t sampleRate, uint32_t minBufferSize) override;
|
|
|
|
|
bool perfDisableEuStallStream() override;
|
2025-11-04 01:32:39 +01:00
|
|
|
bool perfReadEuStallStream(uint8_t *pRawData, size_t *pRawDataSize) override;
|
2020-02-05 10:49:54 +01:00
|
|
|
|
2018-05-08 13:19:26 +02:00
|
|
|
WddmMockHelpers::MakeResidentCall makeResidentResult;
|
2022-01-11 10:00:36 +01:00
|
|
|
WddmMockHelpers::CallResult evictResult;
|
|
|
|
|
WddmMockHelpers::CallResult createAllocationsAndMapGpuVaResult;
|
2018-05-08 13:19:26 +02:00
|
|
|
WddmMockHelpers::CallResult mapGpuVirtualAddressResult;
|
2019-05-27 11:50:29 +02:00
|
|
|
WddmMockHelpers::FreeGpuVirtualAddressCall freeGpuVirtualAddressResult;
|
2018-05-08 13:19:26 +02:00
|
|
|
WddmMockHelpers::CallResult createAllocationResult;
|
|
|
|
|
WddmMockHelpers::CallResult destroyAllocationResult;
|
|
|
|
|
WddmMockHelpers::CallResult destroyContextResult;
|
|
|
|
|
WddmMockHelpers::CallResult queryAdapterInfoResult;
|
2020-02-14 17:39:13 +01:00
|
|
|
WddmMockHelpers::SubmitResult submitResult;
|
2018-05-08 13:19:26 +02:00
|
|
|
WddmMockHelpers::CallResult waitOnGPUResult;
|
|
|
|
|
WddmMockHelpers::CallResult configureDeviceAddressSpaceResult;
|
|
|
|
|
WddmMockHelpers::CallResult createContextResult;
|
2018-09-12 14:44:18 +02:00
|
|
|
WddmMockHelpers::CallResult applyAdditionalContextFlagsResult;
|
2018-05-08 13:19:26 +02:00
|
|
|
WddmMockHelpers::CallResult lockResult;
|
|
|
|
|
WddmMockHelpers::CallResult unlockResult;
|
2019-03-04 14:50:26 +01:00
|
|
|
WddmMockHelpers::WaitFromCpuResult waitFromCpuResult;
|
2018-05-08 13:19:26 +02:00
|
|
|
WddmMockHelpers::CallResult releaseReservedAddressResult;
|
|
|
|
|
WddmMockHelpers::CallResult reserveValidAddressRangeResult;
|
2018-11-14 14:35:45 +01:00
|
|
|
WddmMockHelpers::CallResult registerTrimCallbackResult;
|
2019-01-17 10:34:14 +01:00
|
|
|
WddmMockHelpers::CallResult getPagingFenceAddressResult;
|
2019-03-07 15:14:11 +01:00
|
|
|
WddmMockHelpers::CallResult reserveGpuVirtualAddressResult;
|
2025-04-03 22:28:54 +00:00
|
|
|
WddmMockHelpers::WaitOnPagingFenceFromCpuResult waitOnPagingFenceFromCpuResult;
|
2021-04-19 19:53:46 +00:00
|
|
|
WddmMockHelpers::CallResult setAllocationPriorityResult;
|
2023-11-02 14:37:19 +00:00
|
|
|
WddmMockHelpers::CallResult delayPagingFenceFromCpuResult;
|
2018-05-08 13:19:26 +02:00
|
|
|
|
2022-01-11 10:00:36 +01:00
|
|
|
StackVec<WddmMockHelpers::MakeResidentCall, 2> makeResidentParamsPassed{};
|
|
|
|
|
bool makeResidentStatus = true;
|
|
|
|
|
bool callBaseMakeResident = false;
|
|
|
|
|
std::vector<bool> makeResidentResults = {};
|
|
|
|
|
uint64_t makeResidentNumberOfBytesToTrim = 0;
|
|
|
|
|
bool callBaseEvict = false;
|
|
|
|
|
bool evictStatus = true;
|
|
|
|
|
bool callBaseCreateAllocationsAndMapGpuVa = true;
|
|
|
|
|
NTSTATUS createAllocationsAndMapGpuVaStatus = STATUS_UNSUCCESSFUL;
|
2019-11-06 18:14:30 +01:00
|
|
|
NTSTATUS createAllocationStatus = STATUS_SUCCESS;
|
2020-08-07 10:20:07 +02:00
|
|
|
bool verifyAdapterLuidReturnValue = true;
|
2020-08-10 09:41:15 +02:00
|
|
|
bool callBaseVerifyAdapterLuid = false;
|
2022-05-11 14:08:18 +00:00
|
|
|
LUID mockAdaperLuid = {0, 0};
|
2019-11-06 18:14:30 +01:00
|
|
|
bool mapGpuVaStatus = true;
|
2018-05-08 13:19:26 +02:00
|
|
|
bool callBaseDestroyAllocations = true;
|
|
|
|
|
bool failOpenSharedHandle = false;
|
|
|
|
|
bool callBaseMapGpuVa = true;
|
2023-08-17 08:17:57 +00:00
|
|
|
std::unordered_multiset<void *> reservedAddresses;
|
2019-03-26 11:59:46 +01:00
|
|
|
uintptr_t virtualAllocAddress = NEO::windowsMinAddress;
|
2019-01-16 15:09:33 +01:00
|
|
|
uint64_t mockPagingFence = 0u;
|
2020-03-17 12:19:38 +01:00
|
|
|
bool callBaseCreatePagingLogger = true;
|
2021-02-16 14:30:07 +00:00
|
|
|
bool shutdownStatus = false;
|
2021-04-19 19:53:46 +00:00
|
|
|
bool callBaseSetAllocationPriority = true;
|
2022-07-05 13:40:15 +00:00
|
|
|
bool callBaseWaitFromCpu = true;
|
2022-09-17 00:38:06 +00:00
|
|
|
bool failReserveGpuVirtualAddress = false;
|
2022-12-06 22:36:12 +00:00
|
|
|
bool failCreateAllocation = false;
|
2019-01-16 15:09:33 +01:00
|
|
|
};
|
2019-03-26 11:59:46 +01:00
|
|
|
} // namespace NEO
|