fix(ocl): finish in release ogl object if needed
Finish cache flushes before exiting api call if releasing displayable ogl object or dcflush is mitigated. Related-To: NEO-11694 Signed-off-by: Dominik Dabek <dominik.dabek@intel.com>
This commit is contained in:
parent
585caab757
commit
fc9de71feb
|
@ -640,6 +640,11 @@ cl_int CommandQueue::enqueueReleaseSharedObjects(cl_uint numObjects, const cl_me
|
||||||
if (this->getDevice().getProductHelper().isDcFlushMitigated() || isDisplayableReleased) {
|
if (this->getDevice().getProductHelper().isDcFlushMitigated() || isDisplayableReleased) {
|
||||||
this->getGpgpuCommandStreamReceiver().registerDcFlushForDcMitigation();
|
this->getGpgpuCommandStreamReceiver().registerDcFlushForDcMitigation();
|
||||||
this->getGpgpuCommandStreamReceiver().sendRenderStateCacheFlush();
|
this->getGpgpuCommandStreamReceiver().sendRenderStateCacheFlush();
|
||||||
|
{
|
||||||
|
TakeOwnershipWrapper<CommandQueue> queueOwnership(*this);
|
||||||
|
this->taskCount = this->getGpgpuCommandStreamReceiver().peekTaskCount();
|
||||||
|
}
|
||||||
|
this->finish();
|
||||||
} else if (isImageReleased) {
|
} else if (isImageReleased) {
|
||||||
this->getGpgpuCommandStreamReceiver().sendRenderStateCacheFlush();
|
this->getGpgpuCommandStreamReceiver().sendRenderStateCacheFlush();
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#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_event.h"
|
#include "opencl/test/unit_test/mocks/mock_event.h"
|
||||||
#include "opencl/test/unit_test/mocks/mock_kernel.h"
|
#include "opencl/test/unit_test/mocks/mock_kernel.h"
|
||||||
|
#include "opencl/test/unit_test/mocks/mock_sharing_handler.h"
|
||||||
using namespace NEO;
|
using namespace NEO;
|
||||||
|
|
||||||
HWTEST_F(CommandQueueHwTest, givenNoTimestampPacketsWhenWaitForTimestampsThenNoWaitAndTagIsNotUpdated) {
|
HWTEST_F(CommandQueueHwTest, givenNoTimestampPacketsWhenWaitForTimestampsThenNoWaitAndTagIsNotUpdated) {
|
||||||
|
@ -1433,3 +1433,39 @@ HWTEST_F(CommandQueueHwTest, givenNotBlockedIOQWhenCpuTransferIsBlockedOutEventP
|
||||||
EXPECT_EQ(1, commandQueue->enqueueMarkerWithWaitListCalledCount);
|
EXPECT_EQ(1, commandQueue->enqueueMarkerWithWaitListCalledCount);
|
||||||
clReleaseEvent(returnEvent);
|
clReleaseEvent(returnEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HWTEST_F(CommandQueueHwTest, givenDirectSubmissionAndSharedDisplayableImageWhenReleasingSharedObjectThenFlushRenderStateCacheAndForceDcFlush) {
|
||||||
|
MockCommandQueueHw<FamilyType> mockCmdQueueHw{context, pClDevice, nullptr};
|
||||||
|
MockSharingHandler *mockSharingHandler = new MockSharingHandler;
|
||||||
|
|
||||||
|
auto &ultCsr = mockCmdQueueHw.getUltCommandStreamReceiver();
|
||||||
|
ultCsr.heapStorageRequiresRecyclingTag = false;
|
||||||
|
|
||||||
|
auto directSubmission = new MockDirectSubmissionHw<FamilyType, RenderDispatcher<FamilyType>>(ultCsr);
|
||||||
|
ultCsr.directSubmission.reset(directSubmission);
|
||||||
|
|
||||||
|
auto image = std::unique_ptr<Image>(ImageHelper<Image2dDefaults>::create(context));
|
||||||
|
image->setSharingHandler(mockSharingHandler);
|
||||||
|
image->getGraphicsAllocation(0u)->setAllocationType(AllocationType::sharedImage);
|
||||||
|
|
||||||
|
cl_mem memObject = image.get();
|
||||||
|
cl_uint numObjects = 1;
|
||||||
|
cl_mem *memObjects = &memObject;
|
||||||
|
|
||||||
|
cl_int result = mockCmdQueueHw.enqueueAcquireSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
||||||
|
EXPECT_EQ(result, CL_SUCCESS);
|
||||||
|
image->setIsDisplayable(true);
|
||||||
|
|
||||||
|
ultCsr.directSubmissionAvailable = true;
|
||||||
|
ultCsr.callBaseSendRenderStateCacheFlush = true;
|
||||||
|
EXPECT_FALSE(ultCsr.renderStateCacheFlushed);
|
||||||
|
|
||||||
|
const auto taskCountBefore = mockCmdQueueHw.taskCount;
|
||||||
|
const auto finishCalledBefore = mockCmdQueueHw.finishCalledCount;
|
||||||
|
result = mockCmdQueueHw.enqueueReleaseSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
||||||
|
EXPECT_EQ(result, CL_SUCCESS);
|
||||||
|
EXPECT_TRUE(ultCsr.renderStateCacheFlushed);
|
||||||
|
EXPECT_TRUE(ultCsr.renderStateCacheDcFlushForced);
|
||||||
|
EXPECT_EQ(finishCalledBefore + 1u, mockCmdQueueHw.finishCalledCount);
|
||||||
|
EXPECT_EQ(taskCountBefore + 1u, mockCmdQueueHw.taskCount);
|
||||||
|
}
|
|
@ -55,6 +55,7 @@
|
||||||
#include "opencl/test/unit_test/mocks/mock_kernel.h"
|
#include "opencl/test/unit_test/mocks/mock_kernel.h"
|
||||||
#include "opencl/test/unit_test/mocks/mock_mdi.h"
|
#include "opencl/test/unit_test/mocks/mock_mdi.h"
|
||||||
#include "opencl/test/unit_test/mocks/mock_program.h"
|
#include "opencl/test/unit_test/mocks/mock_program.h"
|
||||||
|
#include "opencl/test/unit_test/mocks/mock_sharing_handler.h"
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
@ -1311,13 +1312,6 @@ TEST(CommandQueue, givenEnqueueAcquireSharedObjectsWhenNoObjectsThenReturnSucces
|
||||||
EXPECT_EQ(result, CL_SUCCESS);
|
EXPECT_EQ(result, CL_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
class MockSharingHandler : public SharingHandler {
|
|
||||||
public:
|
|
||||||
void synchronizeObject(UpdateData &updateData) override {
|
|
||||||
updateData.synchronizationStatus = ACQUIRE_SUCCESFUL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
using CommandQueueTests = ::testing::Test;
|
using CommandQueueTests = ::testing::Test;
|
||||||
HWTEST_F(CommandQueueTests, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerThenReturnSuccess) {
|
HWTEST_F(CommandQueueTests, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerThenReturnSuccess) {
|
||||||
MockContext context;
|
MockContext context;
|
||||||
|
@ -1371,35 +1365,6 @@ HWTEST_F(CommandQueueTests, givenDirectSubmissionAndSharedImageWhenReleasingShar
|
||||||
EXPECT_EQ(ultCsr->renderStateCacheDcFlushForced, context.getDevice(0)->getProductHelper().isDcFlushMitigated());
|
EXPECT_EQ(ultCsr->renderStateCacheDcFlushForced, context.getDevice(0)->getProductHelper().isDcFlushMitigated());
|
||||||
}
|
}
|
||||||
|
|
||||||
HWTEST_F(CommandQueueTests, givenDirectSubmissionAndSharedDisplayableImageWhenReleasingSharedObjectThenFlushRenderStateCacheAndForceDcFlush) {
|
|
||||||
MockContext context;
|
|
||||||
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
|
||||||
MockSharingHandler *mockSharingHandler = new MockSharingHandler;
|
|
||||||
|
|
||||||
auto image = std::unique_ptr<Image>(ImageHelper<Image2dDefaults>::create(&context));
|
|
||||||
image->setSharingHandler(mockSharingHandler);
|
|
||||||
image->getGraphicsAllocation(0u)->setAllocationType(AllocationType::sharedImage);
|
|
||||||
|
|
||||||
cl_mem memObject = image.get();
|
|
||||||
cl_uint numObjects = 1;
|
|
||||||
cl_mem *memObjects = &memObject;
|
|
||||||
|
|
||||||
cl_int result = cmdQ.enqueueAcquireSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
|
||||||
EXPECT_EQ(result, CL_SUCCESS);
|
|
||||||
image->setIsDisplayable(true);
|
|
||||||
|
|
||||||
auto ultCsr = static_cast<UltCommandStreamReceiver<FamilyType> *>(&cmdQ.getGpgpuCommandStreamReceiver());
|
|
||||||
ultCsr->directSubmissionAvailable = true;
|
|
||||||
ultCsr->callBaseSendRenderStateCacheFlush = false;
|
|
||||||
ultCsr->flushReturnValue = SubmissionStatus::success;
|
|
||||||
EXPECT_FALSE(ultCsr->renderStateCacheFlushed);
|
|
||||||
|
|
||||||
result = cmdQ.enqueueReleaseSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
|
||||||
EXPECT_EQ(result, CL_SUCCESS);
|
|
||||||
EXPECT_TRUE(ultCsr->renderStateCacheFlushed);
|
|
||||||
EXPECT_TRUE(ultCsr->renderStateCacheDcFlushForced);
|
|
||||||
}
|
|
||||||
|
|
||||||
HWTEST_F(CommandQueueTests, givenDcFlushMitigationAndDirectSubmissionAndBufferWhenReleasingSharedObjectThenFlushRenderStateCacheAndForceDcFlush) {
|
HWTEST_F(CommandQueueTests, givenDcFlushMitigationAndDirectSubmissionAndBufferWhenReleasingSharedObjectThenFlushRenderStateCacheAndForceDcFlush) {
|
||||||
DebugManagerStateRestore restorer;
|
DebugManagerStateRestore restorer;
|
||||||
debugManager.flags.AllowDcFlush.set(0);
|
debugManager.flags.AllowDcFlush.set(0);
|
||||||
|
|
|
@ -30,6 +30,7 @@ set(IGDRCL_SRCS_tests_mocks
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/mock_program.h
|
${CMAKE_CURRENT_SOURCE_DIR}/mock_program.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/mock_sampler.h
|
${CMAKE_CURRENT_SOURCE_DIR}/mock_sampler.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/mock_sharing_factory.h
|
${CMAKE_CURRENT_SOURCE_DIR}/mock_sharing_factory.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/mock_sharing_handler.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/ult_cl_device_factory.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/ult_cl_device_factory.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/ult_cl_device_factory.h
|
${CMAKE_CURRENT_SOURCE_DIR}/ult_cl_device_factory.h
|
||||||
${NEO_SHARED_DIRECTORY}/gmm_helper/page_table_mngr_impl.cpp
|
${NEO_SHARED_DIRECTORY}/gmm_helper/page_table_mngr_impl.cpp
|
||||||
|
|
|
@ -230,7 +230,10 @@ class MockCommandQueue : public CommandQueue {
|
||||||
cl_int enqueueResourceBarrier(BarrierCommand *resourceBarrier, cl_uint numEventsInWaitList, const cl_event *eventWaitList,
|
cl_int enqueueResourceBarrier(BarrierCommand *resourceBarrier, cl_uint numEventsInWaitList, const cl_event *eventWaitList,
|
||||||
cl_event *event) override { return CL_SUCCESS; }
|
cl_event *event) override { return CL_SUCCESS; }
|
||||||
|
|
||||||
cl_int finish() override { return CL_SUCCESS; }
|
cl_int finish() override {
|
||||||
|
++finishCalledCount;
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
cl_int flush() override { return CL_SUCCESS; }
|
cl_int flush() override { return CL_SUCCESS; }
|
||||||
|
|
||||||
|
@ -253,6 +256,7 @@ class MockCommandQueue : public CommandQueue {
|
||||||
bool releaseIndirectHeapCalled = false;
|
bool releaseIndirectHeapCalled = false;
|
||||||
bool waitForTimestampsCalled = false;
|
bool waitForTimestampsCalled = false;
|
||||||
cl_int writeBufferRetValue = CL_SUCCESS;
|
cl_int writeBufferRetValue = CL_SUCCESS;
|
||||||
|
uint32_t finishCalledCount = 0;
|
||||||
uint32_t isCompletedCalled = 0;
|
uint32_t isCompletedCalled = 0;
|
||||||
uint32_t writeBufferCounter = 0;
|
uint32_t writeBufferCounter = 0;
|
||||||
bool writeBufferBlocking = false;
|
bool writeBufferBlocking = false;
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Intel Corporation
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "opencl/source/sharings/sharing.h"
|
||||||
|
|
||||||
|
class MockSharingHandler : public SharingHandler {
|
||||||
|
public:
|
||||||
|
void synchronizeObject(UpdateData &updateData) override {
|
||||||
|
updateData.synchronizationStatus = ACQUIRE_SUCCESFUL;
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue