mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-08 05:56:36 +08:00
Return proper clDevice for given media adapter
Signed-off-by: Kamil Diedrich <kamil.diedrich@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
64d772d366
commit
edf066a54b
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (C) 2017-2020 Intel Corporation
|
# Copyright (C) 2017-2021 Intel Corporation
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: MIT
|
# SPDX-License-Identifier: MIT
|
||||||
#
|
#
|
||||||
@@ -8,6 +8,7 @@ set(RUNTIME_SRCS_SHARINGS_VA
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
|
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/${BRANCH_DIR_SUFFIX}/va_device.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/${BRANCH_DIR_SUFFIX}/va_device.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/va_device.h
|
${CMAKE_CURRENT_SOURCE_DIR}/va_device.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/va_device_shared.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/${BRANCH_DIR_SUFFIX}/va_extension.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/${BRANCH_DIR_SUFFIX}/va_extension.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/cl_va_api.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/cl_va_api.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/cl_va_api.h
|
${CMAKE_CURRENT_SOURCE_DIR}/cl_va_api.h
|
||||||
|
|||||||
@@ -75,7 +75,12 @@ clGetDeviceIDsFromVA_APIMediaAdapterINTEL(cl_platform_id platform, cl_va_api_dev
|
|||||||
VADevice vaDevice{};
|
VADevice vaDevice{};
|
||||||
cl_device_id device = vaDevice.getDeviceFromVA(pPlatform, mediaAdapter);
|
cl_device_id device = vaDevice.getDeviceFromVA(pPlatform, mediaAdapter);
|
||||||
GetInfoHelper::set(devices, device);
|
GetInfoHelper::set(devices, device);
|
||||||
GetInfoHelper::set(numDevices, 1u);
|
if (device == nullptr) {
|
||||||
|
GetInfoHelper::set(numDevices, 0u);
|
||||||
|
status = CL_DEVICE_NOT_FOUND;
|
||||||
|
} else {
|
||||||
|
GetInfoHelper::set(numDevices, 1u);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Intel Corporation
|
* Copyright (C) 2020-2021 Intel Corporation
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
@@ -16,7 +16,7 @@ VADevice::VADevice() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ClDevice *VADevice::getDeviceFromVA(Platform *pPlatform, VADisplay vaDisplay) {
|
ClDevice *VADevice::getDeviceFromVA(Platform *pPlatform, VADisplay vaDisplay) {
|
||||||
return pPlatform->getClDevice(0);
|
return getRootDeviceFromVaDisplay(pPlatform, vaDisplay);
|
||||||
}
|
}
|
||||||
|
|
||||||
VADevice::~VADevice() {
|
VADevice::~VADevice() {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Intel Corporation
|
* Copyright (C) 2020-2021 Intel Corporation
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
@@ -20,6 +20,7 @@ class VADevice {
|
|||||||
VADevice();
|
VADevice();
|
||||||
virtual ~VADevice();
|
virtual ~VADevice();
|
||||||
|
|
||||||
|
ClDevice *getRootDeviceFromVaDisplay(Platform *pPlatform, VADisplay vaDisplay);
|
||||||
ClDevice *getDeviceFromVA(Platform *pPlatform, VADisplay vaDisplay);
|
ClDevice *getDeviceFromVA(Platform *pPlatform, VADisplay vaDisplay);
|
||||||
|
|
||||||
static std::function<void *(const char *, int)> fdlopen;
|
static std::function<void *(const char *, int)> fdlopen;
|
||||||
|
|||||||
67
opencl/source/sharings/va/va_device_shared.cpp
Normal file
67
opencl/source/sharings/va/va_device_shared.cpp
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 Intel Corporation
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "shared/source/device/device.h"
|
||||||
|
#include "shared/source/os_interface/linux/drm_neo.h"
|
||||||
|
#include "shared/source/os_interface/linux/os_interface.h"
|
||||||
|
#include "shared/source/os_interface/linux/sys_calls.h"
|
||||||
|
|
||||||
|
#include "opencl/source/cl_device/cl_device.h"
|
||||||
|
#include "opencl/source/platform/platform.h"
|
||||||
|
#include "opencl/source/sharings/va/va_device.h"
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <system_error>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <va/va_backend.h>
|
||||||
|
|
||||||
|
namespace NEO {
|
||||||
|
ClDevice *VADevice::getRootDeviceFromVaDisplay(Platform *pPlatform, VADisplay vaDisplay) {
|
||||||
|
VADisplayContextP pDisplayContext_test = reinterpret_cast<VADisplayContextP>(vaDisplay);
|
||||||
|
UNRECOVERABLE_IF(pDisplayContext_test->vadpy_magic != 0x56414430);
|
||||||
|
VADriverContextP pDriverContext_test = pDisplayContext_test->pDriverContext;
|
||||||
|
int deviceFd = *(int *)pDriverContext_test->drm_state;
|
||||||
|
|
||||||
|
UNRECOVERABLE_IF(deviceFd < 0);
|
||||||
|
|
||||||
|
char path[256] = {0};
|
||||||
|
size_t pathlen = 256;
|
||||||
|
|
||||||
|
if (SysCalls::getDevicePath(deviceFd, path, pathlen)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SysCalls::access(path, F_OK)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int readLinkSize = 0;
|
||||||
|
char devicePath[256] = {0};
|
||||||
|
readLinkSize = SysCalls::readlink(path, devicePath, pathlen);
|
||||||
|
|
||||||
|
if (readLinkSize == -1) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string_view prefixView = "../../devices/pci0000:00/0000:";
|
||||||
|
std::string_view devicePathView(devicePath, static_cast<size_t>(readLinkSize));
|
||||||
|
devicePathView.remove_prefix(prefixView.size());
|
||||||
|
devicePathView = devicePathView.substr(0, 7);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < pPlatform->getNumDevices(); ++i) {
|
||||||
|
auto device = pPlatform->getClDevice(i);
|
||||||
|
NEO::Device *neoDevice = &device->getDevice();
|
||||||
|
|
||||||
|
auto *drm = neoDevice->getRootDeviceEnvironment().osInterface->get()->getDrm();
|
||||||
|
auto pciPath = drm->getPciPath();
|
||||||
|
if (devicePathView == pciPath) {
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
} // namespace NEO
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Intel Corporation
|
* Copyright (C) 2020-2021 Intel Corporation
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "shared/source/helpers/string.h"
|
||||||
#include "shared/source/os_interface/linux/sys_calls.h"
|
#include "shared/source/os_interface/linux/sys_calls.h"
|
||||||
|
|
||||||
#include "drm/i915_drm.h"
|
#include "drm/i915_drm.h"
|
||||||
@@ -12,7 +13,11 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <system_error>
|
||||||
|
|
||||||
namespace NEO {
|
namespace NEO {
|
||||||
namespace SysCalls {
|
namespace SysCalls {
|
||||||
@@ -20,6 +25,8 @@ uint32_t closeFuncCalled = 0u;
|
|||||||
int closeFuncArgPassed = 0;
|
int closeFuncArgPassed = 0;
|
||||||
constexpr int fakeFileDescriptor = 123;
|
constexpr int fakeFileDescriptor = 123;
|
||||||
uint32_t vmId = 0;
|
uint32_t vmId = 0;
|
||||||
|
bool makeFakeDevicePath = false;
|
||||||
|
bool allowFakeDevicePath = false;
|
||||||
|
|
||||||
int close(int fileDescriptor) {
|
int close(int fileDescriptor) {
|
||||||
closeFuncCalled++;
|
closeFuncCalled++;
|
||||||
@@ -55,5 +62,35 @@ int ioctl(int fileDescriptor, unsigned long int request, void *arg) {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int access(const char *pathName, int mode) {
|
||||||
|
if (allowFakeDevicePath || strcmp(pathName, "/sys/dev/char/226:128") == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int readlink(const char *path, char *buf, size_t bufsize) {
|
||||||
|
if (strcmp(path, "/sys/dev/char/226:128") != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr size_t sizeofPath = sizeof("../../devices/pci0000:00/0000:00:02.0/drm/renderD128");
|
||||||
|
|
||||||
|
strcpy_s(buf, sizeofPath, "../../devices/pci0000:00/0000:00:02.0/drm/renderD128");
|
||||||
|
return sizeofPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getDevicePath(int deviceFd, char *buf, size_t &bufSize) {
|
||||||
|
if (deviceFd <= 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
constexpr size_t sizeofPath = sizeof("/sys/dev/char/226:128");
|
||||||
|
|
||||||
|
makeFakeDevicePath ? strcpy_s(buf, sizeofPath, "/sys/dev/char/xyzwerq") : strcpy_s(buf, sizeofPath, "/sys/dev/char/226:128");
|
||||||
|
bufSize = sizeofPath;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} // namespace SysCalls
|
} // namespace SysCalls
|
||||||
} // namespace NEO
|
} // namespace NEO
|
||||||
|
|||||||
@@ -1,25 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Intel Corporation
|
* Copyright (C) 2020-2021 Intel Corporation
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "opencl/source/cl_device/cl_device.h"
|
|
||||||
#include "opencl/source/platform/platform.h"
|
|
||||||
#include "opencl/source/sharings/va/va_device.h"
|
|
||||||
#include "opencl/test/unit_test/fixtures/platform_fixture.h"
|
|
||||||
#include "test.h"
|
|
||||||
|
|
||||||
using namespace NEO;
|
|
||||||
|
|
||||||
using VaDeviceTests = Test<PlatformFixture>;
|
|
||||||
|
|
||||||
TEST_F(VaDeviceTests, givenVADeviceWhenGetDeviceFromVAIsCalledThenRootDeviceIsReturned) {
|
|
||||||
VADisplay vaDisplay = nullptr;
|
|
||||||
|
|
||||||
VADevice vaDevice{};
|
|
||||||
ClDevice *device = vaDevice.getDeviceFromVA(pPlatform, vaDisplay);
|
|
||||||
|
|
||||||
EXPECT_EQ(pPlatform->getClDevice(0), device);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -5,15 +5,21 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "shared/source/device/device.h"
|
||||||
#include "shared/source/gmm_helper/gmm.h"
|
#include "shared/source/gmm_helper/gmm.h"
|
||||||
#include "shared/source/helpers/array_count.h"
|
#include "shared/source/helpers/array_count.h"
|
||||||
#include "shared/source/memory_manager/graphics_allocation.h"
|
#include "shared/source/memory_manager/graphics_allocation.h"
|
||||||
|
#include "shared/source/os_interface/linux/drm_neo.h"
|
||||||
|
#include "shared/source/os_interface/linux/os_interface.h"
|
||||||
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
||||||
|
#include "shared/test/common/helpers/ult_hw_config.h"
|
||||||
|
#include "shared/test/common/helpers/variable_backup.h"
|
||||||
|
|
||||||
#include "opencl/source/api/api.h"
|
#include "opencl/source/api/api.h"
|
||||||
#include "opencl/source/cl_device/cl_device.h"
|
#include "opencl/source/cl_device/cl_device.h"
|
||||||
#include "opencl/source/platform/platform.h"
|
#include "opencl/source/platform/platform.h"
|
||||||
#include "opencl/source/sharings/va/cl_va_api.h"
|
#include "opencl/source/sharings/va/cl_va_api.h"
|
||||||
|
#include "opencl/source/sharings/va/va_device.h"
|
||||||
#include "opencl/source/sharings/va/va_sharing.h"
|
#include "opencl/source/sharings/va/va_sharing.h"
|
||||||
#include "opencl/source/sharings/va/va_surface.h"
|
#include "opencl/source/sharings/va/va_surface.h"
|
||||||
#include "opencl/test/unit_test/fixtures/platform_fixture.h"
|
#include "opencl/test/unit_test/fixtures/platform_fixture.h"
|
||||||
@@ -22,10 +28,14 @@
|
|||||||
#include "opencl/test/unit_test/mocks/mock_command_queue.h"
|
#include "opencl/test/unit_test/mocks/mock_command_queue.h"
|
||||||
#include "opencl/test/unit_test/mocks/mock_context.h"
|
#include "opencl/test/unit_test/mocks/mock_context.h"
|
||||||
#include "opencl/test/unit_test/mocks/mock_platform.h"
|
#include "opencl/test/unit_test/mocks/mock_platform.h"
|
||||||
|
#include "opencl/test/unit_test/os_interface/linux/drm_mock.h"
|
||||||
#include "opencl/test/unit_test/sharings/va/mock_va_sharing.h"
|
#include "opencl/test/unit_test/sharings/va/mock_va_sharing.h"
|
||||||
|
#include "test.h"
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include <va/va_backend.h>
|
||||||
|
|
||||||
using namespace NEO;
|
using namespace NEO;
|
||||||
|
|
||||||
class VaSharingTests : public ::testing::Test, public PlatformFixture {
|
class VaSharingTests : public ::testing::Test, public PlatformFixture {
|
||||||
@@ -556,19 +566,6 @@ TEST_F(VaSharingTests, givenContextWhenSharingTableEmptyThenReturnsNullptr) {
|
|||||||
EXPECT_EQ(sharingF, nullptr);
|
EXPECT_EQ(sharingF, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(VaSharingTests, givenValidPlatformWhenGetDeviceIdsFromVaApiMediaAdapterCalledThenReturnFirstDevice) {
|
|
||||||
cl_device_id devices = 0;
|
|
||||||
cl_uint numDevices = 0;
|
|
||||||
|
|
||||||
cl_platform_id platformId = this->pPlatform;
|
|
||||||
|
|
||||||
auto errCode = clGetDeviceIDsFromVA_APIMediaAdapterINTEL(platformId, 0u, nullptr, 0u, 1, &devices, &numDevices);
|
|
||||||
EXPECT_EQ(CL_SUCCESS, errCode);
|
|
||||||
EXPECT_EQ(1u, numDevices);
|
|
||||||
EXPECT_NE(nullptr, platform()->getClDevice(0));
|
|
||||||
EXPECT_EQ(platform()->getClDevice(0), devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(VaSharingTests, givenInValidPlatformWhenGetDeviceIdsFromVaApiMediaAdapterCalledThenReturnFirstDevice) {
|
TEST_F(VaSharingTests, givenInValidPlatformWhenGetDeviceIdsFromVaApiMediaAdapterCalledThenReturnFirstDevice) {
|
||||||
cl_device_id devices = 0;
|
cl_device_id devices = 0;
|
||||||
cl_uint numDevices = 0;
|
cl_uint numDevices = 0;
|
||||||
@@ -1227,3 +1224,172 @@ TEST_F(VaSharingTests, givenPlaneArgumentEquals2WithoutNoProperFormatsThenReturn
|
|||||||
|
|
||||||
EXPECT_EQ(result, CL_SUCCESS);
|
EXPECT_EQ(result, CL_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class VaDeviceTests : public Test<PlatformFixture> {
|
||||||
|
public:
|
||||||
|
VaDeviceTests() {
|
||||||
|
ultHwConfig.useMockedPrepareDeviceEnvironmentsFunc = false;
|
||||||
|
}
|
||||||
|
VariableBackup<UltHwConfig> backup{&ultHwConfig};
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenVADeviceWhenGetDeviceFromVAIsCalledThenRootDeviceIsReturned) {
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x56414430;
|
||||||
|
auto contextPtr = std::make_unique<VADriverContext>();
|
||||||
|
auto drmState = std::make_unique<int>();
|
||||||
|
vaDisplay->pDriverContext = contextPtr.get();
|
||||||
|
contextPtr->drm_state = drmState.get();
|
||||||
|
*(int *)contextPtr->drm_state = 1;
|
||||||
|
|
||||||
|
auto device = pPlatform->getClDevice(0);
|
||||||
|
NEO::Device *neoDevice = &device->getDevice();
|
||||||
|
|
||||||
|
auto mockDrm = static_cast<DrmMock *>(neoDevice->getRootDeviceEnvironment().osInterface->get()->getDrm());
|
||||||
|
mockDrm->setPciPath("00:02.0");
|
||||||
|
|
||||||
|
VADevice vaDevice{};
|
||||||
|
auto clDevice = vaDevice.getDeviceFromVA(pPlatform, vaDisplay.get());
|
||||||
|
EXPECT_NE(clDevice, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenVADeviceAndInvalidPciPathOfClDeviceWhenGetDeviceFromVAIsCalledThenNullptrIsReturned) {
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x56414430;
|
||||||
|
auto contextPtr = std::make_unique<VADriverContext>();
|
||||||
|
auto drmState = std::make_unique<int>();
|
||||||
|
vaDisplay->pDriverContext = contextPtr.get();
|
||||||
|
contextPtr->drm_state = drmState.get();
|
||||||
|
*(int *)contextPtr->drm_state = 1;
|
||||||
|
|
||||||
|
auto device = pPlatform->getClDevice(0);
|
||||||
|
NEO::Device *neoDevice = &device->getDevice();
|
||||||
|
|
||||||
|
auto mockDrm = static_cast<DrmMock *>(neoDevice->getRootDeviceEnvironment().osInterface->get()->getDrm());
|
||||||
|
mockDrm->setPciPath("00:00.0");
|
||||||
|
|
||||||
|
VADevice vaDevice{};
|
||||||
|
auto clDevice = vaDevice.getDeviceFromVA(pPlatform, vaDisplay.get());
|
||||||
|
EXPECT_EQ(clDevice, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenVADeviceAndInvalidFDWhenGetDeviceFromVAIsCalledThenNullptrIsReturned) {
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x56414430;
|
||||||
|
auto contextPtr = std::make_unique<VADriverContext>();
|
||||||
|
auto drmState = std::make_unique<int>();
|
||||||
|
vaDisplay->pDriverContext = contextPtr.get();
|
||||||
|
contextPtr->drm_state = drmState.get();
|
||||||
|
*(int *)contextPtr->drm_state = 0;
|
||||||
|
|
||||||
|
VADevice vaDevice{};
|
||||||
|
auto clDevice = vaDevice.getDeviceFromVA(pPlatform, vaDisplay.get());
|
||||||
|
EXPECT_EQ(clDevice, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenVADeviceAndInvalidMagicNumberWhenGetDeviceFromVAIsCalledThenUnrecoverableIsCalled) {
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x0;
|
||||||
|
|
||||||
|
VADevice vaDevice{};
|
||||||
|
EXPECT_ANY_THROW(vaDevice.getDeviceFromVA(pPlatform, vaDisplay.get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenVADeviceAndNegativeFdWhenGetDeviceFromVAIsCalledThenUnrecoverableIsCalled) {
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x56414430;
|
||||||
|
auto contextPtr = std::make_unique<VADriverContext>();
|
||||||
|
auto drmState = std::make_unique<int>();
|
||||||
|
vaDisplay->pDriverContext = contextPtr.get();
|
||||||
|
contextPtr->drm_state = drmState.get();
|
||||||
|
*(int *)contextPtr->drm_state = -1;
|
||||||
|
|
||||||
|
VADevice vaDevice{};
|
||||||
|
EXPECT_ANY_THROW(vaDevice.getDeviceFromVA(pPlatform, vaDisplay.get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NEO {
|
||||||
|
namespace SysCalls {
|
||||||
|
extern bool makeFakeDevicePath;
|
||||||
|
extern bool allowFakeDevicePath;
|
||||||
|
} // namespace SysCalls
|
||||||
|
} // namespace NEO
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenVADeviceAndFakeDevicePathWhenGetDeviceFromVAIsCalledThenNullptrIsReturned) {
|
||||||
|
VariableBackup<bool> makeFakePathBackup(&SysCalls::makeFakeDevicePath, true);
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x56414430;
|
||||||
|
auto contextPtr = std::make_unique<VADriverContext>();
|
||||||
|
auto drmState = std::make_unique<int>();
|
||||||
|
vaDisplay->pDriverContext = contextPtr.get();
|
||||||
|
contextPtr->drm_state = drmState.get();
|
||||||
|
*(int *)contextPtr->drm_state = 1;
|
||||||
|
|
||||||
|
VADevice vaDevice{};
|
||||||
|
auto clDevice = vaDevice.getDeviceFromVA(pPlatform, vaDisplay.get());
|
||||||
|
EXPECT_EQ(clDevice, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenVADeviceAndAbsolutePathWhenGetDeviceFromVAIsCalledThenNullptrIsReturned) {
|
||||||
|
VariableBackup<bool> makeFakePathBackup(&SysCalls::makeFakeDevicePath, true);
|
||||||
|
VariableBackup<bool> allowFakeDevicePathBackup(&SysCalls::allowFakeDevicePath, true);
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x56414430;
|
||||||
|
auto contextPtr = std::make_unique<VADriverContext>();
|
||||||
|
auto drmState = std::make_unique<int>();
|
||||||
|
vaDisplay->pDriverContext = contextPtr.get();
|
||||||
|
contextPtr->drm_state = drmState.get();
|
||||||
|
*(int *)contextPtr->drm_state = 1;
|
||||||
|
|
||||||
|
VADevice vaDevice{};
|
||||||
|
auto clDevice = vaDevice.getDeviceFromVA(pPlatform, vaDisplay.get());
|
||||||
|
EXPECT_EQ(clDevice, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenValidPlatformWithInvalidVaDisplayWhenGetDeviceIdsFromVaApiMediaAdapterCalledThenReturnNullptrAndZeroDevices) {
|
||||||
|
cl_device_id devices = 0;
|
||||||
|
cl_uint numDevices = 0;
|
||||||
|
cl_platform_id platformId = pPlatform;
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x56414430;
|
||||||
|
auto contextPtr = std::make_unique<VADriverContext>();
|
||||||
|
auto drmState = std::make_unique<int>();
|
||||||
|
vaDisplay->pDriverContext = contextPtr.get();
|
||||||
|
contextPtr->drm_state = drmState.get();
|
||||||
|
*(int *)contextPtr->drm_state = 1;
|
||||||
|
|
||||||
|
auto device = pPlatform->getClDevice(0);
|
||||||
|
NEO::Device *neoDevice = &device->getDevice();
|
||||||
|
|
||||||
|
auto mockDrm = static_cast<DrmMock *>(neoDevice->getRootDeviceEnvironment().osInterface->get()->getDrm());
|
||||||
|
mockDrm->setPciPath("00:00.0");
|
||||||
|
|
||||||
|
auto errCode = clGetDeviceIDsFromVA_APIMediaAdapterINTEL(platformId, 0u, vaDisplay.get(), 0u, 1, &devices, &numDevices);
|
||||||
|
EXPECT_EQ(CL_DEVICE_NOT_FOUND, errCode);
|
||||||
|
EXPECT_EQ(0u, numDevices);
|
||||||
|
EXPECT_EQ(nullptr, devices);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(VaDeviceTests, givenValidPlatformWhenGetDeviceIdsFromVaApiMediaAdapterCalledThenReturnFirstDevice) {
|
||||||
|
cl_device_id devices = 0;
|
||||||
|
cl_uint numDevices = 0;
|
||||||
|
cl_platform_id platformId = pPlatform;
|
||||||
|
auto vaDisplay = std::make_unique<VADisplayContext>();
|
||||||
|
vaDisplay->vadpy_magic = 0x56414430;
|
||||||
|
auto contextPtr = std::make_unique<VADriverContext>();
|
||||||
|
auto drmState = std::make_unique<int>();
|
||||||
|
vaDisplay->pDriverContext = contextPtr.get();
|
||||||
|
contextPtr->drm_state = drmState.get();
|
||||||
|
*(int *)contextPtr->drm_state = 1;
|
||||||
|
|
||||||
|
auto device = pPlatform->getClDevice(0);
|
||||||
|
NEO::Device *neoDevice = &device->getDevice();
|
||||||
|
|
||||||
|
auto mockDrm = static_cast<DrmMock *>(neoDevice->getRootDeviceEnvironment().osInterface->get()->getDrm());
|
||||||
|
mockDrm->setPciPath("00:02.0");
|
||||||
|
|
||||||
|
auto errCode = clGetDeviceIDsFromVA_APIMediaAdapterINTEL(platformId, 0u, vaDisplay.get(), 0u, 1, &devices, &numDevices);
|
||||||
|
EXPECT_EQ(CL_SUCCESS, errCode);
|
||||||
|
EXPECT_EQ(1u, numDevices);
|
||||||
|
EXPECT_EQ(pPlatform->getClDevice(0), devices);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Intel Corporation
|
* Copyright (C) 2020-2021 Intel Corporation
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
@@ -7,10 +7,15 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
namespace NEO {
|
namespace NEO {
|
||||||
namespace SysCalls {
|
namespace SysCalls {
|
||||||
int close(int fileDescriptor);
|
int close(int fileDescriptor);
|
||||||
int open(const char *file, int flags);
|
int open(const char *file, int flags);
|
||||||
int ioctl(int fileDescriptor, unsigned long int request, void *arg);
|
int ioctl(int fileDescriptor, unsigned long int request, void *arg);
|
||||||
|
int getDevicePath(int deviceFd, char *buf, size_t &bufSize);
|
||||||
|
int access(const char *pathname, int mode);
|
||||||
|
int readlink(const char *path, char *buf, size_t bufsize);
|
||||||
} // namespace SysCalls
|
} // namespace SysCalls
|
||||||
} // namespace NEO
|
} // namespace NEO
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Intel Corporation
|
* Copyright (C) 2020-2021 Intel Corporation
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
@@ -8,7 +8,11 @@
|
|||||||
#include "shared/source/os_interface/linux/sys_calls.h"
|
#include "shared/source/os_interface/linux/sys_calls.h"
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdio.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/sysmacros.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
namespace NEO {
|
namespace NEO {
|
||||||
@@ -22,5 +26,25 @@ int open(const char *file, int flags) {
|
|||||||
int ioctl(int fileDescriptor, unsigned long int request, void *arg) {
|
int ioctl(int fileDescriptor, unsigned long int request, void *arg) {
|
||||||
return ::ioctl(fileDescriptor, request, arg);
|
return ::ioctl(fileDescriptor, request, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int access(const char *pathName, int mode) {
|
||||||
|
return ::access(pathName, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
int readlink(const char *path, char *buf, size_t bufsize) {
|
||||||
|
return static_cast<int>(::readlink(path, buf, bufsize));
|
||||||
|
}
|
||||||
|
|
||||||
|
int getDevicePath(int deviceFd, char *buf, size_t &bufSize) {
|
||||||
|
struct stat st;
|
||||||
|
if (fstat(deviceFd, &st)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(buf, bufSize, "/sys/dev/char/%d:%d",
|
||||||
|
major(st.st_rdev), minor(st.st_rdev));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} // namespace SysCalls
|
} // namespace SysCalls
|
||||||
} // namespace NEO
|
} // namespace NEO
|
||||||
|
|||||||
Reference in New Issue
Block a user