1 // 2 // Copyright (c) 2017 The Khronos Group Inc. 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 #ifndef _helpers_h 17 #define _helpers_h 18 19 #include "../harness/compat.h" 20 #include <stdio.h> 21 #include <stdlib.h> 22 #include <string.h> 23 24 #include <sys/types.h> 25 #include <sys/stat.h> 26 27 #if !defined (__APPLE__) 28 #include <CL/cl.h> 29 #include "gl_headers.h" 30 #include <CL/cl_gl.h> 31 #else 32 #include "gl_headers.h" 33 #endif 34 35 #include "harness/errorHelpers.h" 36 #include "harness/kernelHelpers.h" 37 #include "harness/typeWrappers.h" 38 #include "harness/conversions.h" 39 #include "harness/mt19937.h" 40 41 typedef cl_mem 42 (CL_API_CALL *clCreateFromGLBuffer_fn)(cl_context context, 43 cl_mem_flags flags, 44 GLuint bufobj, 45 int * errcode_ret); 46 47 typedef cl_mem 48 (CL_API_CALL *clCreateFromGLTexture_fn)(cl_context context , 49 cl_mem_flags flags , 50 GLenum target , 51 GLint miplevel , 52 GLuint texture , 53 cl_int * errcode_ret) ; 54 55 typedef cl_mem 56 (CL_API_CALL *clCreateFromGLTexture2D_fn)(cl_context context , 57 cl_mem_flags flags , 58 GLenum target , 59 GLint miplevel , 60 GLuint texture , 61 cl_int * errcode_ret) ; 62 63 typedef cl_mem 64 (CL_API_CALL *clCreateFromGLTexture3D_fn)(cl_context context , 65 cl_mem_flags flags , 66 GLenum target , 67 GLint miplevel , 68 GLuint texture , 69 cl_int * errcode_ret) ; 70 71 typedef cl_mem 72 (CL_API_CALL *clCreateFromGLRenderbuffer_fn)(cl_context context , 73 cl_mem_flags flags , 74 GLuint renderbuffer , 75 cl_int * errcode_ret) ; 76 77 typedef cl_int 78 (CL_API_CALL *clGetGLObjectInfo_fn)(cl_mem memobj , 79 cl_gl_object_type * gl_object_type , 80 GLuint * gl_object_name) ; 81 82 typedef cl_int 83 (CL_API_CALL *clGetGLTextureInfo_fn)(cl_mem memobj , 84 cl_gl_texture_info param_name , 85 size_t param_value_size , 86 void * param_value , 87 size_t * param_value_size_ret) ; 88 89 typedef cl_int 90 (CL_API_CALL *clEnqueueAcquireGLObjects_fn)(cl_command_queue command_queue , 91 cl_uint num_objects , 92 const cl_mem * mem_objects , 93 cl_uint num_events_in_wait_list , 94 const cl_event * event_wait_list , 95 cl_event * event) ; 96 97 typedef cl_int 98 (CL_API_CALL *clEnqueueReleaseGLObjects_fn)(cl_command_queue command_queue , 99 cl_uint num_objects , 100 const cl_mem * mem_objects , 101 cl_uint num_events_in_wait_list , 102 const cl_event * event_wait_list , 103 cl_event * event) ; 104 105 106 extern clCreateFromGLBuffer_fn clCreateFromGLBuffer_ptr; 107 extern clCreateFromGLTexture_fn clCreateFromGLTexture_ptr; 108 extern clCreateFromGLTexture2D_fn clCreateFromGLTexture2D_ptr; 109 extern clCreateFromGLTexture3D_fn clCreateFromGLTexture3D_ptr; 110 extern clCreateFromGLRenderbuffer_fn clCreateFromGLRenderbuffer_ptr; 111 extern clGetGLObjectInfo_fn clGetGLObjectInfo_ptr; 112 extern clGetGLTextureInfo_fn clGetGLTextureInfo_ptr; 113 extern clEnqueueAcquireGLObjects_fn clEnqueueAcquireGLObjects_ptr; 114 extern clEnqueueReleaseGLObjects_fn clEnqueueReleaseGLObjects_ptr; 115 116 117 class glBufferWrapper 118 { 119 public: glBufferWrapper()120 glBufferWrapper() { mBuffer = 0; } glBufferWrapper(GLuint b)121 glBufferWrapper( GLuint b ) { mBuffer = b; } ~glBufferWrapper()122 ~glBufferWrapper() { if( mBuffer != 0 ) glDeleteBuffers( 1, &mBuffer ); } 123 124 glBufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; } GLuint()125 operator GLuint() { return mBuffer; } 126 operator GLuint *() { return &mBuffer; } 127 128 GLuint * operator&() { return &mBuffer; } 129 130 bool operator==( GLuint rhs ) { return mBuffer == rhs; } 131 132 protected: 133 134 GLuint mBuffer; 135 }; 136 137 class glTextureWrapper 138 { 139 public: glTextureWrapper()140 glTextureWrapper() { mHandle = 0; } glTextureWrapper(GLuint b)141 glTextureWrapper( GLuint b ) { mHandle = b; } ~glTextureWrapper()142 ~glTextureWrapper() { 143 if( mHandle != 0 ) glDeleteTextures( 1, &mHandle ); 144 } 145 146 glTextureWrapper & operator=( const GLuint &rhs ) { mHandle = rhs; return *this; } GLuint()147 operator GLuint() { return mHandle; } 148 operator GLuint *() { return &mHandle; } 149 150 GLuint * operator&() { return &mHandle; } 151 152 bool operator==( GLuint rhs ) { return mHandle == rhs; } 153 154 protected: 155 156 // The texture handle. 157 GLuint mHandle; 158 }; 159 160 class glRenderbufferWrapper 161 { 162 public: glRenderbufferWrapper()163 glRenderbufferWrapper() { mBuffer = 0; } glRenderbufferWrapper(GLuint b)164 glRenderbufferWrapper( GLuint b ) { mBuffer = b; } ~glRenderbufferWrapper()165 ~glRenderbufferWrapper() { if( mBuffer != 0 ) glDeleteRenderbuffersEXT( 1, &mBuffer ); } 166 167 glRenderbufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; } GLuint()168 operator GLuint() { return mBuffer; } 169 operator GLuint *() { return &mBuffer; } 170 171 GLuint * operator&() { return &mBuffer; } 172 173 bool operator==( GLuint rhs ) { return mBuffer == rhs; } 174 175 protected: 176 177 GLuint mBuffer; 178 }; 179 180 class glFramebufferWrapper 181 { 182 public: glFramebufferWrapper()183 glFramebufferWrapper() { mBuffer = 0; } glFramebufferWrapper(GLuint b)184 glFramebufferWrapper( GLuint b ) { mBuffer = b; } ~glFramebufferWrapper()185 ~glFramebufferWrapper() { if( mBuffer != 0 ) glDeleteFramebuffersEXT( 1, &mBuffer ); } 186 187 glFramebufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; } GLuint()188 operator GLuint() { return mBuffer; } 189 operator GLuint *() { return &mBuffer; } 190 191 GLuint * operator&() { return &mBuffer; } 192 193 bool operator==( GLuint rhs ) { return mBuffer == rhs; } 194 195 protected: 196 197 GLuint mBuffer; 198 }; 199 200 class glVertexArraysWrapper 201 { 202 public: glVertexArraysWrapper()203 glVertexArraysWrapper() { mBuffer = 0; } glVertexArraysWrapper(GLuint b)204 glVertexArraysWrapper( GLuint b ) { mBuffer = b; } ~glVertexArraysWrapper()205 ~glVertexArraysWrapper() { if( mBuffer != 0 ) glDeleteVertexArrays( 1, &mBuffer ); } 206 207 glVertexArraysWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; } GLuint()208 operator GLuint() { return mBuffer; } 209 operator GLuint *() { return &mBuffer; } 210 211 GLuint * operator&() { return &mBuffer; } 212 213 bool operator==( GLuint rhs ) { return mBuffer == rhs; } 214 215 protected: 216 217 GLuint mBuffer; 218 }; 219 220 class glProgramWrapper 221 { 222 public: glProgramWrapper()223 glProgramWrapper() { mProgram = 0; } glProgramWrapper(GLuint b)224 glProgramWrapper( GLuint b ) { mProgram = b; } ~glProgramWrapper()225 ~glProgramWrapper() { if( mProgram != 0 ) glDeleteProgram( mProgram ); } 226 227 glProgramWrapper & operator=( const GLuint &rhs ) { mProgram = rhs; return *this; } GLuint()228 operator GLuint() { return mProgram; } 229 operator GLuint *() { return &mProgram; } 230 231 GLuint * operator&() { return &mProgram; } 232 233 bool operator==( GLuint rhs ) { return mProgram == rhs; } 234 235 protected: 236 237 GLuint mProgram; 238 }; 239 240 class glShaderWrapper 241 { 242 public: glShaderWrapper()243 glShaderWrapper() { mShader = 0; } glShaderWrapper(GLuint b)244 glShaderWrapper( GLuint b ) { mShader = b; } ~glShaderWrapper()245 ~glShaderWrapper() { if( mShader != 0 ) glDeleteShader( mShader ); } 246 247 glShaderWrapper & operator=( const GLuint &rhs ) { mShader = rhs; return *this; } GLuint()248 operator GLuint() { return mShader; } 249 operator GLuint *() { return &mShader; } 250 251 GLuint * operator&() { return &mShader; } 252 253 bool operator==( GLuint rhs ) { return mShader == rhs; } 254 255 protected: 256 257 GLuint mShader; 258 }; 259 260 // Helper functions (defined in helpers.cpp) 261 262 extern void * CreateGLTexture1DArray( size_t width, size_t length, 263 GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType, 264 ExplicitType type, GLuint *outTextureID, int *outError, 265 bool allocateMem, MTdata d); 266 267 extern void * CreateGLTexture2DArray( size_t width, size_t height, size_t length, 268 GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType, 269 ExplicitType type, GLuint *outTextureID, int *outError, 270 bool allocateMem, MTdata d); 271 272 extern void * CreateGLTextureBuffer( size_t width, 273 GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType, 274 ExplicitType type, GLuint *outTex, GLuint *outBuf, int *outError, 275 bool allocateMem, MTdata d); 276 277 extern void * CreateGLTexture1D(size_t width, 278 GLenum target, GLenum glFormat, 279 GLenum internalFormat, GLenum glType, 280 ExplicitType type, GLuint *outTextureID, 281 int *outError, bool allocateMem, MTdata d ); 282 283 extern void * CreateGLTexture2D( size_t width, size_t height, 284 GLenum target, GLenum glFormat, 285 GLenum internalFormat, GLenum glType, 286 ExplicitType type, GLuint *outTextureID, 287 int *outError, bool allocateMem, MTdata d ); 288 289 290 extern void * CreateGLTexture3D( size_t width, size_t height, size_t depth, 291 GLenum target, GLenum glFormat, 292 GLenum internalFormat, GLenum glType, 293 ExplicitType type, GLuint *outTextureID, 294 int *outError, MTdata d, bool allocateMem = true ); 295 296 #ifdef GL_VERSION_3_2 297 extern void * CreateGLTexture2DMultisample( size_t width, size_t height, size_t samples, 298 GLenum target, GLenum glFormat, 299 GLenum internalFormat, GLenum glType, 300 ExplicitType type, GLuint *outTextureID, 301 int *outError, bool allocateMem, MTdata d, 302 bool fixedSampleLocations ); 303 304 extern void * CreateGLTexture2DArrayMultisample( size_t width, size_t height, 305 size_t length, size_t samples, 306 GLenum target, GLenum glFormat, 307 GLenum internalFormat, GLenum glType, 308 ExplicitType type, GLuint *outTextureID, 309 int *outError, bool allocateMem, MTdata d, 310 bool fixedSampleLocations ); 311 #endif 312 313 extern void * ReadGLTexture( GLenum glTarget, GLuint glTexture, GLuint glBuf, GLint width, 314 GLenum glFormat, GLenum glInternalFormat, 315 GLenum glType, ExplicitType typeToReadAs, 316 size_t outWidth, size_t outHeight ); 317 318 extern int CreateGLRenderbufferRaw( GLsizei width, GLsizei height, 319 GLenum target, GLenum glFormat, 320 GLenum internalFormat, GLenum glType, 321 GLuint *outFramebuffer, 322 GLuint *outRenderbuffer ); 323 324 extern void * CreateGLRenderbuffer( GLsizei width, GLsizei height, 325 GLenum target, GLenum glFormat, 326 GLenum internalFormat, GLenum glType, 327 ExplicitType type, 328 GLuint *outFramebuffer, 329 GLuint *outRenderbuffer, 330 int *outError, MTdata d, bool allocateMem ); 331 332 extern void * ReadGLRenderbuffer( GLuint glFramebuffer, GLuint glRenderbuffer, 333 GLenum attachment, GLenum glFormat, 334 GLenum glInternalFormat, GLenum glType, 335 ExplicitType typeToReadAs, 336 size_t outWidth, size_t outHeight ); 337 338 extern void DumpGLBuffer(GLenum type, size_t width, size_t height, void* buffer); 339 extern const char *GetGLTypeName( GLenum type ); 340 extern const char *GetGLAttachmentName( GLenum att ); 341 extern const char *GetGLTargetName( GLenum tgt ); 342 extern const char *GetGLBaseFormatName( GLenum baseformat ); 343 extern const char *GetGLFormatName( GLenum format ); 344 345 extern void* CreateRandomData( ExplicitType type, size_t count, MTdata d ); 346 347 extern GLenum GetGLFormat(GLenum internalFormat); 348 extern GLenum GetGLTypeForExplicitType(ExplicitType type); 349 extern size_t GetGLTypeSize(GLenum type); 350 extern ExplicitType GetExplicitTypeForGLType(GLenum type); 351 352 extern GLenum get_base_gl_target( GLenum target ); 353 354 extern int init_clgl_ext( void ); 355 356 extern GLint get_gl_max_samples( GLenum target, GLenum internalformat ); 357 358 #endif // _helpers_h 359 360 361 362