1*6467f958SSadaf Ebrahimi // 2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc. 3*6467f958SSadaf Ebrahimi // 4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License"); 5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License. 6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at 7*6467f958SSadaf Ebrahimi // 8*6467f958SSadaf Ebrahimi // http://www.apache.org/licenses/LICENSE-2.0 9*6467f958SSadaf Ebrahimi // 10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software 11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS, 12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and 14*6467f958SSadaf Ebrahimi // limitations under the License. 15*6467f958SSadaf Ebrahimi // 16*6467f958SSadaf Ebrahimi #ifndef _helpers_h 17*6467f958SSadaf Ebrahimi #define _helpers_h 18*6467f958SSadaf Ebrahimi 19*6467f958SSadaf Ebrahimi #include <stdio.h> 20*6467f958SSadaf Ebrahimi #include <stdlib.h> 21*6467f958SSadaf Ebrahimi #include <math.h> 22*6467f958SSadaf Ebrahimi #include <string.h> 23*6467f958SSadaf Ebrahimi 24*6467f958SSadaf Ebrahimi #if !defined(_WIN32) 25*6467f958SSadaf Ebrahimi #include <stdbool.h> 26*6467f958SSadaf Ebrahimi #endif 27*6467f958SSadaf Ebrahimi 28*6467f958SSadaf Ebrahimi #include <sys/types.h> 29*6467f958SSadaf Ebrahimi #include <sys/stat.h> 30*6467f958SSadaf Ebrahimi 31*6467f958SSadaf Ebrahimi #if !defined (__APPLE__) 32*6467f958SSadaf Ebrahimi #include <CL/cl.h> 33*6467f958SSadaf Ebrahimi #include <CL/cl_gl.h> 34*6467f958SSadaf Ebrahimi #include <CL/cl_half.h> 35*6467f958SSadaf Ebrahimi #endif 36*6467f958SSadaf Ebrahimi #include "gl_headers.h" 37*6467f958SSadaf Ebrahimi 38*6467f958SSadaf Ebrahimi #include "harness/errorHelpers.h" 39*6467f958SSadaf Ebrahimi #include "harness/kernelHelpers.h" 40*6467f958SSadaf Ebrahimi #include "harness/typeWrappers.h" 41*6467f958SSadaf Ebrahimi #include "harness/conversions.h" 42*6467f958SSadaf Ebrahimi #include "harness/mt19937.h" 43*6467f958SSadaf Ebrahimi 44*6467f958SSadaf Ebrahimi typedef cl_mem 45*6467f958SSadaf Ebrahimi (CL_API_CALL *clCreateFromGLBuffer_fn)(cl_context context, 46*6467f958SSadaf Ebrahimi cl_mem_flags flags, 47*6467f958SSadaf Ebrahimi GLuint bufobj, 48*6467f958SSadaf Ebrahimi int * errcode_ret); 49*6467f958SSadaf Ebrahimi 50*6467f958SSadaf Ebrahimi typedef cl_mem 51*6467f958SSadaf Ebrahimi (CL_API_CALL *clCreateFromGLTexture_fn)(cl_context context , 52*6467f958SSadaf Ebrahimi cl_mem_flags flags , 53*6467f958SSadaf Ebrahimi GLenum target , 54*6467f958SSadaf Ebrahimi GLint miplevel , 55*6467f958SSadaf Ebrahimi GLuint texture , 56*6467f958SSadaf Ebrahimi cl_int * errcode_ret) ; 57*6467f958SSadaf Ebrahimi 58*6467f958SSadaf Ebrahimi typedef cl_mem 59*6467f958SSadaf Ebrahimi (CL_API_CALL *clCreateFromGLRenderbuffer_fn)(cl_context context , 60*6467f958SSadaf Ebrahimi cl_mem_flags flags , 61*6467f958SSadaf Ebrahimi GLuint renderbuffer , 62*6467f958SSadaf Ebrahimi cl_int * errcode_ret) ; 63*6467f958SSadaf Ebrahimi 64*6467f958SSadaf Ebrahimi typedef cl_int 65*6467f958SSadaf Ebrahimi (CL_API_CALL *clGetGLObjectInfo_fn)(cl_mem memobj , 66*6467f958SSadaf Ebrahimi cl_gl_object_type * gl_object_type , 67*6467f958SSadaf Ebrahimi GLuint * gl_object_name) ; 68*6467f958SSadaf Ebrahimi 69*6467f958SSadaf Ebrahimi typedef cl_int 70*6467f958SSadaf Ebrahimi (CL_API_CALL *clGetGLTextureInfo_fn)(cl_mem memobj , 71*6467f958SSadaf Ebrahimi cl_gl_texture_info param_name , 72*6467f958SSadaf Ebrahimi size_t param_value_size , 73*6467f958SSadaf Ebrahimi void * param_value , 74*6467f958SSadaf Ebrahimi size_t * param_value_size_ret) ; 75*6467f958SSadaf Ebrahimi 76*6467f958SSadaf Ebrahimi typedef cl_int 77*6467f958SSadaf Ebrahimi (CL_API_CALL *clEnqueueAcquireGLObjects_fn)(cl_command_queue command_queue , 78*6467f958SSadaf Ebrahimi cl_uint num_objects , 79*6467f958SSadaf Ebrahimi const cl_mem * mem_objects , 80*6467f958SSadaf Ebrahimi cl_uint num_events_in_wait_list , 81*6467f958SSadaf Ebrahimi const cl_event * event_wait_list , 82*6467f958SSadaf Ebrahimi cl_event * event) ; 83*6467f958SSadaf Ebrahimi 84*6467f958SSadaf Ebrahimi typedef cl_int 85*6467f958SSadaf Ebrahimi (CL_API_CALL *clEnqueueReleaseGLObjects_fn)(cl_command_queue command_queue , 86*6467f958SSadaf Ebrahimi cl_uint num_objects , 87*6467f958SSadaf Ebrahimi const cl_mem * mem_objects , 88*6467f958SSadaf Ebrahimi cl_uint num_events_in_wait_list , 89*6467f958SSadaf Ebrahimi const cl_event * event_wait_list , 90*6467f958SSadaf Ebrahimi cl_event * event) ; 91*6467f958SSadaf Ebrahimi 92*6467f958SSadaf Ebrahimi 93*6467f958SSadaf Ebrahimi extern clCreateFromGLBuffer_fn clCreateFromGLBuffer_ptr; 94*6467f958SSadaf Ebrahimi extern clCreateFromGLTexture_fn clCreateFromGLTexture_ptr; 95*6467f958SSadaf Ebrahimi extern clCreateFromGLRenderbuffer_fn clCreateFromGLRenderbuffer_ptr; 96*6467f958SSadaf Ebrahimi extern clGetGLObjectInfo_fn clGetGLObjectInfo_ptr; 97*6467f958SSadaf Ebrahimi extern clGetGLTextureInfo_fn clGetGLTextureInfo_ptr; 98*6467f958SSadaf Ebrahimi extern clEnqueueAcquireGLObjects_fn clEnqueueAcquireGLObjects_ptr; 99*6467f958SSadaf Ebrahimi extern clEnqueueReleaseGLObjects_fn clEnqueueReleaseGLObjects_ptr; 100*6467f958SSadaf Ebrahimi 101*6467f958SSadaf Ebrahimi 102*6467f958SSadaf Ebrahimi class glBufferWrapper 103*6467f958SSadaf Ebrahimi { 104*6467f958SSadaf Ebrahimi public: glBufferWrapper()105*6467f958SSadaf Ebrahimi glBufferWrapper() { mBuffer = 0; } glBufferWrapper(GLuint b)106*6467f958SSadaf Ebrahimi glBufferWrapper( GLuint b ) { mBuffer = b; } ~glBufferWrapper()107*6467f958SSadaf Ebrahimi ~glBufferWrapper() { if( mBuffer != 0 ) glDeleteBuffers( 1, &mBuffer ); } 108*6467f958SSadaf Ebrahimi 109*6467f958SSadaf Ebrahimi glBufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; } GLuint()110*6467f958SSadaf Ebrahimi operator GLuint() { return mBuffer; } 111*6467f958SSadaf Ebrahimi operator GLuint *() { return &mBuffer; } 112*6467f958SSadaf Ebrahimi 113*6467f958SSadaf Ebrahimi GLuint * operator&() { return &mBuffer; } 114*6467f958SSadaf Ebrahimi 115*6467f958SSadaf Ebrahimi bool operator==( GLuint rhs ) { return mBuffer == rhs; } 116*6467f958SSadaf Ebrahimi 117*6467f958SSadaf Ebrahimi protected: 118*6467f958SSadaf Ebrahimi 119*6467f958SSadaf Ebrahimi GLuint mBuffer; 120*6467f958SSadaf Ebrahimi }; 121*6467f958SSadaf Ebrahimi 122*6467f958SSadaf Ebrahimi class glTextureWrapper 123*6467f958SSadaf Ebrahimi { 124*6467f958SSadaf Ebrahimi public: glTextureWrapper()125*6467f958SSadaf Ebrahimi glTextureWrapper() { mBuffer = 0; } glTextureWrapper(GLuint b)126*6467f958SSadaf Ebrahimi glTextureWrapper( GLuint b ) { mBuffer = b; } ~glTextureWrapper()127*6467f958SSadaf Ebrahimi ~glTextureWrapper() { if( mBuffer != 0 ) glDeleteTextures( 1, &mBuffer ); } 128*6467f958SSadaf Ebrahimi 129*6467f958SSadaf Ebrahimi glTextureWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; } GLuint()130*6467f958SSadaf Ebrahimi operator GLuint() { return mBuffer; } 131*6467f958SSadaf Ebrahimi operator GLuint *() { return &mBuffer; } 132*6467f958SSadaf Ebrahimi 133*6467f958SSadaf Ebrahimi GLuint * operator&() { return &mBuffer; } 134*6467f958SSadaf Ebrahimi 135*6467f958SSadaf Ebrahimi bool operator==( GLuint rhs ) { return mBuffer == rhs; } 136*6467f958SSadaf Ebrahimi 137*6467f958SSadaf Ebrahimi protected: 138*6467f958SSadaf Ebrahimi 139*6467f958SSadaf Ebrahimi GLuint mBuffer; 140*6467f958SSadaf Ebrahimi }; 141*6467f958SSadaf Ebrahimi 142*6467f958SSadaf Ebrahimi class glRenderbufferWrapper 143*6467f958SSadaf Ebrahimi { 144*6467f958SSadaf Ebrahimi public: glRenderbufferWrapper()145*6467f958SSadaf Ebrahimi glRenderbufferWrapper() { mBuffer = 0; } glRenderbufferWrapper(GLuint b)146*6467f958SSadaf Ebrahimi glRenderbufferWrapper( GLuint b ) { mBuffer = b; } ~glRenderbufferWrapper()147*6467f958SSadaf Ebrahimi ~glRenderbufferWrapper() { if( mBuffer != 0 ) glDeleteRenderbuffersEXT( 1, &mBuffer ); } 148*6467f958SSadaf Ebrahimi 149*6467f958SSadaf Ebrahimi glRenderbufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; } GLuint()150*6467f958SSadaf Ebrahimi operator GLuint() { return mBuffer; } 151*6467f958SSadaf Ebrahimi operator GLuint *() { return &mBuffer; } 152*6467f958SSadaf Ebrahimi 153*6467f958SSadaf Ebrahimi GLuint * operator&() { return &mBuffer; } 154*6467f958SSadaf Ebrahimi 155*6467f958SSadaf Ebrahimi bool operator==( GLuint rhs ) { return mBuffer == rhs; } 156*6467f958SSadaf Ebrahimi 157*6467f958SSadaf Ebrahimi protected: 158*6467f958SSadaf Ebrahimi 159*6467f958SSadaf Ebrahimi GLuint mBuffer; 160*6467f958SSadaf Ebrahimi }; 161*6467f958SSadaf Ebrahimi 162*6467f958SSadaf Ebrahimi class glFramebufferWrapper 163*6467f958SSadaf Ebrahimi { 164*6467f958SSadaf Ebrahimi public: glFramebufferWrapper()165*6467f958SSadaf Ebrahimi glFramebufferWrapper() { mBuffer = 0; } glFramebufferWrapper(GLuint b)166*6467f958SSadaf Ebrahimi glFramebufferWrapper( GLuint b ) { mBuffer = b; } ~glFramebufferWrapper()167*6467f958SSadaf Ebrahimi ~glFramebufferWrapper() { if( mBuffer != 0 ) glDeleteFramebuffersEXT( 1, &mBuffer ); } 168*6467f958SSadaf Ebrahimi 169*6467f958SSadaf Ebrahimi glFramebufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; } GLuint()170*6467f958SSadaf Ebrahimi operator GLuint() { return mBuffer; } 171*6467f958SSadaf Ebrahimi operator GLuint *() { return &mBuffer; } 172*6467f958SSadaf Ebrahimi 173*6467f958SSadaf Ebrahimi GLuint * operator&() { return &mBuffer; } 174*6467f958SSadaf Ebrahimi 175*6467f958SSadaf Ebrahimi bool operator==( GLuint rhs ) { return mBuffer == rhs; } 176*6467f958SSadaf Ebrahimi 177*6467f958SSadaf Ebrahimi protected: 178*6467f958SSadaf Ebrahimi 179*6467f958SSadaf Ebrahimi GLuint mBuffer; 180*6467f958SSadaf Ebrahimi }; 181*6467f958SSadaf Ebrahimi 182*6467f958SSadaf Ebrahimi 183*6467f958SSadaf Ebrahimi // Helper functions (defined in helpers.cpp) 184*6467f958SSadaf Ebrahimi extern void * CreateGLTexture2D( size_t width, size_t height, 185*6467f958SSadaf Ebrahimi GLenum target, GLenum glFormat, 186*6467f958SSadaf Ebrahimi GLenum internalFormat, GLenum glType, 187*6467f958SSadaf Ebrahimi ExplicitType type, GLuint *outTextureID, 188*6467f958SSadaf Ebrahimi int *outError, bool allocateMem, MTdata d ); 189*6467f958SSadaf Ebrahimi 190*6467f958SSadaf Ebrahimi 191*6467f958SSadaf Ebrahimi extern void * CreateGLTexture3D( size_t width, size_t height, size_t depth, 192*6467f958SSadaf Ebrahimi GLenum target, GLenum glFormat, 193*6467f958SSadaf Ebrahimi GLenum internalFormat, GLenum glType, 194*6467f958SSadaf Ebrahimi ExplicitType type, GLuint *outTextureID, 195*6467f958SSadaf Ebrahimi int *outError, MTdata d, bool allocateMem = true ); 196*6467f958SSadaf Ebrahimi 197*6467f958SSadaf Ebrahimi extern void * ReadGLTexture( GLenum glTarget, GLuint glTexture, 198*6467f958SSadaf Ebrahimi GLenum glFormat, GLenum glInternalFormat, 199*6467f958SSadaf Ebrahimi GLenum glType, ExplicitType typeToReadAs, 200*6467f958SSadaf Ebrahimi size_t outWidth, size_t outHeight ); 201*6467f958SSadaf Ebrahimi 202*6467f958SSadaf Ebrahimi void * CreateGLRenderbuffer( GLsizei width, GLsizei height, 203*6467f958SSadaf Ebrahimi GLenum attachment, 204*6467f958SSadaf Ebrahimi GLenum rbFormat, GLenum rbType, 205*6467f958SSadaf Ebrahimi GLenum texFormat, GLenum texType, 206*6467f958SSadaf Ebrahimi ExplicitType type, 207*6467f958SSadaf Ebrahimi GLuint *outFramebuffer, 208*6467f958SSadaf Ebrahimi GLuint *outRenderbuffer, 209*6467f958SSadaf Ebrahimi int *outError, MTdata d, bool allocateMem ); 210*6467f958SSadaf Ebrahimi 211*6467f958SSadaf Ebrahimi int CreateGLRenderbufferRaw( GLsizei width, GLsizei height, 212*6467f958SSadaf Ebrahimi GLenum attachment, 213*6467f958SSadaf Ebrahimi GLenum rbFormat, GLenum rbType, 214*6467f958SSadaf Ebrahimi GLuint *outFramebuffer, 215*6467f958SSadaf Ebrahimi GLuint *outRenderbuffer ); 216*6467f958SSadaf Ebrahimi 217*6467f958SSadaf Ebrahimi void * ReadGLRenderbuffer( GLuint glFramebuffer, GLuint glRenderbuffer, 218*6467f958SSadaf Ebrahimi GLenum attachment, 219*6467f958SSadaf Ebrahimi GLenum rbFormat, GLenum rbType, 220*6467f958SSadaf Ebrahimi GLenum texFormat, GLenum texType, 221*6467f958SSadaf Ebrahimi ExplicitType typeToReadAs, 222*6467f958SSadaf Ebrahimi size_t outWidth, size_t outHeight ); 223*6467f958SSadaf Ebrahimi 224*6467f958SSadaf Ebrahimi extern void DumpGLBuffer(GLenum type, size_t width, size_t height, void* buffer); 225*6467f958SSadaf Ebrahimi extern const char *GetGLTypeName( GLenum type ); 226*6467f958SSadaf Ebrahimi extern const char *GetGLAttachmentName( GLenum att ); 227*6467f958SSadaf Ebrahimi extern const char *GetGLTargetName( GLenum tgt ); 228*6467f958SSadaf Ebrahimi extern const char *GetGLBaseFormatName( GLenum baseformat ); 229*6467f958SSadaf Ebrahimi extern const char *GetGLFormatName( GLenum format ); 230*6467f958SSadaf Ebrahimi 231*6467f958SSadaf Ebrahimi extern void* CreateRandomData( ExplicitType type, size_t count, MTdata d ); 232*6467f958SSadaf Ebrahimi 233*6467f958SSadaf Ebrahimi extern GLenum GetGLFormat(GLenum internalFormat); 234*6467f958SSadaf Ebrahimi extern GLenum GetGLTypeForExplicitType(ExplicitType type); 235*6467f958SSadaf Ebrahimi extern size_t GetGLTypeSize(GLenum type); 236*6467f958SSadaf Ebrahimi extern ExplicitType GetExplicitTypeForGLType(GLenum type); 237*6467f958SSadaf Ebrahimi 238*6467f958SSadaf Ebrahimi extern GLenum get_base_gl_target( GLenum target ); 239*6467f958SSadaf Ebrahimi 240*6467f958SSadaf Ebrahimi extern int init_clgl_ext( cl_platform_id platform_id ); 241*6467f958SSadaf Ebrahimi 242*6467f958SSadaf Ebrahimi #endif // _helpers_h 243*6467f958SSadaf Ebrahimi 244*6467f958SSadaf Ebrahimi 245*6467f958SSadaf Ebrahimi 246