312 lines
12 KiB
C++
312 lines
12 KiB
C++
/*
|
|
* Copyright (C) 2018 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
#include "config.h"
|
|
#include <cstring>
|
|
#include "runtime/gmm_helper/gmm_helper.h"
|
|
#include "runtime/sharings/gl/gl_sharing.h"
|
|
#include "public/cl_gl_private_intel.h"
|
|
|
|
namespace OCLRT {
|
|
struct EGLBkpContextParams {
|
|
int32_t configAttrs;
|
|
int32_t contextAttrs[3];
|
|
int32_t numConfigs;
|
|
};
|
|
|
|
struct GLXBkpContextParams {
|
|
int FBConfigAttrs;
|
|
int queryAttribute;
|
|
int renderType;
|
|
};
|
|
|
|
struct GLMockReturnedValues {
|
|
GLContext currentContext;
|
|
GLDisplay currentDisplay;
|
|
GLContext madeCurrentContext;
|
|
bool forceMakeCurrentCallFail;
|
|
int numberOfCallFails;
|
|
int failsCounter;
|
|
int syncivRetVal;
|
|
};
|
|
|
|
extern int GLSetSharedOCLContextStateCalled;
|
|
extern int GLAcquireSharedBufferCalled;
|
|
extern int GLAcquireSharedRenderBufferCalled;
|
|
extern int GLAcquireSharedTextureCalled;
|
|
extern int GLReleaseSharedBufferCalled;
|
|
extern int GLReleaseSharedRenderBufferCalled;
|
|
extern int GLReleaseSharedTextureCalled;
|
|
extern int GLGetCurrentContextCalled;
|
|
extern int GLGetCurrentDisplayCalled;
|
|
extern int GLMakeCurrentCalled;
|
|
extern int GLDeleteContextCalled;
|
|
extern int WGLCreateContextCalled;
|
|
extern int WGLShareListsCalled;
|
|
extern int WGLDeleteContextCalled;
|
|
extern int EGLCreateContextCalled;
|
|
extern int EGLDeleteContextCalled;
|
|
extern int EGLChooseConfigCalled;
|
|
extern int GlxChooseFBConfigCalled;
|
|
extern int GlxQueryContextCalled;
|
|
extern int GlxCreateNewContextCalled;
|
|
extern int GlxDeleteContextCalled;
|
|
extern int GlxIsDirectCalled;
|
|
extern int GLRetainSyncCalled;
|
|
extern int GLReleaseSyncCalled;
|
|
extern int GLGetSyncivCalled;
|
|
extern CL_GL_BUFFER_INFO bufferInfoInput;
|
|
extern CL_GL_BUFFER_INFO bufferInfoOutput;
|
|
extern CL_GL_RESOURCE_INFO textureInfoInput;
|
|
extern CL_GL_RESOURCE_INFO textureInfoOutput;
|
|
extern EGLBkpContextParams eglBkpContextParams;
|
|
extern GLXBkpContextParams glxBkpContextParams;
|
|
extern GLMockReturnedValues glMockReturnedValues;
|
|
|
|
namespace glTextureTargets {
|
|
static const unsigned int supportedTargets[] = {
|
|
GL_TEXTURE_1D,
|
|
GL_TEXTURE_1D_ARRAY,
|
|
GL_TEXTURE_BUFFER,
|
|
GL_TEXTURE_2D,
|
|
GL_TEXTURE_2D_ARRAY,
|
|
GL_TEXTURE_RECTANGLE,
|
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
|
|
GL_TEXTURE_CUBE_MAP_POSITIVE_X,
|
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
|
|
GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
|
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
|
|
GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
|
|
GL_TEXTURE_3D,
|
|
GL_RENDERBUFFER_EXT,
|
|
GL_TEXTURE_2D_MULTISAMPLE,
|
|
GL_TEXTURE_2D_MULTISAMPLE_ARRAY,
|
|
};
|
|
}
|
|
|
|
class GlSharingFunctionsMock : public GLSharingFunctions {
|
|
|
|
static GLboolean OSAPI mockGLSetSharedOCLContextState(GLDisplay, GLContext, GLboolean, GLvoid *pBufferInfo) {
|
|
GLSetSharedOCLContextStateCalled++;
|
|
return (GLboolean)1;
|
|
};
|
|
static GLboolean OSAPI mockGLAcquireSharedBuffer(GLDisplay, GLContext, GLContext, GLvoid *pResourceInfo) {
|
|
auto pBufferInfo = (CL_GL_BUFFER_INFO *)pResourceInfo;
|
|
bufferInfoInput = *pBufferInfo;
|
|
pBufferInfo->bufferSize = bufferInfoOutput.bufferSize;
|
|
pBufferInfo->globalShareHandle = bufferInfoOutput.globalShareHandle;
|
|
pBufferInfo->pGmmResInfo = bufferInfoOutput.pGmmResInfo;
|
|
pBufferInfo->bufferOffset = bufferInfoOutput.bufferOffset;
|
|
GLAcquireSharedBufferCalled++;
|
|
return (GLboolean)1;
|
|
};
|
|
static GLboolean OSAPI mockGLAcquireSharedRenderBuffer(GLDisplay, GLContext, GLContext, GLvoid *pResourceInfo) {
|
|
auto pTextureInfo = (CL_GL_RESOURCE_INFO *)pResourceInfo;
|
|
textureInfoInput = *pTextureInfo;
|
|
pTextureInfo->globalShareHandle = textureInfoOutput.globalShareHandle;
|
|
pTextureInfo->pGmmResInfo = textureInfoOutput.pGmmResInfo;
|
|
pTextureInfo->glInternalFormat = GL_RGBA8;
|
|
GLAcquireSharedRenderBufferCalled++;
|
|
return (GLboolean)1;
|
|
};
|
|
static GLboolean OSAPI mockGLAcquireSharedTexture(GLDisplay, GLContext, GLContext, GLvoid *pResourceInfo) {
|
|
auto pTextureInfo = (CL_GL_RESOURCE_INFO *)pResourceInfo;
|
|
textureInfoInput = *pTextureInfo;
|
|
pTextureInfo->globalShareHandle = textureInfoOutput.globalShareHandle;
|
|
pTextureInfo->globalShareHandleMCS = textureInfoOutput.globalShareHandleMCS;
|
|
if (pTextureInfo->target == GL_TEXTURE_BUFFER) {
|
|
// size and width for texture buffer are queried from textureInfo - not from gmm
|
|
pTextureInfo->textureBufferSize = textureInfoOutput.textureBufferSize;
|
|
pTextureInfo->textureBufferWidth = textureInfoOutput.textureBufferWidth;
|
|
}
|
|
pTextureInfo->pGmmResInfo = textureInfoOutput.pGmmResInfo;
|
|
pTextureInfo->glInternalFormat = textureInfoOutput.glInternalFormat ? textureInfoOutput.glInternalFormat : GL_RGBA8;
|
|
pTextureInfo->glHWFormat = textureInfoOutput.glHWFormat;
|
|
pTextureInfo->textureBufferOffset = textureInfoOutput.textureBufferOffset;
|
|
pTextureInfo->numberOfSamples = textureInfoOutput.numberOfSamples;
|
|
GLAcquireSharedTextureCalled++;
|
|
return (GLboolean)1;
|
|
};
|
|
static GLboolean OSAPI mockGLReleaseSharedTexture(GLDisplay, GLContext, GLContext, GLvoid *pResourceInfo) {
|
|
textureInfoInput = *static_cast<CL_GL_RESOURCE_INFO *>(pResourceInfo);
|
|
GLReleaseSharedTextureCalled++;
|
|
return (GLboolean)1;
|
|
};
|
|
static GLboolean OSAPI mockGLReleaseSharedRenderBuffer(GLDisplay, GLContext, GLContext, GLvoid *pResourceInfo) {
|
|
textureInfoInput = *static_cast<CL_GL_RESOURCE_INFO *>(pResourceInfo);
|
|
GLReleaseSharedRenderBufferCalled++;
|
|
return (GLboolean)1;
|
|
};
|
|
static GLboolean OSAPI mockGLReleaseSharedBuffer(GLDisplay, GLContext, GLContext, GLvoid *pResourceInfo) {
|
|
bufferInfoInput = *static_cast<CL_GL_BUFFER_INFO *>(pResourceInfo);
|
|
GLReleaseSharedBufferCalled++;
|
|
return (GLboolean)1;
|
|
};
|
|
static GLContext OSAPI mockGLGetCurrentContext() {
|
|
GLGetCurrentContextCalled++;
|
|
return glMockReturnedValues.currentContext;
|
|
};
|
|
static GLDisplay OSAPI mockGLGetCurrentDisplay() {
|
|
GLGetCurrentDisplayCalled++;
|
|
return glMockReturnedValues.currentDisplay;
|
|
};
|
|
static BOOL OSAPI mockWGLMakeCurrent(HDC, HGLRC context) {
|
|
GLMakeCurrentCalled++;
|
|
glMockReturnedValues.madeCurrentContext = context;
|
|
if (glMockReturnedValues.forceMakeCurrentCallFail) {
|
|
if (glMockReturnedValues.failsCounter < glMockReturnedValues.numberOfCallFails) {
|
|
glMockReturnedValues.failsCounter++;
|
|
return GL_FALSE;
|
|
}
|
|
}
|
|
return (GLboolean)1;
|
|
};
|
|
|
|
static GLContext OSAPI mockWGlCreateContext(GLDisplay hdcHandle) {
|
|
WGLCreateContextCalled++;
|
|
return (GLContext)0x101;
|
|
}
|
|
static int OSAPI mockWGlShareLists(GLContext contextHandle, GLContext backupContextHandle) {
|
|
WGLShareListsCalled++;
|
|
return 1;
|
|
}
|
|
|
|
static BOOL OSAPI mockWGLDeleteContext(HGLRC context) {
|
|
WGLDeleteContextCalled++;
|
|
GLDeleteContextCalled++;
|
|
return (GLboolean)1;
|
|
}
|
|
|
|
static GLboolean OSAPI mockGlRetainSync(GLDisplay HDCHandle, GLContext ContextHandle, GLContext BackupContextHandle,
|
|
GLvoid *pSyncInfo) {
|
|
GLRetainSyncCalled++;
|
|
GL_CL_SYNC_INFO *syncInfo = (GL_CL_SYNC_INFO *)(pSyncInfo);
|
|
syncInfo->pSync = (void *)0x123;
|
|
return GL_TRUE;
|
|
}
|
|
static GLboolean OSAPI mockGlReleaseSync(GLDisplay HDCHandle, GLContext ContextHandle, GLContext BackupContextHandle,
|
|
GLvoid *pSync) {
|
|
GLReleaseSyncCalled++;
|
|
return GL_TRUE;
|
|
}
|
|
static void OSAPI mockGlGetSynciv(GLvoid *pSync, GLenum pname, GLint *value) {
|
|
GLGetSyncivCalled++;
|
|
*value = glMockReturnedValues.syncivRetVal;
|
|
}
|
|
void initMembers();
|
|
|
|
public:
|
|
~GlSharingFunctionsMock() override = default;
|
|
|
|
using GLSharingFunctions::glArbEventMapping;
|
|
using GLSharingFunctions::GLContextHandle;
|
|
using GLSharingFunctions::GLDeviceHandle;
|
|
|
|
using GLSharingFunctions::pfnGlArbSyncObjectCleanup;
|
|
using GLSharingFunctions::pfnGlArbSyncObjectSetup;
|
|
using GLSharingFunctions::pfnGlArbSyncObjectSignal;
|
|
using GLSharingFunctions::pfnGlArbSyncObjectWaitServer;
|
|
|
|
GlSharingFunctionsMock(GLType GLHDCType, GLContext GLHGLRCHandle, GLContext GLHGLRCHandleBkpCtx, GLDisplay GLHDCHandle)
|
|
: GLSharingFunctions(GLHDCType, GLHGLRCHandle, GLHGLRCHandleBkpCtx, GLHDCHandle) {
|
|
initMembers();
|
|
updateOpenGLContext();
|
|
createBackupContext();
|
|
}
|
|
GlSharingFunctionsMock();
|
|
|
|
void setHandles(GLType GLHDCType, GLContext GLHGLRCHandle, GLContext GLHGLRCHandleBkpCtx, GLDisplay GLHDCHandle) {
|
|
this->GLHDCType = GLHDCType;
|
|
this->GLHGLRCHandle = GLHGLRCHandle;
|
|
this->GLHGLRCHandleBkpCtx = GLHGLRCHandleBkpCtx;
|
|
this->GLHDCHandle = GLHDCHandle;
|
|
}
|
|
|
|
void setGLAcquireSharedBufferMock(PFNOGLAcquireSharedBufferINTEL mock) { GLAcquireSharedBuffer = mock; }
|
|
|
|
void setGLAcquireSharedTextureMock(PFNOGLAcquireSharedTextureINTEL mock) { GLAcquireSharedTexture = mock; }
|
|
};
|
|
|
|
class MockGlSharing {
|
|
public:
|
|
MockGlSharing() {}
|
|
MockGlSharing(GLType GLHDCType, GLContext GLHGLRCHandle, GLContext GLHGLRCHandleBkpCtx, GLDisplay GLHDCHandle);
|
|
void uploadDataToBufferInfo() { bufferInfoOutput = m_bufferInfoOutput; }
|
|
void uploadDataToBufferInfo(unsigned int sharedHandle, int bufferOffset) {
|
|
m_bufferInfoOutput.globalShareHandle = sharedHandle;
|
|
m_bufferInfoOutput.bufferOffset = bufferOffset;
|
|
bufferInfoOutput = m_bufferInfoOutput;
|
|
}
|
|
void uploadDataToTextureInfo() { textureInfoOutput = m_textureInfoOutput; }
|
|
void uploadDataToTextureInfo(unsigned int sharedHandle) {
|
|
m_textureInfoOutput.globalShareHandle = sharedHandle;
|
|
textureInfoOutput = m_textureInfoOutput;
|
|
}
|
|
void uploadTextureBufferOffsetToTextureInfo(int texBufOffset) {
|
|
m_textureInfoOutput.textureBufferOffset = texBufOffset;
|
|
textureInfoOutput = m_textureInfoOutput;
|
|
}
|
|
void overrideGetCurrentValues(GLContext ctx, GLDisplay display, bool forceMakeCurrentFail = false, int numberOfFails = 0) {
|
|
glMockReturnedValues.currentContext = ctx;
|
|
glMockReturnedValues.currentDisplay = display;
|
|
glMockReturnedValues.forceMakeCurrentCallFail = forceMakeCurrentFail;
|
|
glMockReturnedValues.numberOfCallFails = numberOfFails;
|
|
glMockReturnedValues.failsCounter = 0;
|
|
}
|
|
void setGetSyncivReturnValue(int val) { glMockReturnedValues.syncivRetVal = val; }
|
|
|
|
GlSharingFunctionsMock m_sharingFunctions;
|
|
|
|
CL_GL_RESOURCE_INFO m_clGlResourceInfo = {0};
|
|
GL_CL_RESOURCE_INFO m_glClResourceInfo = {0};
|
|
CL_GL_BUFFER_INFO m_bufferInfoOutput = {0};
|
|
CL_GL_RESOURCE_INFO m_textureInfoOutput = {0};
|
|
};
|
|
|
|
class MockGLSharingFunctions : public GLSharingFunctions {
|
|
public:
|
|
static const char *arrayStringi[2];
|
|
static const char *arrayString[2];
|
|
static GLboolean GLSetSharedOCLContextStateReturnedValue;
|
|
static bool SharingEnabled;
|
|
static const GLubyte *OSAPI glGetStringTest(GLenum name) {
|
|
if (name == GL_VENDOR)
|
|
return (const GLubyte *)arrayString[0];
|
|
if (name == GL_VERSION)
|
|
return (const GLubyte *)arrayString[1];
|
|
return nullptr;
|
|
};
|
|
static const GLubyte *OSAPI glGetStringiTest(GLenum name, GLuint index) { return (const GLubyte *)arrayStringi[index]; };
|
|
static void OSAPI glGetIntegervTest(GLenum pname, GLint *data) {
|
|
if (pname == GL_NUM_EXTENSIONS)
|
|
*data = 2;
|
|
};
|
|
static GLboolean OSAPI GLSetSharedOCLContextStateTest(GLDisplay HDCHandle, GLContext ContextHandle, GLboolean State,
|
|
GLvoid *pContextInfo) {
|
|
((ContextInfo *)pContextInfo)->ContextHandle = 1;
|
|
((ContextInfo *)pContextInfo)->DeviceHandle = 2;
|
|
return GLSetSharedOCLContextStateReturnedValue;
|
|
}
|
|
using GLSharingFunctions::glGetIntegerv;
|
|
using GLSharingFunctions::glGetString;
|
|
|
|
MockGLSharingFunctions() {
|
|
glGetString = (PFNglGetString)glGetStringTest;
|
|
glGetStringi = (PFNglGetStringi)glGetStringiTest;
|
|
glGetIntegerv = (PFNglGetIntegerv)glGetIntegervTest;
|
|
GLSetSharedOCLContextState = (PFNOGLSetSharedOCLContextStateINTEL)GLSetSharedOCLContextStateTest;
|
|
arrayStringi[0] = "GL_OES_framebuffer_object";
|
|
arrayStringi[1] = "GL_EXT_framebuffer_object";
|
|
arrayString[0] = "Intel";
|
|
arrayString[1] = "4.0";
|
|
GLSetSharedOCLContextStateReturnedValue = 1;
|
|
MockGLSharingFunctions::SharingEnabled = 1;
|
|
}
|
|
};
|
|
} // namespace OCLRT
|