From bca8478bd47e866bd8055bf22a262a159c2e0824 Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Wed, 7 Aug 2024 18:41:38 +0000 Subject: [PATCH] feature: use iotclhelper to get num media engines Related-To: NEO-9777 Signed-off-by: Bartosz Dunajski --- shared/source/memory_manager/memory_manager.h | 3 +++ .../os_interface/linux/drm_memory_manager.cpp | 8 ++++++++ .../os_interface/linux/drm_memory_manager.h | 3 +++ .../source/os_interface/linux/ioctl_helper.h | 3 +++ .../common/mocks/linux/mock_ioctl_helper.h | 2 ++ .../common/test_macros/mock_method_macros.h | 2 ++ .../linux/drm_memory_manager_tests.cpp | 18 ++++++++++++++++++ 7 files changed, 39 insertions(+) diff --git a/shared/source/memory_manager/memory_manager.h b/shared/source/memory_manager/memory_manager.h index 76ff5133e3..ae2cd5d2b8 100644 --- a/shared/source/memory_manager/memory_manager.h +++ b/shared/source/memory_manager/memory_manager.h @@ -306,6 +306,9 @@ class MemoryManager { 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; } + virtual uint32_t getNumMediaDecoders(uint32_t rootDeviceIndex) const { return 0; } + virtual uint32_t getNumMediaEncoders(uint32_t rootDeviceIndex) const { return 0; } + virtual bool isCompressionSupportedForShareable(bool isShareable) { return true; } virtual bool usmCompressionSupported(Device *device); diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index b78fce20e3..92ea3b2fd1 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -2749,6 +2749,14 @@ bool DrmMemoryManager::releaseMediaContext(uint32_t rootDeviceIndex, uint64_t do return getDrm(rootDeviceIndex).getIoctlHelper()->releaseMediaContext(doorbellHandle); } +uint32_t DrmMemoryManager::getNumMediaDecoders(uint32_t rootDeviceIndex) const { + return getDrm(rootDeviceIndex).getIoctlHelper()->getNumMediaDecoders(); +} + +uint32_t DrmMemoryManager::getNumMediaEncoders(uint32_t rootDeviceIndex) const { + return getDrm(rootDeviceIndex).getIoctlHelper()->getNumMediaEncoders(); +} + bool DrmMemoryManager::isCompressionSupportedForShareable(bool isShareable) { // Currently KMD does not support compression with allocation sharing return !isShareable; diff --git a/shared/source/os_interface/linux/drm_memory_manager.h b/shared/source/os_interface/linux/drm_memory_manager.h index 2779de3b6c..a04a720054 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.h +++ b/shared/source/os_interface/linux/drm_memory_manager.h @@ -104,6 +104,9 @@ class DrmMemoryManager : public MemoryManager { 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; + uint32_t getNumMediaDecoders(uint32_t rootDeviceIndex) const override; + uint32_t getNumMediaEncoders(uint32_t rootDeviceIndex) const override; + bool isCompressionSupportedForShareable(bool isShareable) override; bool usmCompressionSupported(Device *device) override; diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 0fae937baa..9bd31b3400 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -161,6 +161,9 @@ class IoctlHelper { 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 uint32_t getNumMediaDecoders() const { return 0; } + virtual uint32_t getNumMediaEncoders() const { return 0; } + 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; virtual void fillExecBuffer(ExecBuffer &execBuffer, uintptr_t buffersPtr, uint32_t bufferCount, uint32_t startOffset, uint32_t size, uint64_t flags, uint32_t drmContextId) = 0; diff --git a/shared/test/common/mocks/linux/mock_ioctl_helper.h b/shared/test/common/mocks/linux/mock_ioctl_helper.h index 6146379f2c..dda26b29e6 100644 --- a/shared/test/common/mocks/linux/mock_ioctl_helper.h +++ b/shared/test/common/mocks/linux/mock_ioctl_helper.h @@ -37,6 +37,8 @@ class MockIoctlHelper : public IoctlHelperPrelim20 { ADDMETHOD_NOBASE(allocateInterrupt, bool, true, (uint32_t &)); ADDMETHOD_NOBASE(createMediaContext, bool, true, (void *, uint32_t, void *, uint32_t, uint64_t &)); ADDMETHOD_NOBASE(releaseMediaContext, bool, true, (uint64_t)); + ADDMETHOD_CONST_NOBASE(getNumMediaDecoders, uint32_t, 0, ()); + ADDMETHOD_CONST_NOBASE(getNumMediaEncoders, uint32_t, 0, ()); int getDrmParamValue(DrmParam drmParam) const override { if (drmParam == DrmParam::memoryClassSystem) { diff --git a/shared/test/common/test_macros/mock_method_macros.h b/shared/test/common/test_macros/mock_method_macros.h index e7b4e045a7..8de2d4c127 100644 --- a/shared/test/common/test_macros/mock_method_macros.h +++ b/shared/test/common/test_macros/mock_method_macros.h @@ -20,7 +20,9 @@ #define ADDMETHOD_CONST_NOBASE(funcName, retType, defaultReturn, funcParams) \ retType funcName##Result = defaultReturn; \ + mutable uint32_t funcName##Called = 0u; \ retType funcName funcParams const override { \ + funcName##Called++; \ return funcName##Result; \ } diff --git a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp index bd1155bcf8..2155d8dd1a 100644 --- a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp @@ -1776,6 +1776,24 @@ TEST_F(DrmMemoryManagerTest, whenCallingCreateAndReleaseMediaContextThenCallIoct EXPECT_EQ(1u, mockIoctlHelper->releaseMediaContextCalled); } +TEST_F(DrmMemoryManagerTest, whenCallingGetNumMediaThenCallIoctlHelper) { + auto mockIoctlHelper = new MockIoctlHelper(*mock); + + auto &drm = static_cast(memoryManager->getDrm(rootDeviceIndex)); + drm.ioctlHelper.reset(mockIoctlHelper); + + EXPECT_EQ(0u, mockIoctlHelper->getNumMediaDecodersCalled); + EXPECT_EQ(0u, mockIoctlHelper->getNumMediaEncodersCalled); + + memoryManager->getNumMediaDecoders(rootDeviceIndex); + EXPECT_EQ(1u, mockIoctlHelper->getNumMediaDecodersCalled); + EXPECT_EQ(0u, mockIoctlHelper->getNumMediaEncodersCalled); + + memoryManager->getNumMediaEncoders(rootDeviceIndex); + EXPECT_EQ(1u, mockIoctlHelper->getNumMediaDecodersCalled); + EXPECT_EQ(1u, mockIoctlHelper->getNumMediaEncodersCalled); +} + TEST_F(DrmMemoryManagerTest, GivenShareableEnabledWhenAskedToCreateGraphicsAllocationThenValidAllocationIsReturnedAndStandard64KBHeapIsUsed) { mock->ioctlHelper.reset(new MockIoctlHelper(*mock)); mock->queryMemoryInfo();