mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-23 03:01:20 +08:00
fix: Flush render state cache on release shared object
Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
9553dd1098
commit
d122e1c906
@@ -615,16 +615,23 @@ cl_int CommandQueue::enqueueReleaseSharedObjects(cl_uint numObjects, const cl_me
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
bool isImageReleased = false;
|
||||
for (unsigned int object = 0; object < numObjects; object++) {
|
||||
auto memObject = castToObject<MemObj>(memObjects[object]);
|
||||
if (memObject == nullptr || memObject->peekSharingHandler() == nullptr) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
isImageReleased |= memObject->getMultiGraphicsAllocation().getAllocationType() == AllocationType::sharedImage;
|
||||
|
||||
memObject->peekSharingHandler()->release(memObject, getDevice().getRootDeviceIndex());
|
||||
DEBUG_BREAK_IF(memObject->acquireCount <= 0);
|
||||
memObject->acquireCount--;
|
||||
}
|
||||
|
||||
if (isImageReleased && this->getGpgpuCommandStreamReceiver().isDirectSubmissionEnabled()) {
|
||||
this->getGpgpuCommandStreamReceiver().sendRenderStateCacheFlush();
|
||||
}
|
||||
|
||||
auto status = enqueueMarkerWithWaitList(
|
||||
numEventsInWaitList,
|
||||
eventWaitList,
|
||||
|
||||
@@ -1329,13 +1329,15 @@ class MockSharingHandler : public SharingHandler {
|
||||
}
|
||||
};
|
||||
|
||||
TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerThenReturnSuccess) {
|
||||
using CommandQueueTests = ::testing::Test;
|
||||
HWTEST_F(CommandQueueTests, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerThenReturnSuccess) {
|
||||
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;
|
||||
@@ -1344,8 +1346,39 @@ TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandler
|
||||
cl_int result = cmdQ.enqueueAcquireSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
||||
EXPECT_EQ(result, CL_SUCCESS);
|
||||
|
||||
auto ultCsr = static_cast<UltCommandStreamReceiver<FamilyType> *>(&cmdQ.getGpgpuCommandStreamReceiver());
|
||||
EXPECT_FALSE(ultCsr->renderStateCacheFlushed);
|
||||
|
||||
result = cmdQ.enqueueReleaseSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
||||
EXPECT_EQ(result, CL_SUCCESS);
|
||||
EXPECT_FALSE(ultCsr->renderStateCacheFlushed);
|
||||
}
|
||||
|
||||
HWTEST_F(CommandQueueTests, givenDirectSubmissionAndSharedImageWhenReleasingSharedObjectThenFlushRenderStateCache) {
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerWithEventThenReturnSuccess) {
|
||||
@@ -1378,7 +1411,7 @@ TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandler
|
||||
|
||||
TEST(CommandQueue, givenEnqueueAcquireSharedObjectsWhenIncorrectArgumentsThenReturnProperError) {
|
||||
MockContext context;
|
||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
||||
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||
|
||||
cl_uint numObjects = 1;
|
||||
cl_mem *memObjects = nullptr;
|
||||
@@ -1418,7 +1451,7 @@ TEST(CommandQueue, givenEnqueueAcquireSharedObjectsWhenIncorrectArgumentsThenRet
|
||||
|
||||
TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenNoObjectsThenReturnSuccess) {
|
||||
MockContext context;
|
||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
||||
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||
|
||||
cl_uint numObjects = 0;
|
||||
cl_mem *memObjects = nullptr;
|
||||
@@ -1429,7 +1462,7 @@ TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenNoObjectsThenReturnSucces
|
||||
|
||||
TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenIncorrectArgumentsThenReturnProperError) {
|
||||
MockContext context;
|
||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
||||
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||
|
||||
cl_uint numObjects = 1;
|
||||
cl_mem *memObjects = nullptr;
|
||||
@@ -1560,7 +1593,7 @@ TEST(CommandQueuePropertiesTests, whenGetEngineIsCalledThenQueueEngineIsReturned
|
||||
|
||||
TEST(CommandQueue, GivenCommandQueueWhenEnqueueResourceBarrierCalledThenSuccessReturned) {
|
||||
MockContext context;
|
||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
||||
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||
|
||||
cl_int result = cmdQ.enqueueResourceBarrier(
|
||||
nullptr,
|
||||
@@ -1572,7 +1605,7 @@ TEST(CommandQueue, GivenCommandQueueWhenEnqueueResourceBarrierCalledThenSuccessR
|
||||
|
||||
TEST(CommandQueue, GivenCommandQueueWhenCheckingIfIsCacheFlushCommandCalledThenFalseReturned) {
|
||||
MockContext context;
|
||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
||||
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||
|
||||
bool isCommandCacheFlush = cmdQ.isCacheFlushCommand(0u);
|
||||
EXPECT_FALSE(isCommandCacheFlush);
|
||||
|
||||
@@ -448,6 +448,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
|
||||
}
|
||||
|
||||
SubmissionStatus sendRenderStateCacheFlush() override {
|
||||
this->renderStateCacheFlushed = true;
|
||||
if (callBaseSendRenderStateCacheFlush) {
|
||||
return BaseClass::sendRenderStateCacheFlush();
|
||||
}
|
||||
@@ -508,6 +509,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
|
||||
CommandStreamReceiverType commandStreamReceiverType = CommandStreamReceiverType::hardware;
|
||||
std::atomic<uint32_t> downloadAllocationsCalledCount = 0;
|
||||
|
||||
bool renderStateCacheFlushed = false;
|
||||
bool cpuCopyForHostPtrSurfaceAllowed = false;
|
||||
bool createPageTableManagerCalled = false;
|
||||
bool recordFlusheBatchBuffer = false;
|
||||
|
||||
Reference in New Issue
Block a user