From 8d60fb2a07a293e898b87b81bf4ee2b473926d56 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Wed, 25 Aug 2021 15:19:44 +0000 Subject: [PATCH] Refactor tag update for stop ring buffer Signed-off-by: Lukasz Jobczyk --- .../direct_submission/direct_submission_hw.h | 1 + .../direct_submission/direct_submission_hw.inl | 6 ++++++ .../linux/drm_direct_submission.h | 1 + .../linux/drm_direct_submission.inl | 16 +++++++++------- .../direct_submission_tests.cpp | 1 + .../linux/drm_direct_submission_tests.cpp | 5 +++++ 6 files changed, 23 insertions(+), 7 deletions(-) diff --git a/shared/source/direct_submission/direct_submission_hw.h b/shared/source/direct_submission/direct_submission_hw.h index 33225da1fb..14ec8dfa9a 100644 --- a/shared/source/direct_submission/direct_submission_hw.h +++ b/shared/source/direct_submission/direct_submission_hw.h @@ -78,6 +78,7 @@ class DirectSubmissionHw { virtual bool handleResidency() = 0; virtual void handleNewResourcesSubmission(); virtual size_t getSizeNewResourceHandler(); + virtual void handleStopRingBuffer(){}; virtual uint64_t switchRingBuffers(); virtual void handleSwitchRingBuffers() = 0; GraphicsAllocation *switchRingBuffersAllocations(); diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index b7c6bb0504..fdce3154a8 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -157,6 +157,7 @@ bool DirectSubmissionHw::startRingBuffer() { if (ringStart) { return true; } + size_t startSize = getSizeSemaphoreSection(); size_t requiredSize = startSize + getSizeDispatch() + getSizeEnd(); if (ringCommandStream.getAvailableSpace() < requiredSize) { @@ -174,6 +175,10 @@ bool DirectSubmissionHw::startRingBuffer() { template bool DirectSubmissionHw::stopRingBuffer() { + if (!ringStart) { + return true; + } + void *flushPtr = ringCommandStream.getSpace(0); Dispatcher::dispatchCacheFlush(ringCommandStream, *hwInfo, gpuVaForMiFlush); if (disableMonitorFence) { @@ -192,6 +197,7 @@ bool DirectSubmissionHw::stopRingBuffer() { semaphoreData->QueueWorkCount = currentQueueWorkCount; cpuCachelineFlush(semaphorePtr, MemoryConstants::cacheLineSize); + this->handleStopRingBuffer(); this->ringStart = false; return true; diff --git a/shared/source/direct_submission/linux/drm_direct_submission.h b/shared/source/direct_submission/linux/drm_direct_submission.h index a790313bf6..7a56bfb13a 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.h +++ b/shared/source/direct_submission/linux/drm_direct_submission.h @@ -29,6 +29,7 @@ class DrmDirectSubmission : public DirectSubmissionHw { bool isNewResourceHandleNeeded(); void handleNewResourcesSubmission() override; size_t getSizeNewResourceHandler() override; + void handleStopRingBuffer() override; void handleSwitchRingBuffers() override; uint64_t updateTagValue() override; void getTagAddressValue(TagData &tagData) override; diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl index 1066390ecb..f9635b85b8 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.inl +++ b/shared/source/direct_submission/linux/drm_direct_submission.inl @@ -34,13 +34,8 @@ DrmDirectSubmission::DrmDirectSubmission(Device &device, template inline DrmDirectSubmission::~DrmDirectSubmission() { - if (this->ringStart) { - this->stopRingBuffer(); - if (this->disableMonitorFence) { - this->currentTagData.tagValue++; - } - this->wait(static_cast(this->currentTagData.tagValue)); - } + this->stopRingBuffer(); + this->wait(static_cast(this->currentTagData.tagValue)); this->deallocateResources(); } @@ -130,6 +125,13 @@ size_t DrmDirectSubmission::getSizeNewResourceHandler() { return size; } +template +void DrmDirectSubmission::handleStopRingBuffer() { + if (this->disableMonitorFence) { + this->currentTagData.tagValue++; + } +} + template void DrmDirectSubmission::handleSwitchRingBuffers() { if (this->disableMonitorFence) { diff --git a/shared/test/unit_test/direct_submission/direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/direct_submission_tests.cpp index 86a5cb6c3e..f390209010 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/direct_submission_tests.cpp @@ -277,6 +277,7 @@ HWTEST_F(DirectSubmissionTest, bool ret = directSubmission.allocateResources(); directSubmission.disableMonitorFence = true; + directSubmission.ringStart = true; EXPECT_TRUE(ret); diff --git a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp index 8a3f15c325..79edcbac30 100644 --- a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp @@ -94,12 +94,17 @@ HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenCallingLinuxImplem drmDirectSubmission.getTagAddressValue(tagData); EXPECT_EQ(drmDirectSubmission.currentTagData.tagAddress, tagData.tagAddress); EXPECT_EQ(drmDirectSubmission.currentTagData.tagValue + 1, tagData.tagValue); + + *drmDirectSubmission.tagAddress = 1u; } HWTEST_F(DrmDirectSubmissionTest, whenCreateDirectSubmissionThenValidObjectIsReturned) { auto directSubmission = DirectSubmissionHw>::create(*device.get(), *osContext.get()); EXPECT_NE(directSubmission.get(), nullptr); + + bool ret = directSubmission->initialize(false); + EXPECT_TRUE(ret); } HWTEST_F(DrmDirectSubmissionTest, givenDisabledMonitorFenceWhenDispatchSwitchRingBufferThenDispatchPipeControl) {