xref: /aosp_15_r20/external/OpenCL-CTS/test_common/gles/helpers.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
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 #include "helpers.h"
17*6467f958SSadaf Ebrahimi 
18*6467f958SSadaf Ebrahimi #include "gl_headers.h"
19*6467f958SSadaf Ebrahimi #include "CL/cl_half.h"
20*6467f958SSadaf Ebrahimi 
21*6467f958SSadaf Ebrahimi #define CHECK_ERROR()\
22*6467f958SSadaf Ebrahimi     {GLint __error = glGetError(); if(__error) {log_error( "GL ERROR: %s!\n", gluErrorString( err ));}}
23*6467f958SSadaf Ebrahimi 
24*6467f958SSadaf Ebrahimi #if defined(__linux__) || defined(GL_ES_VERSION_2_0)
25*6467f958SSadaf Ebrahimi // On linux we don't link to GLU library to avoid compatibility issues with
26*6467f958SSadaf Ebrahimi // libstdc++
27*6467f958SSadaf Ebrahimi // FIXME: Implement this
gluErrorString(GLenum error)28*6467f958SSadaf Ebrahimi const GLubyte* gluErrorString (GLenum error)
29*6467f958SSadaf Ebrahimi {
30*6467f958SSadaf Ebrahimi     const char* gl_Error = "OpenGL Error";
31*6467f958SSadaf Ebrahimi     return (const GLubyte*)gl_Error;
32*6467f958SSadaf Ebrahimi }
33*6467f958SSadaf Ebrahimi #endif
34*6467f958SSadaf Ebrahimi 
35*6467f958SSadaf Ebrahimi static void DrawQuad(void);
36*6467f958SSadaf Ebrahimi 
CreateGLTexture2D(size_t width,size_t height,GLenum target,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outTextureID,int * outError,bool allocateMem,MTdata d)37*6467f958SSadaf Ebrahimi void * CreateGLTexture2D( size_t width, size_t height,
38*6467f958SSadaf Ebrahimi                         GLenum target, GLenum glFormat,
39*6467f958SSadaf Ebrahimi                         GLenum internalFormat, GLenum glType,
40*6467f958SSadaf Ebrahimi                         ExplicitType type, GLuint *outTextureID,
41*6467f958SSadaf Ebrahimi                         int *outError, bool allocateMem, MTdata d )
42*6467f958SSadaf Ebrahimi {
43*6467f958SSadaf Ebrahimi     *outError = 0;
44*6467f958SSadaf Ebrahimi     GLenum err = 0;
45*6467f958SSadaf Ebrahimi 
46*6467f958SSadaf Ebrahimi     char * buffer = (char *)CreateRandomData(type, width * height * 4, d);
47*6467f958SSadaf Ebrahimi 
48*6467f958SSadaf Ebrahimi     glGenTextures( 1, outTextureID );
49*6467f958SSadaf Ebrahimi     glBindTexture( get_base_gl_target( target ), *outTextureID );
50*6467f958SSadaf Ebrahimi     err = glGetError();
51*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
52*6467f958SSadaf Ebrahimi     {
53*6467f958SSadaf Ebrahimi         log_error( "ERROR: Failed to create GL texture object: %s!\n", gluErrorString( err ));
54*6467f958SSadaf Ebrahimi         *outError = -1;
55*6467f958SSadaf Ebrahimi         free( buffer );
56*6467f958SSadaf Ebrahimi         return NULL;
57*6467f958SSadaf Ebrahimi     }
58*6467f958SSadaf Ebrahimi 
59*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
60*6467f958SSadaf Ebrahimi     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
61*6467f958SSadaf Ebrahimi #endif
62*6467f958SSadaf Ebrahimi     glTexParameteri( get_base_gl_target( target ), GL_TEXTURE_MIN_FILTER, GL_NEAREST );
63*6467f958SSadaf Ebrahimi     glTexParameteri( get_base_gl_target( target ), GL_TEXTURE_MAG_FILTER, GL_NEAREST );
64*6467f958SSadaf Ebrahimi 
65*6467f958SSadaf Ebrahimi     if( get_base_gl_target( target ) == GL_TEXTURE_CUBE_MAP )
66*6467f958SSadaf Ebrahimi     {
67*6467f958SSadaf Ebrahimi         char * temp = (char *)malloc(width * height * 4 * get_explicit_type_size( type ) * sizeof(cl_char));
68*6467f958SSadaf Ebrahimi         if(allocateMem)
69*6467f958SSadaf Ebrahimi             memcpy( temp, buffer, width * height * 4 * get_explicit_type_size( type ) );
70*6467f958SSadaf Ebrahimi         else
71*6467f958SSadaf Ebrahimi             memset( temp, 0, width * height * 4 * get_explicit_type_size( type ) );
72*6467f958SSadaf Ebrahimi 
73*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
74*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
75*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
76*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
77*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
78*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
79*6467f958SSadaf Ebrahimi         free(temp);
80*6467f958SSadaf Ebrahimi     }
81*6467f958SSadaf Ebrahimi     else
82*6467f958SSadaf Ebrahimi     {
83*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
84*6467f958SSadaf Ebrahimi         log_info("- glTexImage2D : %s : %s : %d : %d : %s : %s\n",
85*6467f958SSadaf Ebrahimi             GetGLTargetName(target),
86*6467f958SSadaf Ebrahimi             GetGLFormatName(internalFormat),
87*6467f958SSadaf Ebrahimi             width, height,
88*6467f958SSadaf Ebrahimi             GetGLFormatName(glFormat),
89*6467f958SSadaf Ebrahimi             GetGLTypeName(glType));
90*6467f958SSadaf Ebrahimi 
91*6467f958SSadaf Ebrahimi         DumpGLBuffer(glType, width, height, buffer);
92*6467f958SSadaf Ebrahimi 
93*6467f958SSadaf Ebrahimi #endif
94*6467f958SSadaf Ebrahimi         glTexImage2D( get_base_gl_target(target), 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, buffer );
95*6467f958SSadaf Ebrahimi     }
96*6467f958SSadaf Ebrahimi 
97*6467f958SSadaf Ebrahimi     err = glGetError();
98*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
99*6467f958SSadaf Ebrahimi     {
100*6467f958SSadaf Ebrahimi         /**  In section 9.8.3.1. of the CL 1.1. spec it says that:
101*6467f958SSadaf Ebrahimi           *
102*6467f958SSadaf Ebrahimi           *     If a GL texture object with an internal format from table 9.4 is successfully created by
103*6467f958SSadaf Ebrahimi           *     OpenGL, then there is guaranteed to be a mapping to one of the corresponding CL image
104*6467f958SSadaf Ebrahimi           *     format(s) in that table.
105*6467f958SSadaf Ebrahimi           *
106*6467f958SSadaf Ebrahimi           *  Notice that some of the formats in table 9.4 are not supported in OpenGL ES 2.0.
107*6467f958SSadaf Ebrahimi           */
108*6467f958SSadaf Ebrahimi         log_info( "Warning: Skipping %s : %s : %d : %d : %s : %s : because glTexImage2D returned %s\n",
109*6467f958SSadaf Ebrahimi             GetGLTargetName(target),
110*6467f958SSadaf Ebrahimi             GetGLFormatName(internalFormat),
111*6467f958SSadaf Ebrahimi             (int)(width), (int)(height),
112*6467f958SSadaf Ebrahimi             GetGLFormatName(glFormat),
113*6467f958SSadaf Ebrahimi             GetGLTypeName(glType),
114*6467f958SSadaf Ebrahimi             gluErrorString( err ));
115*6467f958SSadaf Ebrahimi 
116*6467f958SSadaf Ebrahimi         glDeleteTextures( 1, outTextureID );
117*6467f958SSadaf Ebrahimi         *outTextureID = 0;
118*6467f958SSadaf Ebrahimi         *outError = 0;
119*6467f958SSadaf Ebrahimi         free( buffer );
120*6467f958SSadaf Ebrahimi         err = glGetError();
121*6467f958SSadaf Ebrahimi         return NULL;
122*6467f958SSadaf Ebrahimi     }
123*6467f958SSadaf Ebrahimi 
124*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
125*6467f958SSadaf Ebrahimi     memset(buffer, 0, width * height * 4 * get_explicit_type_size( type ));
126*6467f958SSadaf Ebrahimi 
127*6467f958SSadaf Ebrahimi     log_info("- glGetTexImage : %s : %s : %s\n",
128*6467f958SSadaf Ebrahimi         GetGLTargetName(target),
129*6467f958SSadaf Ebrahimi         GetGLFormatName(glFormat),
130*6467f958SSadaf Ebrahimi         GetGLTypeName(glType));
131*6467f958SSadaf Ebrahimi 
132*6467f958SSadaf Ebrahimi     glGetTexImage(target, 0, glFormat, glType, buffer);
133*6467f958SSadaf Ebrahimi 
134*6467f958SSadaf Ebrahimi     DumpGLBuffer(type, width, height, buffer);
135*6467f958SSadaf Ebrahimi 
136*6467f958SSadaf Ebrahimi     err = glGetError();
137*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
138*6467f958SSadaf Ebrahimi     {
139*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to read data from glGetTexImage : %s : %s : %s : Error %s\n",
140*6467f958SSadaf Ebrahimi         GetGLTargetName(target),
141*6467f958SSadaf Ebrahimi         GetGLFormatName(glFormat),
142*6467f958SSadaf Ebrahimi         GetGLTypeName(glType),
143*6467f958SSadaf Ebrahimi         gluErrorString( err ));
144*6467f958SSadaf Ebrahimi         return NULL;
145*6467f958SSadaf Ebrahimi     }
146*6467f958SSadaf Ebrahimi #endif
147*6467f958SSadaf Ebrahimi 
148*6467f958SSadaf Ebrahimi     if( !allocateMem )
149*6467f958SSadaf Ebrahimi     {
150*6467f958SSadaf Ebrahimi         free( buffer );
151*6467f958SSadaf Ebrahimi         return NULL;
152*6467f958SSadaf Ebrahimi     }
153*6467f958SSadaf Ebrahimi 
154*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
155*6467f958SSadaf Ebrahimi     if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
156*6467f958SSadaf Ebrahimi     {
157*6467f958SSadaf Ebrahimi         // Reverse and reorder to validate since in the
158*6467f958SSadaf Ebrahimi         // kernel the read_imagef() call always returns RGBA
159*6467f958SSadaf Ebrahimi         cl_uchar *p = (cl_uchar *)buffer;
160*6467f958SSadaf Ebrahimi         for( size_t i = 0; i < width * height; i++ )
161*6467f958SSadaf Ebrahimi         {
162*6467f958SSadaf Ebrahimi             cl_uchar uc0 = p[i * 4 + 0];
163*6467f958SSadaf Ebrahimi             cl_uchar uc1 = p[i * 4 + 1];
164*6467f958SSadaf Ebrahimi             cl_uchar uc2 = p[i * 4 + 2];
165*6467f958SSadaf Ebrahimi             cl_uchar uc3 = p[i * 4 + 3];
166*6467f958SSadaf Ebrahimi 
167*6467f958SSadaf Ebrahimi             p[ i * 4 + 0 ] = uc2;
168*6467f958SSadaf Ebrahimi             p[ i * 4 + 1 ] = uc1;
169*6467f958SSadaf Ebrahimi             p[ i * 4 + 2 ] = uc0;
170*6467f958SSadaf Ebrahimi             p[ i * 4 + 3 ] = uc3;
171*6467f958SSadaf Ebrahimi         }
172*6467f958SSadaf Ebrahimi     }
173*6467f958SSadaf Ebrahimi #endif
174*6467f958SSadaf Ebrahimi 
175*6467f958SSadaf Ebrahimi     return buffer;
176*6467f958SSadaf Ebrahimi }
177*6467f958SSadaf Ebrahimi 
CreateGLTexture3D(size_t width,size_t height,size_t depth,GLenum target,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outTextureID,int * outError,MTdata d,bool allocateMem)178*6467f958SSadaf Ebrahimi void * CreateGLTexture3D( size_t width, size_t height, size_t depth,
179*6467f958SSadaf Ebrahimi                           GLenum target, GLenum glFormat,
180*6467f958SSadaf Ebrahimi                           GLenum internalFormat, GLenum glType,
181*6467f958SSadaf Ebrahimi                           ExplicitType type, GLuint *outTextureID,
182*6467f958SSadaf Ebrahimi                           int *outError, MTdata d, bool allocateMem)
183*6467f958SSadaf Ebrahimi {
184*6467f958SSadaf Ebrahimi     *outError = 0;
185*6467f958SSadaf Ebrahimi 
186*6467f958SSadaf Ebrahimi     char * buffer = (char *)create_random_data( type, d, width * height * depth * 4 );
187*6467f958SSadaf Ebrahimi 
188*6467f958SSadaf Ebrahimi     if( type == kFloat && allocateMem )
189*6467f958SSadaf Ebrahimi     {
190*6467f958SSadaf Ebrahimi         // Re-fill the created buffer to just have [0-1] floats, since that's what it'd expect
191*6467f958SSadaf Ebrahimi         cl_float *p = (cl_float *)buffer;
192*6467f958SSadaf Ebrahimi         for( size_t i = 0; i < width * height * depth * 4; i++ )
193*6467f958SSadaf Ebrahimi         {
194*6467f958SSadaf Ebrahimi             p[ i ] = (float) genrand_real1( d );
195*6467f958SSadaf Ebrahimi         }
196*6467f958SSadaf Ebrahimi     }
197*6467f958SSadaf Ebrahimi     else if( !allocateMem )
198*6467f958SSadaf Ebrahimi         memset( buffer, 0, width * height * depth * 4 * get_explicit_type_size( type ) );
199*6467f958SSadaf Ebrahimi 
200*6467f958SSadaf Ebrahimi     glGenTextures( 1, outTextureID );
201*6467f958SSadaf Ebrahimi 
202*6467f958SSadaf Ebrahimi     glBindTexture( target, *outTextureID );
203*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
204*6467f958SSadaf Ebrahimi     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
205*6467f958SSadaf Ebrahimi #endif
206*6467f958SSadaf Ebrahimi     glTexParameteri( target, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
207*6467f958SSadaf Ebrahimi     glTexParameteri( target, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
208*6467f958SSadaf Ebrahimi 
209*6467f958SSadaf Ebrahimi     glGetError();
210*6467f958SSadaf Ebrahimi     glTexImage3D( target, 0, internalFormat, (GLsizei)width, (GLsizei)height, (GLsizei)depth, 0, glFormat, glType, buffer );
211*6467f958SSadaf Ebrahimi     GLenum err = glGetError();
212*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
213*6467f958SSadaf Ebrahimi     {
214*6467f958SSadaf Ebrahimi         /**  In section 9.8.3.1. of the CL 1.1. spec it says that:
215*6467f958SSadaf Ebrahimi           *
216*6467f958SSadaf Ebrahimi           *     If a GL texture object with an internal format from table 9.4 is successfully created by
217*6467f958SSadaf Ebrahimi           *     OpenGL, then there is guaranteed to be a mapping to one of the corresponding CL image
218*6467f958SSadaf Ebrahimi           *     format(s) in that table.
219*6467f958SSadaf Ebrahimi           *
220*6467f958SSadaf Ebrahimi           *  Notice that some of the formats in table 9.4 are not supported in OpenGL ES 2.0.
221*6467f958SSadaf Ebrahimi           */
222*6467f958SSadaf Ebrahimi         log_info( "Warning: Skipping %s : %s : %d : %d : %s : %s : because glTexImage3D returned %s\n",
223*6467f958SSadaf Ebrahimi             GetGLTargetName(target),
224*6467f958SSadaf Ebrahimi             GetGLFormatName(internalFormat),
225*6467f958SSadaf Ebrahimi             (int)(width), (int)(height),
226*6467f958SSadaf Ebrahimi             GetGLFormatName(glFormat),
227*6467f958SSadaf Ebrahimi             GetGLTypeName(glType),
228*6467f958SSadaf Ebrahimi             gluErrorString( err ));
229*6467f958SSadaf Ebrahimi 
230*6467f958SSadaf Ebrahimi         *outError = 0;
231*6467f958SSadaf Ebrahimi         delete[] buffer;
232*6467f958SSadaf Ebrahimi         return NULL;
233*6467f958SSadaf Ebrahimi     }
234*6467f958SSadaf Ebrahimi 
235*6467f958SSadaf Ebrahimi     if( !allocateMem )
236*6467f958SSadaf Ebrahimi     {
237*6467f958SSadaf Ebrahimi         delete [] buffer;
238*6467f958SSadaf Ebrahimi         return NULL;
239*6467f958SSadaf Ebrahimi     }
240*6467f958SSadaf Ebrahimi 
241*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
242*6467f958SSadaf Ebrahimi     if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
243*6467f958SSadaf Ebrahimi     {
244*6467f958SSadaf Ebrahimi         // Reverse and reorder to validate since in the
245*6467f958SSadaf Ebrahimi         // kernel the read_imagef() call always returns RGBA
246*6467f958SSadaf Ebrahimi 
247*6467f958SSadaf Ebrahimi         cl_uchar *p = (cl_uchar *)buffer;
248*6467f958SSadaf Ebrahimi         for( size_t i = 0; i < width * height * depth; i++ )
249*6467f958SSadaf Ebrahimi         {
250*6467f958SSadaf Ebrahimi             cl_uchar uc0 = p[i * 4 + 0];
251*6467f958SSadaf Ebrahimi             cl_uchar uc1 = p[i * 4 + 1];
252*6467f958SSadaf Ebrahimi             cl_uchar uc2 = p[i * 4 + 2];
253*6467f958SSadaf Ebrahimi             cl_uchar uc3 = p[i * 4 + 3];
254*6467f958SSadaf Ebrahimi 
255*6467f958SSadaf Ebrahimi             p[ i * 4 + 0 ] = uc2;
256*6467f958SSadaf Ebrahimi             p[ i * 4 + 1 ] = uc1;
257*6467f958SSadaf Ebrahimi             p[ i * 4 + 2 ] = uc0;
258*6467f958SSadaf Ebrahimi             p[ i * 4 + 3 ] = uc3;
259*6467f958SSadaf Ebrahimi         }
260*6467f958SSadaf Ebrahimi     }
261*6467f958SSadaf Ebrahimi #endif
262*6467f958SSadaf Ebrahimi 
263*6467f958SSadaf Ebrahimi     return buffer;
264*6467f958SSadaf Ebrahimi }
265*6467f958SSadaf Ebrahimi 
ReadGLTexture(GLenum glTarget,GLuint glTexture,GLenum glFormat,GLenum glInternalFormat,GLenum glType,ExplicitType typeToReadAs,size_t outWidth,size_t outHeight)266*6467f958SSadaf Ebrahimi void * ReadGLTexture( GLenum glTarget, GLuint glTexture,
267*6467f958SSadaf Ebrahimi                         GLenum glFormat, GLenum glInternalFormat,
268*6467f958SSadaf Ebrahimi                         GLenum glType, ExplicitType typeToReadAs,
269*6467f958SSadaf Ebrahimi                         size_t outWidth, size_t outHeight )
270*6467f958SSadaf Ebrahimi {
271*6467f958SSadaf Ebrahimi     // Read results from the GL texture
272*6467f958SSadaf Ebrahimi     glBindTexture(get_base_gl_target(glTarget), glTexture);
273*6467f958SSadaf Ebrahimi 
274*6467f958SSadaf Ebrahimi     GLenum readBackFormat = GL_RGBA;
275*6467f958SSadaf Ebrahimi     GLenum readBackType = glType;
276*6467f958SSadaf Ebrahimi     glFramebufferWrapper glFramebuffer;
277*6467f958SSadaf Ebrahimi     glRenderbufferWrapper glRenderbuffer;
278*6467f958SSadaf Ebrahimi     size_t outBytes = outWidth * outHeight * 4 * GetGLTypeSize(readBackType);
279*6467f958SSadaf Ebrahimi     cl_char *outBuffer = (cl_char *)malloc( outBytes );
280*6467f958SSadaf Ebrahimi     GLenum err = 0;
281*6467f958SSadaf Ebrahimi 
282*6467f958SSadaf Ebrahimi     memset(outBuffer, 0, outBytes);
283*6467f958SSadaf Ebrahimi     glGenFramebuffersEXT( 1, &glFramebuffer );
284*6467f958SSadaf Ebrahimi     glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, glFramebuffer );
285*6467f958SSadaf Ebrahimi     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, glTarget, glTexture, 0);
286*6467f958SSadaf Ebrahimi     err = glGetError();
287*6467f958SSadaf Ebrahimi     if (err != GL_NO_ERROR)
288*6467f958SSadaf Ebrahimi     {
289*6467f958SSadaf Ebrahimi         log_error("Failed to attach texture to FBO!\n");
290*6467f958SSadaf Ebrahimi         return NULL;
291*6467f958SSadaf Ebrahimi     }
292*6467f958SSadaf Ebrahimi 
293*6467f958SSadaf Ebrahimi     glReadPixels( 0, 0, (GLsizei)outWidth, (GLsizei)outHeight, readBackFormat, readBackType, outBuffer );
294*6467f958SSadaf Ebrahimi 
295*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
296*6467f958SSadaf Ebrahimi 
297*6467f958SSadaf Ebrahimi     log_info( "- glGetTexImage: %s : %s : %s \n",
298*6467f958SSadaf Ebrahimi         GetGLTargetName( glTarget),
299*6467f958SSadaf Ebrahimi         GetGLFormatName(readBackFormat),
300*6467f958SSadaf Ebrahimi         GetGLTypeName(readBackType));
301*6467f958SSadaf Ebrahimi 
302*6467f958SSadaf Ebrahimi     DumpGLBuffer(readBackType, outWidth, outHeight, (void *)outBuffer);
303*6467f958SSadaf Ebrahimi 
304*6467f958SSadaf Ebrahimi #endif
305*6467f958SSadaf Ebrahimi 
306*6467f958SSadaf Ebrahimi     return (void *)outBuffer;
307*6467f958SSadaf Ebrahimi }
308*6467f958SSadaf Ebrahimi 
CreateGLRenderbufferRaw(GLsizei width,GLsizei height,GLenum attachment,GLenum rbFormat,GLenum rbType,GLuint * outFramebuffer,GLuint * outRenderbuffer)309*6467f958SSadaf Ebrahimi int CreateGLRenderbufferRaw( GLsizei width, GLsizei height,
310*6467f958SSadaf Ebrahimi                             GLenum attachment,
311*6467f958SSadaf Ebrahimi                             GLenum rbFormat, GLenum rbType,
312*6467f958SSadaf Ebrahimi                             GLuint *outFramebuffer,
313*6467f958SSadaf Ebrahimi                             GLuint *outRenderbuffer )
314*6467f958SSadaf Ebrahimi {
315*6467f958SSadaf Ebrahimi     GLenum err = 0;
316*6467f958SSadaf Ebrahimi 
317*6467f958SSadaf Ebrahimi     // Generate a renderbuffer and bind
318*6467f958SSadaf Ebrahimi     glGenRenderbuffersEXT( 1, outRenderbuffer );
319*6467f958SSadaf Ebrahimi     glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, *outRenderbuffer );
320*6467f958SSadaf Ebrahimi 
321*6467f958SSadaf Ebrahimi     // Allocate storage to the renderbuffer
322*6467f958SSadaf Ebrahimi     glGetError();
323*6467f958SSadaf Ebrahimi     glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, rbFormat, (GLsizei)width,  (GLsizei)height );
324*6467f958SSadaf Ebrahimi     err = glGetError();
325*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
326*6467f958SSadaf Ebrahimi     {
327*6467f958SSadaf Ebrahimi         log_error("Failed to allocate render buffer storage!\n");
328*6467f958SSadaf Ebrahimi         return 1701;
329*6467f958SSadaf Ebrahimi     }
330*6467f958SSadaf Ebrahimi 
331*6467f958SSadaf Ebrahimi     GLint realInternalFormat;
332*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_INTERNAL_FORMAT_EXT, &realInternalFormat );
333*6467f958SSadaf Ebrahimi     rbFormat = realInternalFormat;
334*6467f958SSadaf Ebrahimi 
335*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
336*6467f958SSadaf Ebrahimi     GLint rsize, gsize, bsize, asize;
337*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_RED_SIZE_EXT,&rsize);
338*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_GREEN_SIZE_EXT,&gsize);
339*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_BLUE_SIZE_EXT,&bsize);
340*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_ALPHA_SIZE_EXT,&asize);
341*6467f958SSadaf Ebrahimi 
342*6467f958SSadaf Ebrahimi     log_info("Renderbuffer internal format requested: %s actual: %s sizes: r=%d g=%d b=%d a=%d\n",
343*6467f958SSadaf Ebrahimi              GetGLFormatName( internalFormat ), GetGLFormatName( realInternalFormat ),
344*6467f958SSadaf Ebrahimi              rsize, gsize, bsize, asize );
345*6467f958SSadaf Ebrahimi #endif
346*6467f958SSadaf Ebrahimi 
347*6467f958SSadaf Ebrahimi     // Create and bind a framebuffer to render with
348*6467f958SSadaf Ebrahimi     glGenFramebuffersEXT( 1, outFramebuffer );
349*6467f958SSadaf Ebrahimi     glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, *outFramebuffer );
350*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
351*6467f958SSadaf Ebrahimi     {
352*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to bind framebuffer : Error %s\n",
353*6467f958SSadaf Ebrahimi                   gluErrorString( err ));
354*6467f958SSadaf Ebrahimi 
355*6467f958SSadaf Ebrahimi         return -1;
356*6467f958SSadaf Ebrahimi     }
357*6467f958SSadaf Ebrahimi 
358*6467f958SSadaf Ebrahimi     // Attach to the framebuffer
359*6467f958SSadaf Ebrahimi     glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, *outRenderbuffer );
360*6467f958SSadaf Ebrahimi     err = glGetError();
361*6467f958SSadaf Ebrahimi     GLint status = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
362*6467f958SSadaf Ebrahimi     if( status != GL_FRAMEBUFFER_COMPLETE_EXT )
363*6467f958SSadaf Ebrahimi     {
364*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to attach renderbuffer to framebuffer (%s, status %x)\n", gluErrorString( err ), (int)status );
365*6467f958SSadaf Ebrahimi         return -1;
366*6467f958SSadaf Ebrahimi     }
367*6467f958SSadaf Ebrahimi 
368*6467f958SSadaf Ebrahimi     return 0;
369*6467f958SSadaf Ebrahimi }
370*6467f958SSadaf Ebrahimi 
DrawQuad(void)371*6467f958SSadaf Ebrahimi static void DrawQuad(void)
372*6467f958SSadaf Ebrahimi {
373*6467f958SSadaf Ebrahimi     const char *vssrc =
374*6467f958SSadaf Ebrahimi         "varying   mediump vec2 texCoord;\n"
375*6467f958SSadaf Ebrahimi         "attribute vec2 inPosition;\n"
376*6467f958SSadaf Ebrahimi         "void main() {\n"
377*6467f958SSadaf Ebrahimi         "    texCoord    = vec2((inPosition.x+1.0)/2.0, (inPosition.y+1.0)/2.0);\n"
378*6467f958SSadaf Ebrahimi         "    gl_Position = vec4(inPosition.x, inPosition.y, 0.0, 1.0);\n"
379*6467f958SSadaf Ebrahimi         "}\n";
380*6467f958SSadaf Ebrahimi     const char *fssrc =
381*6467f958SSadaf Ebrahimi         "uniform sampler2D tex;\n"
382*6467f958SSadaf Ebrahimi         "varying mediump vec2      texCoord;\n"
383*6467f958SSadaf Ebrahimi         "void main() {\n"
384*6467f958SSadaf Ebrahimi         "    gl_FragColor =  texture2D(tex, texCoord);\n"
385*6467f958SSadaf Ebrahimi         "}\n";
386*6467f958SSadaf Ebrahimi     GLuint vs, fs, program;
387*6467f958SSadaf Ebrahimi     GLuint positionIdx = 0;
388*6467f958SSadaf Ebrahimi     GLfloat x1 = -1.0f, x2 = 1.0f, y1 = -1.0f, y2 = 1.0f;
389*6467f958SSadaf Ebrahimi     GLfloat vertices[4][2];
390*6467f958SSadaf Ebrahimi     vertices[0][0] = x1; vertices[0][1] = y1;
391*6467f958SSadaf Ebrahimi     vertices[1][0] = x2; vertices[1][1] = y1;
392*6467f958SSadaf Ebrahimi     vertices[2][0] = x1; vertices[2][1] = y2;
393*6467f958SSadaf Ebrahimi     vertices[3][0] = x2; vertices[3][1] = y2;
394*6467f958SSadaf Ebrahimi 
395*6467f958SSadaf Ebrahimi     vs = glCreateShader(GL_VERTEX_SHADER);
396*6467f958SSadaf Ebrahimi     fs = glCreateShader(GL_FRAGMENT_SHADER);
397*6467f958SSadaf Ebrahimi 
398*6467f958SSadaf Ebrahimi     glShaderSource(vs, 1, &vssrc, NULL);
399*6467f958SSadaf Ebrahimi     glShaderSource(fs, 1, &fssrc, NULL);
400*6467f958SSadaf Ebrahimi 
401*6467f958SSadaf Ebrahimi     glCompileShader(vs);
402*6467f958SSadaf Ebrahimi     glCompileShader(fs);
403*6467f958SSadaf Ebrahimi 
404*6467f958SSadaf Ebrahimi     program = glCreateProgram();
405*6467f958SSadaf Ebrahimi     glAttachShader(program, vs);
406*6467f958SSadaf Ebrahimi     glAttachShader(program, fs);
407*6467f958SSadaf Ebrahimi     glLinkProgram(program);
408*6467f958SSadaf Ebrahimi     glUseProgram(program);
409*6467f958SSadaf Ebrahimi 
410*6467f958SSadaf Ebrahimi     positionIdx = glGetAttribLocation(program, "inPosition");
411*6467f958SSadaf Ebrahimi     glEnableVertexAttribArray(positionIdx);
412*6467f958SSadaf Ebrahimi     glVertexAttribPointer(positionIdx, 2, GL_FLOAT, GL_FALSE, 0, vertices);
413*6467f958SSadaf Ebrahimi     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
414*6467f958SSadaf Ebrahimi 
415*6467f958SSadaf Ebrahimi     glUseProgram(0);
416*6467f958SSadaf Ebrahimi     glDeleteProgram(program);
417*6467f958SSadaf Ebrahimi     glDeleteShader(vs);
418*6467f958SSadaf Ebrahimi     glDeleteShader(fs);
419*6467f958SSadaf Ebrahimi }
420*6467f958SSadaf Ebrahimi 
CreateGLRenderbuffer(GLsizei width,GLsizei height,GLenum attachment,GLenum rbFormat,GLenum rbType,GLenum texFormat,GLenum texType,ExplicitType type,GLuint * outFramebuffer,GLuint * outRenderbuffer,int * outError,MTdata d,bool allocateMem)421*6467f958SSadaf Ebrahimi void * CreateGLRenderbuffer( GLsizei width, GLsizei height,
422*6467f958SSadaf Ebrahimi                              GLenum attachment,
423*6467f958SSadaf Ebrahimi                              GLenum rbFormat, GLenum rbType,
424*6467f958SSadaf Ebrahimi                              GLenum texFormat, GLenum texType,
425*6467f958SSadaf Ebrahimi                              ExplicitType type,
426*6467f958SSadaf Ebrahimi                              GLuint *outFramebuffer,
427*6467f958SSadaf Ebrahimi                              GLuint *outRenderbuffer,
428*6467f958SSadaf Ebrahimi                              int *outError, MTdata d, bool allocateMem )
429*6467f958SSadaf Ebrahimi {
430*6467f958SSadaf Ebrahimi     *outError = CreateGLRenderbufferRaw( width, height, attachment, rbFormat, rbType, outFramebuffer, outRenderbuffer );
431*6467f958SSadaf Ebrahimi 
432*6467f958SSadaf Ebrahimi     if( *outError != 0 )
433*6467f958SSadaf Ebrahimi         return NULL;
434*6467f958SSadaf Ebrahimi 
435*6467f958SSadaf Ebrahimi     GLenum err = 0;
436*6467f958SSadaf Ebrahimi 
437*6467f958SSadaf Ebrahimi     // Generate a renderbuffer and bind
438*6467f958SSadaf Ebrahimi     glGenRenderbuffersEXT( 1, outRenderbuffer );
439*6467f958SSadaf Ebrahimi     glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, *outRenderbuffer );
440*6467f958SSadaf Ebrahimi 
441*6467f958SSadaf Ebrahimi     // Allocate storage to the renderbuffer
442*6467f958SSadaf Ebrahimi     glGetError();
443*6467f958SSadaf Ebrahimi     glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, rbFormat, (GLsizei)width,  (GLsizei)height );
444*6467f958SSadaf Ebrahimi     err = glGetError();
445*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
446*6467f958SSadaf Ebrahimi     {
447*6467f958SSadaf Ebrahimi         *outError = 1701;
448*6467f958SSadaf Ebrahimi         log_error("Failed to allocate render buffer storage!\n");
449*6467f958SSadaf Ebrahimi         return NULL;
450*6467f958SSadaf Ebrahimi     }
451*6467f958SSadaf Ebrahimi 
452*6467f958SSadaf Ebrahimi     GLint realInternalFormat;
453*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_INTERNAL_FORMAT_EXT, &realInternalFormat );
454*6467f958SSadaf Ebrahimi     rbFormat = realInternalFormat;
455*6467f958SSadaf Ebrahimi 
456*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
457*6467f958SSadaf Ebrahimi     GLint rsize, gsize, bsize, asize;
458*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_RED_SIZE_EXT,&rsize);
459*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_GREEN_SIZE_EXT,&gsize);
460*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_BLUE_SIZE_EXT,&bsize);
461*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_ALPHA_SIZE_EXT,&asize);
462*6467f958SSadaf Ebrahimi 
463*6467f958SSadaf Ebrahimi     log_info("Renderbuffer internal format requested: %s actual: %s sizes: r=%d g=%d b=%d a=%d\n",
464*6467f958SSadaf Ebrahimi               GetGLFormatName( internalFormat ), GetGLFormatName( realInternalFormat ),
465*6467f958SSadaf Ebrahimi               rsize, gsize, bsize, asize );
466*6467f958SSadaf Ebrahimi #endif
467*6467f958SSadaf Ebrahimi 
468*6467f958SSadaf Ebrahimi     // Create and bind a framebuffer to render with
469*6467f958SSadaf Ebrahimi     glGenFramebuffersEXT( 1, outFramebuffer );
470*6467f958SSadaf Ebrahimi     glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, *outFramebuffer );
471*6467f958SSadaf Ebrahimi     err = glGetError();
472*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
473*6467f958SSadaf Ebrahimi     {
474*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to bind framebuffer : Error %s\n",
475*6467f958SSadaf Ebrahimi                   gluErrorString( err ));
476*6467f958SSadaf Ebrahimi 
477*6467f958SSadaf Ebrahimi         *outError = -1;
478*6467f958SSadaf Ebrahimi         return NULL;
479*6467f958SSadaf Ebrahimi     }
480*6467f958SSadaf Ebrahimi 
481*6467f958SSadaf Ebrahimi     // Attach to the framebuffer
482*6467f958SSadaf Ebrahimi     glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, *outRenderbuffer );
483*6467f958SSadaf Ebrahimi     CHECK_ERROR();
484*6467f958SSadaf Ebrahimi     GLint status = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
485*6467f958SSadaf Ebrahimi     if( status != GL_FRAMEBUFFER_COMPLETE_EXT )
486*6467f958SSadaf Ebrahimi     {
487*6467f958SSadaf Ebrahimi         *outError = -1;
488*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to attach renderbuffer to framebuffer (%s, status %x)\n", gluErrorString( err ), (int)status );
489*6467f958SSadaf Ebrahimi         return NULL;
490*6467f958SSadaf Ebrahimi     }
491*6467f958SSadaf Ebrahimi 
492*6467f958SSadaf Ebrahimi     void* buffer = CreateRandomData(type, width * height * 4, d);
493*6467f958SSadaf Ebrahimi 
494*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
495*6467f958SSadaf Ebrahimi     log_info( "- Fillling renderbuffer: %d : %d : %s : %s \n",
496*6467f958SSadaf Ebrahimi              (int)width, (int)height,
497*6467f958SSadaf Ebrahimi              GetGLFormatName(glFormat),
498*6467f958SSadaf Ebrahimi              GetGLTypeName(glType));
499*6467f958SSadaf Ebrahimi 
500*6467f958SSadaf Ebrahimi     DumpGLBuffer(glType, (int)width, (int)height, (void*)buffer);
501*6467f958SSadaf Ebrahimi #endif
502*6467f958SSadaf Ebrahimi 
503*6467f958SSadaf Ebrahimi     CHECK_ERROR();
504*6467f958SSadaf Ebrahimi 
505*6467f958SSadaf Ebrahimi     // Fill a texture with our input data
506*6467f958SSadaf Ebrahimi     glTextureWrapper texture;
507*6467f958SSadaf Ebrahimi     glGenTextures( 1, &texture );
508*6467f958SSadaf Ebrahimi     glBindTexture( GL_TEXTURE_2D, texture );
509*6467f958SSadaf Ebrahimi     CHECK_ERROR();
510*6467f958SSadaf Ebrahimi     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
511*6467f958SSadaf Ebrahimi     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
512*6467f958SSadaf Ebrahimi     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
513*6467f958SSadaf Ebrahimi     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
514*6467f958SSadaf Ebrahimi     CHECK_ERROR();
515*6467f958SSadaf Ebrahimi     glTexImage2D( GL_TEXTURE_2D, 0, texFormat, width, height, 0, texFormat, texType, buffer );
516*6467f958SSadaf Ebrahimi     CHECK_ERROR();
517*6467f958SSadaf Ebrahimi 
518*6467f958SSadaf Ebrahimi     // Render fullscreen textured quad
519*6467f958SSadaf Ebrahimi     glViewport(0, 0, width, height);
520*6467f958SSadaf Ebrahimi     DrawQuad();
521*6467f958SSadaf Ebrahimi     CHECK_ERROR();
522*6467f958SSadaf Ebrahimi 
523*6467f958SSadaf Ebrahimi     // Read back the data in the renderbuffer
524*6467f958SSadaf Ebrahimi     memset(buffer, 0, width * height * 4 * get_explicit_type_size( type ));
525*6467f958SSadaf Ebrahimi     glReadPixels( 0, 0, (GLsizei)width, (GLsizei)height, texFormat, texType, buffer );
526*6467f958SSadaf Ebrahimi 
527*6467f958SSadaf Ebrahimi     err = glGetError();
528*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
529*6467f958SSadaf Ebrahimi     {
530*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to read data via glReadPixels : %d : %d : %s : %s : Error %s\n",
531*6467f958SSadaf Ebrahimi                   (int)width, (int)height,
532*6467f958SSadaf Ebrahimi                   GetGLFormatName(texFormat),
533*6467f958SSadaf Ebrahimi                   GetGLTypeName(texType),
534*6467f958SSadaf Ebrahimi                   gluErrorString( err ));
535*6467f958SSadaf Ebrahimi         *outError = -1;
536*6467f958SSadaf Ebrahimi     }
537*6467f958SSadaf Ebrahimi 
538*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
539*6467f958SSadaf Ebrahimi     log_info( "- glReadPixels: %d : %d : %s : %s \n",
540*6467f958SSadaf Ebrahimi              (int)width, (int)height,
541*6467f958SSadaf Ebrahimi              GetGLFormatName(glFormat),
542*6467f958SSadaf Ebrahimi              GetGLTypeName(glType));
543*6467f958SSadaf Ebrahimi 
544*6467f958SSadaf Ebrahimi     DumpGLBuffer(glType, (int)width, (int)height, (void*)buffer);
545*6467f958SSadaf Ebrahimi #endif
546*6467f958SSadaf Ebrahimi 
547*6467f958SSadaf Ebrahimi     if( !allocateMem )
548*6467f958SSadaf Ebrahimi     {
549*6467f958SSadaf Ebrahimi         free( buffer );
550*6467f958SSadaf Ebrahimi         return NULL;
551*6467f958SSadaf Ebrahimi     }
552*6467f958SSadaf Ebrahimi 
553*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
554*6467f958SSadaf Ebrahimi     if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
555*6467f958SSadaf Ebrahimi     {
556*6467f958SSadaf Ebrahimi         // Reverse and reorder to validate since in the
557*6467f958SSadaf Ebrahimi         // kernel the read_imagef() call always returns RGBA
558*6467f958SSadaf Ebrahimi         cl_uchar *p = (cl_uchar *)buffer;
559*6467f958SSadaf Ebrahimi         for( size_t i = 0; i < (size_t)width * height; i++ )
560*6467f958SSadaf Ebrahimi         {
561*6467f958SSadaf Ebrahimi             cl_uchar uc0 = p[i * 4 + 0];
562*6467f958SSadaf Ebrahimi             cl_uchar uc1 = p[i * 4 + 1];
563*6467f958SSadaf Ebrahimi             cl_uchar uc2 = p[i * 4 + 2];
564*6467f958SSadaf Ebrahimi             cl_uchar uc3 = p[i * 4 + 3];
565*6467f958SSadaf Ebrahimi 
566*6467f958SSadaf Ebrahimi             p[ i * 4 + 0 ] = uc2;
567*6467f958SSadaf Ebrahimi             p[ i * 4 + 1 ] = uc1;
568*6467f958SSadaf Ebrahimi             p[ i * 4 + 2 ] = uc0;
569*6467f958SSadaf Ebrahimi             p[ i * 4 + 3 ] = uc3;
570*6467f958SSadaf Ebrahimi         }
571*6467f958SSadaf Ebrahimi     }
572*6467f958SSadaf Ebrahimi #endif
573*6467f958SSadaf Ebrahimi 
574*6467f958SSadaf Ebrahimi     return buffer;
575*6467f958SSadaf Ebrahimi }
576*6467f958SSadaf Ebrahimi 
ReadGLRenderbuffer(GLuint glFramebuffer,GLuint glRenderbuffer,GLenum attachment,GLenum rbFormat,GLenum rbType,GLenum texFormat,GLenum texType,ExplicitType typeToReadAs,size_t outWidth,size_t outHeight)577*6467f958SSadaf Ebrahimi void * ReadGLRenderbuffer( GLuint glFramebuffer, GLuint glRenderbuffer,
578*6467f958SSadaf Ebrahimi                            GLenum attachment,
579*6467f958SSadaf Ebrahimi                            GLenum rbFormat, GLenum rbType,
580*6467f958SSadaf Ebrahimi                            GLenum texFormat, GLenum texType,
581*6467f958SSadaf Ebrahimi                            ExplicitType typeToReadAs,
582*6467f958SSadaf Ebrahimi                            size_t outWidth, size_t outHeight )
583*6467f958SSadaf Ebrahimi {
584*6467f958SSadaf Ebrahimi     glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, glFramebuffer );
585*6467f958SSadaf Ebrahimi     glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, glRenderbuffer );
586*6467f958SSadaf Ebrahimi 
587*6467f958SSadaf Ebrahimi     // Attach to the framebuffer
588*6467f958SSadaf Ebrahimi     GLint err = glGetError();
589*6467f958SSadaf Ebrahimi     if( glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ) != GL_FRAMEBUFFER_COMPLETE_EXT )
590*6467f958SSadaf Ebrahimi     {
591*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to attach renderbuffer to framebuffer (%s)\n", gluErrorString( err ) );
592*6467f958SSadaf Ebrahimi         return NULL;
593*6467f958SSadaf Ebrahimi     }
594*6467f958SSadaf Ebrahimi 
595*6467f958SSadaf Ebrahimi     // Read results from the GL renderbuffer
596*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
597*6467f958SSadaf Ebrahimi     log_info( "- Reading back from GL: %d x %d : %s : %s : %s\n",
598*6467f958SSadaf Ebrahimi              (int)outWidth, (int)outHeight,
599*6467f958SSadaf Ebrahimi              GetGLFormatName( glInternalFormat ),
600*6467f958SSadaf Ebrahimi              GetGLFormatName( glFormat ),
601*6467f958SSadaf Ebrahimi              GetGLTypeName( glType ));
602*6467f958SSadaf Ebrahimi #endif
603*6467f958SSadaf Ebrahimi 
604*6467f958SSadaf Ebrahimi     GLenum readBackFormat = GL_RGBA;
605*6467f958SSadaf Ebrahimi     GLenum readBackType = texType;
606*6467f958SSadaf Ebrahimi 
607*6467f958SSadaf Ebrahimi     size_t outBytes = outWidth * outHeight * 4 * GetGLTypeSize(readBackType);
608*6467f958SSadaf Ebrahimi     void *outBuffer = malloc( outBytes );
609*6467f958SSadaf Ebrahimi     memset(outBuffer, 0, outBytes);
610*6467f958SSadaf Ebrahimi 
611*6467f958SSadaf Ebrahimi     glReadPixels( 0, 0, (GLsizei)outWidth, (GLsizei)outHeight, readBackFormat, readBackType, outBuffer );
612*6467f958SSadaf Ebrahimi 
613*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
614*6467f958SSadaf Ebrahimi     log_info( "- glReadPixels: %d : %d : %s : %s \n",
615*6467f958SSadaf Ebrahimi              (int)outWidth, (int)outHeight,
616*6467f958SSadaf Ebrahimi              GetGLFormatName(readBackFormat),
617*6467f958SSadaf Ebrahimi              GetGLTypeName(readBackType));
618*6467f958SSadaf Ebrahimi 
619*6467f958SSadaf Ebrahimi     DumpGLBuffer(readBackType, outWidth, outHeight, outBuffer);
620*6467f958SSadaf Ebrahimi #endif
621*6467f958SSadaf Ebrahimi 
622*6467f958SSadaf Ebrahimi     return (void *)outBuffer;
623*6467f958SSadaf Ebrahimi }
624*6467f958SSadaf Ebrahimi 
625*6467f958SSadaf Ebrahimi GLenum
GetGLFormat(GLenum internalFormat)626*6467f958SSadaf Ebrahimi GetGLFormat(GLenum internalFormat)
627*6467f958SSadaf Ebrahimi {
628*6467f958SSadaf Ebrahimi     GLenum glFormat;
629*6467f958SSadaf Ebrahimi     switch (internalFormat)
630*6467f958SSadaf Ebrahimi     {
631*6467f958SSadaf Ebrahimi         case GL_BGRA:
632*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
633*6467f958SSadaf Ebrahimi         case GL_RGBA8:
634*6467f958SSadaf Ebrahimi         case GL_RGBA16:
635*6467f958SSadaf Ebrahimi         case GL_RGBA32F_ARB:
636*6467f958SSadaf Ebrahimi #endif
637*6467f958SSadaf Ebrahimi             glFormat = GL_RGBA;
638*6467f958SSadaf Ebrahimi             break;
639*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
640*6467f958SSadaf Ebrahimi         case GL_RGBA8I_EXT:
641*6467f958SSadaf Ebrahimi         case GL_RGBA16I_EXT:
642*6467f958SSadaf Ebrahimi         case GL_RGBA32I_EXT:
643*6467f958SSadaf Ebrahimi         case GL_RGBA8UI_EXT:
644*6467f958SSadaf Ebrahimi         case GL_RGBA16UI_EXT:
645*6467f958SSadaf Ebrahimi         case GL_RGBA32UI_EXT:
646*6467f958SSadaf Ebrahimi             glFormat = GL_RGBA_INTEGER_EXT;
647*6467f958SSadaf Ebrahimi             break;
648*6467f958SSadaf Ebrahimi #endif
649*6467f958SSadaf Ebrahimi         default:
650*6467f958SSadaf Ebrahimi             glFormat = GL_RGBA;
651*6467f958SSadaf Ebrahimi             break;
652*6467f958SSadaf Ebrahimi     }
653*6467f958SSadaf Ebrahimi 
654*6467f958SSadaf Ebrahimi     return glFormat;
655*6467f958SSadaf Ebrahimi }
656*6467f958SSadaf Ebrahimi 
GetGLTypeForExplicitType(ExplicitType type)657*6467f958SSadaf Ebrahimi GLenum GetGLTypeForExplicitType(ExplicitType type)
658*6467f958SSadaf Ebrahimi {
659*6467f958SSadaf Ebrahimi     switch( type )
660*6467f958SSadaf Ebrahimi     {
661*6467f958SSadaf Ebrahimi         case kFloat:
662*6467f958SSadaf Ebrahimi             return GL_FLOAT;
663*6467f958SSadaf Ebrahimi         case kInt:
664*6467f958SSadaf Ebrahimi             return GL_INT;
665*6467f958SSadaf Ebrahimi         case kUInt:
666*6467f958SSadaf Ebrahimi             return GL_UNSIGNED_INT;
667*6467f958SSadaf Ebrahimi         case kShort:
668*6467f958SSadaf Ebrahimi             return GL_SHORT;
669*6467f958SSadaf Ebrahimi         case kUShort:
670*6467f958SSadaf Ebrahimi             return GL_UNSIGNED_SHORT;
671*6467f958SSadaf Ebrahimi         case kChar:
672*6467f958SSadaf Ebrahimi             return GL_BYTE;
673*6467f958SSadaf Ebrahimi         case kUChar:
674*6467f958SSadaf Ebrahimi             return GL_UNSIGNED_BYTE;
675*6467f958SSadaf Ebrahimi         case kHalf:
676*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
677*6467f958SSadaf Ebrahimi             return GL_HALF_FLOAT;
678*6467f958SSadaf Ebrahimi #else
679*6467f958SSadaf Ebrahimi             return GL_HALF_FLOAT_ARB;
680*6467f958SSadaf Ebrahimi #endif
681*6467f958SSadaf Ebrahimi         default:
682*6467f958SSadaf Ebrahimi             return GL_INT;
683*6467f958SSadaf Ebrahimi     };
684*6467f958SSadaf Ebrahimi }
685*6467f958SSadaf Ebrahimi 
GetGLTypeSize(GLenum type)686*6467f958SSadaf Ebrahimi size_t GetGLTypeSize(GLenum type)
687*6467f958SSadaf Ebrahimi {
688*6467f958SSadaf Ebrahimi     switch( type )
689*6467f958SSadaf Ebrahimi     {
690*6467f958SSadaf Ebrahimi         case GL_FLOAT:
691*6467f958SSadaf Ebrahimi             return sizeof(GLfloat);
692*6467f958SSadaf Ebrahimi         case GL_INT:
693*6467f958SSadaf Ebrahimi             return sizeof(GLint);
694*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT:
695*6467f958SSadaf Ebrahimi             return sizeof(GLuint);
696*6467f958SSadaf Ebrahimi         case GL_SHORT:
697*6467f958SSadaf Ebrahimi             return sizeof(GLshort);
698*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_SHORT:
699*6467f958SSadaf Ebrahimi             return sizeof(GLushort);
700*6467f958SSadaf Ebrahimi         case GL_BYTE:
701*6467f958SSadaf Ebrahimi             return sizeof(GLbyte);
702*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_BYTE:
703*6467f958SSadaf Ebrahimi             return sizeof(GLubyte);
704*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
705*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT:
706*6467f958SSadaf Ebrahimi #else
707*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_ARB:
708*6467f958SSadaf Ebrahimi #endif
709*6467f958SSadaf Ebrahimi             return sizeof(GLhalf);
710*6467f958SSadaf Ebrahimi         default:
711*6467f958SSadaf Ebrahimi             return kFloat;
712*6467f958SSadaf Ebrahimi     };
713*6467f958SSadaf Ebrahimi }
714*6467f958SSadaf Ebrahimi 
GetExplicitTypeForGLType(GLenum type)715*6467f958SSadaf Ebrahimi ExplicitType GetExplicitTypeForGLType(GLenum type)
716*6467f958SSadaf Ebrahimi {
717*6467f958SSadaf Ebrahimi     switch( type )
718*6467f958SSadaf Ebrahimi     {
719*6467f958SSadaf Ebrahimi         case GL_FLOAT:
720*6467f958SSadaf Ebrahimi             return kFloat;
721*6467f958SSadaf Ebrahimi         case GL_INT:
722*6467f958SSadaf Ebrahimi             return kInt;
723*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT:
724*6467f958SSadaf Ebrahimi             return kUInt;
725*6467f958SSadaf Ebrahimi         case GL_SHORT:
726*6467f958SSadaf Ebrahimi             return kShort;
727*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_SHORT:
728*6467f958SSadaf Ebrahimi             return kUShort;
729*6467f958SSadaf Ebrahimi         case GL_BYTE:
730*6467f958SSadaf Ebrahimi             return kChar;
731*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_BYTE:
732*6467f958SSadaf Ebrahimi             return kUChar;
733*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
734*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT:
735*6467f958SSadaf Ebrahimi #else
736*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_ARB:
737*6467f958SSadaf Ebrahimi #endif
738*6467f958SSadaf Ebrahimi             return kHalf;
739*6467f958SSadaf Ebrahimi         default:
740*6467f958SSadaf Ebrahimi             return kFloat;
741*6467f958SSadaf Ebrahimi     };
742*6467f958SSadaf Ebrahimi }
743*6467f958SSadaf Ebrahimi 
get_base_gl_target(GLenum target)744*6467f958SSadaf Ebrahimi GLenum get_base_gl_target( GLenum target )
745*6467f958SSadaf Ebrahimi {
746*6467f958SSadaf Ebrahimi     switch( target )
747*6467f958SSadaf Ebrahimi     {
748*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
749*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
750*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
751*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
752*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
753*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
754*6467f958SSadaf Ebrahimi             return GL_TEXTURE_CUBE_MAP;
755*6467f958SSadaf Ebrahimi         default:
756*6467f958SSadaf Ebrahimi             return target;
757*6467f958SSadaf Ebrahimi     }
758*6467f958SSadaf Ebrahimi }
759*6467f958SSadaf Ebrahimi 
GetGLTypeName(GLenum type)760*6467f958SSadaf Ebrahimi const char *GetGLTypeName( GLenum type )
761*6467f958SSadaf Ebrahimi {
762*6467f958SSadaf Ebrahimi     switch( type )
763*6467f958SSadaf Ebrahimi     {
764*6467f958SSadaf Ebrahimi         case GL_BYTE:            return "GL_BYTE";
765*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_BYTE:   return "GL_UNSIGNED_BYTE";
766*6467f958SSadaf Ebrahimi         case GL_INT:             return "GL_INT";
767*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT:    return "GL_UNSIGNED_INT";
768*6467f958SSadaf Ebrahimi         case GL_SHORT:           return "GL_SHORT";
769*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_SHORT:  return "GL_UNSIGNED_SHORT";
770*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
771*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT:      return "GL_HALF_FLOAT";
772*6467f958SSadaf Ebrahimi #else
773*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_ARB:  return "GL_HALF_FLOAT_ARB";
774*6467f958SSadaf Ebrahimi #endif
775*6467f958SSadaf Ebrahimi         case GL_FLOAT:           return "GL_FLOAT";
776*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
777*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_8_8_8_8: return "GL_UNSIGNED_INT_8_8_8_8";
778*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_8_8_8_8_REV: return "GL_UNSIGNED_INT_8_8_8_8_REV";
779*6467f958SSadaf Ebrahimi #endif
780*6467f958SSadaf Ebrahimi         default:
781*6467f958SSadaf Ebrahimi         {
782*6467f958SSadaf Ebrahimi         static char foo[ 128 ];
783*6467f958SSadaf Ebrahimi         sprintf( foo, "(Unknown:0x%08x)", (int)type );
784*6467f958SSadaf Ebrahimi         return foo;
785*6467f958SSadaf Ebrahimi         }
786*6467f958SSadaf Ebrahimi     }
787*6467f958SSadaf Ebrahimi }
788*6467f958SSadaf Ebrahimi 
GetGLTargetName(GLenum tgt)789*6467f958SSadaf Ebrahimi const char *GetGLTargetName( GLenum tgt )
790*6467f958SSadaf Ebrahimi {
791*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_2D )          return "GL_TEXTURE_2D";
792*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_3D )          return "GL_TEXTURE_3D";
793*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
794*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_RECTANGLE_EXT ) return "GL_TEXTURE_RECTANGLE_EXT";
795*6467f958SSadaf Ebrahimi #endif
796*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_POSITIVE_X ) return "GL_TEXTURE_CUBE_MAP_POSITIVE_X";
797*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_POSITIVE_Y ) return "GL_TEXTURE_CUBE_MAP_POSITIVE_Y";
798*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_POSITIVE_Z ) return "GL_TEXTURE_CUBE_MAP_POSITIVE_Z";
799*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_NEGATIVE_X ) return "GL_TEXTURE_CUBE_MAP_NEGATIVE_X";
800*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y ) return "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y";
801*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_NEGATIVE_Z ) return "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z";
802*6467f958SSadaf Ebrahimi     return "";
803*6467f958SSadaf Ebrahimi }
804*6467f958SSadaf Ebrahimi 
GetGLAttachmentName(GLenum att)805*6467f958SSadaf Ebrahimi const char *GetGLAttachmentName( GLenum att )
806*6467f958SSadaf Ebrahimi {
807*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT0_EXT ) return "GL_COLOR_ATTACHMENT0_EXT";
808*6467f958SSadaf Ebrahimi #ifndef GL_ES_VERSION_2_0
809*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT1_EXT ) return "GL_COLOR_ATTACHMENT1_EXT";
810*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT2_EXT ) return "GL_COLOR_ATTACHMENT2_EXT";
811*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT3_EXT ) return "GL_COLOR_ATTACHMENT3_EXT";
812*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT4_EXT ) return "GL_COLOR_ATTACHMENT4_EXT";
813*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT5_EXT ) return "GL_COLOR_ATTACHMENT5_EXT";
814*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT6_EXT ) return "GL_COLOR_ATTACHMENT6_EXT";
815*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT7_EXT ) return "GL_COLOR_ATTACHMENT7_EXT";
816*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT8_EXT ) return "GL_COLOR_ATTACHMENT8_EXT";
817*6467f958SSadaf Ebrahimi #endif
818*6467f958SSadaf Ebrahimi     if( att == GL_DEPTH_ATTACHMENT_EXT ) return "GL_DEPTH_ATTACHMENT_EXT";
819*6467f958SSadaf Ebrahimi     return "";
820*6467f958SSadaf Ebrahimi }
GetGLBaseFormatName(GLenum baseformat)821*6467f958SSadaf Ebrahimi const char *GetGLBaseFormatName( GLenum baseformat )
822*6467f958SSadaf Ebrahimi {
823*6467f958SSadaf Ebrahimi     switch( baseformat )
824*6467f958SSadaf Ebrahimi     {
825*6467f958SSadaf Ebrahimi         case GL_RGBA:            return "GL_RGBA";
826*6467f958SSadaf Ebrahimi #ifdef GL_ES_VERSION_2_0
827*6467f958SSadaf Ebrahimi         case GL_BGRA_EXT:            return "GL_BGRA_EXT";
828*6467f958SSadaf Ebrahimi #else
829*6467f958SSadaf Ebrahimi         case GL_RGBA8:            return "GL_RGBA";
830*6467f958SSadaf Ebrahimi         case GL_RGBA16:            return "GL_RGBA";
831*6467f958SSadaf Ebrahimi         case GL_BGRA:            return "GL_BGRA";
832*6467f958SSadaf Ebrahimi         case GL_RGBA8I_EXT:        return "GL_RGBA_INTEGER_EXT";
833*6467f958SSadaf Ebrahimi         case GL_RGBA16I_EXT:    return "GL_RGBA_INTEGER_EXT";
834*6467f958SSadaf Ebrahimi         case GL_RGBA32I_EXT:    return "GL_RGBA_INTEGER_EXT";
835*6467f958SSadaf Ebrahimi         case GL_RGBA8UI_EXT:    return "GL_RGBA_INTEGER_EXT";
836*6467f958SSadaf Ebrahimi         case GL_RGBA16UI_EXT:    return "GL_RGBA_INTEGER_EXT";
837*6467f958SSadaf Ebrahimi         case GL_RGBA32UI_EXT:    return "GL_RGBA_INTEGER_EXT";
838*6467f958SSadaf Ebrahimi         case GL_RGBA32F_ARB:    return "GL_RGBA";
839*6467f958SSadaf Ebrahimi 
840*6467f958SSadaf Ebrahimi         case GL_RGBA_INTEGER_EXT:    return "GL_RGBA_INTEGER_EXT";
841*6467f958SSadaf Ebrahimi 
842*6467f958SSadaf Ebrahimi         case GL_ALPHA4: return "GL_ALPHA";
843*6467f958SSadaf Ebrahimi         case GL_ALPHA8: return "GL_ALPHA";
844*6467f958SSadaf Ebrahimi         case GL_ALPHA12: return "GL_ALPHA";
845*6467f958SSadaf Ebrahimi         case GL_ALPHA16: return "GL_ALPHA";
846*6467f958SSadaf Ebrahimi         case GL_LUMINANCE4: return "GL_LUMINANCE";
847*6467f958SSadaf Ebrahimi         case GL_LUMINANCE8: return "GL_LUMINANCE";
848*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12: return "GL_LUMINANCE";
849*6467f958SSadaf Ebrahimi         case GL_LUMINANCE16: return "GL_LUMINANCE";
850*6467f958SSadaf Ebrahimi         case GL_LUMINANCE4_ALPHA4: return "GL_LUMINANCE_ALPHA";
851*6467f958SSadaf Ebrahimi         case GL_LUMINANCE6_ALPHA2: return "GL_LUMINANCE_ALPHA";
852*6467f958SSadaf Ebrahimi         case GL_LUMINANCE8_ALPHA8: return "GL_LUMINANCE_ALPHA";
853*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12_ALPHA4: return "GL_LUMINANCE_ALPHA";
854*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12_ALPHA12: return "GL_LUMINANCE_ALPHA";
855*6467f958SSadaf Ebrahimi         case GL_LUMINANCE16_ALPHA16: return "GL_LUMINANCE_ALPHA";
856*6467f958SSadaf Ebrahimi         case GL_INTENSITY: return "GL_INTENSITY";
857*6467f958SSadaf Ebrahimi         case GL_INTENSITY4: return "GL_INTENSITY";
858*6467f958SSadaf Ebrahimi         case GL_INTENSITY8: return "GL_INTENSITY";
859*6467f958SSadaf Ebrahimi         case GL_INTENSITY12: return "GL_INTENSITY";
860*6467f958SSadaf Ebrahimi         case GL_INTENSITY16: return "GL_INTENSITY";
861*6467f958SSadaf Ebrahimi         case GL_R3_G3_B2: return "GL_RGB";
862*6467f958SSadaf Ebrahimi         case GL_RGB4: return "GL_RGB";
863*6467f958SSadaf Ebrahimi         case GL_RGB5: return "GL_RGB";
864*6467f958SSadaf Ebrahimi         case GL_RGB8: return "GL_RGB";
865*6467f958SSadaf Ebrahimi         case GL_RGB10: return "GL_RGB";
866*6467f958SSadaf Ebrahimi         case GL_RGB12: return "GL_RGB";
867*6467f958SSadaf Ebrahimi         case GL_RGB16: return "GL_RGB";
868*6467f958SSadaf Ebrahimi         case GL_RGBA2: return "GL_RGBA";
869*6467f958SSadaf Ebrahimi         case GL_RGBA4: return "GL_RGBA";
870*6467f958SSadaf Ebrahimi         case GL_RGB5_A1: return "GL_RGBA";
871*6467f958SSadaf Ebrahimi         case GL_RGB10_A2: return "GL_RGBA";
872*6467f958SSadaf Ebrahimi         case GL_RGBA12: return "GL_RGBA";
873*6467f958SSadaf Ebrahimi #endif
874*6467f958SSadaf Ebrahimi 
875*6467f958SSadaf Ebrahimi         default:
876*6467f958SSadaf Ebrahimi         {
877*6467f958SSadaf Ebrahimi             static char foo[ 128 ];
878*6467f958SSadaf Ebrahimi             sprintf( foo, "(Unknown:0x%08x)", (int)baseformat );
879*6467f958SSadaf Ebrahimi             return foo;
880*6467f958SSadaf Ebrahimi         }
881*6467f958SSadaf Ebrahimi     }
882*6467f958SSadaf Ebrahimi }
883*6467f958SSadaf Ebrahimi 
GetGLFormatName(GLenum format)884*6467f958SSadaf Ebrahimi const char *GetGLFormatName( GLenum format )
885*6467f958SSadaf Ebrahimi {
886*6467f958SSadaf Ebrahimi     switch( format )
887*6467f958SSadaf Ebrahimi     {
888*6467f958SSadaf Ebrahimi         case GL_RGBA:            return "GL_RGBA";
889*6467f958SSadaf Ebrahimi #ifdef GL_ES_VERSION_2_0
890*6467f958SSadaf Ebrahimi         case GL_BGRA_EXT:            return "GL_BGRA_EXT";
891*6467f958SSadaf Ebrahimi #else
892*6467f958SSadaf Ebrahimi         case GL_RGBA8:            return "GL_RGBA8";
893*6467f958SSadaf Ebrahimi         case GL_RGBA16:            return "GL_RGBA16";
894*6467f958SSadaf Ebrahimi         case GL_BGRA:            return "GL_BGRA";
895*6467f958SSadaf Ebrahimi         case GL_RGBA8I_EXT:        return "GL_RGBA8I_EXT";
896*6467f958SSadaf Ebrahimi         case GL_RGBA16I_EXT:    return "GL_RGBA16I_EXT";
897*6467f958SSadaf Ebrahimi         case GL_RGBA32I_EXT:    return "GL_RGBA32I_EXT";
898*6467f958SSadaf Ebrahimi         case GL_RGBA8UI_EXT:    return "GL_RGBA8UI_EXT";
899*6467f958SSadaf Ebrahimi         case GL_RGBA16UI_EXT:    return "GL_RGBA16UI_EXT";
900*6467f958SSadaf Ebrahimi         case GL_RGBA32UI_EXT:    return "GL_RGBA32UI_EXT";
901*6467f958SSadaf Ebrahimi         case GL_RGBA32F_ARB:    return "GL_RGBA32F_ARB";
902*6467f958SSadaf Ebrahimi 
903*6467f958SSadaf Ebrahimi         case GL_RGBA_INTEGER_EXT:    return "GL_RGBA_INTEGER_EXT";
904*6467f958SSadaf Ebrahimi 
905*6467f958SSadaf Ebrahimi         case GL_ALPHA4: return "GL_ALPHA4";
906*6467f958SSadaf Ebrahimi         case GL_ALPHA8: return "GL_ALPHA8";
907*6467f958SSadaf Ebrahimi         case GL_ALPHA12: return "GL_ALPHA12";
908*6467f958SSadaf Ebrahimi         case GL_ALPHA16: return "GL_ALPHA16";
909*6467f958SSadaf Ebrahimi         case GL_LUMINANCE4: return "GL_LUMINANCE4";
910*6467f958SSadaf Ebrahimi         case GL_LUMINANCE8: return "GL_LUMINANCE8";
911*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12: return "GL_LUMINANCE12";
912*6467f958SSadaf Ebrahimi         case GL_LUMINANCE16: return "GL_LUMINANCE16";
913*6467f958SSadaf Ebrahimi         case GL_LUMINANCE4_ALPHA4: return "GL_LUMINANCE4_ALPHA4";
914*6467f958SSadaf Ebrahimi         case GL_LUMINANCE6_ALPHA2: return "GL_LUMINANCE6_ALPHA2";
915*6467f958SSadaf Ebrahimi         case GL_LUMINANCE8_ALPHA8: return "GL_LUMINANCE8_ALPHA8";
916*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12_ALPHA4: return "GL_LUMINANCE12_ALPHA4";
917*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12_ALPHA12: return "GL_LUMINANCE12_ALPHA12";
918*6467f958SSadaf Ebrahimi         case GL_LUMINANCE16_ALPHA16: return "GL_LUMINANCE16_ALPHA16";
919*6467f958SSadaf Ebrahimi         case GL_INTENSITY: return "GL_INTENSITY";
920*6467f958SSadaf Ebrahimi         case GL_INTENSITY4: return "GL_INTENSITY4";
921*6467f958SSadaf Ebrahimi         case GL_INTENSITY8: return "GL_INTENSITY8";
922*6467f958SSadaf Ebrahimi         case GL_INTENSITY12: return "GL_INTENSITY12";
923*6467f958SSadaf Ebrahimi         case GL_INTENSITY16: return "GL_INTENSITY16";
924*6467f958SSadaf Ebrahimi         case GL_R3_G3_B2: return "GL_R3_G3_B2";
925*6467f958SSadaf Ebrahimi         case GL_RGB4: return "GL_RGB4";
926*6467f958SSadaf Ebrahimi         case GL_RGB5: return "GL_RGB5";
927*6467f958SSadaf Ebrahimi         case GL_RGB8: return "GL_RGB8";
928*6467f958SSadaf Ebrahimi         case GL_RGB10: return "GL_RGB10";
929*6467f958SSadaf Ebrahimi         case GL_RGB12: return "GL_RGB12";
930*6467f958SSadaf Ebrahimi         case GL_RGB16: return "GL_RGB16";
931*6467f958SSadaf Ebrahimi         case GL_RGBA2: return "GL_RGBA2";
932*6467f958SSadaf Ebrahimi         case GL_RGBA4: return "GL_RGBA4";
933*6467f958SSadaf Ebrahimi         case GL_RGB5_A1: return "GL_RGB5_A1";
934*6467f958SSadaf Ebrahimi         case GL_RGB10_A2: return "GL_RGB10_A2";
935*6467f958SSadaf Ebrahimi         case GL_RGBA12: return "GL_RGBA12";
936*6467f958SSadaf Ebrahimi #endif
937*6467f958SSadaf Ebrahimi         case GL_INT:            return "GL_INT";
938*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT:    return "GL_UNSIGNED_INT";
939*6467f958SSadaf Ebrahimi         case GL_SHORT:            return "GL_SHORT";
940*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_SHORT:    return "GL_UNSIGNED_SHORT";
941*6467f958SSadaf Ebrahimi         case GL_BYTE:            return "GL_BYTE";
942*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_BYTE:    return "GL_UNSIGNED_BYTE";
943*6467f958SSadaf Ebrahimi         case GL_FLOAT:            return "GL_FLOAT";
944*6467f958SSadaf Ebrahimi #ifdef GL_ES_VERSION_2_0
945*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_OES: return "GL_HALF_FLOAT_OES";
946*6467f958SSadaf Ebrahimi #else
947*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
948*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT:        return "GL_HALF_FLOAT";
949*6467f958SSadaf Ebrahimi #else
950*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_ARB: return "GL_HALF_FLOAT_ARB";
951*6467f958SSadaf Ebrahimi #endif
952*6467f958SSadaf Ebrahimi #endif
953*6467f958SSadaf Ebrahimi 
954*6467f958SSadaf Ebrahimi         default:
955*6467f958SSadaf Ebrahimi         {
956*6467f958SSadaf Ebrahimi             static char foo[ 128 ];
957*6467f958SSadaf Ebrahimi             sprintf( foo, "(Unknown:0x%08x)", (int)format );
958*6467f958SSadaf Ebrahimi             return foo;
959*6467f958SSadaf Ebrahimi         }
960*6467f958SSadaf Ebrahimi     }
961*6467f958SSadaf Ebrahimi }
962*6467f958SSadaf Ebrahimi 
CreateRandomData(ExplicitType type,size_t count,MTdata d)963*6467f958SSadaf Ebrahimi void* CreateRandomData( ExplicitType type, size_t count, MTdata d )
964*6467f958SSadaf Ebrahimi {
965*6467f958SSadaf Ebrahimi     switch(type)
966*6467f958SSadaf Ebrahimi     {
967*6467f958SSadaf Ebrahimi         case (kChar):
968*6467f958SSadaf Ebrahimi         {
969*6467f958SSadaf Ebrahimi             cl_char *p = (cl_char *)malloc(count * sizeof(cl_char));
970*6467f958SSadaf Ebrahimi             if(!p) return 0;
971*6467f958SSadaf Ebrahimi 
972*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
973*6467f958SSadaf Ebrahimi             {
974*6467f958SSadaf Ebrahimi                 p[ i ] = (cl_char)genrand_int32(d);
975*6467f958SSadaf Ebrahimi             }
976*6467f958SSadaf Ebrahimi             return (void*)p;
977*6467f958SSadaf Ebrahimi         }
978*6467f958SSadaf Ebrahimi         case (kUChar):
979*6467f958SSadaf Ebrahimi         {
980*6467f958SSadaf Ebrahimi             cl_uchar *p = (cl_uchar *)malloc(count * sizeof(cl_uchar));
981*6467f958SSadaf Ebrahimi             if(!p) return 0;
982*6467f958SSadaf Ebrahimi 
983*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
984*6467f958SSadaf Ebrahimi             {
985*6467f958SSadaf Ebrahimi                 p[ i ] =  (cl_uchar)genrand_int32(d);
986*6467f958SSadaf Ebrahimi             }
987*6467f958SSadaf Ebrahimi 
988*6467f958SSadaf Ebrahimi             return (void*)p;
989*6467f958SSadaf Ebrahimi         }
990*6467f958SSadaf Ebrahimi         case (kShort):
991*6467f958SSadaf Ebrahimi         {
992*6467f958SSadaf Ebrahimi             cl_short *p = (cl_short *)malloc(count * sizeof(cl_short));
993*6467f958SSadaf Ebrahimi             if(!p) return 0;
994*6467f958SSadaf Ebrahimi 
995*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
996*6467f958SSadaf Ebrahimi             {
997*6467f958SSadaf Ebrahimi                 p[ i ] = (cl_short)genrand_int32(d);
998*6467f958SSadaf Ebrahimi             }
999*6467f958SSadaf Ebrahimi 
1000*6467f958SSadaf Ebrahimi             return (void*)p;
1001*6467f958SSadaf Ebrahimi         }
1002*6467f958SSadaf Ebrahimi         case (kUShort):
1003*6467f958SSadaf Ebrahimi         {
1004*6467f958SSadaf Ebrahimi             cl_ushort *p = (cl_ushort *)malloc(count * sizeof(cl_ushort));
1005*6467f958SSadaf Ebrahimi             if(!p) return 0;
1006*6467f958SSadaf Ebrahimi 
1007*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
1008*6467f958SSadaf Ebrahimi             {
1009*6467f958SSadaf Ebrahimi                 p[ i ] = (cl_ushort)genrand_int32(d);
1010*6467f958SSadaf Ebrahimi             }
1011*6467f958SSadaf Ebrahimi 
1012*6467f958SSadaf Ebrahimi             return (void*)p;
1013*6467f958SSadaf Ebrahimi         }
1014*6467f958SSadaf Ebrahimi         case (kInt):
1015*6467f958SSadaf Ebrahimi         {
1016*6467f958SSadaf Ebrahimi             cl_int *p = (cl_int *)malloc(count * sizeof(cl_int));
1017*6467f958SSadaf Ebrahimi             if(!p) return 0;
1018*6467f958SSadaf Ebrahimi 
1019*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
1020*6467f958SSadaf Ebrahimi             {
1021*6467f958SSadaf Ebrahimi                 p[ i ] = (cl_int)genrand_int32(d);
1022*6467f958SSadaf Ebrahimi             }
1023*6467f958SSadaf Ebrahimi 
1024*6467f958SSadaf Ebrahimi             return (void*)p;
1025*6467f958SSadaf Ebrahimi         }
1026*6467f958SSadaf Ebrahimi         case (kUInt):
1027*6467f958SSadaf Ebrahimi         {
1028*6467f958SSadaf Ebrahimi             cl_uint *p = (cl_uint *)malloc(count * sizeof(cl_uint));
1029*6467f958SSadaf Ebrahimi             if(!p) return 0;
1030*6467f958SSadaf Ebrahimi 
1031*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
1032*6467f958SSadaf Ebrahimi             {
1033*6467f958SSadaf Ebrahimi                 p[ i ] =  (cl_uint)genrand_int32(d);
1034*6467f958SSadaf Ebrahimi             }
1035*6467f958SSadaf Ebrahimi 
1036*6467f958SSadaf Ebrahimi             return (void*)p;
1037*6467f958SSadaf Ebrahimi         }
1038*6467f958SSadaf Ebrahimi 
1039*6467f958SSadaf Ebrahimi         case (kFloat):
1040*6467f958SSadaf Ebrahimi         {
1041*6467f958SSadaf Ebrahimi             cl_float *p = (cl_float *)malloc(count * sizeof(cl_float));
1042*6467f958SSadaf Ebrahimi             if(!p) return 0;
1043*6467f958SSadaf Ebrahimi 
1044*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
1045*6467f958SSadaf Ebrahimi             {
1046*6467f958SSadaf Ebrahimi                 p[ i ] = get_random_float( 0.f, 1.f, d );
1047*6467f958SSadaf Ebrahimi             }
1048*6467f958SSadaf Ebrahimi 
1049*6467f958SSadaf Ebrahimi             return (void*)p;
1050*6467f958SSadaf Ebrahimi         }
1051*6467f958SSadaf Ebrahimi         /* added support for half floats */
1052*6467f958SSadaf Ebrahimi         case (kHalf):
1053*6467f958SSadaf Ebrahimi         {
1054*6467f958SSadaf Ebrahimi             cl_half *p = (cl_half *)malloc(count * sizeof(cl_half));
1055*6467f958SSadaf Ebrahimi             if(!p) return 0;
1056*6467f958SSadaf Ebrahimi 
1057*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
1058*6467f958SSadaf Ebrahimi             {
1059*6467f958SSadaf Ebrahimi                 p[i] = cl_half_from_float(get_random_float(0.f, 1.f, d),
1060*6467f958SSadaf Ebrahimi                                           CL_HALF_RTE);
1061*6467f958SSadaf Ebrahimi             }
1062*6467f958SSadaf Ebrahimi 
1063*6467f958SSadaf Ebrahimi             return (void*)p;
1064*6467f958SSadaf Ebrahimi         }
1065*6467f958SSadaf Ebrahimi         default:
1066*6467f958SSadaf Ebrahimi         {
1067*6467f958SSadaf Ebrahimi             log_error("Invalid explicit type specified for create random data!\n");
1068*6467f958SSadaf Ebrahimi             return 0;
1069*6467f958SSadaf Ebrahimi         }
1070*6467f958SSadaf Ebrahimi     }
1071*6467f958SSadaf Ebrahimi     return 0;
1072*6467f958SSadaf Ebrahimi }
1073*6467f958SSadaf Ebrahimi 
DumpGLBuffer(GLenum type,size_t width,size_t height,void * buffer)1074*6467f958SSadaf Ebrahimi void DumpGLBuffer(GLenum type, size_t width, size_t height, void* buffer)
1075*6467f958SSadaf Ebrahimi {
1076*6467f958SSadaf Ebrahimi     size_t i;
1077*6467f958SSadaf Ebrahimi     size_t count = width * height;
1078*6467f958SSadaf Ebrahimi     if(type == GL_BYTE)
1079*6467f958SSadaf Ebrahimi     {
1080*6467f958SSadaf Ebrahimi         cl_char* p = (cl_char*)buffer;
1081*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
1082*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
1083*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
1084*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
1085*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
1086*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
1087*6467f958SSadaf Ebrahimi     }
1088*6467f958SSadaf Ebrahimi     else if(type == GL_UNSIGNED_BYTE)
1089*6467f958SSadaf Ebrahimi     {
1090*6467f958SSadaf Ebrahimi         cl_uchar* p = (cl_uchar*)buffer;
1091*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
1092*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
1093*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
1094*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
1095*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
1096*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
1097*6467f958SSadaf Ebrahimi     }
1098*6467f958SSadaf Ebrahimi     else if(type == GL_INT)
1099*6467f958SSadaf Ebrahimi     {
1100*6467f958SSadaf Ebrahimi         cl_int* p = (cl_int*)buffer;
1101*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
1102*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
1103*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
1104*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
1105*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
1106*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
1107*6467f958SSadaf Ebrahimi     }
1108*6467f958SSadaf Ebrahimi     else if(type == GL_UNSIGNED_INT)
1109*6467f958SSadaf Ebrahimi     {
1110*6467f958SSadaf Ebrahimi         cl_uint* p = (cl_uint*)buffer;
1111*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
1112*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
1113*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
1114*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
1115*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
1116*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
1117*6467f958SSadaf Ebrahimi     }
1118*6467f958SSadaf Ebrahimi     else if(type == GL_SHORT)
1119*6467f958SSadaf Ebrahimi     {
1120*6467f958SSadaf Ebrahimi         cl_short* p = (cl_short*)buffer;
1121*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
1122*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
1123*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
1124*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
1125*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
1126*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
1127*6467f958SSadaf Ebrahimi     }
1128*6467f958SSadaf Ebrahimi     else if(type == GL_UNSIGNED_SHORT)
1129*6467f958SSadaf Ebrahimi     {
1130*6467f958SSadaf Ebrahimi         cl_ushort* p = (cl_ushort*)buffer;
1131*6467f958SSadaf Ebrahimi         for(i = 0; i <  count; i++)
1132*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
1133*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
1134*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
1135*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
1136*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
1137*6467f958SSadaf Ebrahimi     }
1138*6467f958SSadaf Ebrahimi     else if(type == GL_FLOAT)
1139*6467f958SSadaf Ebrahimi     {
1140*6467f958SSadaf Ebrahimi         cl_float* p = (cl_float*)buffer;
1141*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
1142*6467f958SSadaf Ebrahimi         log_info("[%4d] %#f %#f %#f %#f\n", (unsigned int)(i),
1143*6467f958SSadaf Ebrahimi             p[i* 4 + 0],
1144*6467f958SSadaf Ebrahimi             p[i* 4 + 1],
1145*6467f958SSadaf Ebrahimi             p[i* 4 + 2],
1146*6467f958SSadaf Ebrahimi             p[i* 4 + 3]);
1147*6467f958SSadaf Ebrahimi     }
1148*6467f958SSadaf Ebrahimi }
1149*6467f958SSadaf Ebrahimi 
1150*6467f958SSadaf Ebrahimi #if defined(_WIN32)
1151*6467f958SSadaf Ebrahimi #include <string.h>
1152*6467f958SSadaf Ebrahimi 
gluCheckExtension(const GLubyte * extName,const GLubyte * extString)1153*6467f958SSadaf Ebrahimi GLboolean gluCheckExtension(const GLubyte *extName, const GLubyte *extString)
1154*6467f958SSadaf Ebrahimi {
1155*6467f958SSadaf Ebrahimi   const size_t len = strlen((const char*)extName);
1156*6467f958SSadaf Ebrahimi   const char* str = (const char*)extString;
1157*6467f958SSadaf Ebrahimi 
1158*6467f958SSadaf Ebrahimi   while (str != NULL) {
1159*6467f958SSadaf Ebrahimi     str = strstr(str, (const char*)extName);
1160*6467f958SSadaf Ebrahimi     if (str == NULL) {
1161*6467f958SSadaf Ebrahimi       break;
1162*6467f958SSadaf Ebrahimi     }
1163*6467f958SSadaf Ebrahimi     if ((str > (const char*)extString || str[-1] == ' ')
1164*6467f958SSadaf Ebrahimi         && (str[len] == ' ' || str[len] == '\0')) {
1165*6467f958SSadaf Ebrahimi       return GL_TRUE;
1166*6467f958SSadaf Ebrahimi     }
1167*6467f958SSadaf Ebrahimi     str = strchr(str + len, ' ');
1168*6467f958SSadaf Ebrahimi   }
1169*6467f958SSadaf Ebrahimi 
1170*6467f958SSadaf Ebrahimi   return GL_FALSE;
1171*6467f958SSadaf Ebrahimi }
1172*6467f958SSadaf Ebrahimi 
1173*6467f958SSadaf Ebrahimi #endif
1174*6467f958SSadaf Ebrahimi 
1175*6467f958SSadaf Ebrahimi // Function pointers for the GL/CL calls
1176*6467f958SSadaf Ebrahimi clCreateFromGLBuffer_fn clCreateFromGLBuffer_ptr;
1177*6467f958SSadaf Ebrahimi clCreateFromGLTexture_fn clCreateFromGLTexture_ptr;
1178*6467f958SSadaf Ebrahimi clCreateFromGLRenderbuffer_fn clCreateFromGLRenderbuffer_ptr;
1179*6467f958SSadaf Ebrahimi clGetGLObjectInfo_fn clGetGLObjectInfo_ptr;
1180*6467f958SSadaf Ebrahimi clGetGLTextureInfo_fn clGetGLTextureInfo_ptr;
1181*6467f958SSadaf Ebrahimi clEnqueueAcquireGLObjects_fn clEnqueueAcquireGLObjects_ptr;
1182*6467f958SSadaf Ebrahimi clEnqueueReleaseGLObjects_fn clEnqueueReleaseGLObjects_ptr;
1183*6467f958SSadaf Ebrahimi 
init_clgl_ext(cl_platform_id platform_id)1184*6467f958SSadaf Ebrahimi int init_clgl_ext(cl_platform_id platform_id)
1185*6467f958SSadaf Ebrahimi {
1186*6467f958SSadaf Ebrahimi     // Create the function pointer table
1187*6467f958SSadaf Ebrahimi     clCreateFromGLBuffer_ptr = (clCreateFromGLBuffer_fn)clGetExtensionFunctionAddressForPlatform(platform_id, "clCreateFromGLBuffer");
1188*6467f958SSadaf Ebrahimi     if (clCreateFromGLBuffer_ptr == NULL)
1189*6467f958SSadaf Ebrahimi     {
1190*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(clCreateFromGLBuffer) returned NULL.\n");
1191*6467f958SSadaf Ebrahimi         return -1;
1192*6467f958SSadaf Ebrahimi     }
1193*6467f958SSadaf Ebrahimi 
1194*6467f958SSadaf Ebrahimi     clCreateFromGLTexture_ptr = (clCreateFromGLTexture_fn)clGetExtensionFunctionAddressForPlatform(platform_id, "clCreateFromGLTexture");
1195*6467f958SSadaf Ebrahimi     if (clCreateFromGLTexture_ptr == NULL)
1196*6467f958SSadaf Ebrahimi     {
1197*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(clCreateFromGLTexture) returned NULL.\n");
1198*6467f958SSadaf Ebrahimi         return -1;
1199*6467f958SSadaf Ebrahimi     }
1200*6467f958SSadaf Ebrahimi 
1201*6467f958SSadaf Ebrahimi     clCreateFromGLRenderbuffer_ptr = (clCreateFromGLRenderbuffer_fn)clGetExtensionFunctionAddressForPlatform(platform_id, "clCreateFromGLRenderbuffer");
1202*6467f958SSadaf Ebrahimi     if (clCreateFromGLRenderbuffer_ptr == NULL)
1203*6467f958SSadaf Ebrahimi     {
1204*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(clCreateFromGLRenderbuffer) returned NULL.\n");
1205*6467f958SSadaf Ebrahimi         return -1;
1206*6467f958SSadaf Ebrahimi     }
1207*6467f958SSadaf Ebrahimi 
1208*6467f958SSadaf Ebrahimi     clGetGLObjectInfo_ptr = (clGetGLObjectInfo_fn)clGetExtensionFunctionAddressForPlatform(platform_id, "clGetGLObjectInfo");
1209*6467f958SSadaf Ebrahimi     if (clGetGLObjectInfo_ptr == NULL)
1210*6467f958SSadaf Ebrahimi     {
1211*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(clGetGLObjectInfo) returned NULL.\n");
1212*6467f958SSadaf Ebrahimi         return -1;
1213*6467f958SSadaf Ebrahimi     }
1214*6467f958SSadaf Ebrahimi 
1215*6467f958SSadaf Ebrahimi     clGetGLTextureInfo_ptr = (clGetGLTextureInfo_fn)clGetExtensionFunctionAddressForPlatform(platform_id, "clGetGLTextureInfo");
1216*6467f958SSadaf Ebrahimi     if (clGetGLTextureInfo_ptr == NULL)
1217*6467f958SSadaf Ebrahimi     {
1218*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(clGetGLTextureInfo) returned NULL.\n");
1219*6467f958SSadaf Ebrahimi         return -1;
1220*6467f958SSadaf Ebrahimi     }
1221*6467f958SSadaf Ebrahimi 
1222*6467f958SSadaf Ebrahimi     clEnqueueAcquireGLObjects_ptr = (clEnqueueAcquireGLObjects_fn)clGetExtensionFunctionAddressForPlatform(platform_id, "clEnqueueAcquireGLObjects");
1223*6467f958SSadaf Ebrahimi     if (clEnqueueAcquireGLObjects_ptr == NULL)
1224*6467f958SSadaf Ebrahimi     {
1225*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(clEnqueueAcquireGLObjects) returned NULL.\n");
1226*6467f958SSadaf Ebrahimi         return -1;
1227*6467f958SSadaf Ebrahimi     }
1228*6467f958SSadaf Ebrahimi 
1229*6467f958SSadaf Ebrahimi     clEnqueueReleaseGLObjects_ptr = (clEnqueueReleaseGLObjects_fn)clGetExtensionFunctionAddressForPlatform(platform_id, "clEnqueueReleaseGLObjects");
1230*6467f958SSadaf Ebrahimi     if (clEnqueueReleaseGLObjects_ptr == NULL)
1231*6467f958SSadaf Ebrahimi     {
1232*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(clEnqueueReleaseGLObjects) returned NULL.\n");
1233*6467f958SSadaf Ebrahimi         return -1;
1234*6467f958SSadaf Ebrahimi     }
1235*6467f958SSadaf Ebrahimi 
1236*6467f958SSadaf Ebrahimi     return 0;
1237*6467f958SSadaf Ebrahimi }
1238*6467f958SSadaf Ebrahimi 
1239*6467f958SSadaf Ebrahimi 
1240