xref: /aosp_15_r20/external/OpenCL-CTS/test_common/gl/helpers.h (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
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