feature: initial support for creating media context
Related-To: NEO-11386 Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
parent
e2cec35f1f
commit
bb21d25ed0
|
@ -7,13 +7,38 @@
|
|||
|
||||
#include "level_zero/api/driver_experimental/public/zex_context.h"
|
||||
|
||||
#include "shared/source/device/device.h"
|
||||
|
||||
#include "level_zero/core/source/device/device.h"
|
||||
|
||||
namespace L0 {
|
||||
ZE_APIEXPORT ze_result_t ZE_APICALL zeIntelMediaCommunicationCreate(ze_context_handle_t hContext, ze_device_handle_t hDevice, ze_intel_media_communication_desc_t *desc, ze_intel_media_doorbell_handle_desc_t *phDoorbell) {
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
||||
auto device = Device::fromHandle(hDevice);
|
||||
|
||||
if (!device || !desc || !phDoorbell) {
|
||||
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (device->getNEODevice()->getMemoryManager()->createMediaContext(device->getRootDeviceIndex(), desc->controlSharedMemoryBuffer, desc->controlSharedMemoryBufferSize,
|
||||
desc->controlBatchBuffer, desc->controlBatchBufferSize, phDoorbell->doorbell)) {
|
||||
return ZE_RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
return ZE_RESULT_ERROR_UNKNOWN;
|
||||
}
|
||||
|
||||
ZE_APIEXPORT ze_result_t ZE_APICALL zeIntelMediaCommunicationDestroy(ze_context_handle_t hContext, ze_device_handle_t hDevice, ze_intel_media_doorbell_handle_desc_t *phDoorbell) {
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
||||
auto device = Device::fromHandle(hDevice);
|
||||
|
||||
if (!device || !phDoorbell) {
|
||||
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (device->getNEODevice()->getMemoryManager()->releaseMediaContext(device->getRootDeviceIndex(), phDoorbell->doorbell)) {
|
||||
return ZE_RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
return ZE_RESULT_ERROR_UNKNOWN;
|
||||
}
|
||||
|
||||
} // namespace L0
|
||||
|
|
|
@ -303,6 +303,9 @@ class MemoryManager {
|
|||
virtual bool allocateInterrupt(uint32_t &outHandle, uint32_t rootDeviceIndex) { return false; }
|
||||
virtual bool releaseInterrupt(uint32_t outHandle, uint32_t rootDeviceIndex) { return false; }
|
||||
|
||||
virtual bool createMediaContext(uint32_t rootDeviceIndex, void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) { return false; }
|
||||
virtual bool releaseMediaContext(uint32_t rootDeviceIndex, uint64_t doorbellHandle) { return false; }
|
||||
|
||||
protected:
|
||||
bool getAllocationData(AllocationData &allocationData, const AllocationProperties &properties, const void *hostPtr, const StorageInfo &storageInfo);
|
||||
static void overrideAllocationData(AllocationData &allocationData, const AllocationProperties &properties);
|
||||
|
|
|
@ -2732,4 +2732,12 @@ bool DrmMemoryManager::releaseInterrupt(uint32_t outHandle, uint32_t rootDeviceI
|
|||
return getDrm(rootDeviceIndex).getIoctlHelper()->releaseInterrupt(outHandle);
|
||||
}
|
||||
|
||||
bool DrmMemoryManager::createMediaContext(uint32_t rootDeviceIndex, void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) {
|
||||
return getDrm(rootDeviceIndex).getIoctlHelper()->createMediaContext(controlSharedMemoryBuffer, controlSharedMemoryBufferSize, controlBatchBuffer, controlBatchBufferSize, outDoorbell);
|
||||
}
|
||||
|
||||
bool DrmMemoryManager::releaseMediaContext(uint32_t rootDeviceIndex, uint64_t doorbellHandle) {
|
||||
return getDrm(rootDeviceIndex).getIoctlHelper()->releaseMediaContext(doorbellHandle);
|
||||
}
|
||||
|
||||
} // namespace NEO
|
||||
|
|
|
@ -101,6 +101,9 @@ class DrmMemoryManager : public MemoryManager {
|
|||
bool allocateInterrupt(uint32_t &outHandle, uint32_t rootDeviceIndex) override;
|
||||
bool releaseInterrupt(uint32_t outHandle, uint32_t rootDeviceIndex) override;
|
||||
|
||||
bool createMediaContext(uint32_t rootDeviceIndex, void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) override;
|
||||
bool releaseMediaContext(uint32_t rootDeviceIndex, uint64_t doorbellHandle) override;
|
||||
|
||||
protected:
|
||||
void registerSharedBoHandleAllocation(DrmAllocation *drmAllocation);
|
||||
BufferObjectHandleWrapper tryToGetBoHandleWrapperWithSharedOwnership(int boHandle);
|
||||
|
|
|
@ -200,7 +200,7 @@ void EngineInfo::getListOfEnginesOnATile(uint32_t tile, std::vector<EngineClassI
|
|||
}
|
||||
}
|
||||
|
||||
std::multimap<uint32_t, EngineClassInstance> EngineInfo::getEngineTileInfo() {
|
||||
const std::multimap<uint32_t, EngineClassInstance> &EngineInfo::getEngineTileInfo() const {
|
||||
return tileToEngineMap;
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ struct EngineInfo {
|
|||
const EngineClassInstance *getEngineInstance(uint32_t tile, aub_stream::EngineType engineType) const;
|
||||
uint32_t getEngineTileIndex(const EngineClassInstance &engine);
|
||||
void getListOfEnginesOnATile(uint32_t tile, std::vector<EngineClassInstance> &listOfEngines);
|
||||
std::multimap<uint32_t, EngineClassInstance> getEngineTileInfo();
|
||||
const std::multimap<uint32_t, EngineClassInstance> &getEngineTileInfo() const;
|
||||
bool hasEngines();
|
||||
const std::vector<EngineCapabilities> &getEngineInfos() const;
|
||||
|
||||
|
|
|
@ -155,6 +155,8 @@ class IoctlHelper {
|
|||
|
||||
virtual bool checkIfIoctlReinvokeRequired(int error, DrmIoctl ioctlRequest) const;
|
||||
virtual int createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex, bool allocateInterrupt) = 0;
|
||||
virtual bool createMediaContext(void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) { return false; }
|
||||
virtual bool releaseMediaContext(uint64_t doorbellHandle) { return false; }
|
||||
|
||||
virtual void fillExecObject(ExecObject &execObject, uint32_t handle, uint64_t gpuAddress, uint32_t drmContextId, bool bindInfo, bool isMarkedForCapture) = 0;
|
||||
virtual void logExecObject(const ExecObject &execObject, std::stringstream &logger, size_t size) = 0;
|
||||
|
|
|
@ -994,7 +994,7 @@ int IoctlHelperXe::ioctl(DrmIoctl request, void *arg) {
|
|||
struct drm_xe_exec_queue_destroy destroy = {};
|
||||
destroy.exec_queue_id = d->contextId;
|
||||
ret = IoctlHelper::ioctl(request, &destroy);
|
||||
xeLog(" -> IoctlHelperXe::ioctl GemContextDestroryExt ctx=0x%x r=%d\n",
|
||||
xeLog(" -> IoctlHelperXe::ioctl GemContextDestrory ctx=0x%x r=%d\n",
|
||||
d->contextId, ret);
|
||||
} break;
|
||||
case DrmIoctl::gemContextGetparam: {
|
||||
|
|
|
@ -67,6 +67,15 @@ class MockIoctlHelper : public IoctlHelperPrelim20 {
|
|||
return IoctlHelperPrelim20::releaseInterrupt(handle);
|
||||
}
|
||||
|
||||
bool createMediaContext(void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) override {
|
||||
createMediaContextCalled++;
|
||||
return IoctlHelperPrelim20::createMediaContext(controlSharedMemoryBuffer, controlSharedMemoryBufferSize, controlBatchBuffer, controlBatchBufferSize, outDoorbell);
|
||||
}
|
||||
bool releaseMediaContext(uint64_t doorbellHandle) override {
|
||||
releaseMediaContextCalled++;
|
||||
return IoctlHelperPrelim20::releaseMediaContext(doorbellHandle);
|
||||
}
|
||||
|
||||
std::unique_ptr<MemoryInfo> createMemoryInfo() override {
|
||||
|
||||
std::vector<MemoryRegion> regionInfo(3);
|
||||
|
@ -91,5 +100,7 @@ class MockIoctlHelper : public IoctlHelperPrelim20 {
|
|||
uint32_t allocateInterruptCalled = 0;
|
||||
uint32_t releaseInterruptCalled = 0;
|
||||
uint32_t latestReleaseInterruptHandle = InterruptId::notUsed;
|
||||
uint32_t createMediaContextCalled = 0;
|
||||
uint32_t releaseMediaContextCalled = 0;
|
||||
};
|
||||
} // namespace NEO
|
||||
|
|
|
@ -1726,6 +1726,26 @@ TEST_F(DrmMemoryManagerTest, whenCallingAllocateAndReleaseInterruptThenCallIoctl
|
|||
EXPECT_EQ(123u, mockIoctlHelper->latestReleaseInterruptHandle);
|
||||
}
|
||||
|
||||
TEST_F(DrmMemoryManagerTest, whenCallingCreateAndReleaseMediaContextThenCallIoctlHelper) {
|
||||
auto mockIoctlHelper = new MockIoctlHelper(*mock);
|
||||
|
||||
auto &drm = static_cast<DrmMockCustom &>(memoryManager->getDrm(rootDeviceIndex));
|
||||
drm.ioctlHelper.reset(mockIoctlHelper);
|
||||
|
||||
uint64_t handle = 0;
|
||||
|
||||
EXPECT_EQ(0u, mockIoctlHelper->createMediaContextCalled);
|
||||
EXPECT_EQ(0u, mockIoctlHelper->releaseMediaContextCalled);
|
||||
|
||||
memoryManager->createMediaContext(rootDeviceIndex, nullptr, 0, nullptr, 0, handle);
|
||||
EXPECT_EQ(1u, mockIoctlHelper->createMediaContextCalled);
|
||||
EXPECT_EQ(0u, mockIoctlHelper->releaseMediaContextCalled);
|
||||
|
||||
memoryManager->releaseMediaContext(rootDeviceIndex, handle);
|
||||
EXPECT_EQ(1u, mockIoctlHelper->createMediaContextCalled);
|
||||
EXPECT_EQ(1u, mockIoctlHelper->releaseMediaContextCalled);
|
||||
}
|
||||
|
||||
TEST_F(DrmMemoryManagerTest, GivenShareableEnabledWhenAskedToCreateGraphicsAllocationThenValidAllocationIsReturnedAndStandard64KBHeapIsUsed) {
|
||||
mock->ioctlHelper.reset(new MockIoctlHelper(*mock));
|
||||
mock->queryMemoryInfo();
|
||||
|
|
|
@ -302,6 +302,7 @@ class DrmMockXe : public DrmMockCustom {
|
|||
case DrmIoctl::gemContextCreateExt: {
|
||||
auto queueCreate = static_cast<drm_xe_exec_queue_create *>(arg);
|
||||
latestExecQueueCreate = *queueCreate;
|
||||
latestQueueEngineClassInstance = reinterpret_cast<drm_xe_engine_class_instance *>(queueCreate->instances)[0];
|
||||
|
||||
auto extension = queueCreate->extensions;
|
||||
while (extension) {
|
||||
|
@ -310,6 +311,7 @@ class DrmMockXe : public DrmMockCustom {
|
|||
auto setProperty = reinterpret_cast<drm_xe_ext_set_property *>(ext);
|
||||
execQueueProperties.push_back(*setProperty);
|
||||
}
|
||||
handleContextCreateExtensions(ext);
|
||||
extension = ext->next_extension;
|
||||
}
|
||||
queueCreate->exec_queue_id = mockExecQueueId;
|
||||
|
@ -334,6 +336,7 @@ class DrmMockXe : public DrmMockCustom {
|
|||
}
|
||||
|
||||
virtual void handleUserFenceWaitExtensions(drm_xe_wait_user_fence *userFenceWait) {}
|
||||
virtual void handleContextCreateExtensions(drm_xe_user_extension *extension) {}
|
||||
|
||||
void addMockedQueryTopologyData(uint16_t tileId, uint16_t maskType, uint32_t nBytes, const std::vector<uint8_t> &mask) {
|
||||
|
||||
|
@ -382,6 +385,7 @@ class DrmMockXe : public DrmMockCustom {
|
|||
StackVec<drm_xe_sync, 1> syncInputs;
|
||||
StackVec<drm_xe_ext_set_property, 1> execQueueProperties;
|
||||
drm_xe_exec_queue_create latestExecQueueCreate = {};
|
||||
drm_xe_engine_class_instance latestQueueEngineClassInstance = {};
|
||||
|
||||
int waitUserFenceReturn = 0;
|
||||
int execQueueBanPropertyReturn = 0;
|
||||
|
|
Loading…
Reference in New Issue