Files
compute-runtime/unit_tests/sharings/gl/gl_sharing_tests.cpp
Katarzyna Cencelewska 51ecef7ec2 Refactor of glcl sharing
new pattern to load gl functions from dll

Change-Id: I6f39945d3c53b5a169b0829f36b2102c3ef5e18a
2018-10-05 12:41:31 +02:00

1152 lines
46 KiB
C++

/*
* Copyright (C) 2018 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "runtime/command_queue/command_queue.h"
#include "unit_tests/libult/ult_command_stream_receiver.h"
#include "runtime/device/device.h"
#include "runtime/event/event.h"
#include "runtime/gmm_helper/gmm.h"
#include "runtime/mem_obj/buffer.h"
#include "runtime/mem_obj/image.h"
#include "runtime/os_interface/os_interface.h"
#include "runtime/platform/platform.h"
#include "runtime/sharings/sharing.h"
#include "runtime/sharings/gl/gl_arb_sync_event.h"
#include "runtime/sharings/gl/gl_buffer.h"
#include "runtime/sharings/gl/gl_sync_event.h"
#include "runtime/sharings/gl/gl_texture.h"
#include "unit_tests/helpers/debug_manager_state_restore.h"
#include "unit_tests/mocks/mock_async_event_handler.h"
#include "unit_tests/mocks/gl/mock_gl_arb_sync_event.h"
#include "unit_tests/mocks/gl/mock_gl_sharing.h"
#include "unit_tests/mocks/mock_context.h"
#include "unit_tests/mocks/mock_device.h"
#include "unit_tests/mocks/mock_event.h"
#include "unit_tests/mocks/mock_gmm_resource_info.h"
#include "unit_tests/mocks/mock_memory_manager.h"
#include "unit_tests/libult/create_command_stream.h"
#include "test.h"
#include "gl/gl_sharing_os.h"
namespace Os {
extern const char *openglDllName;
}
using namespace OCLRT;
bool MockGLSharingFunctions::SharingEnabled = false;
const char *MockGLSharingFunctions::arrayStringi[2] = {"GL_OES_framebuffer_object", "GL_EXT_framebuffer_object"};
const char *MockGLSharingFunctions::arrayString[2] = {"Intel", "4.0"};
GLboolean MockGLSharingFunctions::GLSetSharedOCLContextStateReturnedValue = 1;
class glSharingTests : public ::testing::Test {
public:
void SetUp() override {
mockGlSharing = new MockGlSharing;
context.setSharingFunctions(&mockGlSharing->m_sharingFunctions);
mockGlSharing->m_bufferInfoOutput.globalShareHandle = bufferId;
mockGlSharing->m_bufferInfoOutput.bufferSize = 4096u;
mockGlSharing->uploadDataToBufferInfo();
ASSERT_FALSE(overrideCommandStreamReceiverCreation);
}
void TearDown() override {
context.releaseSharingFunctions(SharingType::CLGL_SHARING);
delete mockGlSharing;
}
MockContext context;
MockGlSharing *mockGlSharing;
unsigned int bufferId = 1u;
};
TEST_F(glSharingTests, givenGlMockWhenItIsCreatedThenNonZeroObjectIsReturned) {
EXPECT_NE(nullptr, &mockGlSharing);
EXPECT_NE(nullptr, &mockGlSharing->m_clGlResourceInfo);
EXPECT_NE(nullptr, &mockGlSharing->m_glClResourceInfo);
}
TEST_F(glSharingTests, givenGLSharingFunctionsWhenAskedForIdThenClGlSharingIdIsReturned) {
auto v = SharingType::CLGL_SHARING;
EXPECT_EQ(v, mockGlSharing->m_sharingFunctions.getId());
}
TEST_F(glSharingTests, givenMockGlWhenGlBufferIsCreatedThenMemObjectHasGlHandler) {
auto retVal = CL_SUCCESS;
auto glBuffer = GlBuffer::createSharedGlBuffer(&context, CL_MEM_READ_WRITE, bufferId, &retVal);
EXPECT_NE(nullptr, glBuffer);
EXPECT_NE(nullptr, glBuffer->getGraphicsAllocation());
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(4096u, glBuffer->getGraphicsAllocation()->getUnderlyingBufferSize());
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
EXPECT_EQ(bufferId, bufferInfoInput.bufferName);
EXPECT_EQ(4096u, glBuffer->getSize());
size_t flagsExpected = CL_MEM_READ_WRITE;
EXPECT_EQ(flagsExpected, glBuffer->getFlags());
auto handler = glBuffer->peekSharingHandler();
ASSERT_NE(nullptr, handler);
auto glHandler = static_cast<GlSharing *>(handler);
EXPECT_EQ(glHandler->peekFunctionsHandler(), &mockGlSharing->m_sharingFunctions);
delete glBuffer;
}
class FailingMemoryManager : public MockMemoryManager {
public:
GraphicsAllocation *createGraphicsAllocationFromSharedHandle(osHandle handle, bool requireSpecificBitness) override {
return nullptr;
}
};
TEST_F(glSharingTests, givenMockGlWhenGlBufferIsCreatedFromWrongHandleThenErrorAndNoBufferIsReturned) {
auto tempMemoryManager = context.getMemoryManager();
auto memoryManager = std::unique_ptr<FailingMemoryManager>(new FailingMemoryManager());
context.setMemoryManager(memoryManager.get());
auto retVal = CL_SUCCESS;
auto glBuffer = GlBuffer::createSharedGlBuffer(&context, CL_MEM_READ_WRITE, 0, &retVal);
EXPECT_EQ(nullptr, glBuffer);
EXPECT_EQ(CL_INVALID_GL_OBJECT, retVal);
context.setMemoryManager(tempMemoryManager);
}
TEST_F(glSharingTests, givenContextWhenClCreateFromGlBufferIsCalledThenBufferIsReturned) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
ASSERT_NE(nullptr, glBuffer);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenContextWithoutSharingWhenClCreateFromGlBufferIsCalledThenErrorIsReturned) {
context.releaseSharingFunctions(CLGL_SHARING);
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
ASSERT_EQ(CL_INVALID_CONTEXT, retVal);
ASSERT_EQ(nullptr, glBuffer);
}
GLboolean OSAPI mockGLAcquireSharedBuffer(GLDisplay, GLContext, GLContext, GLvoid *pResourceInfo) {
return GL_FALSE;
};
TEST_F(glSharingTests, givenContextWithSharingWhenClCreateFromGlBufferIsCalledWithIncorrectThenErrorIsReturned) {
mockGlSharing->m_sharingFunctions.setGLAcquireSharedBufferMock(mockGLAcquireSharedBuffer);
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
ASSERT_EQ(CL_INVALID_GL_OBJECT, retVal);
ASSERT_EQ(nullptr, glBuffer);
}
TEST_F(glSharingTests, givenContextAnd32BitAddressingWhenClCreateFromGlBufferIsCalledThenBufferIsReturned) {
auto flagToRestore = DebugManager.flags.Force32bitAddressing.get();
DebugManager.flags.Force32bitAddressing.set(true);
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
ASSERT_NE(nullptr, glBuffer);
EXPECT_TRUE(castToObject<Buffer>(glBuffer)->getGraphicsAllocation()->is32BitAllocation);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
DebugManager.flags.Force32bitAddressing.set(flagToRestore);
}
TEST_F(glSharingTests, givenGlClBufferWhenAskedForCLGLGetInfoThenIdAndTypeIsReturned) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
cl_gl_object_type objectType = 0u;
cl_GLuint objectId = 0u;
retVal = clGetGLObjectInfo(glBuffer, &objectType, &objectId);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(objectType, (cl_gl_object_type)CL_GL_OBJECT_BUFFER);
EXPECT_EQ(objectId, bufferId);
retVal = clGetGLObjectInfo(glBuffer, &objectType, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(objectType, (cl_gl_object_type)CL_GL_OBJECT_BUFFER);
retVal = clGetGLObjectInfo(glBuffer, nullptr, &objectId);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(objectId, bufferId);
retVal = clGetGLObjectInfo(glBuffer, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenClBufferWhenAskedForCLGLGetInfoThenErrorIsReturned) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateBuffer(&context, 0, 1, nullptr, &retVal);
EXPECT_EQ(CL_SUCCESS, retVal);
cl_gl_object_type objectType = 0u;
cl_GLuint objectId = 0u;
retVal = clGetGLObjectInfo(glBuffer, &objectType, &objectId);
EXPECT_EQ(CL_INVALID_GL_OBJECT, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenClGLBufferWhenItIsAcquiredThenAcuqireCountIsIncremented) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
auto memObject = castToObject<Buffer>(glBuffer);
EXPECT_FALSE(memObject->isMemObjZeroCopy());
EXPECT_FALSE(memObject->isReadWriteOnCpuAllowed(true, 0, (void *)0x1001, 100));
auto currentGraphicsAllocation = memObject->getGraphicsAllocation();
memObject->peekSharingHandler()->acquire(memObject);
EXPECT_EQ(2, GLAcquireSharedBufferCalled);
EXPECT_EQ(1, GLGetCurrentContextCalled);
auto currentGraphicsAllocation2 = memObject->getGraphicsAllocation();
EXPECT_EQ(currentGraphicsAllocation2, currentGraphicsAllocation);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenClGLBufferWhenItIsAcquiredTwiceThenAcuqireIsNotCalled) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto memObject = castToObject<MemObj>(glBuffer);
memObject->peekSharingHandler()->acquire(memObject);
EXPECT_EQ(2, GLAcquireSharedBufferCalled);
EXPECT_EQ(1, GLGetCurrentContextCalled);
memObject->peekSharingHandler()->acquire(memObject);
EXPECT_EQ(2, GLAcquireSharedBufferCalled);
EXPECT_EQ(1, GLGetCurrentContextCalled);
memObject->peekSharingHandler()->release(memObject);
memObject->peekSharingHandler()->release(memObject);
EXPECT_EQ(1, GLGetCurrentContextCalled);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenClGLBufferWhenItIsCreatedAndGmmIsAvailableThenItIsUsedInGraphicsAllocation) {
void *ptr = (void *)0x1000;
auto gmm = new Gmm(ptr, 4096u, false);
mockGlSharing->m_bufferInfoOutput.pGmmResInfo = gmm->gmmResourceInfo->peekHandle();
mockGlSharing->uploadDataToBufferInfo();
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto memObject = castToObject<MemObj>(glBuffer);
auto graphicsAllocation = memObject->getGraphicsAllocation();
ASSERT_NE(nullptr, graphicsAllocation->gmm);
EXPECT_NE(nullptr, graphicsAllocation->gmm->gmmResourceInfo->peekHandle());
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
delete gmm;
}
TEST_F(glSharingTests, givenClGLBufferWhenItIsAcquiredTwiceAfterReleaseThenAcuqireIsIncremented) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto memObject = castToObject<MemObj>(glBuffer);
memObject->peekSharingHandler()->acquire(memObject);
EXPECT_EQ(2, GLAcquireSharedBufferCalled);
EXPECT_EQ(1, GLGetCurrentContextCalled);
memObject->peekSharingHandler()->release(memObject);
memObject->peekSharingHandler()->acquire(memObject);
EXPECT_EQ(3, GLAcquireSharedBufferCalled);
EXPECT_EQ(2, GLGetCurrentContextCalled);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenClGLBufferWhenItIsAcquireCountIsDecrementedToZeroThenCallReleaseFunction) {
std::unique_ptr<Buffer> buffer(GlBuffer::createSharedGlBuffer(&context, CL_MEM_READ_WRITE, bufferId, nullptr));
auto sharingHandler = buffer->peekSharingHandler();
sharingHandler->acquire(buffer.get());
sharingHandler->acquire(buffer.get());
sharingHandler->release(buffer.get());
EXPECT_EQ(0, GLReleaseSharedBufferCalled);
sharingHandler->release(buffer.get());
EXPECT_EQ(1, GLReleaseSharedBufferCalled);
EXPECT_EQ(bufferId, bufferInfoInput.bufferName);
}
TEST_F(glSharingTests, givenClGLBufferWhenItIsAcquiredWithDifferentOffsetThenGraphicsAllocationContainsLatestOffsetValue) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto memObject = castToObject<MemObj>(glBuffer);
auto graphicsAddress = memObject->getGraphicsAllocation()->getGpuAddress();
mockGlSharing->m_bufferInfoOutput.bufferOffset = 50u;
mockGlSharing->uploadDataToBufferInfo();
memObject->peekSharingHandler()->acquire(memObject);
auto offsetedGraphicsAddress = memObject->getGraphicsAllocation()->getGpuAddress();
EXPECT_EQ(offsetedGraphicsAddress, graphicsAddress + mockGlSharing->m_bufferInfoOutput.bufferOffset);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenHwCommandQueueWhenAcquireIsCalledThenAcquireCountIsIncremented) {
auto retVal = CL_SUCCESS;
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto buffer = castToObject<Buffer>(glBuffer);
EXPECT_EQ(0u, buffer->acquireCount);
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
retVal = clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(2, GLAcquireSharedBufferCalled);
EXPECT_EQ(1u, buffer->acquireCount);
retVal = clEnqueueReleaseGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(0u, buffer->acquireCount);
retVal = clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(3, GLAcquireSharedBufferCalled);
EXPECT_EQ(1u, buffer->acquireCount);
retVal = clReleaseCommandQueue(commandQueue);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenHwCommandQueueWhenAcquireIsCalledWithIncorrectWaitlistThenReturnError) {
auto retVal = CL_SUCCESS;
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto buffer = castToObject<Buffer>(glBuffer);
EXPECT_EQ(0u, buffer->acquireCount);
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
retVal = clEnqueueAcquireGLObjects(commandQueue, 0, &glBuffer, 1, nullptr, nullptr);
EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, retVal);
retVal = clReleaseCommandQueue(commandQueue);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenEnabledAsyncEventsHandlerWhenAcquireGlObjectsIsCalledWithIncompleteExternallySynchronizedEventThenItIsAddedToAsyncEventsHandler) {
std::unique_ptr<DebugManagerStateRestore> dbgRestore;
DebugManager.flags.EnableAsyncEventsHandler.set(true);
auto handler = new MockHandler(false);
auto oldHandler = OCLRT::platform()->setAsyncEventsHandler(std::unique_ptr<AsyncEventsHandler>(handler));
struct ExternallySynchronizedEvent : Event {
ExternallySynchronizedEvent()
: Event(nullptr, 0, 0, 0) {
}
bool isExternallySynchronized() const override {
return true;
}
void updateExecutionStatus() override {
++updateCount;
if (complete) {
transitionExecutionStatus(CL_COMPLETE);
}
}
bool complete = false;
uint32_t updateCount = 0;
};
auto *event = new ExternallySynchronizedEvent;
cl_event clEvent = static_cast<cl_event>(event);
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, nullptr);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, nullptr);
EXPECT_EQ(CL_SUCCESS, clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 1, &clEvent, nullptr));
EXPECT_EQ(CL_SUCCESS, clReleaseCommandQueue(commandQueue));
EXPECT_EQ(CL_SUCCESS, clReleaseMemObject(glBuffer));
EXPECT_LT(CL_SUCCESS, event->peekExecutionStatus());
EXPECT_FALSE(handler->peekIsRegisterListEmpty());
uint32_t updateCount = event->updateCount;
handler->process();
EXPECT_LT(updateCount, event->updateCount);
updateCount = event->updateCount;
handler->process();
EXPECT_LT(updateCount, event->updateCount);
updateCount = event->updateCount;
event->complete = true;
handler->process();
EXPECT_LE(updateCount, event->updateCount);
updateCount = event->updateCount;
handler->process();
EXPECT_EQ(updateCount, event->updateCount);
event->release();
OCLRT::platform()->setAsyncEventsHandler(std::move(oldHandler));
}
TEST_F(glSharingTests, givenDisabledAsyncEventsHandlerWhenAcquireGlObjectsIsCalledWithIncompleteExternallySynchronizedEventThenItIsNotAddedToAsyncEventsHandler) {
std::unique_ptr<DebugManagerStateRestore> dbgRestore;
DebugManager.flags.EnableAsyncEventsHandler.set(false);
auto handler = new MockHandler(false);
auto oldHandler = OCLRT::platform()->setAsyncEventsHandler(std::unique_ptr<AsyncEventsHandler>(handler));
struct ExternallySynchronizedEvent : Event {
ExternallySynchronizedEvent()
: Event(nullptr, 0, 0, 0) {
}
bool isExternallySynchronized() const override {
return true;
}
};
auto *event = new ExternallySynchronizedEvent;
cl_event clEvent = static_cast<cl_event>(event);
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, nullptr);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, nullptr);
EXPECT_EQ(CL_SUCCESS, clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 1, &clEvent, nullptr));
EXPECT_EQ(CL_SUCCESS, clReleaseCommandQueue(commandQueue));
EXPECT_EQ(CL_SUCCESS, clReleaseMemObject(glBuffer));
EXPECT_LT(CL_SUCCESS, event->peekExecutionStatus());
EXPECT_TRUE(handler->peekIsRegisterListEmpty());
event->release();
OCLRT::platform()->setAsyncEventsHandler(std::move(oldHandler));
}
TEST_F(glSharingTests, givenEnabledAsyncEventsHandlerWhenAcquireGlObjectsIsCalledWithIncompleteButNotExternallySynchronizedEventThenItIsNotAddedToAsyncEventsHandler) {
std::unique_ptr<DebugManagerStateRestore> dbgRestore;
DebugManager.flags.EnableAsyncEventsHandler.set(false);
auto handler = new MockHandler(false);
auto oldHandler = OCLRT::platform()->setAsyncEventsHandler(std::unique_ptr<AsyncEventsHandler>(handler));
auto *event = new UserEvent;
cl_event clEvent = static_cast<cl_event>(event);
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, nullptr);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, nullptr);
EXPECT_EQ(CL_SUCCESS, clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 1, &clEvent, nullptr));
EXPECT_EQ(CL_SUCCESS, clReleaseCommandQueue(commandQueue));
EXPECT_EQ(CL_SUCCESS, clReleaseMemObject(glBuffer));
EXPECT_LT(CL_SUCCESS, event->peekExecutionStatus());
EXPECT_TRUE(handler->peekIsRegisterListEmpty());
event->release();
OCLRT::platform()->setAsyncEventsHandler(std::move(oldHandler));
}
TEST_F(glSharingTests, givenHwCommandQueueWhenReleaseIsCalledWithIncorrectWaitlistThenReturnError) {
auto retVal = CL_SUCCESS;
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto buffer = castToObject<Buffer>(glBuffer);
EXPECT_EQ(0u, buffer->acquireCount);
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
retVal = clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clEnqueueReleaseGLObjects(commandQueue, 1, &glBuffer, 1, nullptr, nullptr);
EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, retVal);
retVal = clEnqueueReleaseGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseCommandQueue(commandQueue);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenContextWithoutSharingWhenAcquireIsCalledThenErrorIsReturned) {
auto retVal = CL_SUCCESS;
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto buffer = castToObject<Buffer>(glBuffer);
EXPECT_EQ(0u, buffer->acquireCount);
context.releaseSharingFunctions(CLGL_SHARING);
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
retVal = clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(CL_INVALID_CONTEXT, retVal);
retVal = clReleaseCommandQueue(commandQueue);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenContextWithoutSharingWhenReleaseIsCalledThenErrorIsReturned) {
auto retVal = CL_SUCCESS;
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto buffer = castToObject<Buffer>(glBuffer);
EXPECT_EQ(0u, buffer->acquireCount);
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
retVal = clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(2, GLAcquireSharedBufferCalled);
EXPECT_EQ(1u, buffer->acquireCount);
context.releaseSharingFunctions(CLGL_SHARING);
retVal = clEnqueueReleaseGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(CL_INVALID_CONTEXT, retVal);
retVal = clReleaseCommandQueue(commandQueue);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenHwCommandQueueWhenAcquireAndReleaseCallsAreMadeWithEventsThenProperCmdTypeIsReturned) {
cl_event retEvent;
auto retVal = CL_SUCCESS;
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, &retVal);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
retVal = clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, &retEvent);
EXPECT_EQ(CL_SUCCESS, retVal);
cl_command_type cmdType = 0;
size_t sizeReturned = 0;
retVal = clGetEventInfo(retEvent, CL_EVENT_COMMAND_TYPE, sizeof(cmdType), &cmdType, &sizeReturned);
ASSERT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(static_cast<cl_command_type>(CL_COMMAND_ACQUIRE_GL_OBJECTS), cmdType);
EXPECT_EQ(sizeof(cl_command_type), sizeReturned);
retVal = clReleaseEvent(retEvent);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clEnqueueReleaseGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, &retEvent);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clGetEventInfo(retEvent, CL_EVENT_COMMAND_TYPE, sizeof(cmdType), &cmdType, &sizeReturned);
ASSERT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(static_cast<cl_command_type>(CL_COMMAND_RELEASE_GL_OBJECTS), cmdType);
EXPECT_EQ(sizeof(cl_command_type), sizeReturned);
retVal = clReleaseEvent(retEvent);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseCommandQueue(commandQueue);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenCommandQueueWhenReleaseGlObjectIsCalledThenFinishIsCalled) {
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, nullptr);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, nullptr);
auto neoQueue = castToObject<CommandQueue>(commandQueue);
clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
neoQueue->taskCount = 5u;
clEnqueueReleaseGLObjects(commandQueue, 1, &glBuffer, 0, nullptr, nullptr);
EXPECT_EQ(5u, neoQueue->latestTaskCountWaited);
clReleaseCommandQueue(commandQueue);
clReleaseMemObject(glBuffer);
}
TEST_F(glSharingTests, givenMockGLWhenFunctionsAreCalledThenCallsAreReceived) {
auto ptrToStruct = &mockGlSharing->m_clGlResourceInfo;
auto glDisplay = (GLDisplay)1;
auto glContext = (GLContext)1;
mockGlSharing->overrideGetCurrentValues(glContext, glDisplay);
EXPECT_EQ(1u, mockGlSharing->m_sharingFunctions.setSharedOCLContextState());
EXPECT_EQ(1u, mockGlSharing->m_sharingFunctions.acquireSharedBufferINTEL(ptrToStruct));
EXPECT_EQ(1u, mockGlSharing->m_sharingFunctions.acquireSharedRenderBuffer(ptrToStruct));
EXPECT_EQ(1u, mockGlSharing->m_sharingFunctions.acquireSharedTexture(ptrToStruct));
EXPECT_EQ(1u, mockGlSharing->m_sharingFunctions.releaseSharedBufferINTEL(ptrToStruct));
EXPECT_EQ(1u, mockGlSharing->m_sharingFunctions.releaseSharedRenderBuffer(ptrToStruct));
EXPECT_EQ(1u, mockGlSharing->m_sharingFunctions.releaseSharedTexture(ptrToStruct));
EXPECT_EQ(glContext, mockGlSharing->m_sharingFunctions.getCurrentContext());
EXPECT_EQ(glDisplay, mockGlSharing->m_sharingFunctions.getCurrentDisplay());
EXPECT_EQ(1u, mockGlSharing->m_sharingFunctions.makeCurrent(glContext, glDisplay));
EXPECT_EQ(1, GLSetSharedOCLContextStateCalled);
EXPECT_EQ(1, GLAcquireSharedBufferCalled);
EXPECT_EQ(1, GLAcquireSharedRenderBufferCalled);
EXPECT_EQ(1, GLAcquireSharedTextureCalled);
EXPECT_EQ(1, GLReleaseSharedBufferCalled);
EXPECT_EQ(1, GLReleaseSharedRenderBufferCalled);
EXPECT_EQ(1, GLReleaseSharedTextureCalled);
EXPECT_EQ(1, GLGetCurrentContextCalled);
EXPECT_EQ(1, GLGetCurrentDisplayCalled);
EXPECT_EQ(1, GLMakeCurrentCalled);
}
TEST(glSharingBasicTest, GivenSharingFunctionsWhenItIsConstructedThenOglContextFunctionIsCalled) {
GLType GLHDCType = 0;
GLContext GLHGLRCHandle = 0;
GLDisplay GLHDCHandle = 0;
GlSharingFunctionsMock glSharingFunctions(GLHDCType, GLHGLRCHandle, GLHGLRCHandle, GLHDCHandle);
EXPECT_EQ(1, GLSetSharedOCLContextStateCalled);
}
TEST(glSharingBasicTest, givenInvalidExtensionNameWhenCheckGLExtensionSupportedThenReturnFalse) {
GLSharingFunctions glSharingFunctions;
bool RetVal = glSharingFunctions.isOpenGlExtensionSupported("InvalidExtensionName");
EXPECT_FALSE(RetVal);
}
TEST(glSharingBasicTest, givenglGetIntegervIsNullWhenCheckGLExtensionSupportedThenReturnFalse) {
MockGLSharingFunctions glSharingFunctions;
glSharingFunctions.glGetIntegerv = nullptr;
bool RetVal = glSharingFunctions.isOpenGlExtensionSupported("InvalidExtensionName");
EXPECT_FALSE(RetVal);
}
TEST(glSharingBasicTest, givenValidExtensionNameWhenCheckGLExtensionSupportedThenReturnTrue) {
MockGLSharingFunctions glSharingFunctions;
bool RetVal = glSharingFunctions.isOpenGlExtensionSupported("GL_OES_framebuffer_object");
EXPECT_TRUE(RetVal);
}
TEST(glSharingBasicTest, givenWhenCheckGLSharingSupportedThenReturnTrue) {
MockGLSharingFunctions glSharingFunctions;
bool RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_TRUE(RetVal);
}
TEST(glSharingBasicTest, givenVendorisNullWhenCheckGLSharingSupportedThenReturnFalse) {
auto invalidGetStringFcn = [](GLenum name) {
return (const GLubyte *)nullptr;
};
MockGLSharingFunctions glSharingFunctions;
glSharingFunctions.glGetString = invalidGetStringFcn;
bool RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_FALSE(RetVal);
}
TEST(glSharingBasicTest, givenVersionisNullWhenCheckGLSharingSupportedThenReturnFalse) {
MockGLSharingFunctions glSharingFunctions;
glSharingFunctions.arrayString[1] = nullptr; // version returns null
bool RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_FALSE(RetVal);
glSharingFunctions.arrayString[0] = "Int..";
RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_FALSE(RetVal);
}
TEST(glSharingBasicTest, givenVersionisGlesWhenCheckGLSharingSupportedThenReturnFalse) {
MockGLSharingFunctions glSharingFunctions;
glSharingFunctions.arrayString[1] = "OpenGL ES";
bool RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_TRUE(RetVal);
glSharingFunctions.arrayString[1] = "OpenGL ES 1.";
RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_TRUE(RetVal);
glSharingFunctions.arrayString[1] = "2.0";
RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_TRUE(RetVal);
glSharingFunctions.arrayStringi[1] = "GL_EXT_framebuffer_o...";
RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_FALSE(RetVal);
glSharingFunctions.arrayStringi[1] = "GL_EXT_framebuffer_object";
RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_TRUE(RetVal);
glSharingFunctions.arrayString[1] = "OpenGL ES 1.";
glSharingFunctions.arrayStringi[0] = "GL_OES_framebuffer_o...";
RetVal = glSharingFunctions.isOpenGlSharingSupported();
EXPECT_FALSE(RetVal);
}
TEST(glSharingBasicTest, givensetSharedOCLContextStateWhenCallThenCorrectValue) {
MockGLSharingFunctions glSharingFunctions;
glSharingFunctions.GLSetSharedOCLContextStateReturnedValue = 0u;
EXPECT_EQ(0u, glSharingFunctions.setSharedOCLContextState());
glSharingFunctions.GLSetSharedOCLContextStateReturnedValue = 1u;
EXPECT_EQ(1u, glSharingFunctions.setSharedOCLContextState());
}
TEST_F(glSharingTests, givenContextWhenCreateFromSharedBufferThenSharedImageIsReturned) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
ASSERT_NE(nullptr, glBuffer);
auto parentbBuffer = castToObject<Buffer>(glBuffer);
cl_image_format format = {CL_RGBA, CL_FLOAT};
cl_image_desc image_desc = {CL_MEM_OBJECT_IMAGE1D_BUFFER, 1, 1, 1, 1, 0, 0, 0, 0, {glBuffer}};
cl_mem image = clCreateImage(&context, CL_MEM_READ_WRITE, &format, &image_desc, 0, &retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
ASSERT_NE(nullptr, glBuffer);
auto childImage = castToObject<Image>(image);
EXPECT_EQ(parentbBuffer->peekSharingHandler(), childImage->peekSharingHandler());
retVal = clReleaseMemObject(image);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenClGLBufferWhenMapAndUnmapBufferIsCalledThenCopyOnGpu) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto buffer = castToObject<Buffer>(glBuffer);
EXPECT_EQ(buffer->getCpuAddressForMemoryTransfer(), nullptr); // no cpu ptr
auto commandQueue = CommandQueue::create(&context, context.getDevice(0), 0, retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
size_t offset = 1;
auto taskCount = commandQueue->taskCount;
auto mappedPtr = clEnqueueMapBuffer(commandQueue, glBuffer, CL_TRUE, CL_MAP_WRITE, offset, (buffer->getSize() - offset),
0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(taskCount + 1, commandQueue->taskCount);
MapInfo mapInfo;
EXPECT_TRUE(buffer->findMappedPtr(mappedPtr, mapInfo));
EXPECT_EQ(mappedPtr, ptrOffset(buffer->getAllocatedMapPtr(), offset));
EXPECT_EQ(mapInfo.size[0], buffer->getSize() - offset);
EXPECT_EQ(mapInfo.offset[0], offset);
retVal = commandQueue->enqueueUnmapMemObject(buffer, mappedPtr, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(taskCount + 2, commandQueue->taskCount);
EXPECT_FALSE(buffer->findMappedPtr(mappedPtr, mapInfo)); // delete in destructor
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
delete commandQueue;
}
TEST_F(glSharingTests, givenClGLBufferWhenretValIsNotPassedToCreateFunctionThenBufferIsCreated) {
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, nullptr);
ASSERT_NE(nullptr, glBuffer);
auto retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(glSharingTests, givenClGLBufferWhenMapAndUnmapBufferIsCalledTwiceThenReuseStorage) {
auto retVal = CL_SUCCESS;
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto buffer = castToObject<Buffer>(glBuffer);
EXPECT_EQ(buffer->getCpuAddressForMemoryTransfer(), nullptr); // no cpu ptr
auto commandQueue = CommandQueue::create(&context, context.getDevice(0), 0, retVal);
ASSERT_EQ(CL_SUCCESS, retVal);
auto mappedPtr = clEnqueueMapBuffer(commandQueue, glBuffer, CL_TRUE, CL_MAP_READ, 0, buffer->getSize(),
0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clEnqueueUnmapMemObject(commandQueue, glBuffer, mappedPtr, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
auto mappedPtr2 = clEnqueueMapBuffer(commandQueue, glBuffer, CL_TRUE, CL_MAP_READ, 0, buffer->getSize(),
0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(mappedPtr, mappedPtr2);
retVal = clEnqueueUnmapMemObject(commandQueue, glBuffer, mappedPtr, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
retVal = clReleaseMemObject(glBuffer);
EXPECT_EQ(CL_SUCCESS, retVal);
delete commandQueue;
}
TEST(APIclCreateEventFromGLsyncKHR, givenInvalidContexWhenCreateThenReturnError) {
cl_int retVal = CL_SUCCESS;
cl_GLsync sync = {0};
auto event = clCreateEventFromGLsyncKHR(nullptr, sync, &retVal);
EXPECT_EQ(CL_INVALID_CONTEXT, retVal);
EXPECT_EQ(nullptr, event);
}
TEST_F(glSharingTests, givenContextWithoutSharingWhenCreateEventFromGLThenErrorIsReturned) {
context.releaseSharingFunctions(CLGL_SHARING);
cl_int retVal = CL_SUCCESS;
cl_GLsync sync = {0};
auto event = clCreateEventFromGLsyncKHR(&context, sync, &retVal);
EXPECT_EQ(CL_INVALID_CONTEXT, retVal);
EXPECT_EQ(nullptr, event);
}
TEST(glSharingContextSwitch, givenContextOrBkpContextHandleAsCurrentWhenSwitchAttemptedThenDontMakeSwitch) {
GLType type = 0;
auto context = (GLContext)1;
auto display = (GLDisplay)2;
auto bkpContext = (GLContext)3;
MockGlSharing mockGlSharing(type, context, bkpContext, display);
mockGlSharing.overrideGetCurrentValues(context, display);
{
GLContextGuard guard(mockGlSharing.m_sharingFunctions);
EXPECT_TRUE(glMockReturnedValues.currentContext == context);
EXPECT_TRUE(glMockReturnedValues.currentDisplay == display);
}
EXPECT_EQ(0, GLMakeCurrentCalled);
EXPECT_EQ(1, GLGetCurrentContextCalled);
EXPECT_EQ(1, GLGetCurrentDisplayCalled);
mockGlSharing.overrideGetCurrentValues(bkpContext, display);
{
GLContextGuard guard(mockGlSharing.m_sharingFunctions);
EXPECT_EQ(0, GLMakeCurrentCalled);
EXPECT_TRUE(glMockReturnedValues.currentContext == bkpContext);
}
EXPECT_EQ(1, GLMakeCurrentCalled); // destructor
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == bkpContext);
}
TEST(glSharingContextSwitch, givenUnknownCurrentContextAndNoFailsOnCallWhenSwitchAttemptedThenMakeSwitchToCtxHandle) {
GLType type = 0;
auto context = (GLContext)1;
auto display = (GLDisplay)2;
auto bkpContext = (GLContext)3;
auto unknownContext = (GLContext)4;
MockGlSharing mockGlSharing(type, context, bkpContext, display);
mockGlSharing.overrideGetCurrentValues(unknownContext, display, false);
{
GLContextGuard guard(mockGlSharing.m_sharingFunctions);
EXPECT_TRUE(glMockReturnedValues.currentContext == unknownContext);
EXPECT_EQ(1, GLMakeCurrentCalled);
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == context);
}
EXPECT_EQ(2, GLMakeCurrentCalled); // destructor
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == unknownContext);
}
TEST(glSharingContextSwitch, givenUnknownCurrentContextAndOneFailOnCallWhenSwitchAttemptedThenMakeSwitchToBkpCtxHandle) {
GLType type = 0;
auto context = (GLContext)1;
auto display = (GLDisplay)2;
auto bkpContext = (GLContext)3;
auto unknownContext = (GLContext)4;
MockGlSharing mockGlSharing(type, context, bkpContext, display);
mockGlSharing.overrideGetCurrentValues(unknownContext, display, true, 1);
{
GLContextGuard guard(mockGlSharing.m_sharingFunctions);
EXPECT_TRUE(glMockReturnedValues.currentContext == unknownContext);
EXPECT_EQ(2, GLMakeCurrentCalled);
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == bkpContext);
}
EXPECT_EQ(3, GLMakeCurrentCalled); // destructor
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == unknownContext);
}
TEST(glSharingContextSwitch, givenUnknownCurrentContextAndMultipleFailOnCallWhenSwitchAttemptedThenMakeSwitchToBkpCtxHandleUntilSuccess) {
GLType type = 0;
auto context = (GLContext)1;
auto display = (GLDisplay)2;
auto bkpContext = (GLContext)3;
auto unknownContext = (GLContext)4;
MockGlSharing mockGlSharing(type, context, bkpContext, display);
mockGlSharing.overrideGetCurrentValues(unknownContext, display, true, 5);
{
GLContextGuard guard(mockGlSharing.m_sharingFunctions);
EXPECT_TRUE(glMockReturnedValues.currentContext == unknownContext);
EXPECT_EQ(6, GLMakeCurrentCalled);
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == bkpContext);
}
EXPECT_EQ(7, GLMakeCurrentCalled); // destructor
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == unknownContext);
}
TEST(glSharingContextSwitch, givenZeroCurrentContextWhenSwitchAttemptedThenMakeSwitchToBkpCtxHandle) {
GLType type = 0;
auto context = (GLContext)1;
auto display = (GLDisplay)2;
auto bkpContext = (GLContext)3;
auto zeroContext = (GLContext)0;
MockGlSharing mockGlSharing(type, context, bkpContext, display);
mockGlSharing.overrideGetCurrentValues(zeroContext, display, false);
{
GLContextGuard guard(mockGlSharing.m_sharingFunctions);
EXPECT_TRUE(glMockReturnedValues.currentContext == zeroContext);
EXPECT_EQ(1, GLMakeCurrentCalled);
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == bkpContext);
}
EXPECT_EQ(2, GLMakeCurrentCalled); // destructor
EXPECT_TRUE(glMockReturnedValues.madeCurrentContext == zeroContext);
}
TEST(glSharingContextSwitch, givenSharingFunctionsWhenGlDeleteContextIsNotPresentThenItIsNotCalled) {
auto glSharingFunctions = new MockGLSharingFunctions();
auto currentGlDeleteContextCalledCount = GLDeleteContextCalled;
delete glSharingFunctions;
EXPECT_EQ(currentGlDeleteContextCalledCount, GLDeleteContextCalled);
}
HWTEST_F(glSharingTests, givenSyncObjectWhenCreateEventIsCalledThenCreateGLSyncObj) {
cl_int retVal = CL_SUCCESS;
GLsync glSync = {0};
auto event = clCreateEventFromGLsyncKHR(&context, glSync, &retVal);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_NE(nullptr, event);
auto &csr = reinterpret_cast<MockDevice *>(context.getDevice(0))->getUltCommandStreamReceiver<FamilyType>();
csr.taskLevel = 123;
auto csrTaskLevel = csr.peekTaskLevel();
auto eventObj = castToObject<Event>(event);
EXPECT_TRUE(eventObj->getCommandType() == CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR);
EXPECT_TRUE(eventObj->peekExecutionStatus() == CL_SUBMITTED);
EXPECT_EQ(Event::eventNotReady, eventObj->taskLevel);
EXPECT_EQ(csrTaskLevel, eventObj->getTaskLevel());
EXPECT_EQ(1, GLRetainSyncCalled);
clReleaseEvent(event);
EXPECT_EQ(1, GLReleaseSyncCalled);
}
HWTEST_F(glSharingTests, givenEventCreatedFromFenceObjectWhenItIsPassedToAcquireThenItsStatusIsUpdated) {
GLsync glSync = {0};
auto retVal = CL_SUCCESS;
auto event = clCreateEventFromGLsyncKHR(&context, glSync, &retVal);
auto glBuffer = clCreateFromGLBuffer(&context, 0, bufferId, &retVal);
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, &retVal);
mockGlSharing->setGetSyncivReturnValue(GL_SIGNALED);
auto neoEvent = castToObject<Event>(event);
EXPECT_FALSE(neoEvent->isReadyForSubmission());
retVal = clEnqueueAcquireGLObjects(commandQueue, 1, &glBuffer, 1, &event, nullptr);
EXPECT_TRUE(neoEvent->isReadyForSubmission());
EXPECT_EQ(CL_SUCCESS, retVal);
clReleaseCommandQueue(commandQueue);
clReleaseMemObject(glBuffer);
clReleaseEvent(event);
}
TEST_F(glSharingTests, glSyncEventReportsAsExternallySynchronized) {
GLsync glSync = {0};
auto syncEvent = GlSyncEvent::create(context, glSync, nullptr);
ASSERT_NE(nullptr, syncEvent);
EXPECT_TRUE(syncEvent->isExternallySynchronized());
syncEvent->release();
}
TEST_F(glSharingTests, givenSyncEventWhenUpdateExecutionStatusIsCalledThenGLGetSyncivCalled) {
GLsync glSync = {0};
auto syncEvent = GlSyncEvent::create(context, glSync, nullptr);
ASSERT_NE(nullptr, syncEvent);
mockGlSharing->setGetSyncivReturnValue(GL_UNSIGNALED);
syncEvent->updateExecutionStatus();
EXPECT_EQ(1, GLGetSyncivCalled);
EXPECT_TRUE(syncEvent->updateEventAndReturnCurrentStatus() == CL_SUBMITTED);
EXPECT_EQ(2, GLGetSyncivCalled); // updateExecutionStatus called in peekExecutionStatus
mockGlSharing->setGetSyncivReturnValue(GL_SIGNALED);
syncEvent->updateExecutionStatus();
EXPECT_EQ(3, GLGetSyncivCalled);
EXPECT_TRUE(syncEvent->peekExecutionStatus() == CL_COMPLETE);
delete syncEvent;
}
TEST_F(glSharingTests, givenContextWhenEmptySharingTableEmptyThenReturnsNullptr) {
MockContext context;
context.clearSharingFunctions();
GLSharingFunctions *sharingF = context.getSharing<GLSharingFunctions>();
EXPECT_EQ(sharingF, nullptr);
}
TEST_F(glSharingTests, givenUnknownBaseEventWhenGetGlArbSyncEventIsCalledThenNullptrIsReturned) {
auto *sharing = context.getSharing<GLSharingFunctions>();
ASSERT_NE(nullptr, sharing);
auto event = new MockEvent<UserEvent>();
MockContext context;
EXPECT_EQ(nullptr, sharing->getGlArbSyncEvent(*event));
event->release();
}
TEST_F(glSharingTests, givenKnownBaseEventWhenGetGlArbSyncEventIsCalledThenProperArbEventIsReturned) {
auto *sharing = static_cast<GlSharingFunctionsMock *>(context.getSharing<GLSharingFunctions>());
ASSERT_NE(nullptr, sharing);
auto baseEvent = new MockEvent<UserEvent>;
auto arbSyncEvent = reinterpret_cast<GlArbSyncEvent *>(0x1c);
sharing->glArbEventMapping[baseEvent] = arbSyncEvent;
EXPECT_EQ(arbSyncEvent, sharing->getGlArbSyncEvent(*baseEvent));
baseEvent->release();
}
TEST_F(glSharingTests, givenKnownBaseEventWhenRemoveGlArbSyncEventMappingIsCalledThenProperArbEventIsRemovedFromMap) {
auto *sharing = static_cast<GlSharingFunctionsMock *>(context.getSharing<GLSharingFunctions>());
ASSERT_NE(nullptr, sharing);
auto baseEvent = new MockEvent<UserEvent>;
auto arbSyncEvent = reinterpret_cast<GlArbSyncEvent *>(0x1c);
sharing->glArbEventMapping[baseEvent] = arbSyncEvent;
EXPECT_NE(sharing->glArbEventMapping.end(), sharing->glArbEventMapping.find(baseEvent));
sharing->removeGlArbSyncEventMapping(*baseEvent);
EXPECT_EQ(sharing->glArbEventMapping.end(), sharing->glArbEventMapping.find(baseEvent));
baseEvent->release();
}
TEST_F(glSharingTests, givenUnknownBaseEventWhenRemoveGlArbSyncEventMappingIsCalledThenProperArbEventIsRemovedFromMap) {
auto *sharing = static_cast<GlSharingFunctionsMock *>(context.getSharing<GLSharingFunctions>());
ASSERT_NE(nullptr, sharing);
auto baseEvent = new MockEvent<UserEvent>;
auto unknownBaseEvent = new MockEvent<UserEvent>;
auto arbSyncEvent = reinterpret_cast<GlArbSyncEvent *>(0x1c);
sharing->glArbEventMapping[baseEvent] = arbSyncEvent;
EXPECT_NE(sharing->glArbEventMapping.end(), sharing->glArbEventMapping.find(baseEvent));
EXPECT_EQ(sharing->glArbEventMapping.end(), sharing->glArbEventMapping.find(unknownBaseEvent));
sharing->removeGlArbSyncEventMapping(*unknownBaseEvent);
EXPECT_NE(sharing->glArbEventMapping.end(), sharing->glArbEventMapping.find(baseEvent));
EXPECT_EQ(sharing->glArbEventMapping.end(), sharing->glArbEventMapping.find(unknownBaseEvent));
unknownBaseEvent->release();
baseEvent->release();
}
TEST_F(glSharingTests, givenUnknownBaseEventWhenGetOrCreateGlArbSyncEventIsCalledThenNewArbEventIsReturned) {
auto *sharing = static_cast<GlSharingFunctionsMock *>(context.getSharing<GLSharingFunctions>());
sharing->pfnGlArbSyncObjectCleanup = glArbSyncObjectCleanupMockDoNothing;
ASSERT_NE(nullptr, sharing);
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, nullptr);
ASSERT_NE(nullptr, commandQueue);
auto baseEvent = new Event(castToObjectOrAbort<CommandQueue>(commandQueue), CL_COMMAND_RELEASE_GL_OBJECTS, -1, -1);
auto syncEv = sharing->getOrCreateGlArbSyncEvent<DummyArbEvent<false>>(*baseEvent);
ASSERT_NE(nullptr, syncEv);
EXPECT_NE(nullptr, syncEv->getSyncInfo());
std::unique_ptr<OSInterface> osInterface{new OSInterface};
static_cast<DummyArbEvent<false> *>(syncEv)->osInterface = osInterface.get();
syncEv->release();
clReleaseCommandQueue(commandQueue);
}
TEST_F(glSharingTests, givenKnownBaseEventWhenGetOrCreateGlArbSyncEventIsCalledThenOldArbEventIsReused) {
auto *sharing = static_cast<GlSharingFunctionsMock *>(context.getSharing<GLSharingFunctions>());
sharing->pfnGlArbSyncObjectCleanup = glArbSyncObjectCleanupMockDoNothing;
ASSERT_NE(nullptr, sharing);
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, nullptr);
ASSERT_NE(nullptr, commandQueue);
auto baseEvent = new Event(castToObjectOrAbort<CommandQueue>(commandQueue), CL_COMMAND_RELEASE_GL_OBJECTS, -1, -1);
auto syncEv = sharing->getOrCreateGlArbSyncEvent<DummyArbEvent<false>>(*baseEvent);
ASSERT_NE(nullptr, syncEv);
EXPECT_EQ(syncEv, sharing->getOrCreateGlArbSyncEvent<DummyArbEvent<false>>(*baseEvent));
std::unique_ptr<OSInterface> osInterface{new OSInterface};
static_cast<DummyArbEvent<false> *>(syncEv)->osInterface = osInterface.get();
syncEv->release();
clReleaseCommandQueue(commandQueue);
}
TEST_F(glSharingTests, WhenArbSyncEventCreationFailsThenGetOrCreateGlArbSyncEventReturnsNull) {
auto *sharing = static_cast<GlSharingFunctionsMock *>(context.getSharing<GLSharingFunctions>());
ASSERT_NE(nullptr, sharing);
auto commandQueue = clCreateCommandQueue(&context, context.getDevice(0), 0, nullptr);
ASSERT_NE(nullptr, commandQueue);
auto baseEvent = new Event(castToObjectOrAbort<CommandQueue>(commandQueue), CL_COMMAND_RELEASE_GL_OBJECTS, -1, -1);
auto syncEv = sharing->getOrCreateGlArbSyncEvent<DummyArbEvent<true>>(*baseEvent);
EXPECT_EQ(nullptr, syncEv);
baseEvent->release();
clReleaseCommandQueue(commandQueue);
}
TEST_F(glSharingTests, whenGetGlDeviceHandleIsCalledThenProperHandleIsReturned) {
auto *sharing = static_cast<GlSharingFunctionsMock *>(context.getSharing<GLSharingFunctions>());
ASSERT_NE(nullptr, sharing);
sharing->GLDeviceHandle = 0x2c;
EXPECT_EQ(0x2cU, sharing->getGLDeviceHandle());
}
TEST_F(glSharingTests, whenGetGlContextHandleIsCalledThenProperHandleIsReturned) {
auto *sharing = static_cast<GlSharingFunctionsMock *>(context.getSharing<GLSharingFunctions>());
ASSERT_NE(nullptr, sharing);
sharing->GLContextHandle = 0x2c;
EXPECT_EQ(0x2cU, sharing->getGLContextHandle());
}