mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 23:03:02 +08:00
Use newer GMM API
Related-To: NEO-3832 Change-Id: I9c97a20a6a611118eb14348a8c6960115a20777d Signed-off-by: Jobczyk, Lukasz <lukasz.jobczyk@intel.com> Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
committed by
sys_ocldev
parent
aa7058a2a9
commit
3fc748c0f9
@@ -5,69 +5,57 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "runtime/execution_environment/execution_environment.h"
|
||||
#include "runtime/gmm_helper/gmm_helper.h"
|
||||
#include "runtime/helpers/hw_info.h"
|
||||
#include "runtime/os_interface/os_interface.h"
|
||||
#include "runtime/platform/platform.h"
|
||||
#include "runtime/sku_info/operations/sku_info_transfer.h"
|
||||
#include "unit_tests/helpers/variable_backup.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include <array>
|
||||
|
||||
GMM_CLIENT_CONTEXT *GMM_STDCALL createClientContext(GMM_CLIENT clientType) {
|
||||
return reinterpret_cast<GMM_CLIENT_CONTEXT *>(0x1);
|
||||
}
|
||||
void GMM_STDCALL deleteClientContext(GMM_CLIENT_CONTEXT *pGmmClientContext) {
|
||||
}
|
||||
void GMM_STDCALL destroySingletonContext(void) {
|
||||
}
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN64
|
||||
const char *mockGmmEntryName = "openMockGmm";
|
||||
const char *mockGmmInitFuncName = "initMockGmm";
|
||||
const char *mockGmmDestroyFuncName = "destroyMockGmm";
|
||||
#else
|
||||
const char *mockGmmEntryName = "_openMockGmm@4";
|
||||
const char *mockGmmInitFuncName = "_initMockGmm@8";
|
||||
const char *mockGmmDestroyFuncName = "_destroyMockGmm@4";
|
||||
#endif
|
||||
#define EXPORT_KEYWORD __declspec(dllexport)
|
||||
GMM_STATUS GMM_STDCALL createSingletonContext(const PLATFORM platform,
|
||||
const SKU_FEATURE_TABLE *featureTable,
|
||||
const WA_TABLE *workaroundTable,
|
||||
const GT_SYSTEM_INFO *pGtSysInfo) {
|
||||
return GMM_SUCCESS;
|
||||
}
|
||||
#else
|
||||
const char *mockGmmEntryName = "openMockGmm";
|
||||
const char *mockGmmInitFuncName = "initMockGmm";
|
||||
const char *mockGmmDestroyFuncName = "destroyMockGmm";
|
||||
#define EXPORT_KEYWORD
|
||||
GMM_STATUS GMM_STDCALL createSingletonContext(const PLATFORM platform,
|
||||
const void *featureTable,
|
||||
const void *workaroundTable,
|
||||
const void *pGtSysInfo) {
|
||||
return GMM_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool setCreateContextFunction = true;
|
||||
bool setCreateContextSingletonFunction = true;
|
||||
bool setDeleteContextFunction = true;
|
||||
bool setDestroyContextSingletonFunction = true;
|
||||
GMM_STATUS openGmmReturnValue = GMM_SUCCESS;
|
||||
|
||||
extern "C" EXPORT_KEYWORD GMM_STATUS GMM_STDCALL openMockGmm(GmmExportEntries *pGmmFuncs) {
|
||||
if (setCreateContextFunction) {
|
||||
pGmmFuncs->pfnCreateClientContext = &createClientContext;
|
||||
}
|
||||
if (setCreateContextSingletonFunction) {
|
||||
pGmmFuncs->pfnCreateSingletonContext = &createSingletonContext;
|
||||
}
|
||||
if (setDeleteContextFunction) {
|
||||
pGmmFuncs->pfnDeleteClientContext = &deleteClientContext;
|
||||
}
|
||||
if (setDestroyContextSingletonFunction) {
|
||||
pGmmFuncs->pfnDestroySingletonContext = &destroySingletonContext;
|
||||
GMM_INIT_IN_ARGS passedInputArgs = {};
|
||||
SKU_FEATURE_TABLE passedFtrTable = {};
|
||||
WA_TABLE passedWaTable = {};
|
||||
bool copyInputArgs = false;
|
||||
extern "C" {
|
||||
EXPORT_KEYWORD GMM_STATUS GMM_STDCALL initMockGmm(GMM_INIT_IN_ARGS *pInArgs, GMM_INIT_OUT_ARGS *pOutArgs) {
|
||||
if (copyInputArgs && pInArgs) {
|
||||
passedInputArgs = *pInArgs;
|
||||
passedFtrTable = *reinterpret_cast<SKU_FEATURE_TABLE *>(pInArgs->pSkuTable);
|
||||
passedWaTable = *reinterpret_cast<WA_TABLE *>(pInArgs->pWaTable);
|
||||
}
|
||||
pOutArgs->pGmmClientContext = reinterpret_cast<GMM_CLIENT_CONTEXT *>(0x01);
|
||||
return openGmmReturnValue;
|
||||
}
|
||||
|
||||
EXPORT_KEYWORD void GMM_STDCALL destroyMockGmm(GMM_INIT_OUT_ARGS *pInArgs) {
|
||||
}
|
||||
}
|
||||
|
||||
namespace Os {
|
||||
extern const char *gmmDllName;
|
||||
extern const char *gmmEntryName;
|
||||
extern const char *gmmInitFuncName;
|
||||
extern const char *gmmDestroyFuncName;
|
||||
} // namespace Os
|
||||
namespace NEO {
|
||||
extern const HardwareInfo **platformDevices;
|
||||
@@ -77,28 +65,82 @@ struct GmmInterfaceTest : public ::testing::Test {
|
||||
const char *empty = "";
|
||||
|
||||
VariableBackup<const char *> gmmDllNameBackup = {&Os::gmmDllName, empty};
|
||||
VariableBackup<const char *> gmmEntryNameBackup = {&Os::gmmEntryName, mockGmmEntryName};
|
||||
VariableBackup<const char *> gmmInitNameBackup = {&Os::gmmInitFuncName, mockGmmInitFuncName};
|
||||
VariableBackup<const char *> gmmDestroyNameBackup = {&Os::gmmDestroyFuncName, mockGmmDestroyFuncName};
|
||||
};
|
||||
|
||||
TEST_F(GmmInterfaceTest, givenValidGmmLibWhenCreateGmmHelperThenEverythingWorksFine) {
|
||||
std::unique_ptr<GmmHelper> gmmHelper;
|
||||
EXPECT_NO_THROW(gmmHelper.reset(new GmmHelper(*platformDevices)));
|
||||
}
|
||||
|
||||
TEST_F(GmmInterfaceTest, givenInvalidGmmLibNameWhenCreateGmmHelperThenThrowException) {
|
||||
std::unique_ptr<GmmHelper> gmmHelper;
|
||||
gmmDllNameBackup = "invalidName";
|
||||
EXPECT_THROW(gmmHelper.reset(new GmmHelper(*platformDevices)), std::exception);
|
||||
}
|
||||
|
||||
TEST_F(GmmInterfaceTest, givenGmmLibWhenOpenGmmFunctionFailsThenThrowException) {
|
||||
std::unique_ptr<GmmHelper> gmmHelper;
|
||||
VariableBackup<GMM_STATUS> openGmmReturnValueBackup(&openGmmReturnValue, GMM_ERROR);
|
||||
EXPECT_THROW(gmmHelper.reset(new GmmHelper(*platformDevices)), std::exception);
|
||||
}
|
||||
TEST_F(GmmInterfaceTest, givenGmmLibWhenAnyFunctionIsNotLoadedThenThrowExceptionDuringGmmHelperCreation) {
|
||||
|
||||
TEST_F(GmmInterfaceTest, givenInvalidGmmInitFunctionNameWhenCreateGmmHelperThenThrowException) {
|
||||
std::unique_ptr<GmmHelper> gmmHelper;
|
||||
std::array<bool *, 4> flags = {{&setCreateContextFunction, &setCreateContextSingletonFunction, &setDeleteContextFunction, &setDestroyContextSingletonFunction}};
|
||||
for (auto &flag : flags) {
|
||||
VariableBackup<bool> flagBackup(flag, false);
|
||||
EXPECT_THROW(gmmHelper.reset(new GmmHelper(*platformDevices)), std::exception);
|
||||
}
|
||||
gmmInitNameBackup = "invalidName";
|
||||
EXPECT_THROW(gmmHelper.reset(new GmmHelper(*platformDevices)), std::exception);
|
||||
}
|
||||
|
||||
TEST_F(GmmInterfaceTest, givenInvalidGmmDestroyFunctionNameWhenCreateGmmHelperThenThrowException) {
|
||||
std::unique_ptr<GmmHelper> gmmHelper;
|
||||
gmmDestroyNameBackup = "invalidName";
|
||||
EXPECT_THROW(gmmHelper.reset(new GmmHelper(*platformDevices)), std::exception);
|
||||
}
|
||||
|
||||
TEST_F(GmmInterfaceTest, givenValidGmmFunctionsWhenCreateGmmHelperWithInitializedOsInterfaceThenProperParametersArePassed) {
|
||||
std::unique_ptr<GmmHelper> gmmHelper;
|
||||
auto executionEnvironment = platform()->peekExecutionEnvironment();
|
||||
size_t numDevices;
|
||||
DeviceFactory::getDevices(numDevices, *executionEnvironment);
|
||||
VariableBackup<decltype(passedInputArgs)> passedInputArgsBackup(&passedInputArgs);
|
||||
VariableBackup<decltype(passedFtrTable)> passedFtrTableBackup(&passedFtrTable);
|
||||
VariableBackup<decltype(passedWaTable)> passedWaTableBackup(&passedWaTable);
|
||||
VariableBackup<decltype(copyInputArgs)> copyInputArgsBackup(©InputArgs, true);
|
||||
|
||||
auto hwInfo = platformDevices[0];
|
||||
SKU_FEATURE_TABLE expectedFtrTable = {};
|
||||
WA_TABLE expectedWaTable = {};
|
||||
SkuInfoTransfer::transferFtrTableForGmm(&expectedFtrTable, &hwInfo->featureTable);
|
||||
SkuInfoTransfer::transferWaTableForGmm(&expectedWaTable, &hwInfo->workaroundTable);
|
||||
|
||||
gmmHelper.reset(new GmmHelper(hwInfo));
|
||||
EXPECT_EQ(0, memcmp(&hwInfo->platform, &passedInputArgs.Platform, sizeof(PLATFORM)));
|
||||
EXPECT_EQ(&hwInfo->gtSystemInfo, passedInputArgs.pGtSysInfo);
|
||||
EXPECT_EQ(0, memcmp(&expectedFtrTable, &passedFtrTable, sizeof(SKU_FEATURE_TABLE)));
|
||||
EXPECT_EQ(0, memcmp(&expectedWaTable, &passedWaTable, sizeof(WA_TABLE)));
|
||||
EXPECT_EQ(GMM_CLIENT::GMM_OCL_VISTA, passedInputArgs.ClientType);
|
||||
}
|
||||
|
||||
TEST_F(GmmInterfaceTest, givenValidGmmFunctionsWhenCreateGmmHelperWithoutOsInterfaceThenInitializationDoesntCrashAndProperParametersArePassed) {
|
||||
std::unique_ptr<GmmHelper> gmmHelper;
|
||||
auto executionEnvironment = platform()->peekExecutionEnvironment();
|
||||
executionEnvironment->osInterface.reset();
|
||||
VariableBackup<decltype(passedInputArgs)> passedInputArgsBackup(&passedInputArgs);
|
||||
VariableBackup<decltype(passedFtrTable)> passedFtrTableBackup(&passedFtrTable);
|
||||
VariableBackup<decltype(passedWaTable)> passedWaTableBackup(&passedWaTable);
|
||||
VariableBackup<decltype(copyInputArgs)> copyInputArgsBackup(©InputArgs, true);
|
||||
|
||||
auto hwInfo = platformDevices[0];
|
||||
SKU_FEATURE_TABLE expectedFtrTable = {};
|
||||
WA_TABLE expectedWaTable = {};
|
||||
SkuInfoTransfer::transferFtrTableForGmm(&expectedFtrTable, &hwInfo->featureTable);
|
||||
SkuInfoTransfer::transferWaTableForGmm(&expectedWaTable, &hwInfo->workaroundTable);
|
||||
|
||||
gmmHelper.reset(new GmmHelper(hwInfo));
|
||||
EXPECT_EQ(0, memcmp(&hwInfo->platform, &passedInputArgs.Platform, sizeof(PLATFORM)));
|
||||
EXPECT_EQ(&hwInfo->gtSystemInfo, passedInputArgs.pGtSysInfo);
|
||||
EXPECT_EQ(0, memcmp(&expectedFtrTable, &passedFtrTable, sizeof(SKU_FEATURE_TABLE)));
|
||||
EXPECT_EQ(0, memcmp(&expectedWaTable, &passedWaTable, sizeof(WA_TABLE)));
|
||||
EXPECT_EQ(GMM_CLIENT::GMM_OCL_VISTA, passedInputArgs.ClientType);
|
||||
}
|
||||
@@ -52,7 +52,8 @@ std::thread::id tempThreadID;
|
||||
} // namespace NEO
|
||||
namespace Os {
|
||||
extern const char *gmmDllName;
|
||||
extern const char *gmmEntryName;
|
||||
extern const char *gmmInitFuncName;
|
||||
extern const char *gmmDestroyFuncName;
|
||||
} // namespace Os
|
||||
|
||||
using namespace NEO;
|
||||
@@ -446,7 +447,8 @@ int main(int argc, char **argv) {
|
||||
#endif
|
||||
if (!useMockGmm) {
|
||||
Os::gmmDllName = GMM_UMD_DLL;
|
||||
Os::gmmEntryName = GMM_ENTRY_NAME;
|
||||
Os::gmmInitFuncName = GMM_INIT_NAME;
|
||||
Os::gmmDestroyFuncName = GMM_DESTROY_NAME;
|
||||
} else {
|
||||
GmmHelper::createGmmContextWrapperFunc = GmmClientContextBase::create<MockGmmClientContext>;
|
||||
}
|
||||
|
||||
@@ -7,43 +7,18 @@
|
||||
|
||||
#include "GmmLib.h"
|
||||
|
||||
GMM_CLIENT_CONTEXT *GMM_STDCALL createClientContext(GMM_CLIENT clientType) {
|
||||
return reinterpret_cast<GMM_CLIENT_CONTEXT *>(0x1);
|
||||
}
|
||||
void GMM_STDCALL deleteClientContext(GMM_CLIENT_CONTEXT *pGmmClientContext) {
|
||||
}
|
||||
void GMM_STDCALL destroySingletonContext(void) {
|
||||
}
|
||||
#ifdef _WIN32
|
||||
GMM_STATUS GMM_STDCALL createSingletonContext(const PLATFORM Platform,
|
||||
const SKU_FEATURE_TABLE *featureTable,
|
||||
const WA_TABLE *workaroundTable,
|
||||
const GT_SYSTEM_INFO *pGtSysInfo) {
|
||||
if (Platform.eProductFamily == PRODUCT_FAMILY::IGFX_UNKNOWN &&
|
||||
Platform.eRenderCoreFamily == GFXCORE_FAMILY::IGFX_UNKNOWN_CORE &&
|
||||
Platform.ePCHProductFamily == PCH_PRODUCT_FAMILY::PCH_UNKNOWN) {
|
||||
return GMM_ERROR;
|
||||
}
|
||||
return GMM_SUCCESS;
|
||||
}
|
||||
#else
|
||||
GMM_STATUS GMM_STDCALL createSingletonContext(const PLATFORM platform,
|
||||
const void *featureTable,
|
||||
const void *workaroundTable,
|
||||
const void *pGtSysInfo) {
|
||||
return GMM_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
GMM_STATUS GMM_STDCALL openMockGmm(GmmExportEntries *pGmmFuncs) {
|
||||
pGmmFuncs->pfnCreateClientContext = &createClientContext;
|
||||
pGmmFuncs->pfnCreateSingletonContext = &createSingletonContext;
|
||||
pGmmFuncs->pfnDeleteClientContext = &deleteClientContext;
|
||||
pGmmFuncs->pfnDestroySingletonContext = &destroySingletonContext;
|
||||
|
||||
GMM_STATUS GMM_STDCALL initMockGmm(GMM_INIT_IN_ARGS *pInArgs, GMM_INIT_OUT_ARGS *pOutArgs) {
|
||||
pOutArgs->pGmmClientContext = reinterpret_cast<GMM_CLIENT_CONTEXT *>(0x01);
|
||||
return GMM_SUCCESS;
|
||||
}
|
||||
|
||||
void GMM_STDCALL destroyMockGmm(GMM_INIT_OUT_ARGS *pInArgs) {
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,23 +1,10 @@
|
||||
; Copyright (c) 2018, Intel Corporation
|
||||
;
|
||||
; Permission is hereby granted, free of charge, to any person obtaining a
|
||||
; copy of this software and associated documentation files (the "Software"),
|
||||
; to deal in the Software without restriction, including without limitation
|
||||
; the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
; and/or sell copies of the Software, and to permit persons to whom the
|
||||
; Software is furnished to do so, subject to the following conditions:
|
||||
; Copyright (C) 2018-2019 Intel Corporation
|
||||
;
|
||||
; The above copyright notice and this permission notice shall be included
|
||||
; in all copies or substantial portions of the Software.
|
||||
; SPDX-License-Identifier: MIT
|
||||
;
|
||||
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
; OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
; THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
; OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
; ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
; OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
LIBRARY "mock_gmm"
|
||||
EXPORTS
|
||||
openMockGmm
|
||||
initMockGmm
|
||||
destroyMockGmm
|
||||
@@ -8,6 +8,6 @@
|
||||
#include "mock_gmm_client_context.h"
|
||||
|
||||
namespace NEO {
|
||||
MockGmmClientContext::MockGmmClientContext(GMM_CLIENT clientType, GmmExportEntries &gmmExportEntries) : MockGmmClientContextBase(clientType, gmmExportEntries) {
|
||||
MockGmmClientContext::MockGmmClientContext(HardwareInfo *hwInfo, decltype(&InitializeGmm) initFunc, decltype(&GmmDestroy) destroyFunc) : MockGmmClientContextBase(hwInfo, initFunc, destroyFunc) {
|
||||
}
|
||||
} // namespace NEO
|
||||
|
||||
@@ -11,6 +11,6 @@
|
||||
namespace NEO {
|
||||
class MockGmmClientContext : public MockGmmClientContextBase {
|
||||
public:
|
||||
MockGmmClientContext(GMM_CLIENT clientType, GmmExportEntries &gmmExportEntries);
|
||||
MockGmmClientContext(HardwareInfo *hwInfo, decltype(&InitializeGmm) initFunc, decltype(&GmmDestroy) destroyFunc);
|
||||
};
|
||||
} // namespace NEO
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "unit_tests/mocks/mock_gmm_client_context.h"
|
||||
|
||||
namespace NEO {
|
||||
MockGmmClientContextBase::MockGmmClientContextBase(GMM_CLIENT clientType, GmmExportEntries &gmmExportEntries) : GmmClientContext(clientType, gmmExportEntries) {
|
||||
MockGmmClientContextBase::MockGmmClientContextBase(HardwareInfo *hwInfo, decltype(&InitializeGmm) initFunc, decltype(&GmmDestroy) destroyFunc) : GmmClientContext(hwInfo, initFunc, destroyFunc) {
|
||||
}
|
||||
|
||||
MEMORY_OBJECT_CONTROL_STATE MockGmmClientContextBase::cachePolicyGetMemoryObject(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE usage) {
|
||||
|
||||
@@ -24,6 +24,6 @@ class MockGmmClientContextBase : public GmmClientContext {
|
||||
uint32_t getMediaSurfaceStateCompressionFormatCalled = 0u;
|
||||
|
||||
protected:
|
||||
MockGmmClientContextBase(GMM_CLIENT clientType, GmmExportEntries &gmmExportEntries);
|
||||
MockGmmClientContextBase(HardwareInfo *hwInfo, decltype(&InitializeGmm) initFunc, decltype(&GmmDestroy) destroyFuncs);
|
||||
};
|
||||
} // namespace NEO
|
||||
|
||||
@@ -24,6 +24,7 @@ class GraphicsAllocation;
|
||||
class WddmMock : public Wddm {
|
||||
public:
|
||||
using Wddm::adapter;
|
||||
using Wddm::adapterBDF;
|
||||
using Wddm::currentPagingFenceValue;
|
||||
using Wddm::dedicatedVideoMemory;
|
||||
using Wddm::device;
|
||||
|
||||
@@ -21,7 +21,8 @@ const char *igcDllName = "libmock_igc.so";
|
||||
const char *libvaDllName = nullptr;
|
||||
const char *testDllName = "libtest_dynamic_lib.so";
|
||||
const char *gmmDllName = "libmock_gmm.so";
|
||||
const char *gmmEntryName = "openMockGmm";
|
||||
const char *gmmInitFuncName = "initMockGmm";
|
||||
const char *gmmDestroyFuncName = "destroyMockGmm";
|
||||
const char *metricsLibraryDllName = "";
|
||||
#endif
|
||||
const char *sysFsPciPath = "./test_files";
|
||||
|
||||
@@ -19,7 +19,8 @@ const char *frontEndDllName = "";
|
||||
const char *igcDllName = "";
|
||||
const char *gdiDllName = "gdi32_mock.dll";
|
||||
const char *gmmDllName = "mock_gmm.dll";
|
||||
const char *gmmEntryName = "openMockGmm";
|
||||
const char *gmmInitFuncName = "initMockGmm";
|
||||
const char *gmmDestroyFuncName = "destroyMockGmm";
|
||||
const char *testDllName = "test_dynamic_lib.dll";
|
||||
const char *metricsLibraryDllName = "";
|
||||
} // namespace Os
|
||||
|
||||
@@ -34,3 +34,18 @@ TEST(OsContextTest, givenWddmWhenCreateOsContextAfterInitWddmThenOsContextIsInit
|
||||
EXPECT_EQ(osContext->getWddm(), wddm);
|
||||
EXPECT_EQ(1u, wddm->registerTrimCallbackResult.called);
|
||||
}
|
||||
|
||||
TEST_F(OsInterfaceTest, whenOsInterfaceSetupGmmInputArgsThenProperAdapterBDFIsSet) {
|
||||
auto wddm = new WddmMock;
|
||||
osInterface->get()->setWddm(wddm);
|
||||
auto hwInfo = *platformDevices[0];
|
||||
wddm->init(hwInfo);
|
||||
auto &adapterBDF = wddm->adapterBDF;
|
||||
adapterBDF.Bus = 0x12;
|
||||
adapterBDF.Device = 0x34;
|
||||
adapterBDF.Function = 0x56;
|
||||
GMM_INIT_IN_ARGS gmmInputArgs = {};
|
||||
EXPECT_NE(0, memcmp(&adapterBDF, &gmmInputArgs.stAdapterBDF, sizeof(ADAPTER_BDF)));
|
||||
osInterface->setGmmInputArgs(&gmmInputArgs);
|
||||
EXPECT_EQ(0, memcmp(&adapterBDF, &gmmInputArgs.stAdapterBDF, sizeof(ADAPTER_BDF)));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user