1 /*
2  * Copyright (C) 2018-2020 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #ifndef OPENCL_SHARED_RESOURCE
9 #define OPENCL_SHARED_RESOURCE
10 
11 #include "GL/gl.h"
12 #include "GmmLib.h"
13 #include "third_party/opencl_headers/CL/cl_gl.h"
14 
15 // Used for creating CL resources from GL resources
16 typedef struct _tagCLGLResourceInfo {
17     GLuint name;
18     GLenum target;
19     unsigned int globalShareHandle;
20     GMM_RESOURCE_INFO *pGmmResInfo; /// Pointer to GMMResInfo from GL that will be copied in CL (GL)
21     GLenum glFormat;
22     GLint glInternalFormat;
23     GLuint glHWFormat;
24     GLboolean isAuxEnabled;
25     GLuint borderWidth;
26     GLint textureBufferWidth;
27     GLint textureBufferSize;
28     GLint textureBufferOffset;
29     GLboolean oglSynchronized;
30     GMM_STATUS status;
31     unsigned int globalShareHandleMCS;
32     GMM_RESOURCE_INFO *pGmmResInfoMCS;
33     GLint numberOfSamples; // Number of samples as specified by API
34     GLvoid *pReleaseData;
35 } CL_GL_RESOURCE_INFO, *PCL_GL_RESOURCE_INFO;
36 
37 // Used for creating GL resources from CL resources
38 typedef struct _tagGLCLResourceInfo {
39     unsigned int globalShareHandle;
40     unsigned int clChannelOrder;
41     unsigned int clChannelDataType;
42     size_t imageWidth;
43     size_t imageHeight;
44     size_t rowPitch;
45     size_t slicePitch;
46     unsigned int mipCount;
47     bool isCreatedFromBuffer;
48     unsigned int arraySize;
49     unsigned int depth;
50 } GL_CL_RESOURCE_INFO, *PGL_CL_RESOURCE_INFO;
51 
52 typedef struct _tagCLGLBufferInfo {
53     GLenum bufferName;
54     unsigned int globalShareHandle;
55     GMM_RESOURCE_INFO *pGmmResInfo; /// Pointer to GMMResInfo from GL that will be copied in CL (GL)
56     GLvoid *pSysMem;
57     GLint bufferSize;
58     GLint bufferOffset;
59     GLboolean oglSynchronized;
60     GMM_STATUS status;
61     GLvoid *pReleaseData;
62 } CL_GL_BUFFER_INFO, *PCL_GL_BUFFER_INFO;
63 
64 #ifdef _WIN32
65 // Used for creating GL sync objects from CL events
66 typedef struct _tagCLGLSyncInfo {
67 
_tagCLGLSyncInfo_tagCLGLSyncInfo68     _tagCLGLSyncInfo()
69         : eventName(NULL),
70           event((HANDLE)0),
71           submissionEventName(NULL),
72           submissionEvent((HANDLE)0),
73           clientSynchronizationObject((D3DKMT_HANDLE)0),
74           serverSynchronizationObject((D3DKMT_HANDLE)0),
75           submissionSynchronizationObject((D3DKMT_HANDLE)0),
76           hContextToBlock((D3DKMT_HANDLE)0),
77           waitCalled(false) {
78     }
79 
80     char *eventName;
81     HANDLE event;
82     char *submissionEventName;
83     HANDLE submissionEvent;
84     D3DKMT_HANDLE clientSynchronizationObject;
85     D3DKMT_HANDLE serverSynchronizationObject;
86     D3DKMT_HANDLE submissionSynchronizationObject;
87     D3DKMT_HANDLE hContextToBlock;
88     bool waitCalled;
89 } CL_GL_SYNC_INFO, *PCL_GL_SYNC_INFO;
90 
91 // Used for creating CL events from GL sync objects
92 typedef struct _tagGLCLSyncInfo {
93     __GLsync *syncName;
94     GLvoid *pSync;
95 } GL_CL_SYNC_INFO, *PGL_CL_SYNC_INFO;
96 #endif
97 
98 typedef int(__stdcall *pfn_clRetainEvent)(struct _cl_event *event);
99 typedef int(__stdcall *pfn_clReleaseEvent)(struct _cl_event *event);
100 typedef int(__stdcall *INTELpfn_clGetCLObjectInfoINTEL)(struct _cl_mem *pMemObj, void *pResourceInfo);
101 typedef int(__stdcall *INTELpfn_clEnqueueMarkerWithSyncObjectINTEL)(
102     struct _cl_command_queue *pCommandQueue,
103     struct _cl_event **pOclEvent,
104     struct _cl_context **pOclContext);
105 
106 typedef struct _tagCLGLDispatch {
107     pfn_clRetainEvent clRetainEvent;
108     pfn_clReleaseEvent clReleaseEvent;
109     INTELpfn_clGetCLObjectInfoINTEL clGetCLObjectInfoINTEL;
110     INTELpfn_clEnqueueMarkerWithSyncObjectINTEL clEnqueueMarkerWithSyncObjectINTEL;
111 } CL_GL_DISPATCH, *PCL_GL_DISPATCH;
112 
113 #ifdef _WIN32
114 typedef struct _tagCLGLContextInfo {
115     D3DKMT_HANDLE DeviceHandle;
116     D3DKMT_HANDLE ContextHandle;
117 } CL_GL_CONTEXT_INFO, *PCL_GL_CONTEXT_INFO;
118 
119 typedef struct _tagCLGLEvent {
120     struct
121     {
122         void *dispatch1;
123         void *dispatch2;
124     } dispatch;
125     void *pObj;
126     void *CLCmdQ;
127     struct _cl_context *CLCtx;
128     unsigned int IsUserEvent;
129     PCL_GL_SYNC_INFO pSyncInfo;
130 } CL_GL_EVENT, *PCL_GL_EVENT;
131 #endif //_WIN32
132 #endif
133