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;
|
return CL_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isImageReleased = false;
|
||||||
for (unsigned int object = 0; object < numObjects; object++) {
|
for (unsigned int object = 0; object < numObjects; object++) {
|
||||||
auto memObject = castToObject<MemObj>(memObjects[object]);
|
auto memObject = castToObject<MemObj>(memObjects[object]);
|
||||||
if (memObject == nullptr || memObject->peekSharingHandler() == nullptr) {
|
if (memObject == nullptr || memObject->peekSharingHandler() == nullptr) {
|
||||||
return CL_INVALID_MEM_OBJECT;
|
return CL_INVALID_MEM_OBJECT;
|
||||||
}
|
}
|
||||||
|
isImageReleased |= memObject->getMultiGraphicsAllocation().getAllocationType() == AllocationType::sharedImage;
|
||||||
|
|
||||||
memObject->peekSharingHandler()->release(memObject, getDevice().getRootDeviceIndex());
|
memObject->peekSharingHandler()->release(memObject, getDevice().getRootDeviceIndex());
|
||||||
DEBUG_BREAK_IF(memObject->acquireCount <= 0);
|
DEBUG_BREAK_IF(memObject->acquireCount <= 0);
|
||||||
memObject->acquireCount--;
|
memObject->acquireCount--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isImageReleased && this->getGpgpuCommandStreamReceiver().isDirectSubmissionEnabled()) {
|
||||||
|
this->getGpgpuCommandStreamReceiver().sendRenderStateCacheFlush();
|
||||||
|
}
|
||||||
|
|
||||||
auto status = enqueueMarkerWithWaitList(
|
auto status = enqueueMarkerWithWaitList(
|
||||||
numEventsInWaitList,
|
numEventsInWaitList,
|
||||||
eventWaitList,
|
eventWaitList,
|
||||||
|
|||||||
@@ -1329,13 +1329,15 @@ class MockSharingHandler : public SharingHandler {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerThenReturnSuccess) {
|
using CommandQueueTests = ::testing::Test;
|
||||||
|
HWTEST_F(CommandQueueTests, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerThenReturnSuccess) {
|
||||||
MockContext context;
|
MockContext context;
|
||||||
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||||
MockSharingHandler *mockSharingHandler = new MockSharingHandler;
|
MockSharingHandler *mockSharingHandler = new MockSharingHandler;
|
||||||
|
|
||||||
auto image = std::unique_ptr<Image>(ImageHelper<Image2dDefaults>::create(&context));
|
auto image = std::unique_ptr<Image>(ImageHelper<Image2dDefaults>::create(&context));
|
||||||
image->setSharingHandler(mockSharingHandler);
|
image->setSharingHandler(mockSharingHandler);
|
||||||
|
image->getGraphicsAllocation(0u)->setAllocationType(AllocationType::sharedImage);
|
||||||
|
|
||||||
cl_mem memObject = image.get();
|
cl_mem memObject = image.get();
|
||||||
cl_uint numObjects = 1;
|
cl_uint numObjects = 1;
|
||||||
@@ -1344,8 +1346,39 @@ TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandler
|
|||||||
cl_int result = cmdQ.enqueueAcquireSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
cl_int result = cmdQ.enqueueAcquireSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
||||||
EXPECT_EQ(result, CL_SUCCESS);
|
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);
|
result = cmdQ.enqueueReleaseSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0);
|
||||||
EXPECT_EQ(result, CL_SUCCESS);
|
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) {
|
TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerWithEventThenReturnSuccess) {
|
||||||
@@ -1378,7 +1411,7 @@ TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandler
|
|||||||
|
|
||||||
TEST(CommandQueue, givenEnqueueAcquireSharedObjectsWhenIncorrectArgumentsThenReturnProperError) {
|
TEST(CommandQueue, givenEnqueueAcquireSharedObjectsWhenIncorrectArgumentsThenReturnProperError) {
|
||||||
MockContext context;
|
MockContext context;
|
||||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||||
|
|
||||||
cl_uint numObjects = 1;
|
cl_uint numObjects = 1;
|
||||||
cl_mem *memObjects = nullptr;
|
cl_mem *memObjects = nullptr;
|
||||||
@@ -1418,7 +1451,7 @@ TEST(CommandQueue, givenEnqueueAcquireSharedObjectsWhenIncorrectArgumentsThenRet
|
|||||||
|
|
||||||
TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenNoObjectsThenReturnSuccess) {
|
TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenNoObjectsThenReturnSuccess) {
|
||||||
MockContext context;
|
MockContext context;
|
||||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||||
|
|
||||||
cl_uint numObjects = 0;
|
cl_uint numObjects = 0;
|
||||||
cl_mem *memObjects = nullptr;
|
cl_mem *memObjects = nullptr;
|
||||||
@@ -1429,7 +1462,7 @@ TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenNoObjectsThenReturnSucces
|
|||||||
|
|
||||||
TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenIncorrectArgumentsThenReturnProperError) {
|
TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenIncorrectArgumentsThenReturnProperError) {
|
||||||
MockContext context;
|
MockContext context;
|
||||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||||
|
|
||||||
cl_uint numObjects = 1;
|
cl_uint numObjects = 1;
|
||||||
cl_mem *memObjects = nullptr;
|
cl_mem *memObjects = nullptr;
|
||||||
@@ -1560,7 +1593,7 @@ TEST(CommandQueuePropertiesTests, whenGetEngineIsCalledThenQueueEngineIsReturned
|
|||||||
|
|
||||||
TEST(CommandQueue, GivenCommandQueueWhenEnqueueResourceBarrierCalledThenSuccessReturned) {
|
TEST(CommandQueue, GivenCommandQueueWhenEnqueueResourceBarrierCalledThenSuccessReturned) {
|
||||||
MockContext context;
|
MockContext context;
|
||||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||||
|
|
||||||
cl_int result = cmdQ.enqueueResourceBarrier(
|
cl_int result = cmdQ.enqueueResourceBarrier(
|
||||||
nullptr,
|
nullptr,
|
||||||
@@ -1572,7 +1605,7 @@ TEST(CommandQueue, GivenCommandQueueWhenEnqueueResourceBarrierCalledThenSuccessR
|
|||||||
|
|
||||||
TEST(CommandQueue, GivenCommandQueueWhenCheckingIfIsCacheFlushCommandCalledThenFalseReturned) {
|
TEST(CommandQueue, GivenCommandQueueWhenCheckingIfIsCacheFlushCommandCalledThenFalseReturned) {
|
||||||
MockContext context;
|
MockContext context;
|
||||||
MockCommandQueue cmdQ(&context, nullptr, 0, false);
|
MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false);
|
||||||
|
|
||||||
bool isCommandCacheFlush = cmdQ.isCacheFlushCommand(0u);
|
bool isCommandCacheFlush = cmdQ.isCacheFlushCommand(0u);
|
||||||
EXPECT_FALSE(isCommandCacheFlush);
|
EXPECT_FALSE(isCommandCacheFlush);
|
||||||
|
|||||||
@@ -448,6 +448,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
|
|||||||
}
|
}
|
||||||
|
|
||||||
SubmissionStatus sendRenderStateCacheFlush() override {
|
SubmissionStatus sendRenderStateCacheFlush() override {
|
||||||
|
this->renderStateCacheFlushed = true;
|
||||||
if (callBaseSendRenderStateCacheFlush) {
|
if (callBaseSendRenderStateCacheFlush) {
|
||||||
return BaseClass::sendRenderStateCacheFlush();
|
return BaseClass::sendRenderStateCacheFlush();
|
||||||
}
|
}
|
||||||
@@ -508,6 +509,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
|
|||||||
CommandStreamReceiverType commandStreamReceiverType = CommandStreamReceiverType::hardware;
|
CommandStreamReceiverType commandStreamReceiverType = CommandStreamReceiverType::hardware;
|
||||||
std::atomic<uint32_t> downloadAllocationsCalledCount = 0;
|
std::atomic<uint32_t> downloadAllocationsCalledCount = 0;
|
||||||
|
|
||||||
|
bool renderStateCacheFlushed = false;
|
||||||
bool cpuCopyForHostPtrSurfaceAllowed = false;
|
bool cpuCopyForHostPtrSurfaceAllowed = false;
|
||||||
bool createPageTableManagerCalled = false;
|
bool createPageTableManagerCalled = false;
|
||||||
bool recordFlusheBatchBuffer = false;
|
bool recordFlusheBatchBuffer = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user