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