diff --git a/opencl/test/unit_test/mock_gdi/mock_gdi.cpp b/opencl/test/unit_test/mock_gdi/mock_gdi.cpp index ce799ec0f7..97fb2a941d 100644 --- a/opencl/test/unit_test/mock_gdi/mock_gdi.cpp +++ b/opencl/test/unit_test/mock_gdi/mock_gdi.cpp @@ -56,7 +56,11 @@ NTSTATUS __stdcall D3DKMTOpenAdapterFromLuid(IN OUT CONST D3DKMT_OPENADAPTERFROM return STATUS_INVALID_PARAMETER; } D3DKMT_OPENADAPTERFROMLUID *openAdapterNonConst = const_cast(openAdapter); - openAdapterNonConst->hAdapter = ADAPTER_HANDLE; + if (openAdapter->AdapterLuid.HighPart == 0xdd) { + openAdapterNonConst->hAdapter = SHADOW_ADAPTER_HANDLE; + } else { + openAdapterNonConst->hAdapter = ADAPTER_HANDLE; + } return STATUS_SUCCESS; } @@ -247,7 +251,7 @@ NTSTATUS __stdcall D3DKMTReserveGpuVirtualAddress(IN OUT D3DDDI_RESERVEGPUVIRTUA } NTSTATUS __stdcall D3DKMTQueryAdapterInfo(IN CONST D3DKMT_QUERYADAPTERINFO *queryAdapterInfo) { - if (queryAdapterInfo == nullptr || queryAdapterInfo->hAdapter != ADAPTER_HANDLE) { + if (queryAdapterInfo == nullptr) { return STATUS_INVALID_PARAMETER; } if (queryAdapterInfo->Type == KMTQAITYPE_UMDRIVERPRIVATE) { @@ -258,38 +262,56 @@ NTSTATUS __stdcall D3DKMTQueryAdapterInfo(IN CONST D3DKMT_QUERYADAPTERINFO *quer return STATUS_INVALID_PARAMETER; } } - ADAPTER_INFO *adapterInfo = reinterpret_cast(queryAdapterInfo->pPrivateDriverData); - adapterInfo->GfxPlatform = gAdapterInfo.GfxPlatform; - adapterInfo->SystemInfo = gAdapterInfo.SystemInfo; - adapterInfo->SkuTable = gAdapterInfo.SkuTable; - adapterInfo->WaTable = gAdapterInfo.WaTable; - adapterInfo->CacheLineSize = 64; - adapterInfo->MinRenderFreq = 350; - adapterInfo->MaxRenderFreq = 1150; + if (queryAdapterInfo->Type == KMTQAITYPE_ADAPTERTYPE) { + D3DKMT_ADAPTERTYPE *adapterType = reinterpret_cast(queryAdapterInfo->pPrivateDriverData); + if (queryAdapterInfo->hAdapter == ADAPTER_HANDLE) { + adapterType->RenderSupported = 1; + } else if (queryAdapterInfo->hAdapter == SHADOW_ADAPTER_HANDLE) { + adapterType->RenderSupported = 0; + } else { + return STATUS_INVALID_PARAMETER; + } - adapterInfo->SizeOfDmaBuffer = 32768; - adapterInfo->GfxMemorySize = 2181038080; - adapterInfo->SystemSharedMemory = 4249540608; - adapterInfo->SystemVideoMemory = 0; + return STATUS_SUCCESS; + } + if (queryAdapterInfo->Type == KMTQAITYPE_UMDRIVERPRIVATE) { + if (queryAdapterInfo->hAdapter != ADAPTER_HANDLE && queryAdapterInfo->hAdapter != SHADOW_ADAPTER_HANDLE) { + return STATUS_INVALID_PARAMETER; + } + ADAPTER_INFO *adapterInfo = reinterpret_cast(queryAdapterInfo->pPrivateDriverData); - adapterInfo->GfxPartition.Standard.Base = gAdapterInfo.GfxPartition.Standard.Base; - adapterInfo->GfxPartition.Standard.Limit = gAdapterInfo.GfxPartition.Standard.Limit; - adapterInfo->GfxPartition.Standard64KB.Base = gAdapterInfo.GfxPartition.Standard64KB.Base; - adapterInfo->GfxPartition.Standard64KB.Limit = gAdapterInfo.GfxPartition.Standard64KB.Limit; + adapterInfo->GfxPlatform = gAdapterInfo.GfxPlatform; + adapterInfo->SystemInfo = gAdapterInfo.SystemInfo; + adapterInfo->SkuTable = gAdapterInfo.SkuTable; + adapterInfo->WaTable = gAdapterInfo.WaTable; + adapterInfo->CacheLineSize = 64; + adapterInfo->MinRenderFreq = 350; + adapterInfo->MaxRenderFreq = 1150; - adapterInfo->GfxPartition.SVM.Base = gAdapterInfo.GfxPartition.SVM.Base; - adapterInfo->GfxPartition.SVM.Limit = gAdapterInfo.GfxPartition.SVM.Limit; - adapterInfo->GfxPartition.Heap32[0].Base = gAdapterInfo.GfxPartition.Heap32[0].Base; - adapterInfo->GfxPartition.Heap32[0].Limit = gAdapterInfo.GfxPartition.Heap32[0].Limit; - adapterInfo->GfxPartition.Heap32[1].Base = gAdapterInfo.GfxPartition.Heap32[1].Base; - adapterInfo->GfxPartition.Heap32[1].Limit = gAdapterInfo.GfxPartition.Heap32[1].Limit; - adapterInfo->GfxPartition.Heap32[2].Base = gAdapterInfo.GfxPartition.Heap32[2].Base; - adapterInfo->GfxPartition.Heap32[2].Limit = gAdapterInfo.GfxPartition.Heap32[2].Limit; - adapterInfo->GfxPartition.Heap32[3].Base = gAdapterInfo.GfxPartition.Heap32[3].Base; - adapterInfo->GfxPartition.Heap32[3].Limit = gAdapterInfo.GfxPartition.Heap32[3].Limit; + adapterInfo->SizeOfDmaBuffer = 32768; + adapterInfo->GfxMemorySize = 2181038080; + adapterInfo->SystemSharedMemory = 4249540608; + adapterInfo->SystemVideoMemory = 0; - return STATUS_SUCCESS; + adapterInfo->GfxPartition.Standard.Base = gAdapterInfo.GfxPartition.Standard.Base; + adapterInfo->GfxPartition.Standard.Limit = gAdapterInfo.GfxPartition.Standard.Limit; + adapterInfo->GfxPartition.Standard64KB.Base = gAdapterInfo.GfxPartition.Standard64KB.Base; + adapterInfo->GfxPartition.Standard64KB.Limit = gAdapterInfo.GfxPartition.Standard64KB.Limit; + + adapterInfo->GfxPartition.SVM.Base = gAdapterInfo.GfxPartition.SVM.Base; + adapterInfo->GfxPartition.SVM.Limit = gAdapterInfo.GfxPartition.SVM.Limit; + adapterInfo->GfxPartition.Heap32[0].Base = gAdapterInfo.GfxPartition.Heap32[0].Base; + adapterInfo->GfxPartition.Heap32[0].Limit = gAdapterInfo.GfxPartition.Heap32[0].Limit; + adapterInfo->GfxPartition.Heap32[1].Base = gAdapterInfo.GfxPartition.Heap32[1].Base; + adapterInfo->GfxPartition.Heap32[1].Limit = gAdapterInfo.GfxPartition.Heap32[1].Limit; + adapterInfo->GfxPartition.Heap32[2].Base = gAdapterInfo.GfxPartition.Heap32[2].Base; + adapterInfo->GfxPartition.Heap32[2].Limit = gAdapterInfo.GfxPartition.Heap32[2].Limit; + adapterInfo->GfxPartition.Heap32[3].Base = gAdapterInfo.GfxPartition.Heap32[3].Base; + adapterInfo->GfxPartition.Heap32[3].Limit = gAdapterInfo.GfxPartition.Heap32[3].Limit; + return STATUS_SUCCESS; + } + return STATUS_INVALID_PARAMETER; } NTSTATUS __stdcall D3DKMTMakeResident(IN OUT D3DDDI_MAKERESIDENT *makeResident) { diff --git a/opencl/test/unit_test/mock_gdi/mock_gdi.h b/opencl/test/unit_test/mock_gdi/mock_gdi.h index 9927e2537a..aa46f12f31 100644 --- a/opencl/test/unit_test/mock_gdi/mock_gdi.h +++ b/opencl/test/unit_test/mock_gdi/mock_gdi.h @@ -47,6 +47,7 @@ } #define ADAPTER_HANDLE (static_cast(0x40001234)) +#define SHADOW_ADAPTER_HANDLE (static_cast(0x30001234)) #define DEVICE_HANDLE (static_cast(0x40004321)) #define PAGINGQUEUE_HANDLE (static_cast(0x40005678)) #define PAGINGQUEUE_SYNCOBJECT_HANDLE (static_cast(0x40008765)) diff --git a/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp b/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp index c4fd7c2989..5110df2e3c 100644 --- a/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp @@ -45,6 +45,7 @@ namespace SysCalls { extern const wchar_t *currentLibraryPath; } extern uint32_t numRootDevicesToEnum; +std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid); } // namespace NEO using namespace NEO; @@ -1450,3 +1451,23 @@ TEST(DiscoverDevices, whenDriverInfoHasIncompatibleDriverStoreThenHwDeviceIdIsNo auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); EXPECT_TRUE(hwDeviceIds.empty()); } + +TEST(VerifyAdapterType, whenAdapterDoesntSupportRenderThenDontCreateHwDeviceId) { + auto gdi = std::make_unique(); + auto osEnv = std::make_unique(); + osEnv->gdi.reset(gdi.release()); + + LUID shadowAdapterLuid = {0xdd, 0xdd}; + auto hwDeviceId = createHwDeviceIdFromAdapterLuid(*osEnv, shadowAdapterLuid); + EXPECT_EQ(nullptr, hwDeviceId.get()); +} + +TEST(VerifyAdapterType, whenAdapterSupportsRenderThenCreateHwDeviceId) { + auto gdi = std::make_unique(); + auto osEnv = std::make_unique(); + osEnv->gdi.reset(gdi.release()); + + LUID adapterLuid = {0x12, 0x1234}; + auto hwDeviceId = createHwDeviceIdFromAdapterLuid(*osEnv, adapterLuid); + EXPECT_NE(nullptr, hwDeviceId.get()); +} diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index 66db5e7362..e5f25ceeb3 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -245,6 +245,20 @@ std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &os return nullptr; } + D3DKMT_ADAPTERTYPE queryAdapterType = {}; + QueryAdapterInfo.hAdapter = OpenAdapterData.hAdapter; + QueryAdapterInfo.Type = KMTQAITYPE_ADAPTERTYPE; + QueryAdapterInfo.pPrivateDriverData = &queryAdapterType; + QueryAdapterInfo.PrivateDriverDataSize = sizeof(queryAdapterType); + status = osEnvironment.gdi->queryAdapterInfo(&QueryAdapterInfo); + if (status != STATUS_SUCCESS) { + DEBUG_BREAK_IF("queryAdapterInfo failed"); + return nullptr; + } + if (0 == queryAdapterType.RenderSupported) { + return nullptr; + } + return std::make_unique(OpenAdapterData.hAdapter, adapterLuid, &osEnvironment); }