1 /*
2  * Copyright (C) 2020-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 #include "opencl/extensions/public/cl_gl_private_intel.h"
10 #include "opencl/source/sharings/gl/windows/gl_sharing_windows.h"
11 #include "opencl/test/unit_test/sharings/gl/gl_dll_helper.h"
12 
13 #include "config.h"
14 
15 #include <cstring>
16 
17 namespace NEO {
18 struct EGLBkpContextParams {
19     int32_t configAttrs;
20     int32_t contextAttrs[3];
21     int32_t numConfigs;
22 };
23 
24 struct GLXBkpContextParams {
25     int FBConfigAttrs;
26     int queryAttribute;
27     int renderType;
28 };
29 
30 struct GLMockReturnedValues {
31     GLContext currentContext;
32     GLDisplay currentDisplay;
33     GLContext madeCurrentContext;
34     bool forceMakeCurrentCallFail;
35     int numberOfCallFails;
36     int failsCounter;
37     int syncivRetVal;
38 };
39 
40 extern int GLSetSharedOCLContextStateCalled;
41 extern int EGLCreateContextCalled;
42 extern int EGLDeleteContextCalled;
43 extern int EGLChooseConfigCalled;
44 extern int GlxChooseFBConfigCalled;
45 extern int GlxQueryContextCalled;
46 extern int GlxCreateNewContextCalled;
47 extern int GlxDeleteContextCalled;
48 extern int GlxIsDirectCalled;
49 extern EGLBkpContextParams eglBkpContextParams;
50 extern GLXBkpContextParams glxBkpContextParams;
51 
52 namespace glTextureTargets {
53 static const unsigned int supportedTargets[] = {
54     GL_TEXTURE_1D,
55     GL_TEXTURE_1D_ARRAY,
56     GL_TEXTURE_BUFFER,
57     GL_TEXTURE_2D,
58     GL_TEXTURE_2D_ARRAY,
59     GL_TEXTURE_RECTANGLE,
60     GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
61     GL_TEXTURE_CUBE_MAP_POSITIVE_X,
62     GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
63     GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
64     GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
65     GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
66     GL_TEXTURE_3D,
67     GL_RENDERBUFFER_EXT,
68     GL_TEXTURE_2D_MULTISAMPLE,
69     GL_TEXTURE_2D_MULTISAMPLE_ARRAY,
70 };
71 }
72 
73 class GlSharingFunctionsMock : public GLSharingFunctionsWindows {
74 
75     void initMembers();
76 
77   public:
mockGLSetSharedOCLContextState(GLDisplay,GLContext,GLboolean,GLvoid * pBufferInfo)78     static GLboolean OSAPI mockGLSetSharedOCLContextState(GLDisplay, GLContext, GLboolean, GLvoid *pBufferInfo) {
79         GLSetSharedOCLContextStateCalled++;
80         return (GLboolean)1;
81     };
82     ~GlSharingFunctionsMock() override = default;
83 
84     using GLSharingFunctionsWindows::GLAcquireSharedBuffer;
85     using GLSharingFunctionsWindows::GLAcquireSharedRenderBuffer;
86     using GLSharingFunctionsWindows::GLAcquireSharedTexture;
87     using GLSharingFunctionsWindows::GLGetCurrentContext;
88     using GLSharingFunctionsWindows::GLGetCurrentDisplay;
89     using GLSharingFunctionsWindows::glGetIntegerv;
90     using GLSharingFunctionsWindows::glGetString;
91     using GLSharingFunctionsWindows::glGetStringi;
92     using GLSharingFunctionsWindows::GLGetSynciv;
93     using GLSharingFunctionsWindows::GLReleaseSharedBuffer;
94     using GLSharingFunctionsWindows::GLReleaseSharedRenderBuffer;
95     using GLSharingFunctionsWindows::GLReleaseSharedTexture;
96     using GLSharingFunctionsWindows::GLReleaseSync;
97     using GLSharingFunctionsWindows::GLRetainSync;
98     using GLSharingFunctionsWindows::GLSetSharedOCLContextState;
99     using GLSharingFunctionsWindows::isOpenGlExtensionSupported;
100     using GLSharingFunctionsWindows::pfnWglCreateContext;
101     using GLSharingFunctionsWindows::pfnWglDeleteContext;
102     using GLSharingFunctionsWindows::pfnWglShareLists;
103     using GLSharingFunctionsWindows::setSharedOCLContextState;
104     using GLSharingFunctionsWindows::wglMakeCurrent;
105 
106     using GLSharingFunctionsWindows::glArbEventMapping;
107     using GLSharingFunctionsWindows::GLContextHandle;
108     using GLSharingFunctionsWindows::GLDeviceHandle;
109 
110     using GLSharingFunctionsWindows::getSupportedFormats;
111     using GLSharingFunctionsWindows::pfnGlArbSyncObjectCleanup;
112     using GLSharingFunctionsWindows::pfnGlArbSyncObjectSetup;
113     using GLSharingFunctionsWindows::pfnGlArbSyncObjectSignal;
114     using GLSharingFunctionsWindows::pfnGlArbSyncObjectWaitServer;
115 
GlSharingFunctionsMock(GLType GLHDCType,GLContext GLHGLRCHandle,GLContext GLHGLRCHandleBkpCtx,GLDisplay GLHDCHandle)116     GlSharingFunctionsMock(GLType GLHDCType, GLContext GLHGLRCHandle, GLContext GLHGLRCHandleBkpCtx, GLDisplay GLHDCHandle)
117         : GLSharingFunctionsWindows(GLHDCType, GLHGLRCHandle, GLHGLRCHandleBkpCtx, GLHDCHandle) {
118         initMembers();
119         updateOpenGLContext();
120         createBackupContext();
121     }
122     GlSharingFunctionsMock();
123 
setHandles(GLType GLHDCType,GLContext GLHGLRCHandle,GLContext GLHGLRCHandleBkpCtx,GLDisplay GLHDCHandle)124     void setHandles(GLType GLHDCType, GLContext GLHGLRCHandle, GLContext GLHGLRCHandleBkpCtx, GLDisplay GLHDCHandle) {
125         this->GLHDCType = GLHDCType;
126         this->GLHGLRCHandle = GLHGLRCHandle;
127         this->GLHGLRCHandleBkpCtx = GLHGLRCHandleBkpCtx;
128         this->GLHDCHandle = GLHDCHandle;
129     }
130 
setGLAcquireSharedBufferMock(PFNOGLAcquireSharedBufferINTEL mock)131     void setGLAcquireSharedBufferMock(PFNOGLAcquireSharedBufferINTEL mock) { GLAcquireSharedBuffer = mock; }
132 
setGLAcquireSharedTextureMock(PFNOGLAcquireSharedTextureINTEL mock)133     void setGLAcquireSharedTextureMock(PFNOGLAcquireSharedTextureINTEL mock) { GLAcquireSharedTexture = mock; }
134 };
135 
136 class MockGlSharing {
137   public:
MockGlSharing()138     MockGlSharing() {}
139     MockGlSharing(GLType GLHDCType, GLContext GLHGLRCHandle, GLContext GLHGLRCHandleBkpCtx, GLDisplay GLHDCHandle);
uploadDataToBufferInfo()140     void uploadDataToBufferInfo() {
141         dllParam->loadBuffer(m_bufferInfoOutput);
142     }
uploadDataToBufferInfo(unsigned int sharedHandle,int bufferOffset,GMM_RESOURCE_INFO * gmmResInfo)143     void uploadDataToBufferInfo(unsigned int sharedHandle, int bufferOffset, GMM_RESOURCE_INFO *gmmResInfo) {
144         m_bufferInfoOutput.globalShareHandle = sharedHandle;
145         m_bufferInfoOutput.bufferOffset = bufferOffset;
146         m_bufferInfoOutput.pGmmResInfo = gmmResInfo;
147         dllParam->loadBuffer(m_bufferInfoOutput);
148     }
uploadDataToTextureInfo()149     void uploadDataToTextureInfo() {
150         dllParam->loadTexture(m_textureInfoOutput);
151     }
uploadDataToTextureInfo(unsigned int sharedHandle)152     void uploadDataToTextureInfo(unsigned int sharedHandle) {
153         m_textureInfoOutput.globalShareHandle = sharedHandle;
154         dllParam->loadTexture(m_textureInfoOutput);
155     }
uploadTextureBufferOffsetToTextureInfo(int texBufOffset)156     void uploadTextureBufferOffsetToTextureInfo(int texBufOffset) {
157         m_textureInfoOutput.textureBufferOffset = texBufOffset;
158         dllParam->loadTexture(m_textureInfoOutput);
159     }
160     void overrideGetCurrentValues(GLContext ctx, GLDisplay display, bool forceMakeCurrentFail = false, int numberOfFails = 0) {
161         glMockReturnedValues.currentContext = ctx;
162         glMockReturnedValues.currentDisplay = display;
163         glMockReturnedValues.forceMakeCurrentCallFail = forceMakeCurrentFail;
164         glMockReturnedValues.numberOfCallFails = numberOfFails;
165         glMockReturnedValues.failsCounter = 0;
166         dllParam->setGlMockReturnedValues(glMockReturnedValues);
167     }
setGetSyncivReturnValue(int val)168     void setGetSyncivReturnValue(int val) {
169         glMockReturnedValues.syncivRetVal = val;
170         dllParam->setGlMockReturnedValues(glMockReturnedValues);
171     }
172 
173     std::unique_ptr<GlSharingFunctionsMock> sharingFunctions = std::make_unique<GlSharingFunctionsMock>();
174     std::unique_ptr<GlDllHelper> dllParam = std::make_unique<GlDllHelper>();
175     CL_GL_RESOURCE_INFO m_clGlResourceInfo = {0};
176     GL_CL_RESOURCE_INFO m_glClResourceInfo = {0};
177     CL_GL_BUFFER_INFO m_bufferInfoOutput = {0};
178     CL_GL_RESOURCE_INFO m_textureInfoOutput = {0};
179     GLMockReturnedValues glMockReturnedValues = {0};
180 };
181 
182 class MockGLSharingFunctions : public GLSharingFunctionsWindows {
183   public:
184     using GLSharingFunctionsWindows::isOpenGlExtensionSupported;
185     using GLSharingFunctionsWindows::setSharedOCLContextState;
186 
187     static bool SharingEnabled;
188 
glGetIntegervTest(GLenum pname,GLint * data)189     static void OSAPI glGetIntegervTest(GLenum pname, GLint *data) {
190         if (pname == GL_NUM_EXTENSIONS)
191             *data = 2;
192     };
193     using GLSharingFunctionsWindows::glGetIntegerv;
194     using GLSharingFunctionsWindows::glGetString;
195     std::unique_ptr<GlDllHelper> dllParam = std::make_unique<GlDllHelper>();
MockGLSharingFunctions()196     MockGLSharingFunctions() {
197         GLSharingFunctionsWindows::initGLFunctions();
198         MockGLSharingFunctions::SharingEnabled = 1;
199     }
200 };
201 } // namespace NEO
202