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:
Jobczyk, Lukasz
2019-10-15 15:05:47 +02:00
committed by sys_ocldev
parent aa7058a2a9
commit 3fc748c0f9
26 changed files with 205 additions and 150 deletions

View File

@@ -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(&copyInputArgs, 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(&copyInputArgs, 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);
}

View File

@@ -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>;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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) {

View File

@@ -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

View File

@@ -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;

View File

@@ -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";

View File

@@ -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

View File

@@ -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)));
}