xref: /aosp_15_r20/external/OpenCL-CTS/test_common/gl/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 #include "harness/imageHelpers.h"
18*6467f958SSadaf Ebrahimi 
19*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
20*6467f958SSadaf Ebrahimi     #include <OpenGL/glu.h>
21*6467f958SSadaf Ebrahimi #else
22*6467f958SSadaf Ebrahimi     #include <GL/glu.h>
23*6467f958SSadaf Ebrahimi #endif
24*6467f958SSadaf Ebrahimi 
25*6467f958SSadaf Ebrahimi #if defined(__linux__)
26*6467f958SSadaf Ebrahimi // On linux we dont link to GLU library to avoid comaptibility issues with
27*6467f958SSadaf Ebrahimi // libstdc++
28*6467f958SSadaf Ebrahimi // FIXME: Implement this
gluErrorString(GLenum error)29*6467f958SSadaf Ebrahimi const GLubyte* gluErrorString (GLenum error)
30*6467f958SSadaf Ebrahimi {
31*6467f958SSadaf Ebrahimi     const char* gl_Error = "OpenGL Error";
32*6467f958SSadaf Ebrahimi     return (const GLubyte*)gl_Error;
33*6467f958SSadaf Ebrahimi }
34*6467f958SSadaf Ebrahimi #endif
35*6467f958SSadaf Ebrahimi 
CreateGLTexture1DArray(size_t width,size_t length,GLenum target,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outTextureID,int * outError,bool allocateMem,MTdata d)36*6467f958SSadaf Ebrahimi void * CreateGLTexture1DArray(size_t width, size_t length,
37*6467f958SSadaf Ebrahimi   GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType,
38*6467f958SSadaf Ebrahimi   ExplicitType type, GLuint *outTextureID, int *outError,
39*6467f958SSadaf Ebrahimi   bool allocateMem, MTdata d)
40*6467f958SSadaf Ebrahimi {
41*6467f958SSadaf Ebrahimi   *outError = 0;
42*6467f958SSadaf Ebrahimi   GLenum err = 0;
43*6467f958SSadaf Ebrahimi 
44*6467f958SSadaf Ebrahimi   char * buffer;
45*6467f958SSadaf Ebrahimi   unsigned int size = 0;
46*6467f958SSadaf Ebrahimi 
47*6467f958SSadaf Ebrahimi   // width_in_pixels * pixel_width * number_of_images:
48*6467f958SSadaf Ebrahimi   if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) )
49*6467f958SSadaf Ebrahimi   {
50*6467f958SSadaf Ebrahimi     size = width * length;
51*6467f958SSadaf Ebrahimi   }
52*6467f958SSadaf Ebrahimi   else
53*6467f958SSadaf Ebrahimi   {
54*6467f958SSadaf Ebrahimi     size = width * length * 4;
55*6467f958SSadaf Ebrahimi   }
56*6467f958SSadaf Ebrahimi 
57*6467f958SSadaf Ebrahimi   buffer = (char *)CreateRandomData(type, size, d);
58*6467f958SSadaf Ebrahimi 
59*6467f958SSadaf Ebrahimi   glGenTextures( 1, outTextureID );
60*6467f958SSadaf Ebrahimi   glBindTexture( get_base_gl_target( target ), *outTextureID );
61*6467f958SSadaf Ebrahimi   glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
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   err = glGetError();
65*6467f958SSadaf Ebrahimi   if( err != GL_NO_ERROR ) {
66*6467f958SSadaf Ebrahimi     log_error( "ERROR: Failed to create GL texture object: %s!\n", gluErrorString( err ));
67*6467f958SSadaf Ebrahimi     *outError = -1;
68*6467f958SSadaf Ebrahimi     free( buffer );
69*6467f958SSadaf Ebrahimi     return NULL;
70*6467f958SSadaf Ebrahimi   }
71*6467f958SSadaf Ebrahimi 
72*6467f958SSadaf Ebrahimi   // use TexImage2D to pump the 1D array fill of bits:
73*6467f958SSadaf Ebrahimi   glTexImage2D( get_base_gl_target(target), 0, internalFormat, (GLsizei)width,
74*6467f958SSadaf Ebrahimi     (GLsizei)length, 0, glFormat, glType, buffer );
75*6467f958SSadaf Ebrahimi 
76*6467f958SSadaf Ebrahimi   err = glGetError();
77*6467f958SSadaf Ebrahimi   if( err != GL_NO_ERROR ) {
78*6467f958SSadaf Ebrahimi     if (err != GL_OUT_OF_MEMORY) {
79*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to load data using glTexImage2D for "
80*6467f958SSadaf Ebrahimi           "TEXTURE_1D_ARRAY : %s : %s : %d : %d : %s : %s : Error %s\n",
81*6467f958SSadaf Ebrahimi         GetGLTargetName(target),
82*6467f958SSadaf Ebrahimi         GetGLFormatName(internalFormat),
83*6467f958SSadaf Ebrahimi         (int)(width), (int)(length),
84*6467f958SSadaf Ebrahimi         GetGLFormatName(glFormat),
85*6467f958SSadaf Ebrahimi         GetGLTypeName(glType),
86*6467f958SSadaf Ebrahimi         gluErrorString( err ));
87*6467f958SSadaf Ebrahimi 
88*6467f958SSadaf Ebrahimi         *outError = -1;
89*6467f958SSadaf Ebrahimi     } else {
90*6467f958SSadaf Ebrahimi         log_info( "WARNING: Unable to load data using glTexImage2D for "
91*6467f958SSadaf Ebrahimi           "TEXTURE_1D_ARRAY : %s : %s : %d : %d : %s : %s : Error %s\n",
92*6467f958SSadaf Ebrahimi         GetGLTargetName(target),
93*6467f958SSadaf Ebrahimi         GetGLFormatName(internalFormat),
94*6467f958SSadaf Ebrahimi         (int)(width), (int)(length),
95*6467f958SSadaf Ebrahimi         GetGLFormatName(glFormat),
96*6467f958SSadaf Ebrahimi         GetGLTypeName(glType),
97*6467f958SSadaf Ebrahimi         gluErrorString( err ));
98*6467f958SSadaf Ebrahimi 
99*6467f958SSadaf Ebrahimi         *outError = -2;
100*6467f958SSadaf Ebrahimi     }
101*6467f958SSadaf Ebrahimi     free( buffer );
102*6467f958SSadaf Ebrahimi     return NULL;
103*6467f958SSadaf Ebrahimi   }
104*6467f958SSadaf Ebrahimi 
105*6467f958SSadaf Ebrahimi   if( !allocateMem ) {
106*6467f958SSadaf Ebrahimi     free( buffer );
107*6467f958SSadaf Ebrahimi     return NULL;
108*6467f958SSadaf Ebrahimi   }
109*6467f958SSadaf Ebrahimi 
110*6467f958SSadaf Ebrahimi   if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
111*6467f958SSadaf Ebrahimi   {
112*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
113*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
114*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
115*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < width * length; i++ ) {
116*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
117*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
118*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
119*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
120*6467f958SSadaf Ebrahimi 
121*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc2;
122*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc1;
123*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc0;
124*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc3;
125*6467f958SSadaf Ebrahimi     }
126*6467f958SSadaf Ebrahimi   }
127*6467f958SSadaf Ebrahimi   else if( glType == GL_UNSIGNED_INT_8_8_8_8 && glFormat == GL_BGRA && allocateMem )
128*6467f958SSadaf Ebrahimi   {
129*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
130*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
131*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
132*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < width * length; i++ )
133*6467f958SSadaf Ebrahimi     {
134*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
135*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
136*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
137*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
138*6467f958SSadaf Ebrahimi 
139*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc1;
140*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc2;
141*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc3;
142*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc0;
143*6467f958SSadaf Ebrahimi     }
144*6467f958SSadaf Ebrahimi   }
145*6467f958SSadaf Ebrahimi 
146*6467f958SSadaf Ebrahimi   return buffer;
147*6467f958SSadaf Ebrahimi }
148*6467f958SSadaf Ebrahimi 
CreateGLTexture2DArray(size_t width,size_t height,size_t length,GLenum target,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outTextureID,int * outError,bool allocateMem,MTdata d)149*6467f958SSadaf Ebrahimi void * CreateGLTexture2DArray(size_t width, size_t height, size_t length,
150*6467f958SSadaf Ebrahimi   GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType,
151*6467f958SSadaf Ebrahimi   ExplicitType type, GLuint *outTextureID, int *outError,
152*6467f958SSadaf Ebrahimi   bool allocateMem, MTdata d)
153*6467f958SSadaf Ebrahimi {
154*6467f958SSadaf Ebrahimi   *outError = 0;
155*6467f958SSadaf Ebrahimi 
156*6467f958SSadaf Ebrahimi   char * buffer;
157*6467f958SSadaf Ebrahimi   unsigned int size = 0;
158*6467f958SSadaf Ebrahimi 
159*6467f958SSadaf Ebrahimi   if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) )
160*6467f958SSadaf Ebrahimi   {
161*6467f958SSadaf Ebrahimi     size = width * height * length;
162*6467f958SSadaf Ebrahimi   }
163*6467f958SSadaf Ebrahimi   else
164*6467f958SSadaf Ebrahimi   {
165*6467f958SSadaf Ebrahimi     size = width * height * length * 4;
166*6467f958SSadaf Ebrahimi   }
167*6467f958SSadaf Ebrahimi 
168*6467f958SSadaf Ebrahimi   buffer = (char *)CreateRandomData(type, size, d);
169*6467f958SSadaf Ebrahimi 
170*6467f958SSadaf Ebrahimi   if( type == kFloat && allocateMem )
171*6467f958SSadaf Ebrahimi   {
172*6467f958SSadaf Ebrahimi     // Re-fill the created buffer to just have [0-1] floats, since that's what it'd expect
173*6467f958SSadaf Ebrahimi     cl_float *p = (cl_float *)buffer;
174*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < size; i++ )
175*6467f958SSadaf Ebrahimi     {
176*6467f958SSadaf Ebrahimi       p[ i ] = (float) genrand_real1( d );
177*6467f958SSadaf Ebrahimi     }
178*6467f958SSadaf Ebrahimi   }
179*6467f958SSadaf Ebrahimi   else if( !allocateMem )
180*6467f958SSadaf Ebrahimi     memset( buffer, 0, size * get_explicit_type_size( type ) );
181*6467f958SSadaf Ebrahimi 
182*6467f958SSadaf Ebrahimi   glGenTextures( 1, outTextureID );
183*6467f958SSadaf Ebrahimi 
184*6467f958SSadaf Ebrahimi   glBindTexture( target, *outTextureID );
185*6467f958SSadaf Ebrahimi   glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
186*6467f958SSadaf Ebrahimi   glTexParameteri( target, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
187*6467f958SSadaf Ebrahimi   glTexParameteri( target, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
188*6467f958SSadaf Ebrahimi 
189*6467f958SSadaf Ebrahimi   glGetError();
190*6467f958SSadaf Ebrahimi   //the default alignment in OpenGL is 4 bytes and need to be changed for GL_DEPTH_COMPONENT16 which is aligned to 2 bytes
191*6467f958SSadaf Ebrahimi   if (internalFormat == GL_DEPTH_COMPONENT16)
192*6467f958SSadaf Ebrahimi     glPixelStorei(GL_UNPACK_ALIGNMENT, get_explicit_type_size( type ));
193*6467f958SSadaf Ebrahimi 
194*6467f958SSadaf Ebrahimi   glTexImage3D( target, 0, internalFormat, (GLsizei)width, (GLsizei)height,
195*6467f958SSadaf Ebrahimi     (GLsizei)length, 0, glFormat, glType, buffer );
196*6467f958SSadaf Ebrahimi 
197*6467f958SSadaf Ebrahimi   if (internalFormat == GL_DEPTH_COMPONENT16)
198*6467f958SSadaf Ebrahimi     glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
199*6467f958SSadaf Ebrahimi 
200*6467f958SSadaf Ebrahimi   GLenum err = glGetError();
201*6467f958SSadaf Ebrahimi   if( err != GL_NO_ERROR )
202*6467f958SSadaf Ebrahimi   {
203*6467f958SSadaf Ebrahimi     if (err != GL_OUT_OF_MEMORY) {
204*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to load data into GL texture (%s) format %s "
205*6467f958SSadaf Ebrahimi           "type %s internal format %s\n", gluErrorString( err ),
206*6467f958SSadaf Ebrahimi           GetGLFormatName( glFormat ), get_explicit_type_name( type ),
207*6467f958SSadaf Ebrahimi           GetGLFormatName( internalFormat ) );
208*6467f958SSadaf Ebrahimi         *outError = -1;
209*6467f958SSadaf Ebrahimi     } else {
210*6467f958SSadaf Ebrahimi         log_info( "WARNING: Unable to load data into GL texture (%s) format %s "
211*6467f958SSadaf Ebrahimi           "type %s internal format %s\n", gluErrorString( err ),
212*6467f958SSadaf Ebrahimi           GetGLFormatName( glFormat ), get_explicit_type_name( type ),
213*6467f958SSadaf Ebrahimi           GetGLFormatName( internalFormat ) );
214*6467f958SSadaf Ebrahimi         *outError = -2;
215*6467f958SSadaf Ebrahimi     }
216*6467f958SSadaf Ebrahimi     delete [] buffer;
217*6467f958SSadaf Ebrahimi     return NULL;
218*6467f958SSadaf Ebrahimi   }
219*6467f958SSadaf Ebrahimi 
220*6467f958SSadaf Ebrahimi   if( !allocateMem )
221*6467f958SSadaf Ebrahimi   {
222*6467f958SSadaf Ebrahimi     delete [] buffer;
223*6467f958SSadaf Ebrahimi     return NULL;
224*6467f958SSadaf Ebrahimi   }
225*6467f958SSadaf Ebrahimi 
226*6467f958SSadaf Ebrahimi   if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
227*6467f958SSadaf Ebrahimi   {
228*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
229*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
230*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
231*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < width * height * length; i++ )
232*6467f958SSadaf Ebrahimi     {
233*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
234*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
235*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
236*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
237*6467f958SSadaf Ebrahimi 
238*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc2;
239*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc1;
240*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc0;
241*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc3;
242*6467f958SSadaf Ebrahimi     }
243*6467f958SSadaf Ebrahimi   }
244*6467f958SSadaf Ebrahimi   else if( glType == GL_UNSIGNED_INT_8_8_8_8 && glFormat == GL_BGRA && allocateMem )
245*6467f958SSadaf Ebrahimi   {
246*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
247*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
248*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
249*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < width * length; i++ )
250*6467f958SSadaf Ebrahimi     {
251*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
252*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
253*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
254*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
255*6467f958SSadaf Ebrahimi 
256*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc1;
257*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc2;
258*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc3;
259*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc0;
260*6467f958SSadaf Ebrahimi     }
261*6467f958SSadaf Ebrahimi   }
262*6467f958SSadaf Ebrahimi 
263*6467f958SSadaf Ebrahimi   return buffer;
264*6467f958SSadaf Ebrahimi }
265*6467f958SSadaf Ebrahimi 
CreateGLTextureBuffer(size_t width,GLenum target,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outTex,GLuint * outBuf,int * outError,bool allocateMem,MTdata d)266*6467f958SSadaf Ebrahimi void * CreateGLTextureBuffer(size_t width, GLenum target,
267*6467f958SSadaf Ebrahimi   GLenum glFormat, GLenum internalFormat, GLenum glType, ExplicitType type,
268*6467f958SSadaf Ebrahimi   GLuint *outTex, GLuint *outBuf, int *outError, bool allocateMem, MTdata d)
269*6467f958SSadaf Ebrahimi {
270*6467f958SSadaf Ebrahimi   // First, generate a regular GL Buffer from random data.
271*6467f958SSadaf Ebrahimi   *outError = 0;
272*6467f958SSadaf Ebrahimi   GLenum err = 0;
273*6467f958SSadaf Ebrahimi 
274*6467f958SSadaf Ebrahimi   char * buffer;
275*6467f958SSadaf Ebrahimi   unsigned int size = 0;
276*6467f958SSadaf Ebrahimi 
277*6467f958SSadaf Ebrahimi   // The buffer should be the array width * number of elements * element pitch
278*6467f958SSadaf Ebrahimi   if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) )
279*6467f958SSadaf Ebrahimi   {
280*6467f958SSadaf Ebrahimi     size = width;
281*6467f958SSadaf Ebrahimi   }
282*6467f958SSadaf Ebrahimi   else
283*6467f958SSadaf Ebrahimi   {
284*6467f958SSadaf Ebrahimi     size = width * 4;
285*6467f958SSadaf Ebrahimi   }
286*6467f958SSadaf Ebrahimi 
287*6467f958SSadaf Ebrahimi   buffer = (char*)CreateRandomData(type, size, d);
288*6467f958SSadaf Ebrahimi 
289*6467f958SSadaf Ebrahimi   err = glGetError();
290*6467f958SSadaf Ebrahimi 
291*6467f958SSadaf Ebrahimi   glGenBuffers(1, outBuf);
292*6467f958SSadaf Ebrahimi   glBindBuffer(GL_TEXTURE_BUFFER, *outBuf);
293*6467f958SSadaf Ebrahimi 
294*6467f958SSadaf Ebrahimi   // Need to multiply by the type size:
295*6467f958SSadaf Ebrahimi   size *= ( GetGLTypeSize( GetGLTypeForExplicitType(type) ) );
296*6467f958SSadaf Ebrahimi 
297*6467f958SSadaf Ebrahimi   glBufferData(GL_TEXTURE_BUFFER, size, buffer, GL_DYNAMIC_DRAW);
298*6467f958SSadaf Ebrahimi 
299*6467f958SSadaf Ebrahimi   // Now make a Texture out of this Buffer:
300*6467f958SSadaf Ebrahimi 
301*6467f958SSadaf Ebrahimi   glGenTextures(1, outTex);
302*6467f958SSadaf Ebrahimi   glBindTexture(GL_TEXTURE_BUFFER, *outTex);
303*6467f958SSadaf Ebrahimi   glTexBuffer(GL_TEXTURE_BUFFER, internalFormat, *outBuf);
304*6467f958SSadaf Ebrahimi 
305*6467f958SSadaf Ebrahimi   if ((err = glGetError())) {
306*6467f958SSadaf Ebrahimi     log_error( "ERROR: Unable to load data into glTexBuffer : %s : %s : %d : %s : %s : Error %s\n",
307*6467f958SSadaf Ebrahimi               GetGLTargetName(target),
308*6467f958SSadaf Ebrahimi               GetGLFormatName(internalFormat),
309*6467f958SSadaf Ebrahimi               (int)(size),
310*6467f958SSadaf Ebrahimi               GetGLFormatName(glFormat),
311*6467f958SSadaf Ebrahimi               GetGLTypeName(glType),
312*6467f958SSadaf Ebrahimi               gluErrorString( err ));
313*6467f958SSadaf Ebrahimi     *outError = -1;
314*6467f958SSadaf Ebrahimi     delete [] buffer;
315*6467f958SSadaf Ebrahimi     return NULL;
316*6467f958SSadaf Ebrahimi   }
317*6467f958SSadaf Ebrahimi 
318*6467f958SSadaf Ebrahimi   if( !allocateMem ) {
319*6467f958SSadaf Ebrahimi     free( buffer );
320*6467f958SSadaf Ebrahimi     return NULL;
321*6467f958SSadaf Ebrahimi   }
322*6467f958SSadaf Ebrahimi 
323*6467f958SSadaf Ebrahimi   if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
324*6467f958SSadaf Ebrahimi   {
325*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
326*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
327*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
328*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < width; i++ ) {
329*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
330*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
331*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
332*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
333*6467f958SSadaf Ebrahimi 
334*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc2;
335*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc1;
336*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc0;
337*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc3;
338*6467f958SSadaf Ebrahimi     }
339*6467f958SSadaf Ebrahimi   }
340*6467f958SSadaf Ebrahimi   else if( glType == GL_UNSIGNED_INT_8_8_8_8 && glFormat == GL_BGRA && allocateMem )
341*6467f958SSadaf Ebrahimi   {
342*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
343*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
344*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
345*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < width; i++ )
346*6467f958SSadaf Ebrahimi     {
347*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
348*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
349*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
350*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
351*6467f958SSadaf Ebrahimi 
352*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc1;
353*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc2;
354*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc3;
355*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc0;
356*6467f958SSadaf Ebrahimi     }
357*6467f958SSadaf Ebrahimi   }
358*6467f958SSadaf Ebrahimi 
359*6467f958SSadaf Ebrahimi   return buffer;
360*6467f958SSadaf Ebrahimi }
361*6467f958SSadaf Ebrahimi 
CreateGLTexture1D(size_t width,GLenum target,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outTextureID,int * outError,bool allocateMem,MTdata d)362*6467f958SSadaf Ebrahimi void* CreateGLTexture1D( size_t width, GLenum target, GLenum glFormat,
363*6467f958SSadaf Ebrahimi     GLenum internalFormat, GLenum glType, ExplicitType type,
364*6467f958SSadaf Ebrahimi     GLuint *outTextureID, int *outError, bool allocateMem, MTdata d )
365*6467f958SSadaf Ebrahimi {
366*6467f958SSadaf Ebrahimi   *outError = 0;
367*6467f958SSadaf Ebrahimi   GLenum err = 0;
368*6467f958SSadaf Ebrahimi 
369*6467f958SSadaf Ebrahimi   char * buffer;
370*6467f958SSadaf Ebrahimi   unsigned int size = 0;
371*6467f958SSadaf Ebrahimi 
372*6467f958SSadaf Ebrahimi   // The buffer should be the array width * number of elements * element pitch
373*6467f958SSadaf Ebrahimi   if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) )
374*6467f958SSadaf Ebrahimi   {
375*6467f958SSadaf Ebrahimi     size = width;
376*6467f958SSadaf Ebrahimi   }
377*6467f958SSadaf Ebrahimi   else
378*6467f958SSadaf Ebrahimi   {
379*6467f958SSadaf Ebrahimi     size = width * 4;
380*6467f958SSadaf Ebrahimi   }
381*6467f958SSadaf Ebrahimi 
382*6467f958SSadaf Ebrahimi   buffer = (char*)CreateRandomData(type, size, d);
383*6467f958SSadaf Ebrahimi 
384*6467f958SSadaf Ebrahimi   glGenTextures( 1, outTextureID );
385*6467f958SSadaf Ebrahimi   glBindTexture( get_base_gl_target( target ), *outTextureID );
386*6467f958SSadaf Ebrahimi   glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
387*6467f958SSadaf Ebrahimi   glTexParameteri( get_base_gl_target( target ), GL_TEXTURE_MIN_FILTER, GL_NEAREST );
388*6467f958SSadaf Ebrahimi   glTexParameteri( get_base_gl_target( target ), GL_TEXTURE_MAG_FILTER, GL_NEAREST );
389*6467f958SSadaf Ebrahimi   err = glGetError();
390*6467f958SSadaf Ebrahimi   if( err != GL_NO_ERROR )
391*6467f958SSadaf Ebrahimi   {
392*6467f958SSadaf Ebrahimi     log_error( "ERROR: Failed to create GL texture object: %s!\n", gluErrorString( err ));
393*6467f958SSadaf Ebrahimi     *outError = -1;
394*6467f958SSadaf Ebrahimi     free( buffer );
395*6467f958SSadaf Ebrahimi     return NULL;
396*6467f958SSadaf Ebrahimi   }
397*6467f958SSadaf Ebrahimi 
398*6467f958SSadaf Ebrahimi   glTexImage1D( get_base_gl_target(target), 0, internalFormat, (GLsizei)width,
399*6467f958SSadaf Ebrahimi     0, glFormat, glType, buffer );
400*6467f958SSadaf Ebrahimi 
401*6467f958SSadaf Ebrahimi   err = glGetError();
402*6467f958SSadaf Ebrahimi   if( err != GL_NO_ERROR )
403*6467f958SSadaf Ebrahimi   {
404*6467f958SSadaf Ebrahimi         if (err != GL_OUT_OF_MEMORY) {
405*6467f958SSadaf Ebrahimi             log_error( "ERROR: Unable to load data into glTexImage1D : %s : %s : %d : %s : %s : Error %s\n",
406*6467f958SSadaf Ebrahimi               GetGLTargetName(target),
407*6467f958SSadaf Ebrahimi               GetGLFormatName(internalFormat),
408*6467f958SSadaf Ebrahimi               (int)(width),
409*6467f958SSadaf Ebrahimi               GetGLFormatName(glFormat),
410*6467f958SSadaf Ebrahimi               GetGLTypeName(glType),
411*6467f958SSadaf Ebrahimi               gluErrorString( err ));
412*6467f958SSadaf Ebrahimi             *outError = -1;
413*6467f958SSadaf Ebrahimi         } else {
414*6467f958SSadaf Ebrahimi             log_info( "WARNING: Unable to load data into glTexImage1D : %s : %s : %d : %s : %s : Error %s\n",
415*6467f958SSadaf Ebrahimi               GetGLTargetName(target),
416*6467f958SSadaf Ebrahimi               GetGLFormatName(internalFormat),
417*6467f958SSadaf Ebrahimi               (int)(width),
418*6467f958SSadaf Ebrahimi               GetGLFormatName(glFormat),
419*6467f958SSadaf Ebrahimi               GetGLTypeName(glType),
420*6467f958SSadaf Ebrahimi               gluErrorString( err ));
421*6467f958SSadaf Ebrahimi             *outError = -2;
422*6467f958SSadaf Ebrahimi         }
423*6467f958SSadaf Ebrahimi       free( buffer );
424*6467f958SSadaf Ebrahimi       return NULL;
425*6467f958SSadaf Ebrahimi   }
426*6467f958SSadaf Ebrahimi 
427*6467f958SSadaf Ebrahimi   if( !allocateMem ) {
428*6467f958SSadaf Ebrahimi     free( buffer );
429*6467f958SSadaf Ebrahimi     return NULL;
430*6467f958SSadaf Ebrahimi   }
431*6467f958SSadaf Ebrahimi 
432*6467f958SSadaf Ebrahimi   if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
433*6467f958SSadaf Ebrahimi   {
434*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
435*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
436*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
437*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < width; i++ ) {
438*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
439*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
440*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
441*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
442*6467f958SSadaf Ebrahimi 
443*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc2;
444*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc1;
445*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc0;
446*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc3;
447*6467f958SSadaf Ebrahimi     }
448*6467f958SSadaf Ebrahimi   }
449*6467f958SSadaf Ebrahimi   else if( glType == GL_UNSIGNED_INT_8_8_8_8 && glFormat == GL_BGRA && allocateMem )
450*6467f958SSadaf Ebrahimi   {
451*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
452*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
453*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
454*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < width; i++ )
455*6467f958SSadaf Ebrahimi     {
456*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
457*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
458*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
459*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
460*6467f958SSadaf Ebrahimi 
461*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc1;
462*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc2;
463*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc3;
464*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc0;
465*6467f958SSadaf Ebrahimi     }
466*6467f958SSadaf Ebrahimi   }
467*6467f958SSadaf Ebrahimi 
468*6467f958SSadaf Ebrahimi   return buffer;
469*6467f958SSadaf Ebrahimi }
470*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)471*6467f958SSadaf Ebrahimi void * CreateGLTexture2D( size_t width, size_t height,
472*6467f958SSadaf Ebrahimi                         GLenum target, GLenum glFormat,
473*6467f958SSadaf Ebrahimi                         GLenum internalFormat, GLenum glType,
474*6467f958SSadaf Ebrahimi                         ExplicitType type, GLuint *outTextureID,
475*6467f958SSadaf Ebrahimi                         int *outError, bool allocateMem, MTdata d )
476*6467f958SSadaf Ebrahimi {
477*6467f958SSadaf Ebrahimi     *outError = 0;
478*6467f958SSadaf Ebrahimi     GLenum err = 0;
479*6467f958SSadaf Ebrahimi 
480*6467f958SSadaf Ebrahimi     char * buffer;
481*6467f958SSadaf Ebrahimi     unsigned int size = 0;
482*6467f958SSadaf Ebrahimi 
483*6467f958SSadaf Ebrahimi     if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) )
484*6467f958SSadaf Ebrahimi     {
485*6467f958SSadaf Ebrahimi       size = width * height;
486*6467f958SSadaf Ebrahimi     }
487*6467f958SSadaf Ebrahimi     else
488*6467f958SSadaf Ebrahimi     {
489*6467f958SSadaf Ebrahimi       size = width * height * 4;
490*6467f958SSadaf Ebrahimi     }
491*6467f958SSadaf Ebrahimi 
492*6467f958SSadaf Ebrahimi     buffer = (char *)CreateRandomData(type, size, d);
493*6467f958SSadaf Ebrahimi 
494*6467f958SSadaf Ebrahimi     glGenTextures( 1, outTextureID );
495*6467f958SSadaf Ebrahimi     glBindTexture( get_base_gl_target( target ), *outTextureID );
496*6467f958SSadaf Ebrahimi     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
497*6467f958SSadaf Ebrahimi     glTexParameteri( get_base_gl_target( target ), GL_TEXTURE_MIN_FILTER, GL_NEAREST );
498*6467f958SSadaf Ebrahimi     glTexParameteri( get_base_gl_target( target ), GL_TEXTURE_MAG_FILTER, GL_NEAREST );
499*6467f958SSadaf Ebrahimi     err = glGetError();
500*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
501*6467f958SSadaf Ebrahimi     {
502*6467f958SSadaf Ebrahimi         log_error( "ERROR: Failed to create GL texture object: %s!\n", gluErrorString( err ));
503*6467f958SSadaf Ebrahimi         *outError = -1;
504*6467f958SSadaf Ebrahimi         free( buffer );
505*6467f958SSadaf Ebrahimi         return NULL;
506*6467f958SSadaf Ebrahimi     }
507*6467f958SSadaf Ebrahimi 
508*6467f958SSadaf Ebrahimi     if( get_base_gl_target( target ) == GL_TEXTURE_CUBE_MAP )
509*6467f958SSadaf Ebrahimi     {
510*6467f958SSadaf Ebrahimi         char * temp = (char *)malloc(size * get_explicit_type_size( type ) * sizeof(cl_char));
511*6467f958SSadaf Ebrahimi         if(allocateMem)
512*6467f958SSadaf Ebrahimi             memcpy( temp, buffer, size * get_explicit_type_size( type ) );
513*6467f958SSadaf Ebrahimi         else
514*6467f958SSadaf Ebrahimi             memset( temp, 0, size * get_explicit_type_size( type ) );
515*6467f958SSadaf Ebrahimi 
516*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
517*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
518*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
519*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
520*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
521*6467f958SSadaf Ebrahimi         glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, temp );
522*6467f958SSadaf Ebrahimi         free(temp);
523*6467f958SSadaf Ebrahimi     }
524*6467f958SSadaf Ebrahimi     else
525*6467f958SSadaf Ebrahimi     {
526*6467f958SSadaf Ebrahimi #ifdef DEBUG
527*6467f958SSadaf Ebrahimi         log_info("- glTexImage2D : %s : %s : %d : %d : %s : %s\n",
528*6467f958SSadaf Ebrahimi             GetGLTargetName(target),
529*6467f958SSadaf Ebrahimi             GetGLFormatName(internalFormat),
530*6467f958SSadaf Ebrahimi             width, height,
531*6467f958SSadaf Ebrahimi             GetGLFormatName(glFormat),
532*6467f958SSadaf Ebrahimi             GetGLTypeName(glType));
533*6467f958SSadaf Ebrahimi 
534*6467f958SSadaf Ebrahimi         DumpGLBuffer(glType, width, height, buffer);
535*6467f958SSadaf Ebrahimi #endif
536*6467f958SSadaf Ebrahimi 
537*6467f958SSadaf Ebrahimi         //the default alignment in OpenGL is 4 bytes and need to be changed for GL_DEPTH_COMPONENT16 which is aligned to 2 bytes
538*6467f958SSadaf Ebrahimi         if (internalFormat == GL_DEPTH_COMPONENT16)
539*6467f958SSadaf Ebrahimi           glPixelStorei(GL_UNPACK_ALIGNMENT, get_explicit_type_size( type ));
540*6467f958SSadaf Ebrahimi 
541*6467f958SSadaf Ebrahimi         glTexImage2D( get_base_gl_target(target), 0, internalFormat, (GLsizei)width, (GLsizei)height, 0, glFormat, glType, buffer );
542*6467f958SSadaf Ebrahimi 
543*6467f958SSadaf Ebrahimi         if (internalFormat == GL_DEPTH_COMPONENT16)
544*6467f958SSadaf Ebrahimi           glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
545*6467f958SSadaf Ebrahimi     }
546*6467f958SSadaf Ebrahimi 
547*6467f958SSadaf Ebrahimi     err = glGetError();
548*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
549*6467f958SSadaf Ebrahimi     {
550*6467f958SSadaf Ebrahimi         if (err != GL_OUT_OF_MEMORY) {
551*6467f958SSadaf Ebrahimi             log_error( "ERROR: Unable to load data into glTexImage2D : %s : %s : %d : %d : %s : %s : Error %s\n",
552*6467f958SSadaf Ebrahimi                 GetGLTargetName(target),
553*6467f958SSadaf Ebrahimi                 GetGLFormatName(internalFormat),
554*6467f958SSadaf Ebrahimi                 (int)(width), (int)(height),
555*6467f958SSadaf Ebrahimi                 GetGLFormatName(glFormat),
556*6467f958SSadaf Ebrahimi                 GetGLTypeName(glType),
557*6467f958SSadaf Ebrahimi                 gluErrorString( err ));
558*6467f958SSadaf Ebrahimi             *outError = -1;
559*6467f958SSadaf Ebrahimi         } else {
560*6467f958SSadaf Ebrahimi             log_info( "WARNING: Unable to load data into glTexImage2D : %s : %s : %d : %d : %s : %s : Error %s\n",
561*6467f958SSadaf Ebrahimi                 GetGLTargetName(target),
562*6467f958SSadaf Ebrahimi                 GetGLFormatName(internalFormat),
563*6467f958SSadaf Ebrahimi                 (int)(width), (int)(height),
564*6467f958SSadaf Ebrahimi                 GetGLFormatName(glFormat),
565*6467f958SSadaf Ebrahimi                 GetGLTypeName(glType),
566*6467f958SSadaf Ebrahimi                 gluErrorString( err ));
567*6467f958SSadaf Ebrahimi             *outError = -2;
568*6467f958SSadaf Ebrahimi         }
569*6467f958SSadaf Ebrahimi         free( buffer );
570*6467f958SSadaf Ebrahimi         return NULL;
571*6467f958SSadaf Ebrahimi     }
572*6467f958SSadaf Ebrahimi 
573*6467f958SSadaf Ebrahimi #ifdef DEBUG
574*6467f958SSadaf Ebrahimi     char * test = (char *)malloc(width * height * 4 * get_explicit_type_size( type ));
575*6467f958SSadaf Ebrahimi     memset(test, 0, width * height * 4 * get_explicit_type_size( type ));
576*6467f958SSadaf Ebrahimi 
577*6467f958SSadaf Ebrahimi     if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) )
578*6467f958SSadaf Ebrahimi     {
579*6467f958SSadaf Ebrahimi       glFormat = GL_RGBA;
580*6467f958SSadaf Ebrahimi       glType = GL_FLOAT;
581*6467f958SSadaf Ebrahimi     }
582*6467f958SSadaf Ebrahimi 
583*6467f958SSadaf Ebrahimi     log_info("- glGetTexImage : %s : %s : %s\n",
584*6467f958SSadaf Ebrahimi         GetGLTargetName(target),
585*6467f958SSadaf Ebrahimi         GetGLFormatName(glFormat),
586*6467f958SSadaf Ebrahimi         GetGLTypeName(glType));
587*6467f958SSadaf Ebrahimi 
588*6467f958SSadaf Ebrahimi     glGetTexImage(target, 0, glFormat, glType, test);
589*6467f958SSadaf Ebrahimi 
590*6467f958SSadaf Ebrahimi     DumpGLBuffer(glType, width, height, test);
591*6467f958SSadaf Ebrahimi 
592*6467f958SSadaf Ebrahimi     free(test);
593*6467f958SSadaf Ebrahimi 
594*6467f958SSadaf Ebrahimi     err = glGetError();
595*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
596*6467f958SSadaf Ebrahimi     {
597*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to read data from glGetTexImage : %s : %s : %s : Error %s\n",
598*6467f958SSadaf Ebrahimi         GetGLTargetName(target),
599*6467f958SSadaf Ebrahimi         GetGLFormatName(glFormat),
600*6467f958SSadaf Ebrahimi         GetGLTypeName(glType),
601*6467f958SSadaf Ebrahimi         gluErrorString( err ));
602*6467f958SSadaf Ebrahimi         return NULL;
603*6467f958SSadaf Ebrahimi     }
604*6467f958SSadaf Ebrahimi #endif
605*6467f958SSadaf Ebrahimi 
606*6467f958SSadaf Ebrahimi     if( !allocateMem )
607*6467f958SSadaf Ebrahimi     {
608*6467f958SSadaf Ebrahimi         free( buffer );
609*6467f958SSadaf Ebrahimi         return NULL;
610*6467f958SSadaf Ebrahimi     }
611*6467f958SSadaf Ebrahimi 
612*6467f958SSadaf Ebrahimi     if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
613*6467f958SSadaf Ebrahimi     {
614*6467f958SSadaf Ebrahimi         // Reverse and reorder to validate since in the
615*6467f958SSadaf Ebrahimi         // kernel the read_imagef() call always returns RGBA
616*6467f958SSadaf Ebrahimi         cl_uchar *p = (cl_uchar *)buffer;
617*6467f958SSadaf Ebrahimi         for( size_t i = 0; i < width * height; i++ )
618*6467f958SSadaf Ebrahimi         {
619*6467f958SSadaf Ebrahimi             cl_uchar uc0 = p[i * 4 + 0];
620*6467f958SSadaf Ebrahimi             cl_uchar uc1 = p[i * 4 + 1];
621*6467f958SSadaf Ebrahimi             cl_uchar uc2 = p[i * 4 + 2];
622*6467f958SSadaf Ebrahimi             cl_uchar uc3 = p[i * 4 + 3];
623*6467f958SSadaf Ebrahimi 
624*6467f958SSadaf Ebrahimi             p[ i * 4 + 0 ] = uc2;
625*6467f958SSadaf Ebrahimi             p[ i * 4 + 1 ] = uc1;
626*6467f958SSadaf Ebrahimi             p[ i * 4 + 2 ] = uc0;
627*6467f958SSadaf Ebrahimi             p[ i * 4 + 3 ] = uc3;
628*6467f958SSadaf Ebrahimi         }
629*6467f958SSadaf Ebrahimi     }
630*6467f958SSadaf Ebrahimi     else if( glType == GL_UNSIGNED_INT_8_8_8_8 && glFormat == GL_BGRA && allocateMem )
631*6467f958SSadaf Ebrahimi     {
632*6467f958SSadaf Ebrahimi       // Reverse and reorder to validate since in the
633*6467f958SSadaf Ebrahimi       // kernel the read_imagef() call always returns RGBA
634*6467f958SSadaf Ebrahimi       cl_uchar *p = (cl_uchar *)buffer;
635*6467f958SSadaf Ebrahimi       for( size_t i = 0; i < width * height; i++ )
636*6467f958SSadaf Ebrahimi       {
637*6467f958SSadaf Ebrahimi         cl_uchar uc0 = p[i * 4 + 0];
638*6467f958SSadaf Ebrahimi         cl_uchar uc1 = p[i * 4 + 1];
639*6467f958SSadaf Ebrahimi         cl_uchar uc2 = p[i * 4 + 2];
640*6467f958SSadaf Ebrahimi         cl_uchar uc3 = p[i * 4 + 3];
641*6467f958SSadaf Ebrahimi 
642*6467f958SSadaf Ebrahimi         p[ i * 4 + 0 ] = uc1;
643*6467f958SSadaf Ebrahimi         p[ i * 4 + 1 ] = uc2;
644*6467f958SSadaf Ebrahimi         p[ i * 4 + 2 ] = uc3;
645*6467f958SSadaf Ebrahimi         p[ i * 4 + 3 ] = uc0;
646*6467f958SSadaf Ebrahimi       }
647*6467f958SSadaf Ebrahimi     }
648*6467f958SSadaf Ebrahimi 
649*6467f958SSadaf Ebrahimi     return buffer;
650*6467f958SSadaf Ebrahimi }
651*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)652*6467f958SSadaf Ebrahimi void * CreateGLTexture3D( size_t width, size_t height, size_t depth,
653*6467f958SSadaf Ebrahimi                           GLenum target, GLenum glFormat,
654*6467f958SSadaf Ebrahimi                           GLenum internalFormat, GLenum glType,
655*6467f958SSadaf Ebrahimi                           ExplicitType type, GLuint *outTextureID,
656*6467f958SSadaf Ebrahimi                           int *outError, MTdata d, bool allocateMem)
657*6467f958SSadaf Ebrahimi {
658*6467f958SSadaf Ebrahimi     *outError = 0;
659*6467f958SSadaf Ebrahimi 
660*6467f958SSadaf Ebrahimi     char * buffer;
661*6467f958SSadaf Ebrahimi     unsigned int size = 0;
662*6467f958SSadaf Ebrahimi 
663*6467f958SSadaf Ebrahimi     if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) )
664*6467f958SSadaf Ebrahimi     {
665*6467f958SSadaf Ebrahimi         size = width * height * depth;
666*6467f958SSadaf Ebrahimi     }
667*6467f958SSadaf Ebrahimi     else
668*6467f958SSadaf Ebrahimi     {
669*6467f958SSadaf Ebrahimi         size = width * height * depth * 4;
670*6467f958SSadaf Ebrahimi     }
671*6467f958SSadaf Ebrahimi 
672*6467f958SSadaf Ebrahimi     buffer = (char *)create_random_data( type, d, size );
673*6467f958SSadaf Ebrahimi 
674*6467f958SSadaf Ebrahimi     if( type == kFloat && allocateMem )
675*6467f958SSadaf Ebrahimi     {
676*6467f958SSadaf Ebrahimi         // Re-fill the created buffer to just have [0-1] floats, since that's what it'd expect
677*6467f958SSadaf Ebrahimi         cl_float *p = (cl_float *)buffer;
678*6467f958SSadaf Ebrahimi         for( size_t i = 0; i < size; i++ )
679*6467f958SSadaf Ebrahimi         {
680*6467f958SSadaf Ebrahimi             p[ i ] = (float) genrand_real1( d );
681*6467f958SSadaf Ebrahimi         }
682*6467f958SSadaf Ebrahimi     }
683*6467f958SSadaf Ebrahimi     else if( !allocateMem )
684*6467f958SSadaf Ebrahimi         memset( buffer, 0, size * get_explicit_type_size( type ) );
685*6467f958SSadaf Ebrahimi 
686*6467f958SSadaf Ebrahimi     glGenTextures( 1, outTextureID );
687*6467f958SSadaf Ebrahimi 
688*6467f958SSadaf Ebrahimi     glBindTexture( target, *outTextureID );
689*6467f958SSadaf Ebrahimi     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
690*6467f958SSadaf Ebrahimi     glTexParameteri( target, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
691*6467f958SSadaf Ebrahimi     glTexParameteri( target, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
692*6467f958SSadaf Ebrahimi 
693*6467f958SSadaf Ebrahimi     glGetError();
694*6467f958SSadaf Ebrahimi     glTexImage3D( target, 0, internalFormat, (GLsizei)width, (GLsizei)height, (GLsizei)depth, 0, glFormat, glType, buffer );
695*6467f958SSadaf Ebrahimi     GLenum err = glGetError();
696*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
697*6467f958SSadaf Ebrahimi     {
698*6467f958SSadaf Ebrahimi         if (err != GL_OUT_OF_MEMORY) {
699*6467f958SSadaf Ebrahimi             log_error( "ERROR: Unable to load data into GL texture (%s) format %s type %s internal format %s\n", gluErrorString( err ), GetGLFormatName( glFormat ), get_explicit_type_name( type ), GetGLFormatName( internalFormat ) );
700*6467f958SSadaf Ebrahimi             *outError = -1;
701*6467f958SSadaf Ebrahimi         } else {
702*6467f958SSadaf Ebrahimi             log_info( "WARNING: Unable to load data into GL texture (%s) format %s type %s internal format %s\n", gluErrorString( err ), GetGLFormatName( glFormat ), get_explicit_type_name( type ), GetGLFormatName( internalFormat ) );
703*6467f958SSadaf Ebrahimi             *outError = -2;
704*6467f958SSadaf Ebrahimi         }
705*6467f958SSadaf Ebrahimi         delete [] buffer;
706*6467f958SSadaf Ebrahimi         return NULL;
707*6467f958SSadaf Ebrahimi     }
708*6467f958SSadaf Ebrahimi 
709*6467f958SSadaf Ebrahimi     if( !allocateMem )
710*6467f958SSadaf Ebrahimi     {
711*6467f958SSadaf Ebrahimi         delete [] buffer;
712*6467f958SSadaf Ebrahimi         return NULL;
713*6467f958SSadaf Ebrahimi     }
714*6467f958SSadaf Ebrahimi 
715*6467f958SSadaf Ebrahimi     if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
716*6467f958SSadaf Ebrahimi     {
717*6467f958SSadaf Ebrahimi         // Reverse and reorder to validate since in the
718*6467f958SSadaf Ebrahimi         // kernel the read_imagef() call always returns RGBA
719*6467f958SSadaf Ebrahimi         cl_uchar *p = (cl_uchar *)buffer;
720*6467f958SSadaf Ebrahimi         for( size_t i = 0; i < width * height * depth; i++ )
721*6467f958SSadaf Ebrahimi         {
722*6467f958SSadaf Ebrahimi             cl_uchar uc0 = p[i * 4 + 0];
723*6467f958SSadaf Ebrahimi             cl_uchar uc1 = p[i * 4 + 1];
724*6467f958SSadaf Ebrahimi             cl_uchar uc2 = p[i * 4 + 2];
725*6467f958SSadaf Ebrahimi             cl_uchar uc3 = p[i * 4 + 3];
726*6467f958SSadaf Ebrahimi 
727*6467f958SSadaf Ebrahimi             p[ i * 4 + 0 ] = uc2;
728*6467f958SSadaf Ebrahimi             p[ i * 4 + 1 ] = uc1;
729*6467f958SSadaf Ebrahimi             p[ i * 4 + 2 ] = uc0;
730*6467f958SSadaf Ebrahimi             p[ i * 4 + 3 ] = uc3;
731*6467f958SSadaf Ebrahimi         }
732*6467f958SSadaf Ebrahimi     }
733*6467f958SSadaf Ebrahimi     else if( glType == GL_UNSIGNED_INT_8_8_8_8 && glFormat == GL_BGRA && allocateMem )
734*6467f958SSadaf Ebrahimi     {
735*6467f958SSadaf Ebrahimi       // Reverse and reorder to validate since in the
736*6467f958SSadaf Ebrahimi       // kernel the read_imagef() call always returns RGBA
737*6467f958SSadaf Ebrahimi       cl_uchar *p = (cl_uchar *)buffer;
738*6467f958SSadaf Ebrahimi       for( size_t i = 0; i < width * height * depth; i++ )
739*6467f958SSadaf Ebrahimi       {
740*6467f958SSadaf Ebrahimi         cl_uchar uc0 = p[i * 4 + 0];
741*6467f958SSadaf Ebrahimi         cl_uchar uc1 = p[i * 4 + 1];
742*6467f958SSadaf Ebrahimi         cl_uchar uc2 = p[i * 4 + 2];
743*6467f958SSadaf Ebrahimi         cl_uchar uc3 = p[i * 4 + 3];
744*6467f958SSadaf Ebrahimi 
745*6467f958SSadaf Ebrahimi         p[ i * 4 + 0 ] = uc1;
746*6467f958SSadaf Ebrahimi         p[ i * 4 + 1 ] = uc2;
747*6467f958SSadaf Ebrahimi         p[ i * 4 + 2 ] = uc3;
748*6467f958SSadaf Ebrahimi         p[ i * 4 + 3 ] = uc0;
749*6467f958SSadaf Ebrahimi       }
750*6467f958SSadaf Ebrahimi     }
751*6467f958SSadaf Ebrahimi 
752*6467f958SSadaf Ebrahimi     return buffer;
753*6467f958SSadaf Ebrahimi }
754*6467f958SSadaf Ebrahimi 
ReadGLTexture(GLenum glTarget,GLuint glTexture,GLuint glBuf,GLint width,GLenum glFormat,GLenum glInternalFormat,GLenum glType,ExplicitType typeToReadAs,size_t outWidth,size_t outHeight)755*6467f958SSadaf Ebrahimi void * ReadGLTexture( GLenum glTarget, GLuint glTexture, GLuint glBuf, GLint width,
756*6467f958SSadaf Ebrahimi                         GLenum glFormat, GLenum glInternalFormat,
757*6467f958SSadaf Ebrahimi                         GLenum glType, ExplicitType typeToReadAs,
758*6467f958SSadaf Ebrahimi                         size_t outWidth, size_t outHeight )
759*6467f958SSadaf Ebrahimi {
760*6467f958SSadaf Ebrahimi     // Read results from the GL texture
761*6467f958SSadaf Ebrahimi     glBindTexture(get_base_gl_target(glTarget), glTexture);
762*6467f958SSadaf Ebrahimi 
763*6467f958SSadaf Ebrahimi     GLint realWidth, realHeight, realDepth;
764*6467f958SSadaf Ebrahimi     glGetTexLevelParameteriv( glTarget, 0, GL_TEXTURE_WIDTH, &realWidth );
765*6467f958SSadaf Ebrahimi     glGetTexLevelParameteriv( glTarget, 0, GL_TEXTURE_HEIGHT, &realHeight );
766*6467f958SSadaf Ebrahimi     glGetTexLevelParameteriv( glTarget, 0, GL_TEXTURE_DEPTH, &realDepth );
767*6467f958SSadaf Ebrahimi 
768*6467f958SSadaf Ebrahimi     realDepth = (realDepth) ? realDepth : 1;
769*6467f958SSadaf Ebrahimi 
770*6467f958SSadaf Ebrahimi     GLint realInternalFormat;
771*6467f958SSadaf Ebrahimi     glGetTexLevelParameteriv( glTarget, 0, GL_TEXTURE_INTERNAL_FORMAT, &realInternalFormat );
772*6467f958SSadaf Ebrahimi 
773*6467f958SSadaf Ebrahimi #ifdef DEBUG
774*6467f958SSadaf Ebrahimi     log_info( "- Reading back from GL: %d x %d : %s : %s : %s : %s (stored as %s)\n",
775*6467f958SSadaf Ebrahimi         realWidth, realHeight,
776*6467f958SSadaf Ebrahimi         GetGLTargetName( glTarget),
777*6467f958SSadaf Ebrahimi         GetGLFormatName( glInternalFormat ),
778*6467f958SSadaf Ebrahimi         GetGLFormatName( glFormat ),
779*6467f958SSadaf Ebrahimi         GetGLTypeName( glType ),
780*6467f958SSadaf Ebrahimi         GetGLFormatName( realInternalFormat ));
781*6467f958SSadaf Ebrahimi #endif
782*6467f958SSadaf Ebrahimi 
783*6467f958SSadaf Ebrahimi     GLenum readBackFormat;
784*6467f958SSadaf Ebrahimi     switch(glFormat)
785*6467f958SSadaf Ebrahimi     {
786*6467f958SSadaf Ebrahimi     case GL_RGBA_INTEGER_EXT:
787*6467f958SSadaf Ebrahimi       readBackFormat = GL_RGBA_INTEGER_EXT;
788*6467f958SSadaf Ebrahimi       break;
789*6467f958SSadaf Ebrahimi     case GL_DEPTH_COMPONENT:
790*6467f958SSadaf Ebrahimi       readBackFormat = GL_DEPTH_COMPONENT;
791*6467f958SSadaf Ebrahimi       break;
792*6467f958SSadaf Ebrahimi     case GL_DEPTH_STENCIL:
793*6467f958SSadaf Ebrahimi       readBackFormat = GL_DEPTH_STENCIL;
794*6467f958SSadaf Ebrahimi       break;
795*6467f958SSadaf Ebrahimi     default:
796*6467f958SSadaf Ebrahimi       readBackFormat = GL_RGBA;
797*6467f958SSadaf Ebrahimi       break;
798*6467f958SSadaf Ebrahimi     }
799*6467f958SSadaf Ebrahimi 
800*6467f958SSadaf Ebrahimi     GLenum readBackType;
801*6467f958SSadaf Ebrahimi     switch (glType) {
802*6467f958SSadaf Ebrahimi #ifdef __APPLE__
803*6467f958SSadaf Ebrahimi       case GL_UNSIGNED_INT_8_8_8_8:
804*6467f958SSadaf Ebrahimi       case GL_UNSIGNED_INT_8_8_8_8_REV:
805*6467f958SSadaf Ebrahimi         readBackType = GL_UNSIGNED_BYTE;
806*6467f958SSadaf Ebrahimi         break;
807*6467f958SSadaf Ebrahimi #endif
808*6467f958SSadaf Ebrahimi       case GL_HALF_FLOAT:
809*6467f958SSadaf Ebrahimi       case GL_UNSIGNED_BYTE:
810*6467f958SSadaf Ebrahimi       case GL_UNSIGNED_SHORT:
811*6467f958SSadaf Ebrahimi       case GL_UNSIGNED_INT:
812*6467f958SSadaf Ebrahimi       case GL_BYTE:
813*6467f958SSadaf Ebrahimi       case GL_SHORT:
814*6467f958SSadaf Ebrahimi       case GL_INT:
815*6467f958SSadaf Ebrahimi       case GL_FLOAT:
816*6467f958SSadaf Ebrahimi       default:
817*6467f958SSadaf Ebrahimi         readBackType = glType;
818*6467f958SSadaf Ebrahimi     }
819*6467f958SSadaf Ebrahimi 
820*6467f958SSadaf Ebrahimi     size_t outBytes;
821*6467f958SSadaf Ebrahimi     if (get_base_gl_target(glTarget) != GL_TEXTURE_BUFFER) {
822*6467f958SSadaf Ebrahimi         outBytes = realWidth * realHeight * realDepth * 4
823*6467f958SSadaf Ebrahimi           * GetGLTypeSize(readBackType);
824*6467f958SSadaf Ebrahimi     }
825*6467f958SSadaf Ebrahimi     else {
826*6467f958SSadaf Ebrahimi         outBytes = width * 4;
827*6467f958SSadaf Ebrahimi 
828*6467f958SSadaf Ebrahimi         outBytes *= ( GetGLTypeSize( GetGLTypeForExplicitType(typeToReadAs) ) );
829*6467f958SSadaf Ebrahimi     }
830*6467f958SSadaf Ebrahimi 
831*6467f958SSadaf Ebrahimi     cl_char *outBuffer = (cl_char *)malloc( outBytes );
832*6467f958SSadaf Ebrahimi     memset(outBuffer, 0, outBytes);
833*6467f958SSadaf Ebrahimi 
834*6467f958SSadaf Ebrahimi     if (get_base_gl_target(glTarget) != GL_TEXTURE_BUFFER) {
835*6467f958SSadaf Ebrahimi         //the default alignment in OpenGL is 4 bytes and need to be changed for GL_DEPTH_COMPONENT16 which is aligned to 2 bytes
836*6467f958SSadaf Ebrahimi         if (realInternalFormat == GL_DEPTH_COMPONENT16)
837*6467f958SSadaf Ebrahimi           glPixelStorei(GL_PACK_ALIGNMENT, 2);
838*6467f958SSadaf Ebrahimi 
839*6467f958SSadaf Ebrahimi         glGetTexImage( glTarget, 0, readBackFormat, readBackType, outBuffer );
840*6467f958SSadaf Ebrahimi 
841*6467f958SSadaf Ebrahimi         if (realInternalFormat == GL_DEPTH_COMPONENT16)
842*6467f958SSadaf Ebrahimi           glPixelStorei(GL_PACK_ALIGNMENT, 4);
843*6467f958SSadaf Ebrahimi     }
844*6467f958SSadaf Ebrahimi     else {
845*6467f958SSadaf Ebrahimi         glBindBuffer(GL_ARRAY_BUFFER, glBuf);
846*6467f958SSadaf Ebrahimi         glGetBufferSubData(GL_ARRAY_BUFFER, 0, outBytes, outBuffer);
847*6467f958SSadaf Ebrahimi     }
848*6467f958SSadaf Ebrahimi 
849*6467f958SSadaf Ebrahimi #ifdef DEBUG
850*6467f958SSadaf Ebrahimi 
851*6467f958SSadaf Ebrahimi     log_info( "- glGetTexImage: %s : %s : %s \n",
852*6467f958SSadaf Ebrahimi         GetGLTargetName( glTarget),
853*6467f958SSadaf Ebrahimi         GetGLFormatName(readBackFormat),
854*6467f958SSadaf Ebrahimi         GetGLTypeName(readBackType));
855*6467f958SSadaf Ebrahimi 
856*6467f958SSadaf Ebrahimi     DumpGLBuffer(readBackType, realWidth, realHeight, (void*)outBuffer);
857*6467f958SSadaf Ebrahimi 
858*6467f958SSadaf Ebrahimi #endif
859*6467f958SSadaf Ebrahimi 
860*6467f958SSadaf Ebrahimi     return (void *)outBuffer;
861*6467f958SSadaf Ebrahimi }
862*6467f958SSadaf Ebrahimi 
CreateGLRenderbufferRaw(GLsizei width,GLsizei height,GLenum attachment,GLenum glFormat,GLenum internalFormat,GLenum glType,GLuint * outFramebuffer,GLuint * outRenderbuffer)863*6467f958SSadaf Ebrahimi int CreateGLRenderbufferRaw( GLsizei width, GLsizei height,
864*6467f958SSadaf Ebrahimi                             GLenum attachment, GLenum glFormat,
865*6467f958SSadaf Ebrahimi                             GLenum internalFormat, GLenum glType,
866*6467f958SSadaf Ebrahimi                             GLuint *outFramebuffer,
867*6467f958SSadaf Ebrahimi                             GLuint *outRenderbuffer )
868*6467f958SSadaf Ebrahimi {
869*6467f958SSadaf Ebrahimi     GLenum err = 0;
870*6467f958SSadaf Ebrahimi 
871*6467f958SSadaf Ebrahimi     // Generate a renderbuffer and bind
872*6467f958SSadaf Ebrahimi     glGenRenderbuffersEXT( 1, outRenderbuffer );
873*6467f958SSadaf Ebrahimi     glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, *outRenderbuffer );
874*6467f958SSadaf Ebrahimi 
875*6467f958SSadaf Ebrahimi     // Allocate storage to the renderbuffer
876*6467f958SSadaf Ebrahimi     glGetError();
877*6467f958SSadaf Ebrahimi     glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, internalFormat, (GLsizei)width,  (GLsizei)height );
878*6467f958SSadaf Ebrahimi     err = glGetError();
879*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
880*6467f958SSadaf Ebrahimi     {
881*6467f958SSadaf Ebrahimi         log_error("Failed to allocate render buffer storage!\n");
882*6467f958SSadaf Ebrahimi         return 1701;
883*6467f958SSadaf Ebrahimi     }
884*6467f958SSadaf Ebrahimi 
885*6467f958SSadaf Ebrahimi     GLint realInternalFormat;
886*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_INTERNAL_FORMAT_EXT, &realInternalFormat );
887*6467f958SSadaf Ebrahimi     internalFormat = realInternalFormat;
888*6467f958SSadaf Ebrahimi 
889*6467f958SSadaf Ebrahimi #ifdef DEBUG
890*6467f958SSadaf Ebrahimi     GLint rsize, gsize, bsize, asize;
891*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_RED_SIZE_EXT,&rsize);
892*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_GREEN_SIZE_EXT,&gsize);
893*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_BLUE_SIZE_EXT,&bsize);
894*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_ALPHA_SIZE_EXT,&asize);
895*6467f958SSadaf Ebrahimi 
896*6467f958SSadaf Ebrahimi     log_info("Renderbuffer internal format requested: %s actual: %s sizes: r=%d g=%d b=%d a=%d\n",
897*6467f958SSadaf Ebrahimi              GetGLFormatName( internalFormat ), GetGLFormatName( realInternalFormat ),
898*6467f958SSadaf Ebrahimi              rsize, gsize, bsize, asize );
899*6467f958SSadaf Ebrahimi #endif
900*6467f958SSadaf Ebrahimi 
901*6467f958SSadaf Ebrahimi     // Create and bind a framebuffer to render with
902*6467f958SSadaf Ebrahimi     glGenFramebuffersEXT( 1, outFramebuffer );
903*6467f958SSadaf Ebrahimi     glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, *outFramebuffer );
904*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
905*6467f958SSadaf Ebrahimi     {
906*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to bind framebuffer : Error %s\n",
907*6467f958SSadaf Ebrahimi                   gluErrorString( err ));
908*6467f958SSadaf Ebrahimi 
909*6467f958SSadaf Ebrahimi         return -1;
910*6467f958SSadaf Ebrahimi     }
911*6467f958SSadaf Ebrahimi 
912*6467f958SSadaf Ebrahimi     // Attach to the framebuffer
913*6467f958SSadaf Ebrahimi     glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, *outRenderbuffer );
914*6467f958SSadaf Ebrahimi     err = glGetError();
915*6467f958SSadaf Ebrahimi     GLint status = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
916*6467f958SSadaf Ebrahimi     if( status != GL_FRAMEBUFFER_COMPLETE_EXT )
917*6467f958SSadaf Ebrahimi     {
918*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to attach renderbuffer to framebuffer (%s, status %x)\n", gluErrorString( err ), (int)status );
919*6467f958SSadaf Ebrahimi         return -1;
920*6467f958SSadaf Ebrahimi     }
921*6467f958SSadaf Ebrahimi 
922*6467f958SSadaf Ebrahimi     return 0;
923*6467f958SSadaf Ebrahimi }
924*6467f958SSadaf Ebrahimi 
925*6467f958SSadaf Ebrahimi 
reorder_verification_buffer(GLenum glFormat,GLenum glType,char * buffer,size_t num_pixels)926*6467f958SSadaf Ebrahimi void reorder_verification_buffer(GLenum glFormat, GLenum glType, char* buffer, size_t num_pixels)
927*6467f958SSadaf Ebrahimi {
928*6467f958SSadaf Ebrahimi   if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA)
929*6467f958SSadaf Ebrahimi   {
930*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
931*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
932*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
933*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < num_pixels; i++ )
934*6467f958SSadaf Ebrahimi     {
935*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
936*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
937*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
938*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
939*6467f958SSadaf Ebrahimi 
940*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc2;
941*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc1;
942*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc0;
943*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc3;
944*6467f958SSadaf Ebrahimi     }
945*6467f958SSadaf Ebrahimi   }
946*6467f958SSadaf Ebrahimi   else if( glType == GL_UNSIGNED_INT_8_8_8_8 && glFormat == GL_BGRA)
947*6467f958SSadaf Ebrahimi   {
948*6467f958SSadaf Ebrahimi     // Reverse and reorder to validate since in the
949*6467f958SSadaf Ebrahimi     // kernel the read_imagef() call always returns RGBA
950*6467f958SSadaf Ebrahimi     cl_uchar *p = (cl_uchar *)buffer;
951*6467f958SSadaf Ebrahimi     for( size_t i = 0; i < num_pixels; i++ )
952*6467f958SSadaf Ebrahimi     {
953*6467f958SSadaf Ebrahimi       cl_uchar uc0 = p[i * 4 + 0];
954*6467f958SSadaf Ebrahimi       cl_uchar uc1 = p[i * 4 + 1];
955*6467f958SSadaf Ebrahimi       cl_uchar uc2 = p[i * 4 + 2];
956*6467f958SSadaf Ebrahimi       cl_uchar uc3 = p[i * 4 + 3];
957*6467f958SSadaf Ebrahimi 
958*6467f958SSadaf Ebrahimi       p[ i * 4 + 0 ] = uc1;
959*6467f958SSadaf Ebrahimi       p[ i * 4 + 1 ] = uc2;
960*6467f958SSadaf Ebrahimi       p[ i * 4 + 2 ] = uc3;
961*6467f958SSadaf Ebrahimi       p[ i * 4 + 3 ] = uc0;
962*6467f958SSadaf Ebrahimi     }
963*6467f958SSadaf Ebrahimi   }
964*6467f958SSadaf Ebrahimi }
965*6467f958SSadaf Ebrahimi 
966*6467f958SSadaf Ebrahimi 
967*6467f958SSadaf Ebrahimi #ifdef GL_VERSION_3_2
968*6467f958SSadaf Ebrahimi 
969*6467f958SSadaf Ebrahimi #define CHECK_GL_ERROR()                                                       \
970*6467f958SSadaf Ebrahimi     {                                                                          \
971*6467f958SSadaf Ebrahimi         GLenum errnom = GL_NO_ERROR;                                           \
972*6467f958SSadaf Ebrahimi         if ((errnom = glGetError()) != GL_NO_ERROR)                            \
973*6467f958SSadaf Ebrahimi             log_error("GL Error: 0x%04X at %s:%d\n", errnom, __FILE__,         \
974*6467f958SSadaf Ebrahimi                       __LINE__);                                               \
975*6467f958SSadaf Ebrahimi     }
976*6467f958SSadaf Ebrahimi 
get_gl_vector_type(GLenum internalformat)977*6467f958SSadaf Ebrahimi const char *get_gl_vector_type( GLenum internalformat )
978*6467f958SSadaf Ebrahimi {
979*6467f958SSadaf Ebrahimi   switch (internalformat) {
980*6467f958SSadaf Ebrahimi   case GL_RGBA8:
981*6467f958SSadaf Ebrahimi   case GL_RGBA16:
982*6467f958SSadaf Ebrahimi   case GL_RGBA32F_ARB:
983*6467f958SSadaf Ebrahimi   case GL_RGBA16F_ARB:
984*6467f958SSadaf Ebrahimi   case GL_DEPTH_COMPONENT16:
985*6467f958SSadaf Ebrahimi   case GL_DEPTH_COMPONENT32F:
986*6467f958SSadaf Ebrahimi   case GL_DEPTH24_STENCIL8:
987*6467f958SSadaf Ebrahimi   case GL_DEPTH32F_STENCIL8:
988*6467f958SSadaf Ebrahimi     return "vec4";
989*6467f958SSadaf Ebrahimi     break;
990*6467f958SSadaf Ebrahimi   case GL_RGBA8I_EXT:
991*6467f958SSadaf Ebrahimi   case GL_RGBA16I_EXT:
992*6467f958SSadaf Ebrahimi   case GL_RGBA32I_EXT:
993*6467f958SSadaf Ebrahimi     return "ivec4";
994*6467f958SSadaf Ebrahimi     break;
995*6467f958SSadaf Ebrahimi   case GL_RGBA8UI_EXT:
996*6467f958SSadaf Ebrahimi   case GL_RGBA16UI_EXT:
997*6467f958SSadaf Ebrahimi   case GL_RGBA32UI_EXT:
998*6467f958SSadaf Ebrahimi     return "uvec4";
999*6467f958SSadaf Ebrahimi     break;
1000*6467f958SSadaf Ebrahimi   default:
1001*6467f958SSadaf Ebrahimi     log_error("Test error: unsupported data type\n");
1002*6467f958SSadaf Ebrahimi     return "";
1003*6467f958SSadaf Ebrahimi     break;
1004*6467f958SSadaf Ebrahimi   }
1005*6467f958SSadaf Ebrahimi }
1006*6467f958SSadaf Ebrahimi 
get_gl_data_type(GLenum internalformat)1007*6467f958SSadaf Ebrahimi const char *get_gl_data_type( GLenum internalformat )
1008*6467f958SSadaf Ebrahimi {
1009*6467f958SSadaf Ebrahimi   switch (internalformat) {
1010*6467f958SSadaf Ebrahimi   case GL_RGBA8:
1011*6467f958SSadaf Ebrahimi   case GL_RGBA16:
1012*6467f958SSadaf Ebrahimi   case GL_RGBA32F_ARB:
1013*6467f958SSadaf Ebrahimi   case GL_RGBA16F_ARB:
1014*6467f958SSadaf Ebrahimi   case GL_DEPTH_COMPONENT16:
1015*6467f958SSadaf Ebrahimi   case GL_DEPTH_COMPONENT32F:
1016*6467f958SSadaf Ebrahimi   case GL_DEPTH24_STENCIL8:
1017*6467f958SSadaf Ebrahimi   case GL_DEPTH32F_STENCIL8:
1018*6467f958SSadaf Ebrahimi     return "float";
1019*6467f958SSadaf Ebrahimi     break;
1020*6467f958SSadaf Ebrahimi   case GL_RGBA8I_EXT:
1021*6467f958SSadaf Ebrahimi   case GL_RGBA16I_EXT:
1022*6467f958SSadaf Ebrahimi   case GL_RGBA32I_EXT:
1023*6467f958SSadaf Ebrahimi     return "int";
1024*6467f958SSadaf Ebrahimi     break;
1025*6467f958SSadaf Ebrahimi   case GL_RGBA8UI_EXT:
1026*6467f958SSadaf Ebrahimi   case GL_RGBA16UI_EXT:
1027*6467f958SSadaf Ebrahimi   case GL_RGBA32UI_EXT:
1028*6467f958SSadaf Ebrahimi     return "uint";
1029*6467f958SSadaf Ebrahimi     break;
1030*6467f958SSadaf Ebrahimi   default:
1031*6467f958SSadaf Ebrahimi     log_error("Test error: unsupported data type\n");
1032*6467f958SSadaf Ebrahimi     return "";
1033*6467f958SSadaf Ebrahimi     break;
1034*6467f958SSadaf Ebrahimi   }
1035*6467f958SSadaf Ebrahimi }
1036*6467f958SSadaf Ebrahimi 
1037*6467f958SSadaf Ebrahimi 
CreateGLTexture2DMultisample(size_t width,size_t height,size_t samples,GLenum target,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outTextureID,int * outError,bool allocateMem,MTdata d,bool fixedSampleLocations)1038*6467f958SSadaf Ebrahimi void * CreateGLTexture2DMultisample( size_t width, size_t height, size_t samples,
1039*6467f958SSadaf Ebrahimi                                     GLenum target, GLenum glFormat,
1040*6467f958SSadaf Ebrahimi                                     GLenum internalFormat, GLenum glType,
1041*6467f958SSadaf Ebrahimi                                     ExplicitType type, GLuint *outTextureID,
1042*6467f958SSadaf Ebrahimi                                     int *outError, bool allocateMem, MTdata d , bool fixedSampleLocations)
1043*6467f958SSadaf Ebrahimi {
1044*6467f958SSadaf Ebrahimi   // This function creates a multisample texture and renders into each sample
1045*6467f958SSadaf Ebrahimi   // using a GLSL shader
1046*6467f958SSadaf Ebrahimi 
1047*6467f958SSadaf Ebrahimi   // Check if the renderer supports enough samples
1048*6467f958SSadaf Ebrahimi   GLint max_samples = get_gl_max_samples(target, internalFormat);
1049*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1050*6467f958SSadaf Ebrahimi 
1051*6467f958SSadaf Ebrahimi   if (max_samples < (GLint)samples)
1052*6467f958SSadaf Ebrahimi       log_error("GL error: requested samples (%zu) exceeds renderer max "
1053*6467f958SSadaf Ebrahimi                 "samples (%d)\n",
1054*6467f958SSadaf Ebrahimi                 samples, max_samples);
1055*6467f958SSadaf Ebrahimi 
1056*6467f958SSadaf Ebrahimi   // Setup the GLSL program
1057*6467f958SSadaf Ebrahimi   const GLchar *vertex_source =
1058*6467f958SSadaf Ebrahimi   "#version 140\n"
1059*6467f958SSadaf Ebrahimi   "in vec4 att0;\n"
1060*6467f958SSadaf Ebrahimi   "void main (void) {\n"
1061*6467f958SSadaf Ebrahimi   " gl_Position = vec4(att0.xy,0.0,1.0);\n"
1062*6467f958SSadaf Ebrahimi   "}\n";
1063*6467f958SSadaf Ebrahimi 
1064*6467f958SSadaf Ebrahimi   const GLchar *fragmentSource =
1065*6467f958SSadaf Ebrahimi   "#version 140\n"
1066*6467f958SSadaf Ebrahimi     "out %s out0;\n"
1067*6467f958SSadaf Ebrahimi     "uniform %s colorVal;\n"
1068*6467f958SSadaf Ebrahimi     "uniform float depthVal;\n"
1069*6467f958SSadaf Ebrahimi   "void main (void) {\n"
1070*6467f958SSadaf Ebrahimi     "    out0 = %s(colorVal);\n"
1071*6467f958SSadaf Ebrahimi     " gl_FragDepth = depthVal;\n"
1072*6467f958SSadaf Ebrahimi   "}\n";
1073*6467f958SSadaf Ebrahimi 
1074*6467f958SSadaf Ebrahimi   GLchar fragmentShader[256];
1075*6467f958SSadaf Ebrahimi   sprintf(fragmentShader, fragmentSource, get_gl_vector_type(internalFormat), get_gl_data_type(internalFormat), get_gl_vector_type(internalFormat));
1076*6467f958SSadaf Ebrahimi   const GLchar *fragment_source = &fragmentShader[0];
1077*6467f958SSadaf Ebrahimi 
1078*6467f958SSadaf Ebrahimi   glShaderWrapper vertex_shader = glCreateShader(GL_VERTEX_SHADER);
1079*6467f958SSadaf Ebrahimi   glShaderSource(vertex_shader, 1, &vertex_source, NULL);
1080*6467f958SSadaf Ebrahimi   glCompileShader(vertex_shader);
1081*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1082*6467f958SSadaf Ebrahimi 
1083*6467f958SSadaf Ebrahimi   glShaderWrapper fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
1084*6467f958SSadaf Ebrahimi   glShaderSource(fragment_shader, 1, &fragment_source, NULL);
1085*6467f958SSadaf Ebrahimi   glCompileShader(fragment_shader);
1086*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1087*6467f958SSadaf Ebrahimi 
1088*6467f958SSadaf Ebrahimi   GLuint prog = glCreateProgram();
1089*6467f958SSadaf Ebrahimi   glAttachShader(prog, vertex_shader);
1090*6467f958SSadaf Ebrahimi   glAttachShader(prog, fragment_shader);
1091*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1092*6467f958SSadaf Ebrahimi 
1093*6467f958SSadaf Ebrahimi   glBindAttribLocation(prog, 0, "att0");
1094*6467f958SSadaf Ebrahimi   glLinkProgram(prog);
1095*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1096*6467f958SSadaf Ebrahimi 
1097*6467f958SSadaf Ebrahimi   // Setup the FBO and texture
1098*6467f958SSadaf Ebrahimi   glFramebufferWrapper fbo;
1099*6467f958SSadaf Ebrahimi   glGenFramebuffers(1, &fbo);
1100*6467f958SSadaf Ebrahimi   glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1101*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1102*6467f958SSadaf Ebrahimi 
1103*6467f958SSadaf Ebrahimi   glViewport(0, 0, width, height);
1104*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1105*6467f958SSadaf Ebrahimi 
1106*6467f958SSadaf Ebrahimi   GLuint tex = 0;
1107*6467f958SSadaf Ebrahimi   glGenTextures(1, &tex);
1108*6467f958SSadaf Ebrahimi   glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
1109*6467f958SSadaf Ebrahimi   glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, internalFormat, width, height, fixedSampleLocations);
1110*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1111*6467f958SSadaf Ebrahimi 
1112*6467f958SSadaf Ebrahimi   GLint attachment;
1113*6467f958SSadaf Ebrahimi   switch (internalFormat) {
1114*6467f958SSadaf Ebrahimi     case GL_DEPTH_COMPONENT16:
1115*6467f958SSadaf Ebrahimi     case GL_DEPTH_COMPONENT32F:
1116*6467f958SSadaf Ebrahimi     attachment = GL_DEPTH_ATTACHMENT;
1117*6467f958SSadaf Ebrahimi     break;
1118*6467f958SSadaf Ebrahimi     case GL_DEPTH24_STENCIL8:
1119*6467f958SSadaf Ebrahimi     case GL_DEPTH32F_STENCIL8:
1120*6467f958SSadaf Ebrahimi     attachment = GL_DEPTH_STENCIL_ATTACHMENT;
1121*6467f958SSadaf Ebrahimi       break;
1122*6467f958SSadaf Ebrahimi     default:
1123*6467f958SSadaf Ebrahimi     attachment = GL_COLOR_ATTACHMENT0;
1124*6467f958SSadaf Ebrahimi       break;
1125*6467f958SSadaf Ebrahimi   }
1126*6467f958SSadaf Ebrahimi 
1127*6467f958SSadaf Ebrahimi   glFramebufferTexture(GL_FRAMEBUFFER, attachment, tex, 0);
1128*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1129*6467f958SSadaf Ebrahimi 
1130*6467f958SSadaf Ebrahimi   GLint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1131*6467f958SSadaf Ebrahimi   if (status == GL_FRAMEBUFFER_UNSUPPORTED) {
1132*6467f958SSadaf Ebrahimi     log_info("GL status: GL_FRAMEBUFFER_UNSUPPORTED format %s multisample is not supported\n", GetGLFormatName(internalFormat));
1133*6467f958SSadaf Ebrahimi     *outTextureID = 0;
1134*6467f958SSadaf Ebrahimi     *outError = GL_FRAMEBUFFER_UNSUPPORTED;
1135*6467f958SSadaf Ebrahimi     return NULL;
1136*6467f958SSadaf Ebrahimi   }
1137*6467f958SSadaf Ebrahimi 
1138*6467f958SSadaf Ebrahimi   if (status != GL_FRAMEBUFFER_COMPLETE) {
1139*6467f958SSadaf Ebrahimi     log_error("GL error: framebuffer incomplete status 0x%04X\n",status);
1140*6467f958SSadaf Ebrahimi     *outTextureID = 0;
1141*6467f958SSadaf Ebrahimi     *outError = status;
1142*6467f958SSadaf Ebrahimi     return NULL;
1143*6467f958SSadaf Ebrahimi   }
1144*6467f958SSadaf Ebrahimi 
1145*6467f958SSadaf Ebrahimi   // Check if the framebuffer supports enough samples
1146*6467f958SSadaf Ebrahimi   GLint fbo_samples = 0;
1147*6467f958SSadaf Ebrahimi   glGetIntegerv(GL_SAMPLES, &fbo_samples);
1148*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR();
1149*6467f958SSadaf Ebrahimi 
1150*6467f958SSadaf Ebrahimi   if (fbo_samples < (GLint)samples)
1151*6467f958SSadaf Ebrahimi       log_error(
1152*6467f958SSadaf Ebrahimi           "GL Error: requested samples (%zu) exceeds FBO capability (%d)\n",
1153*6467f958SSadaf Ebrahimi           samples, fbo_samples);
1154*6467f958SSadaf Ebrahimi 
1155*6467f958SSadaf Ebrahimi   glUseProgram(prog);
1156*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1157*6467f958SSadaf Ebrahimi 
1158*6467f958SSadaf Ebrahimi   if (attachment != GL_DEPTH_ATTACHMENT && attachment != GL_DEPTH_STENCIL_ATTACHMENT) {
1159*6467f958SSadaf Ebrahimi     glDisable(GL_DEPTH_TEST);
1160*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR()
1161*6467f958SSadaf Ebrahimi   }
1162*6467f958SSadaf Ebrahimi   else {
1163*6467f958SSadaf Ebrahimi     glEnable(GL_DEPTH_TEST);
1164*6467f958SSadaf Ebrahimi     glDepthFunc(GL_ALWAYS);
1165*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR()
1166*6467f958SSadaf Ebrahimi   }
1167*6467f958SSadaf Ebrahimi 
1168*6467f958SSadaf Ebrahimi   // Setup the VBO for rendering a quad
1169*6467f958SSadaf Ebrahimi   GLfloat quad[] = {
1170*6467f958SSadaf Ebrahimi     -1.0f, -1.0f,
1171*6467f958SSadaf Ebrahimi     1.0f, -1.0f,
1172*6467f958SSadaf Ebrahimi     1.0f,  1.0f,
1173*6467f958SSadaf Ebrahimi     -1.0f,  1.0f
1174*6467f958SSadaf Ebrahimi   };
1175*6467f958SSadaf Ebrahimi 
1176*6467f958SSadaf Ebrahimi   glBufferWrapper vbo;
1177*6467f958SSadaf Ebrahimi   glGenBuffers(1, &vbo);
1178*6467f958SSadaf Ebrahimi   glBindBuffer(GL_ARRAY_BUFFER, vbo);
1179*6467f958SSadaf Ebrahimi   glBufferData(GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STREAM_DRAW);
1180*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1181*6467f958SSadaf Ebrahimi 
1182*6467f958SSadaf Ebrahimi   glVertexArraysWrapper vao;
1183*6467f958SSadaf Ebrahimi   glGenVertexArrays(1, &vao);
1184*6467f958SSadaf Ebrahimi   glBindVertexArray(vao);
1185*6467f958SSadaf Ebrahimi   glEnableVertexAttribArray(0);
1186*6467f958SSadaf Ebrahimi   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*2, 0);
1187*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1188*6467f958SSadaf Ebrahimi 
1189*6467f958SSadaf Ebrahimi   //clearing color and depth buffer
1190*6467f958SSadaf Ebrahimi   glClearColor(0, 0, 0, 0);
1191*6467f958SSadaf Ebrahimi   glClear(GL_COLOR_BUFFER_BIT);
1192*6467f958SSadaf Ebrahimi   glClearDepth(1.0);
1193*6467f958SSadaf Ebrahimi   glClear(GL_DEPTH_BUFFER_BIT);
1194*6467f958SSadaf Ebrahimi 
1195*6467f958SSadaf Ebrahimi   //calculating colors
1196*6467f958SSadaf Ebrahimi   double color_delta = 1.0 / samples;
1197*6467f958SSadaf Ebrahimi   double color = color_delta;
1198*6467f958SSadaf Ebrahimi 
1199*6467f958SSadaf Ebrahimi   glEnable(GL_SAMPLE_MASK);
1200*6467f958SSadaf Ebrahimi   for (size_t i=0;i!=samples;++i) {
1201*6467f958SSadaf Ebrahimi     glSampleMaski(0, 1<<i);
1202*6467f958SSadaf Ebrahimi     GLint colorUniformLocation = glGetUniformLocation(prog, "colorVal");
1203*6467f958SSadaf Ebrahimi     switch (internalFormat) {
1204*6467f958SSadaf Ebrahimi     case GL_RGBA8I_EXT:
1205*6467f958SSadaf Ebrahimi       glUniform1i(colorUniformLocation, color * 0x7f);
1206*6467f958SSadaf Ebrahimi       break;
1207*6467f958SSadaf Ebrahimi     case GL_RGBA16I_EXT:
1208*6467f958SSadaf Ebrahimi       glUniform1i(colorUniformLocation, color * 0x7fff);
1209*6467f958SSadaf Ebrahimi       break;
1210*6467f958SSadaf Ebrahimi     case GL_RGBA32I_EXT:
1211*6467f958SSadaf Ebrahimi       glUniform1i(colorUniformLocation, color * 0x7fffffff);
1212*6467f958SSadaf Ebrahimi       break;
1213*6467f958SSadaf Ebrahimi     case GL_RGBA8UI_EXT:
1214*6467f958SSadaf Ebrahimi       glUniform1ui(colorUniformLocation, color * 0xff);
1215*6467f958SSadaf Ebrahimi       break;
1216*6467f958SSadaf Ebrahimi     case GL_RGBA16UI_EXT:
1217*6467f958SSadaf Ebrahimi       glUniform1ui(colorUniformLocation, color * 0xffff);
1218*6467f958SSadaf Ebrahimi       break;
1219*6467f958SSadaf Ebrahimi     case GL_RGBA32UI_EXT:
1220*6467f958SSadaf Ebrahimi       glUniform1ui(colorUniformLocation, color * 0xffffffff);
1221*6467f958SSadaf Ebrahimi       break;
1222*6467f958SSadaf Ebrahimi     default:
1223*6467f958SSadaf Ebrahimi       glUniform1f(colorUniformLocation, color);
1224*6467f958SSadaf Ebrahimi       break;
1225*6467f958SSadaf Ebrahimi     }
1226*6467f958SSadaf Ebrahimi 
1227*6467f958SSadaf Ebrahimi     glUniform1f(glGetUniformLocation(prog, "depthVal"), color);
1228*6467f958SSadaf Ebrahimi     color += color_delta;
1229*6467f958SSadaf Ebrahimi 
1230*6467f958SSadaf Ebrahimi     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
1231*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR();
1232*6467f958SSadaf Ebrahimi 
1233*6467f958SSadaf Ebrahimi     glFlush();
1234*6467f958SSadaf Ebrahimi   }
1235*6467f958SSadaf Ebrahimi 
1236*6467f958SSadaf Ebrahimi   glDisable(GL_SAMPLE_MASK);
1237*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR();
1238*6467f958SSadaf Ebrahimi 
1239*6467f958SSadaf Ebrahimi   *outTextureID = tex;
1240*6467f958SSadaf Ebrahimi 
1241*6467f958SSadaf Ebrahimi   // Create an output buffer containing the expected results.
1242*6467f958SSadaf Ebrahimi   unsigned int size = 0;
1243*6467f958SSadaf Ebrahimi   if ( glType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV )
1244*6467f958SSadaf Ebrahimi   {
1245*6467f958SSadaf Ebrahimi     size = width * height * 2;
1246*6467f958SSadaf Ebrahimi   }
1247*6467f958SSadaf Ebrahimi   else if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) || (attachment == GL_DEPTH_ATTACHMENT) || (attachment == GL_DEPTH_STENCIL_ATTACHMENT))
1248*6467f958SSadaf Ebrahimi   {
1249*6467f958SSadaf Ebrahimi     size = width * height;
1250*6467f958SSadaf Ebrahimi   }
1251*6467f958SSadaf Ebrahimi   else
1252*6467f958SSadaf Ebrahimi   {
1253*6467f958SSadaf Ebrahimi     size = width * height * 4;
1254*6467f958SSadaf Ebrahimi   }
1255*6467f958SSadaf Ebrahimi 
1256*6467f958SSadaf Ebrahimi   char *data = (char *)malloc(get_explicit_type_size(type) * size * samples);
1257*6467f958SSadaf Ebrahimi   char *p = data;
1258*6467f958SSadaf Ebrahimi   size_t stride = get_explicit_type_size(type);
1259*6467f958SSadaf Ebrahimi 
1260*6467f958SSadaf Ebrahimi   for (size_t s=0;s!=samples;++s) {
1261*6467f958SSadaf Ebrahimi     double val = color_delta + (color_delta * s);
1262*6467f958SSadaf Ebrahimi     for (size_t i=0;i!=size;++i) {
1263*6467f958SSadaf Ebrahimi       switch (type) {
1264*6467f958SSadaf Ebrahimi       case kChar:
1265*6467f958SSadaf Ebrahimi         *((char*)p) = val * 0x7f;
1266*6467f958SSadaf Ebrahimi         break;
1267*6467f958SSadaf Ebrahimi         case kUChar:
1268*6467f958SSadaf Ebrahimi         *((unsigned char*)p) = val * 0xff;
1269*6467f958SSadaf Ebrahimi           break;
1270*6467f958SSadaf Ebrahimi         case kFloat:
1271*6467f958SSadaf Ebrahimi           *((float*)p) = val;
1272*6467f958SSadaf Ebrahimi           break;
1273*6467f958SSadaf Ebrahimi       case kShort:
1274*6467f958SSadaf Ebrahimi         *((short*)p) = val*0x7fff;
1275*6467f958SSadaf Ebrahimi         break;
1276*6467f958SSadaf Ebrahimi         case kUShort:
1277*6467f958SSadaf Ebrahimi         *((unsigned short*)p) = val*0xffff;
1278*6467f958SSadaf Ebrahimi           break;
1279*6467f958SSadaf Ebrahimi       case kInt:
1280*6467f958SSadaf Ebrahimi         *((int*)p) = val*0x7fffffff;
1281*6467f958SSadaf Ebrahimi           break;
1282*6467f958SSadaf Ebrahimi         case kUInt:
1283*6467f958SSadaf Ebrahimi         *((unsigned int*)p) = val*0xffffffff;
1284*6467f958SSadaf Ebrahimi           break;
1285*6467f958SSadaf Ebrahimi         case kHalf: *((cl_half *)p) = convert_float_to_half(val); break;
1286*6467f958SSadaf Ebrahimi         default:
1287*6467f958SSadaf Ebrahimi           log_error("Test error: unexpected type enum 0x%x\n",type);
1288*6467f958SSadaf Ebrahimi       }
1289*6467f958SSadaf Ebrahimi 
1290*6467f958SSadaf Ebrahimi       p += stride;
1291*6467f958SSadaf Ebrahimi     }
1292*6467f958SSadaf Ebrahimi   }
1293*6467f958SSadaf Ebrahimi 
1294*6467f958SSadaf Ebrahimi 
1295*6467f958SSadaf Ebrahimi   if (allocateMem)
1296*6467f958SSadaf Ebrahimi     reorder_verification_buffer(glFormat,glType,data,width*height*samples);
1297*6467f958SSadaf Ebrahimi 
1298*6467f958SSadaf Ebrahimi   return data;
1299*6467f958SSadaf Ebrahimi }
1300*6467f958SSadaf Ebrahimi 
CreateGLTexture2DArrayMultisample(size_t width,size_t height,size_t total_layers,size_t samples,GLenum target,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outTextureID,int * outError,bool allocateMem,MTdata d,bool fixedSampleLocations)1301*6467f958SSadaf Ebrahimi void * CreateGLTexture2DArrayMultisample(size_t width, size_t height,
1302*6467f958SSadaf Ebrahimi                               size_t total_layers, size_t samples,
1303*6467f958SSadaf Ebrahimi                               GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType,
1304*6467f958SSadaf Ebrahimi                               ExplicitType type, GLuint *outTextureID, int *outError,
1305*6467f958SSadaf Ebrahimi                               bool allocateMem, MTdata d, bool fixedSampleLocations)
1306*6467f958SSadaf Ebrahimi {
1307*6467f958SSadaf Ebrahimi   // This function creates a multisample texture and renders into each sample
1308*6467f958SSadaf Ebrahimi   // using a GLSL shader
1309*6467f958SSadaf Ebrahimi 
1310*6467f958SSadaf Ebrahimi   // Check if the renderer supports enough samples
1311*6467f958SSadaf Ebrahimi   GLint max_samples = get_gl_max_samples(target, internalFormat);
1312*6467f958SSadaf Ebrahimi 
1313*6467f958SSadaf Ebrahimi   if (max_samples < (GLint)samples)
1314*6467f958SSadaf Ebrahimi       log_error("GL error: requested samples (%zu) exceeds renderer max "
1315*6467f958SSadaf Ebrahimi                 "samples (%d)\n",
1316*6467f958SSadaf Ebrahimi                 samples, max_samples);
1317*6467f958SSadaf Ebrahimi 
1318*6467f958SSadaf Ebrahimi   // Setup the GLSL program
1319*6467f958SSadaf Ebrahimi   const GLchar *vertex_source =
1320*6467f958SSadaf Ebrahimi   "#version 140\n"
1321*6467f958SSadaf Ebrahimi   "in vec4 att0;\n"
1322*6467f958SSadaf Ebrahimi   "void main (void) {\n"
1323*6467f958SSadaf Ebrahimi   " gl_Position = vec4(att0.xy,0.0,1.0);\n"
1324*6467f958SSadaf Ebrahimi   "}\n";
1325*6467f958SSadaf Ebrahimi 
1326*6467f958SSadaf Ebrahimi   const GLchar *fragmentSource =
1327*6467f958SSadaf Ebrahimi   "#version 140\n"
1328*6467f958SSadaf Ebrahimi     "out %s out0;\n"
1329*6467f958SSadaf Ebrahimi     "uniform %s colorVal;\n"
1330*6467f958SSadaf Ebrahimi     "uniform float depthVal;\n"
1331*6467f958SSadaf Ebrahimi   "void main (void) {\n"
1332*6467f958SSadaf Ebrahimi     "    out0 = %s(colorVal);\n"
1333*6467f958SSadaf Ebrahimi     " gl_FragDepth = depthVal;\n"
1334*6467f958SSadaf Ebrahimi   "}\n";
1335*6467f958SSadaf Ebrahimi 
1336*6467f958SSadaf Ebrahimi   GLchar fragmentShader[256];
1337*6467f958SSadaf Ebrahimi   sprintf(fragmentShader, fragmentSource, get_gl_vector_type(internalFormat), get_gl_data_type(internalFormat), get_gl_vector_type(internalFormat));
1338*6467f958SSadaf Ebrahimi   const GLchar *fragment_source = &fragmentShader[0];
1339*6467f958SSadaf Ebrahimi 
1340*6467f958SSadaf Ebrahimi   glShaderWrapper vertex_shader = glCreateShader(GL_VERTEX_SHADER);
1341*6467f958SSadaf Ebrahimi   glShaderSource(vertex_shader, 1, &vertex_source, NULL);
1342*6467f958SSadaf Ebrahimi   glCompileShader(vertex_shader);
1343*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1344*6467f958SSadaf Ebrahimi 
1345*6467f958SSadaf Ebrahimi   glShaderWrapper fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
1346*6467f958SSadaf Ebrahimi   glShaderSource(fragment_shader, 1, &fragment_source, NULL);
1347*6467f958SSadaf Ebrahimi   glCompileShader(fragment_shader);
1348*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1349*6467f958SSadaf Ebrahimi 
1350*6467f958SSadaf Ebrahimi   glProgramWrapper prog = glCreateProgram();
1351*6467f958SSadaf Ebrahimi   glAttachShader(prog, vertex_shader);
1352*6467f958SSadaf Ebrahimi   glAttachShader(prog, fragment_shader);
1353*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1354*6467f958SSadaf Ebrahimi 
1355*6467f958SSadaf Ebrahimi   glBindAttribLocation(prog, 0, "att0");
1356*6467f958SSadaf Ebrahimi   glLinkProgram(prog);
1357*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1358*6467f958SSadaf Ebrahimi 
1359*6467f958SSadaf Ebrahimi   // Setup the FBO and texture
1360*6467f958SSadaf Ebrahimi   glFramebufferWrapper fbo;
1361*6467f958SSadaf Ebrahimi   glGenFramebuffers(1, &fbo);
1362*6467f958SSadaf Ebrahimi   glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1363*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1364*6467f958SSadaf Ebrahimi 
1365*6467f958SSadaf Ebrahimi   glViewport(0, 0, width, height);
1366*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1367*6467f958SSadaf Ebrahimi 
1368*6467f958SSadaf Ebrahimi   GLuint tex = 0;
1369*6467f958SSadaf Ebrahimi   glGenTextures(1, &tex);
1370*6467f958SSadaf Ebrahimi   glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, tex);
1371*6467f958SSadaf Ebrahimi   glTexImage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, samples, internalFormat, width, height, total_layers, fixedSampleLocations);
1372*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1373*6467f958SSadaf Ebrahimi 
1374*6467f958SSadaf Ebrahimi   GLint attachment;
1375*6467f958SSadaf Ebrahimi   switch (internalFormat) {
1376*6467f958SSadaf Ebrahimi     case GL_DEPTH_COMPONENT16:
1377*6467f958SSadaf Ebrahimi     case GL_DEPTH_COMPONENT32F:
1378*6467f958SSadaf Ebrahimi     attachment = GL_DEPTH_ATTACHMENT;
1379*6467f958SSadaf Ebrahimi     break;
1380*6467f958SSadaf Ebrahimi     case GL_DEPTH24_STENCIL8:
1381*6467f958SSadaf Ebrahimi     case GL_DEPTH32F_STENCIL8:
1382*6467f958SSadaf Ebrahimi     attachment = GL_DEPTH_STENCIL_ATTACHMENT;
1383*6467f958SSadaf Ebrahimi       break;
1384*6467f958SSadaf Ebrahimi     default:
1385*6467f958SSadaf Ebrahimi     attachment = GL_COLOR_ATTACHMENT0;
1386*6467f958SSadaf Ebrahimi     break;
1387*6467f958SSadaf Ebrahimi   }
1388*6467f958SSadaf Ebrahimi 
1389*6467f958SSadaf Ebrahimi   //calculating colors
1390*6467f958SSadaf Ebrahimi   double color_delta = 1.0 / (total_layers * samples);
1391*6467f958SSadaf Ebrahimi 
1392*6467f958SSadaf Ebrahimi   if (attachment != GL_DEPTH_ATTACHMENT && attachment != GL_DEPTH_STENCIL_ATTACHMENT) {
1393*6467f958SSadaf Ebrahimi     glDisable(GL_DEPTH_TEST);
1394*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR()
1395*6467f958SSadaf Ebrahimi   }
1396*6467f958SSadaf Ebrahimi   else {
1397*6467f958SSadaf Ebrahimi     glEnable(GL_DEPTH_TEST);
1398*6467f958SSadaf Ebrahimi     glDepthFunc(GL_ALWAYS);
1399*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR()
1400*6467f958SSadaf Ebrahimi   }
1401*6467f958SSadaf Ebrahimi 
1402*6467f958SSadaf Ebrahimi   // Setup the VBO for rendering a quad
1403*6467f958SSadaf Ebrahimi   GLfloat quad[] = {
1404*6467f958SSadaf Ebrahimi     -1.0f, -1.0f,
1405*6467f958SSadaf Ebrahimi     1.0f, -1.0f,
1406*6467f958SSadaf Ebrahimi     1.0f,  1.0f,
1407*6467f958SSadaf Ebrahimi     -1.0f,  1.0f
1408*6467f958SSadaf Ebrahimi   };
1409*6467f958SSadaf Ebrahimi 
1410*6467f958SSadaf Ebrahimi   glBufferWrapper vbo;
1411*6467f958SSadaf Ebrahimi   glGenBuffers(1, &vbo);
1412*6467f958SSadaf Ebrahimi   glBindBuffer(GL_ARRAY_BUFFER, vbo);
1413*6467f958SSadaf Ebrahimi   glBufferData(GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STREAM_DRAW);
1414*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1415*6467f958SSadaf Ebrahimi 
1416*6467f958SSadaf Ebrahimi   glVertexArraysWrapper vao;
1417*6467f958SSadaf Ebrahimi   glGenVertexArrays(1, &vao);
1418*6467f958SSadaf Ebrahimi   glBindVertexArray(vao);
1419*6467f958SSadaf Ebrahimi   glEnableVertexAttribArray(0);
1420*6467f958SSadaf Ebrahimi   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*2, 0);
1421*6467f958SSadaf Ebrahimi   CHECK_GL_ERROR()
1422*6467f958SSadaf Ebrahimi 
1423*6467f958SSadaf Ebrahimi   for (size_t l=0; l!=total_layers; ++l) {
1424*6467f958SSadaf Ebrahimi     glFramebufferTextureLayer(GL_FRAMEBUFFER, attachment, tex, 0, l);
1425*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR()
1426*6467f958SSadaf Ebrahimi 
1427*6467f958SSadaf Ebrahimi     GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1428*6467f958SSadaf Ebrahimi     if (status == GL_FRAMEBUFFER_UNSUPPORTED) {
1429*6467f958SSadaf Ebrahimi       log_info("GL status: GL_FRAMEBUFFER_UNSUPPORTED format %s multisample array is not supported\n", GetGLFormatName(internalFormat));
1430*6467f958SSadaf Ebrahimi       *outTextureID = 0;
1431*6467f958SSadaf Ebrahimi       *outError = GL_FRAMEBUFFER_UNSUPPORTED;
1432*6467f958SSadaf Ebrahimi       return NULL;
1433*6467f958SSadaf Ebrahimi     }
1434*6467f958SSadaf Ebrahimi 
1435*6467f958SSadaf Ebrahimi     if (status != GL_FRAMEBUFFER_COMPLETE) {
1436*6467f958SSadaf Ebrahimi       log_error("GL error: framebuffer incomplete status 0x%04X\n",status);
1437*6467f958SSadaf Ebrahimi       *outTextureID = 0;
1438*6467f958SSadaf Ebrahimi       *outError = status;
1439*6467f958SSadaf Ebrahimi       return NULL;
1440*6467f958SSadaf Ebrahimi     }
1441*6467f958SSadaf Ebrahimi 
1442*6467f958SSadaf Ebrahimi     // Check if the framebuffer supports enough samples
1443*6467f958SSadaf Ebrahimi     GLint fbo_samples = 0;
1444*6467f958SSadaf Ebrahimi     glGetIntegerv(GL_SAMPLES, &fbo_samples);
1445*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR();
1446*6467f958SSadaf Ebrahimi 
1447*6467f958SSadaf Ebrahimi     if (fbo_samples < (GLint)samples)
1448*6467f958SSadaf Ebrahimi         log_error(
1449*6467f958SSadaf Ebrahimi             "GL Error: requested samples (%zu) exceeds FBO capability (%d)\n",
1450*6467f958SSadaf Ebrahimi             samples, fbo_samples);
1451*6467f958SSadaf Ebrahimi 
1452*6467f958SSadaf Ebrahimi     glUseProgram(prog);
1453*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR()
1454*6467f958SSadaf Ebrahimi 
1455*6467f958SSadaf Ebrahimi     //clearing color and depth buffer
1456*6467f958SSadaf Ebrahimi     glClearColor(0, 0, 0, 0);
1457*6467f958SSadaf Ebrahimi     glClear(GL_COLOR_BUFFER_BIT);
1458*6467f958SSadaf Ebrahimi     glClearDepth(1.0);
1459*6467f958SSadaf Ebrahimi     glClear(GL_DEPTH_BUFFER_BIT);
1460*6467f958SSadaf Ebrahimi 
1461*6467f958SSadaf Ebrahimi     glEnable(GL_SAMPLE_MASK);
1462*6467f958SSadaf Ebrahimi     for (size_t s=0;s!=samples;++s) {
1463*6467f958SSadaf Ebrahimi       double val = color_delta + color_delta * (l * samples + s);
1464*6467f958SSadaf Ebrahimi 
1465*6467f958SSadaf Ebrahimi       glSampleMaski(0, 1<<s);
1466*6467f958SSadaf Ebrahimi       GLint colorUniformLocation = glGetUniformLocation(prog, "colorVal");
1467*6467f958SSadaf Ebrahimi       switch (internalFormat) {
1468*6467f958SSadaf Ebrahimi       case GL_RGBA8I_EXT:
1469*6467f958SSadaf Ebrahimi         glUniform1i(colorUniformLocation, val * 0x7f);
1470*6467f958SSadaf Ebrahimi         break;
1471*6467f958SSadaf Ebrahimi       case GL_RGBA16I_EXT:
1472*6467f958SSadaf Ebrahimi         glUniform1i(colorUniformLocation, val * 0x7fff);
1473*6467f958SSadaf Ebrahimi         break;
1474*6467f958SSadaf Ebrahimi       case GL_RGBA32I_EXT:
1475*6467f958SSadaf Ebrahimi         glUniform1i(colorUniformLocation, val * 0x7fffffff);
1476*6467f958SSadaf Ebrahimi         break;
1477*6467f958SSadaf Ebrahimi       case GL_RGBA8UI_EXT:
1478*6467f958SSadaf Ebrahimi         glUniform1ui(colorUniformLocation, val * 0xff);
1479*6467f958SSadaf Ebrahimi         break;
1480*6467f958SSadaf Ebrahimi       case GL_RGBA16UI_EXT:
1481*6467f958SSadaf Ebrahimi         glUniform1ui(colorUniformLocation, val * 0xffff);
1482*6467f958SSadaf Ebrahimi         break;
1483*6467f958SSadaf Ebrahimi       case GL_RGBA32UI_EXT:
1484*6467f958SSadaf Ebrahimi         glUniform1ui(colorUniformLocation, val * 0xffffffff);
1485*6467f958SSadaf Ebrahimi         break;
1486*6467f958SSadaf Ebrahimi       default:
1487*6467f958SSadaf Ebrahimi         glUniform1f(colorUniformLocation, val);
1488*6467f958SSadaf Ebrahimi         break;
1489*6467f958SSadaf Ebrahimi       }
1490*6467f958SSadaf Ebrahimi 
1491*6467f958SSadaf Ebrahimi       glUniform1f(glGetUniformLocation(prog, "depthVal"), val);
1492*6467f958SSadaf Ebrahimi 
1493*6467f958SSadaf Ebrahimi       glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
1494*6467f958SSadaf Ebrahimi       CHECK_GL_ERROR();
1495*6467f958SSadaf Ebrahimi 
1496*6467f958SSadaf Ebrahimi       glFlush();
1497*6467f958SSadaf Ebrahimi     }
1498*6467f958SSadaf Ebrahimi 
1499*6467f958SSadaf Ebrahimi     glDisable(GL_SAMPLE_MASK);
1500*6467f958SSadaf Ebrahimi     CHECK_GL_ERROR();
1501*6467f958SSadaf Ebrahimi   }
1502*6467f958SSadaf Ebrahimi 
1503*6467f958SSadaf Ebrahimi   *outTextureID = tex;
1504*6467f958SSadaf Ebrahimi 
1505*6467f958SSadaf Ebrahimi   // Create an output buffer containing the expected results.
1506*6467f958SSadaf Ebrahimi   unsigned int size = 0;
1507*6467f958SSadaf Ebrahimi   if ( glType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV )
1508*6467f958SSadaf Ebrahimi   {
1509*6467f958SSadaf Ebrahimi     size = width * height * 2;
1510*6467f958SSadaf Ebrahimi   }
1511*6467f958SSadaf Ebrahimi   else if ( (glType == GL_UNSIGNED_INT_2_10_10_10_REV) || (glType == GL_UNSIGNED_INT_10_10_10_2) || (attachment == GL_DEPTH_ATTACHMENT) || (attachment == GL_DEPTH_STENCIL_ATTACHMENT))
1512*6467f958SSadaf Ebrahimi   {
1513*6467f958SSadaf Ebrahimi     size = width * height;
1514*6467f958SSadaf Ebrahimi   }
1515*6467f958SSadaf Ebrahimi   else
1516*6467f958SSadaf Ebrahimi   {
1517*6467f958SSadaf Ebrahimi     size = width * height * 4;
1518*6467f958SSadaf Ebrahimi   }
1519*6467f958SSadaf Ebrahimi 
1520*6467f958SSadaf Ebrahimi   char *data = (char *)malloc(get_explicit_type_size(type) * size * total_layers * samples);
1521*6467f958SSadaf Ebrahimi   char *p = data;
1522*6467f958SSadaf Ebrahimi   size_t stride = get_explicit_type_size(type);
1523*6467f958SSadaf Ebrahimi 
1524*6467f958SSadaf Ebrahimi   for (size_t s=0;s!=samples;++s) {
1525*6467f958SSadaf Ebrahimi     for (size_t l=0;l!=total_layers;++l) {
1526*6467f958SSadaf Ebrahimi       double val = color_delta + color_delta * (l * samples + s);
1527*6467f958SSadaf Ebrahimi     for (size_t i=0;i!=size;++i) {
1528*6467f958SSadaf Ebrahimi       switch (type) {
1529*6467f958SSadaf Ebrahimi         case kChar:
1530*6467f958SSadaf Ebrahimi           *((char*)p) = val * 0x7f;
1531*6467f958SSadaf Ebrahimi           break;
1532*6467f958SSadaf Ebrahimi         case kUChar:
1533*6467f958SSadaf Ebrahimi           *((unsigned char*)p) = val*0xff;
1534*6467f958SSadaf Ebrahimi           break;
1535*6467f958SSadaf Ebrahimi         case kFloat:
1536*6467f958SSadaf Ebrahimi           *((float*)p) = val;
1537*6467f958SSadaf Ebrahimi           break;
1538*6467f958SSadaf Ebrahimi         case kShort:
1539*6467f958SSadaf Ebrahimi           *((short*)p) = val * 0x7fff;
1540*6467f958SSadaf Ebrahimi           break;
1541*6467f958SSadaf Ebrahimi         case kUShort:
1542*6467f958SSadaf Ebrahimi           *((unsigned short*)p) = val * 0xffff;
1543*6467f958SSadaf Ebrahimi           break;
1544*6467f958SSadaf Ebrahimi         case kInt:
1545*6467f958SSadaf Ebrahimi           *((int*)p) = val * 0x7fffffff;
1546*6467f958SSadaf Ebrahimi           break;
1547*6467f958SSadaf Ebrahimi         case kUInt:
1548*6467f958SSadaf Ebrahimi           *((unsigned int*)p) = val*0xffffffff;
1549*6467f958SSadaf Ebrahimi           break;
1550*6467f958SSadaf Ebrahimi         case kHalf: *((cl_half *)p) = convert_float_to_half(val); break;
1551*6467f958SSadaf Ebrahimi         default:
1552*6467f958SSadaf Ebrahimi           log_error("Test error: unexpected type enum 0x%x\n",type);
1553*6467f958SSadaf Ebrahimi       }
1554*6467f958SSadaf Ebrahimi 
1555*6467f958SSadaf Ebrahimi       p += stride;
1556*6467f958SSadaf Ebrahimi     }
1557*6467f958SSadaf Ebrahimi   }
1558*6467f958SSadaf Ebrahimi   }
1559*6467f958SSadaf Ebrahimi 
1560*6467f958SSadaf Ebrahimi   if (allocateMem)
1561*6467f958SSadaf Ebrahimi     reorder_verification_buffer(glFormat,glType,data,width*height*samples*total_layers);
1562*6467f958SSadaf Ebrahimi 
1563*6467f958SSadaf Ebrahimi   return data;
1564*6467f958SSadaf Ebrahimi }
1565*6467f958SSadaf Ebrahimi 
1566*6467f958SSadaf Ebrahimi #endif // GL_VERSION_3_2
1567*6467f958SSadaf Ebrahimi 
CreateGLRenderbuffer(GLsizei width,GLsizei height,GLenum attachment,GLenum glFormat,GLenum internalFormat,GLenum glType,ExplicitType type,GLuint * outFramebuffer,GLuint * outRenderbuffer,int * outError,MTdata d,bool allocateMem)1568*6467f958SSadaf Ebrahimi void * CreateGLRenderbuffer( GLsizei width, GLsizei height,
1569*6467f958SSadaf Ebrahimi                              GLenum attachment, GLenum glFormat,
1570*6467f958SSadaf Ebrahimi                              GLenum internalFormat, GLenum glType,
1571*6467f958SSadaf Ebrahimi                              ExplicitType type,
1572*6467f958SSadaf Ebrahimi                              GLuint *outFramebuffer,
1573*6467f958SSadaf Ebrahimi                              GLuint *outRenderbuffer,
1574*6467f958SSadaf Ebrahimi                              int *outError, MTdata d, bool allocateMem )
1575*6467f958SSadaf Ebrahimi {
1576*6467f958SSadaf Ebrahimi     *outError = CreateGLRenderbufferRaw( width, height, attachment, glFormat, internalFormat,
1577*6467f958SSadaf Ebrahimi                             glType, outFramebuffer, outRenderbuffer );
1578*6467f958SSadaf Ebrahimi 
1579*6467f958SSadaf Ebrahimi     if( *outError != 0 )
1580*6467f958SSadaf Ebrahimi         return NULL;
1581*6467f958SSadaf Ebrahimi 
1582*6467f958SSadaf Ebrahimi     GLenum err = 0;
1583*6467f958SSadaf Ebrahimi 
1584*6467f958SSadaf Ebrahimi     // Generate a renderbuffer and bind
1585*6467f958SSadaf Ebrahimi     glGenRenderbuffersEXT( 1, outRenderbuffer );
1586*6467f958SSadaf Ebrahimi     glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, *outRenderbuffer );
1587*6467f958SSadaf Ebrahimi 
1588*6467f958SSadaf Ebrahimi     // Allocate storage to the renderbuffer
1589*6467f958SSadaf Ebrahimi     glGetError();
1590*6467f958SSadaf Ebrahimi     glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, internalFormat, (GLsizei)width,  (GLsizei)height );
1591*6467f958SSadaf Ebrahimi     err = glGetError();
1592*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
1593*6467f958SSadaf Ebrahimi     {
1594*6467f958SSadaf Ebrahimi         *outError = 1701;
1595*6467f958SSadaf Ebrahimi         log_error("Failed to allocate render buffer storage!\n");
1596*6467f958SSadaf Ebrahimi         return NULL;
1597*6467f958SSadaf Ebrahimi     }
1598*6467f958SSadaf Ebrahimi 
1599*6467f958SSadaf Ebrahimi     GLint realInternalFormat;
1600*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_INTERNAL_FORMAT_EXT, &realInternalFormat );
1601*6467f958SSadaf Ebrahimi     internalFormat = realInternalFormat;
1602*6467f958SSadaf Ebrahimi 
1603*6467f958SSadaf Ebrahimi #ifdef DEBUG
1604*6467f958SSadaf Ebrahimi     GLint rsize, gsize, bsize, asize;
1605*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_RED_SIZE_EXT,&rsize);
1606*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_GREEN_SIZE_EXT,&gsize);
1607*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_BLUE_SIZE_EXT,&bsize);
1608*6467f958SSadaf Ebrahimi     glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_ALPHA_SIZE_EXT,&asize);
1609*6467f958SSadaf Ebrahimi 
1610*6467f958SSadaf Ebrahimi     log_info("Renderbuffer internal format requested: %s actual: %s sizes: r=%d g=%d b=%d a=%d\n",
1611*6467f958SSadaf Ebrahimi               GetGLFormatName( internalFormat ), GetGLFormatName( realInternalFormat ),
1612*6467f958SSadaf Ebrahimi               rsize, gsize, bsize, asize );
1613*6467f958SSadaf Ebrahimi #endif
1614*6467f958SSadaf Ebrahimi 
1615*6467f958SSadaf Ebrahimi     // Create and bind a framebuffer to render with
1616*6467f958SSadaf Ebrahimi     glGenFramebuffersEXT( 1, outFramebuffer );
1617*6467f958SSadaf Ebrahimi     glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, *outFramebuffer );
1618*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
1619*6467f958SSadaf Ebrahimi     {
1620*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to bind framebuffer : Error %s\n",
1621*6467f958SSadaf Ebrahimi                   gluErrorString( err ));
1622*6467f958SSadaf Ebrahimi 
1623*6467f958SSadaf Ebrahimi         *outError = -1;
1624*6467f958SSadaf Ebrahimi         return NULL;
1625*6467f958SSadaf Ebrahimi     }
1626*6467f958SSadaf Ebrahimi 
1627*6467f958SSadaf Ebrahimi     // Attach to the framebuffer
1628*6467f958SSadaf Ebrahimi     glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, *outRenderbuffer );
1629*6467f958SSadaf Ebrahimi     err = glGetError();
1630*6467f958SSadaf Ebrahimi     GLint status = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
1631*6467f958SSadaf Ebrahimi     if( status != GL_FRAMEBUFFER_COMPLETE_EXT )
1632*6467f958SSadaf Ebrahimi     {
1633*6467f958SSadaf Ebrahimi         *outError = -1;
1634*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to attach renderbuffer to framebuffer (%s, status %x)\n", gluErrorString( err ), (int)status );
1635*6467f958SSadaf Ebrahimi         return NULL;
1636*6467f958SSadaf Ebrahimi     }
1637*6467f958SSadaf Ebrahimi 
1638*6467f958SSadaf Ebrahimi     void* buffer = CreateRandomData(type, width * height * 4, d);
1639*6467f958SSadaf Ebrahimi 
1640*6467f958SSadaf Ebrahimi #ifdef DEBUG
1641*6467f958SSadaf Ebrahimi     log_info( "- Fillling renderbuffer: %d : %d : %s : %s \n",
1642*6467f958SSadaf Ebrahimi              (int)width, (int)height,
1643*6467f958SSadaf Ebrahimi              GetGLFormatName(glFormat),
1644*6467f958SSadaf Ebrahimi              GetGLTypeName(glType));
1645*6467f958SSadaf Ebrahimi 
1646*6467f958SSadaf Ebrahimi     DumpGLBuffer(glType, (int)width, (int)height, (void*)buffer);
1647*6467f958SSadaf Ebrahimi #endif
1648*6467f958SSadaf Ebrahimi 
1649*6467f958SSadaf Ebrahimi     // Fill a texture with our input data
1650*6467f958SSadaf Ebrahimi     glTextureWrapper texture;
1651*6467f958SSadaf Ebrahimi     glGenTextures( 1, &texture );
1652*6467f958SSadaf Ebrahimi     glBindTexture( GL_TEXTURE_RECTANGLE_ARB, texture );
1653*6467f958SSadaf Ebrahimi     glTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
1654*6467f958SSadaf Ebrahimi     glTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
1655*6467f958SSadaf Ebrahimi     glTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
1656*6467f958SSadaf Ebrahimi     glTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
1657*6467f958SSadaf Ebrahimi     glTexImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, internalFormat, width, height, 0, glFormat, glType, buffer );
1658*6467f958SSadaf Ebrahimi     glEnable( GL_TEXTURE_RECTANGLE_ARB );
1659*6467f958SSadaf Ebrahimi 
1660*6467f958SSadaf Ebrahimi     // Render fullscreen textured quad
1661*6467f958SSadaf Ebrahimi     glDisable( GL_LIGHTING );
1662*6467f958SSadaf Ebrahimi     glViewport(0, 0, width, height);
1663*6467f958SSadaf Ebrahimi     glMatrixMode(GL_MODELVIEW);
1664*6467f958SSadaf Ebrahimi     glLoadIdentity();
1665*6467f958SSadaf Ebrahimi     glMatrixMode( GL_TEXTURE );
1666*6467f958SSadaf Ebrahimi     glLoadIdentity();
1667*6467f958SSadaf Ebrahimi     glMatrixMode(GL_PROJECTION);
1668*6467f958SSadaf Ebrahimi     glLoadIdentity();
1669*6467f958SSadaf Ebrahimi     glClear(GL_COLOR_BUFFER_BIT);
1670*6467f958SSadaf Ebrahimi     gluOrtho2D( -1.0, 1.0, -1.0, 1.0 );
1671*6467f958SSadaf Ebrahimi     glMatrixMode( GL_MODELVIEW );
1672*6467f958SSadaf Ebrahimi     glBegin( GL_QUADS );
1673*6467f958SSadaf Ebrahimi     {
1674*6467f958SSadaf Ebrahimi         glColor3f(1.0f, 1.0f, 1.0f);
1675*6467f958SSadaf Ebrahimi         glTexCoord2f( 0.0f, 0.0f );
1676*6467f958SSadaf Ebrahimi         glVertex3f( -1.0f, -1.0f, 0.0f );
1677*6467f958SSadaf Ebrahimi         glTexCoord2f( 0.0f, height );
1678*6467f958SSadaf Ebrahimi         glVertex3f( -1.0f, 1.0f, 0.0f );
1679*6467f958SSadaf Ebrahimi         glTexCoord2f( width, height );
1680*6467f958SSadaf Ebrahimi         glVertex3f( 1.0f, 1.0f, 0.0f );
1681*6467f958SSadaf Ebrahimi         glTexCoord2f( width, 0.0f );
1682*6467f958SSadaf Ebrahimi         glVertex3f( 1.0f, -1.0f, 0.0f );
1683*6467f958SSadaf Ebrahimi     }
1684*6467f958SSadaf Ebrahimi     glEnd();
1685*6467f958SSadaf Ebrahimi     glBindTexture( GL_TEXTURE_RECTANGLE_ARB, 0 );
1686*6467f958SSadaf Ebrahimi     glDisable( GL_TEXTURE_RECTANGLE_ARB );
1687*6467f958SSadaf Ebrahimi 
1688*6467f958SSadaf Ebrahimi     glFlush();
1689*6467f958SSadaf Ebrahimi 
1690*6467f958SSadaf Ebrahimi     // Read back the data in the renderbuffer
1691*6467f958SSadaf Ebrahimi     memset(buffer, 0, width * height * 4 * get_explicit_type_size( type ));
1692*6467f958SSadaf Ebrahimi     glReadBuffer( attachment );
1693*6467f958SSadaf Ebrahimi 
1694*6467f958SSadaf Ebrahimi     glReadPixels( 0, 0, (GLsizei)width, (GLsizei)height, glFormat, glType, buffer );
1695*6467f958SSadaf Ebrahimi 
1696*6467f958SSadaf Ebrahimi     err = glGetError();
1697*6467f958SSadaf Ebrahimi     if( err != GL_NO_ERROR )
1698*6467f958SSadaf Ebrahimi     {
1699*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to read data via glReadPixels : %d : %d : %s : %s : Error %s\n",
1700*6467f958SSadaf Ebrahimi                   (int)width, (int)height,
1701*6467f958SSadaf Ebrahimi                   GetGLFormatName(glFormat),
1702*6467f958SSadaf Ebrahimi                   GetGLTypeName(glType),
1703*6467f958SSadaf Ebrahimi                   gluErrorString( err ));
1704*6467f958SSadaf Ebrahimi         *outError = -1;
1705*6467f958SSadaf Ebrahimi     }
1706*6467f958SSadaf Ebrahimi 
1707*6467f958SSadaf Ebrahimi #ifdef DEBUG
1708*6467f958SSadaf Ebrahimi     log_info( "- glReadPixels: %d : %d : %s : %s \n",
1709*6467f958SSadaf Ebrahimi              (int)width, (int)height,
1710*6467f958SSadaf Ebrahimi              GetGLFormatName(glFormat),
1711*6467f958SSadaf Ebrahimi              GetGLTypeName(glType));
1712*6467f958SSadaf Ebrahimi 
1713*6467f958SSadaf Ebrahimi     DumpGLBuffer(glType, (int)width, (int)height, (void*)buffer);
1714*6467f958SSadaf Ebrahimi #endif
1715*6467f958SSadaf Ebrahimi 
1716*6467f958SSadaf Ebrahimi     if( !allocateMem )
1717*6467f958SSadaf Ebrahimi     {
1718*6467f958SSadaf Ebrahimi         free( buffer );
1719*6467f958SSadaf Ebrahimi         return NULL;
1720*6467f958SSadaf Ebrahimi     }
1721*6467f958SSadaf Ebrahimi 
1722*6467f958SSadaf Ebrahimi     if( glType == GL_UNSIGNED_INT_8_8_8_8_REV && glFormat == GL_BGRA && allocateMem )
1723*6467f958SSadaf Ebrahimi     {
1724*6467f958SSadaf Ebrahimi         // Reverse and reorder to validate since in the
1725*6467f958SSadaf Ebrahimi         // kernel the read_imagef() call always returns RGBA
1726*6467f958SSadaf Ebrahimi         cl_uchar *p = (cl_uchar *)buffer;
1727*6467f958SSadaf Ebrahimi         for (GLsizei i = 0; i < width * height; i++)
1728*6467f958SSadaf Ebrahimi         {
1729*6467f958SSadaf Ebrahimi             cl_uchar uc0 = p[i * 4 + 0];
1730*6467f958SSadaf Ebrahimi             cl_uchar uc1 = p[i * 4 + 1];
1731*6467f958SSadaf Ebrahimi             cl_uchar uc2 = p[i * 4 + 2];
1732*6467f958SSadaf Ebrahimi             cl_uchar uc3 = p[i * 4 + 3];
1733*6467f958SSadaf Ebrahimi 
1734*6467f958SSadaf Ebrahimi             p[ i * 4 + 0 ] = uc2;
1735*6467f958SSadaf Ebrahimi             p[ i * 4 + 1 ] = uc1;
1736*6467f958SSadaf Ebrahimi             p[ i * 4 + 2 ] = uc0;
1737*6467f958SSadaf Ebrahimi             p[ i * 4 + 3 ] = uc3;
1738*6467f958SSadaf Ebrahimi         }
1739*6467f958SSadaf Ebrahimi     }
1740*6467f958SSadaf Ebrahimi     else if( glType == GL_UNSIGNED_INT_8_8_8_8 && glFormat == GL_BGRA && allocateMem )
1741*6467f958SSadaf Ebrahimi     {
1742*6467f958SSadaf Ebrahimi       // Reverse and reorder to validate since in the
1743*6467f958SSadaf Ebrahimi       // kernel the read_imagef() call always returns RGBA
1744*6467f958SSadaf Ebrahimi       cl_uchar *p = (cl_uchar *)buffer;
1745*6467f958SSadaf Ebrahimi       for (GLsizei i = 0; i < width * height; i++)
1746*6467f958SSadaf Ebrahimi       {
1747*6467f958SSadaf Ebrahimi         cl_uchar uc0 = p[i * 4 + 0];
1748*6467f958SSadaf Ebrahimi         cl_uchar uc1 = p[i * 4 + 1];
1749*6467f958SSadaf Ebrahimi         cl_uchar uc2 = p[i * 4 + 2];
1750*6467f958SSadaf Ebrahimi         cl_uchar uc3 = p[i * 4 + 3];
1751*6467f958SSadaf Ebrahimi 
1752*6467f958SSadaf Ebrahimi         p[ i * 4 + 0 ] = uc1;
1753*6467f958SSadaf Ebrahimi         p[ i * 4 + 1 ] = uc2;
1754*6467f958SSadaf Ebrahimi         p[ i * 4 + 2 ] = uc3;
1755*6467f958SSadaf Ebrahimi         p[ i * 4 + 3 ] = uc0;
1756*6467f958SSadaf Ebrahimi       }
1757*6467f958SSadaf Ebrahimi     }
1758*6467f958SSadaf Ebrahimi 
1759*6467f958SSadaf Ebrahimi     return buffer;
1760*6467f958SSadaf Ebrahimi }
1761*6467f958SSadaf Ebrahimi 
ReadGLRenderbuffer(GLuint glFramebuffer,GLuint glRenderbuffer,GLenum attachment,GLenum glFormat,GLenum glInternalFormat,GLenum glType,ExplicitType typeToReadAs,size_t outWidth,size_t outHeight)1762*6467f958SSadaf Ebrahimi void * ReadGLRenderbuffer( GLuint glFramebuffer, GLuint glRenderbuffer,
1763*6467f958SSadaf Ebrahimi                            GLenum attachment, GLenum glFormat,
1764*6467f958SSadaf Ebrahimi                            GLenum glInternalFormat, GLenum glType,
1765*6467f958SSadaf Ebrahimi                            ExplicitType typeToReadAs,
1766*6467f958SSadaf Ebrahimi                            size_t outWidth, size_t outHeight )
1767*6467f958SSadaf Ebrahimi {
1768*6467f958SSadaf Ebrahimi     glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, glFramebuffer );
1769*6467f958SSadaf Ebrahimi     glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, glRenderbuffer );
1770*6467f958SSadaf Ebrahimi 
1771*6467f958SSadaf Ebrahimi     // Attach to the framebuffer
1772*6467f958SSadaf Ebrahimi     GLint err = glGetError();
1773*6467f958SSadaf Ebrahimi     if( glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ) != GL_FRAMEBUFFER_COMPLETE_EXT )
1774*6467f958SSadaf Ebrahimi     {
1775*6467f958SSadaf Ebrahimi         log_error( "ERROR: Unable to attach renderbuffer to framebuffer (%s)\n", gluErrorString( err ) );
1776*6467f958SSadaf Ebrahimi         return NULL;
1777*6467f958SSadaf Ebrahimi     }
1778*6467f958SSadaf Ebrahimi 
1779*6467f958SSadaf Ebrahimi     // Read results from the GL renderbuffer
1780*6467f958SSadaf Ebrahimi #ifdef DEBUG
1781*6467f958SSadaf Ebrahimi     log_info( "- Reading back from GL: %d x %d : %s : %s : %s\n",
1782*6467f958SSadaf Ebrahimi              (int)outWidth, (int)outHeight,
1783*6467f958SSadaf Ebrahimi              GetGLFormatName( glInternalFormat ),
1784*6467f958SSadaf Ebrahimi              GetGLFormatName( glFormat ),
1785*6467f958SSadaf Ebrahimi              GetGLTypeName( glType ));
1786*6467f958SSadaf Ebrahimi #endif
1787*6467f958SSadaf Ebrahimi 
1788*6467f958SSadaf Ebrahimi     GLenum readBackFormat = glFormat == GL_RGBA_INTEGER_EXT ? GL_RGBA_INTEGER_EXT : GL_RGBA;
1789*6467f958SSadaf Ebrahimi     GLenum readBackType = glType;
1790*6467f958SSadaf Ebrahimi 
1791*6467f958SSadaf Ebrahimi     size_t outBytes = outWidth * outHeight * 4 * GetGLTypeSize(readBackType);
1792*6467f958SSadaf Ebrahimi     void *outBuffer = malloc( outBytes );
1793*6467f958SSadaf Ebrahimi     memset(outBuffer, 0, outBytes);
1794*6467f958SSadaf Ebrahimi 
1795*6467f958SSadaf Ebrahimi     glReadPixels( 0, 0, (GLsizei)outWidth, (GLsizei)outHeight, readBackFormat, readBackType, outBuffer );
1796*6467f958SSadaf Ebrahimi 
1797*6467f958SSadaf Ebrahimi #ifdef DEBUG
1798*6467f958SSadaf Ebrahimi     log_info( "- glReadPixels: %d : %d : %s : %s \n",
1799*6467f958SSadaf Ebrahimi              (int)outWidth, (int)outHeight,
1800*6467f958SSadaf Ebrahimi              GetGLFormatName(readBackFormat),
1801*6467f958SSadaf Ebrahimi              GetGLTypeName(readBackType));
1802*6467f958SSadaf Ebrahimi 
1803*6467f958SSadaf Ebrahimi     DumpGLBuffer(readBackType, outWidth, outHeight, outBuffer);
1804*6467f958SSadaf Ebrahimi #endif
1805*6467f958SSadaf Ebrahimi 
1806*6467f958SSadaf Ebrahimi     return (void *)outBuffer;
1807*6467f958SSadaf Ebrahimi }
1808*6467f958SSadaf Ebrahimi 
1809*6467f958SSadaf Ebrahimi GLenum
GetGLFormat(GLenum internalFormat)1810*6467f958SSadaf Ebrahimi GetGLFormat(GLenum internalFormat)
1811*6467f958SSadaf Ebrahimi {
1812*6467f958SSadaf Ebrahimi     GLenum glFormat;
1813*6467f958SSadaf Ebrahimi     switch (internalFormat)
1814*6467f958SSadaf Ebrahimi     {
1815*6467f958SSadaf Ebrahimi         case GL_BGRA:
1816*6467f958SSadaf Ebrahimi         case GL_RGBA8:
1817*6467f958SSadaf Ebrahimi         case GL_RGBA16:
1818*6467f958SSadaf Ebrahimi         case GL_RGBA32F_ARB:
1819*6467f958SSadaf Ebrahimi             glFormat = GL_RGBA;
1820*6467f958SSadaf Ebrahimi             break;
1821*6467f958SSadaf Ebrahimi         case GL_RGBA8I_EXT:
1822*6467f958SSadaf Ebrahimi         case GL_RGBA16I_EXT:
1823*6467f958SSadaf Ebrahimi         case GL_RGBA32I_EXT:
1824*6467f958SSadaf Ebrahimi         case GL_RGBA8UI_EXT:
1825*6467f958SSadaf Ebrahimi         case GL_RGBA16UI_EXT:
1826*6467f958SSadaf Ebrahimi         case GL_RGBA32UI_EXT:
1827*6467f958SSadaf Ebrahimi             glFormat = GL_RGBA_INTEGER_EXT;
1828*6467f958SSadaf Ebrahimi             break;
1829*6467f958SSadaf Ebrahimi         default:
1830*6467f958SSadaf Ebrahimi             glFormat = GL_RGBA;
1831*6467f958SSadaf Ebrahimi             break;
1832*6467f958SSadaf Ebrahimi     }
1833*6467f958SSadaf Ebrahimi 
1834*6467f958SSadaf Ebrahimi     return glFormat;
1835*6467f958SSadaf Ebrahimi }
1836*6467f958SSadaf Ebrahimi 
GetGLTypeForExplicitType(ExplicitType type)1837*6467f958SSadaf Ebrahimi GLenum GetGLTypeForExplicitType(ExplicitType type)
1838*6467f958SSadaf Ebrahimi {
1839*6467f958SSadaf Ebrahimi     switch( type )
1840*6467f958SSadaf Ebrahimi     {
1841*6467f958SSadaf Ebrahimi         case kFloat:
1842*6467f958SSadaf Ebrahimi             return GL_FLOAT;
1843*6467f958SSadaf Ebrahimi         case kInt:
1844*6467f958SSadaf Ebrahimi             return GL_INT;
1845*6467f958SSadaf Ebrahimi         case kUInt:
1846*6467f958SSadaf Ebrahimi             return GL_UNSIGNED_INT;
1847*6467f958SSadaf Ebrahimi         case kShort:
1848*6467f958SSadaf Ebrahimi             return GL_SHORT;
1849*6467f958SSadaf Ebrahimi         case kUShort:
1850*6467f958SSadaf Ebrahimi             return GL_UNSIGNED_SHORT;
1851*6467f958SSadaf Ebrahimi         case kChar:
1852*6467f958SSadaf Ebrahimi             return GL_BYTE;
1853*6467f958SSadaf Ebrahimi         case kUChar:
1854*6467f958SSadaf Ebrahimi             return GL_UNSIGNED_BYTE;
1855*6467f958SSadaf Ebrahimi         case kHalf:
1856*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
1857*6467f958SSadaf Ebrahimi             return GL_HALF_FLOAT;
1858*6467f958SSadaf Ebrahimi #else
1859*6467f958SSadaf Ebrahimi             return GL_HALF_FLOAT_ARB;
1860*6467f958SSadaf Ebrahimi #endif
1861*6467f958SSadaf Ebrahimi         default:
1862*6467f958SSadaf Ebrahimi             return GL_INT;
1863*6467f958SSadaf Ebrahimi     };
1864*6467f958SSadaf Ebrahimi }
1865*6467f958SSadaf Ebrahimi 
GetGLTypeSize(GLenum type)1866*6467f958SSadaf Ebrahimi size_t GetGLTypeSize(GLenum type)
1867*6467f958SSadaf Ebrahimi {
1868*6467f958SSadaf Ebrahimi     switch( type )
1869*6467f958SSadaf Ebrahimi     {
1870*6467f958SSadaf Ebrahimi         case GL_FLOAT:
1871*6467f958SSadaf Ebrahimi             return sizeof(GLfloat);
1872*6467f958SSadaf Ebrahimi         case GL_INT:
1873*6467f958SSadaf Ebrahimi             return sizeof(GLint);
1874*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT:
1875*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_10_10_10_2:
1876*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_2_10_10_10_REV:
1877*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_24_8:
1878*6467f958SSadaf Ebrahimi             return sizeof(GLuint);
1879*6467f958SSadaf Ebrahimi         case GL_SHORT:
1880*6467f958SSadaf Ebrahimi             return sizeof(GLshort);
1881*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_SHORT:
1882*6467f958SSadaf Ebrahimi             return sizeof(GLushort);
1883*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_8_8_8_8_REV:
1884*6467f958SSadaf Ebrahimi         case GL_BYTE:
1885*6467f958SSadaf Ebrahimi             return sizeof(GLbyte);
1886*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_BYTE:
1887*6467f958SSadaf Ebrahimi             return sizeof(GLubyte);
1888*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
1889*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT:
1890*6467f958SSadaf Ebrahimi #else
1891*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_ARB:
1892*6467f958SSadaf Ebrahimi #endif
1893*6467f958SSadaf Ebrahimi             return sizeof(GLhalf);
1894*6467f958SSadaf Ebrahimi         case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
1895*6467f958SSadaf Ebrahimi             return 2 * sizeof(GLfloat);
1896*6467f958SSadaf Ebrahimi         default:
1897*6467f958SSadaf Ebrahimi             log_error("Unknown type 0x%x\n",type);
1898*6467f958SSadaf Ebrahimi             return 0;
1899*6467f958SSadaf Ebrahimi     };
1900*6467f958SSadaf Ebrahimi }
1901*6467f958SSadaf Ebrahimi 
GetExplicitTypeForGLType(GLenum type)1902*6467f958SSadaf Ebrahimi ExplicitType GetExplicitTypeForGLType(GLenum type)
1903*6467f958SSadaf Ebrahimi {
1904*6467f958SSadaf Ebrahimi     switch( type )
1905*6467f958SSadaf Ebrahimi     {
1906*6467f958SSadaf Ebrahimi         case GL_FLOAT:
1907*6467f958SSadaf Ebrahimi             return kFloat;
1908*6467f958SSadaf Ebrahimi         case GL_INT:
1909*6467f958SSadaf Ebrahimi             return kInt;
1910*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT:
1911*6467f958SSadaf Ebrahimi             return kUInt;
1912*6467f958SSadaf Ebrahimi         case GL_SHORT:
1913*6467f958SSadaf Ebrahimi             return kShort;
1914*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_SHORT:
1915*6467f958SSadaf Ebrahimi             return kUShort;
1916*6467f958SSadaf Ebrahimi         case GL_BYTE:
1917*6467f958SSadaf Ebrahimi             return kChar;
1918*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_BYTE:
1919*6467f958SSadaf Ebrahimi             return kUChar;
1920*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
1921*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT:
1922*6467f958SSadaf Ebrahimi #else
1923*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_ARB:
1924*6467f958SSadaf Ebrahimi #endif
1925*6467f958SSadaf Ebrahimi             return kHalf;
1926*6467f958SSadaf Ebrahimi         default:
1927*6467f958SSadaf Ebrahimi             return kFloat;
1928*6467f958SSadaf Ebrahimi     };
1929*6467f958SSadaf Ebrahimi }
1930*6467f958SSadaf Ebrahimi 
get_base_gl_target(GLenum target)1931*6467f958SSadaf Ebrahimi GLenum get_base_gl_target( GLenum target )
1932*6467f958SSadaf Ebrahimi {
1933*6467f958SSadaf Ebrahimi     switch( target )
1934*6467f958SSadaf Ebrahimi     {
1935*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1936*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1937*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1938*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1939*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1940*6467f958SSadaf Ebrahimi         case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1941*6467f958SSadaf Ebrahimi             return GL_TEXTURE_CUBE_MAP;
1942*6467f958SSadaf Ebrahimi         default:
1943*6467f958SSadaf Ebrahimi             return target;
1944*6467f958SSadaf Ebrahimi     }
1945*6467f958SSadaf Ebrahimi }
1946*6467f958SSadaf Ebrahimi 
GetGLTypeName(GLenum type)1947*6467f958SSadaf Ebrahimi const char *GetGLTypeName( GLenum type )
1948*6467f958SSadaf Ebrahimi {
1949*6467f958SSadaf Ebrahimi     switch( type )
1950*6467f958SSadaf Ebrahimi     {
1951*6467f958SSadaf Ebrahimi         case GL_BYTE:            return "GL_BYTE";
1952*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_BYTE:   return "GL_UNSIGNED_BYTE";
1953*6467f958SSadaf Ebrahimi         case GL_INT:             return "GL_INT";
1954*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT:    return "GL_UNSIGNED_INT";
1955*6467f958SSadaf Ebrahimi         case GL_SHORT:           return "GL_SHORT";
1956*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_SHORT:  return "GL_UNSIGNED_SHORT";
1957*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
1958*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT:      return "GL_HALF_FLOAT";
1959*6467f958SSadaf Ebrahimi #else
1960*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_ARB:  return "GL_HALF_FLOAT_ARB";
1961*6467f958SSadaf Ebrahimi #endif
1962*6467f958SSadaf Ebrahimi         case GL_FLOAT:           return "GL_FLOAT";
1963*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_8_8_8_8:        return "GL_UNSIGNED_INT_8_8_8_8";
1964*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_8_8_8_8_REV:    return "GL_UNSIGNED_INT_8_8_8_8_REV";
1965*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_10_10_10_2:     return "GL_UNSIGNED_INT_10_10_10_2";
1966*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_2_10_10_10_REV: return "GL_UNSIGNED_INT_2_10_10_10_REV";
1967*6467f958SSadaf Ebrahimi #ifdef GL_VERSION_3_2
1968*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT_24_8: return "GL_UNSIGNED_INT_24_8";
1969*6467f958SSadaf Ebrahimi         case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return "GL_FLOAT_32_UNSIGNED_INT_24_8_REV";
1970*6467f958SSadaf Ebrahimi #endif
1971*6467f958SSadaf Ebrahimi         default:
1972*6467f958SSadaf Ebrahimi         {
1973*6467f958SSadaf Ebrahimi             static char foo[ 128 ];
1974*6467f958SSadaf Ebrahimi             sprintf( foo, "0x%04x", (int)type);
1975*6467f958SSadaf Ebrahimi             return foo;
1976*6467f958SSadaf Ebrahimi         }
1977*6467f958SSadaf Ebrahimi     }
1978*6467f958SSadaf Ebrahimi }
1979*6467f958SSadaf Ebrahimi 
GetGLTargetName(GLenum tgt)1980*6467f958SSadaf Ebrahimi const char *GetGLTargetName( GLenum tgt )
1981*6467f958SSadaf Ebrahimi {
1982*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_BUFFER ) return "GL_TEXTURE_BUFFER";
1983*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_1D ) return "GL_TEXTURE_1D";
1984*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_2D ) return "GL_TEXTURE_2D";
1985*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_3D ) return "GL_TEXTURE_3D";
1986*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_RECTANGLE_EXT ) return "GL_TEXTURE_RECTANGLE_EXT";
1987*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_POSITIVE_X ) return "GL_TEXTURE_CUBE_MAP_POSITIVE_X";
1988*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_POSITIVE_Y ) return "GL_TEXTURE_CUBE_MAP_POSITIVE_Y";
1989*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_POSITIVE_Z ) return "GL_TEXTURE_CUBE_MAP_POSITIVE_Z";
1990*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_NEGATIVE_X ) return "GL_TEXTURE_CUBE_MAP_NEGATIVE_X";
1991*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y ) return "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y";
1992*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_CUBE_MAP_NEGATIVE_Z ) return "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z";
1993*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_2D_MULTISAMPLE ) return "GL_TEXTURE_2D_MULTISAMPLE";
1994*6467f958SSadaf Ebrahimi     if( tgt == GL_TEXTURE_2D_MULTISAMPLE_ARRAY ) return "GL_TEXTURE_2D_MULTISAMPLE_ARRAY";
1995*6467f958SSadaf Ebrahimi 
1996*6467f958SSadaf Ebrahimi     static char foo[ 128 ];
1997*6467f958SSadaf Ebrahimi     sprintf( foo, "0x%04x", (int)tgt);
1998*6467f958SSadaf Ebrahimi     return foo;
1999*6467f958SSadaf Ebrahimi }
2000*6467f958SSadaf Ebrahimi 
GetGLAttachmentName(GLenum att)2001*6467f958SSadaf Ebrahimi const char *GetGLAttachmentName( GLenum att )
2002*6467f958SSadaf Ebrahimi {
2003*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT0_EXT ) return "GL_COLOR_ATTACHMENT0_EXT";
2004*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT1_EXT ) return "GL_COLOR_ATTACHMENT1_EXT";
2005*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT2_EXT ) return "GL_COLOR_ATTACHMENT2_EXT";
2006*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT3_EXT ) return "GL_COLOR_ATTACHMENT3_EXT";
2007*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT4_EXT ) return "GL_COLOR_ATTACHMENT4_EXT";
2008*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT5_EXT ) return "GL_COLOR_ATTACHMENT5_EXT";
2009*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT6_EXT ) return "GL_COLOR_ATTACHMENT6_EXT";
2010*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT7_EXT ) return "GL_COLOR_ATTACHMENT7_EXT";
2011*6467f958SSadaf Ebrahimi     if( att == GL_COLOR_ATTACHMENT8_EXT ) return "GL_COLOR_ATTACHMENT8_EXT";
2012*6467f958SSadaf Ebrahimi     if( att == GL_DEPTH_ATTACHMENT_EXT ) return "GL_DEPTH_ATTACHMENT_EXT";
2013*6467f958SSadaf Ebrahimi     return "";
2014*6467f958SSadaf Ebrahimi }
GetGLBaseFormatName(GLenum baseformat)2015*6467f958SSadaf Ebrahimi const char *GetGLBaseFormatName( GLenum baseformat )
2016*6467f958SSadaf Ebrahimi {
2017*6467f958SSadaf Ebrahimi     switch( baseformat )
2018*6467f958SSadaf Ebrahimi     {
2019*6467f958SSadaf Ebrahimi         case GL_RGBA8:          return "GL_RGBA";
2020*6467f958SSadaf Ebrahimi         case GL_RGBA16:         return "GL_RGBA";
2021*6467f958SSadaf Ebrahimi         case GL_RGBA:           return "GL_RGBA";
2022*6467f958SSadaf Ebrahimi         case GL_BGRA:           return "GL_BGRA";
2023*6467f958SSadaf Ebrahimi         case GL_RGBA8I_EXT:     return "GL_RGBA_INTEGER_EXT";
2024*6467f958SSadaf Ebrahimi         case GL_RGBA16I_EXT:    return "GL_RGBA_INTEGER_EXT";
2025*6467f958SSadaf Ebrahimi         case GL_RGBA32I_EXT:    return "GL_RGBA_INTEGER_EXT";
2026*6467f958SSadaf Ebrahimi         case GL_RGBA8UI_EXT:    return "GL_RGBA_INTEGER_EXT";
2027*6467f958SSadaf Ebrahimi         case GL_RGBA16UI_EXT:   return "GL_RGBA_INTEGER_EXT";
2028*6467f958SSadaf Ebrahimi         case GL_RGBA32UI_EXT:   return "GL_RGBA_INTEGER_EXT";
2029*6467f958SSadaf Ebrahimi         case GL_RGBA32F_ARB:    return "GL_RGBA";
2030*6467f958SSadaf Ebrahimi 
2031*6467f958SSadaf Ebrahimi         case GL_RGBA_INTEGER_EXT:   return "GL_RGBA_INTEGER_EXT";
2032*6467f958SSadaf Ebrahimi 
2033*6467f958SSadaf Ebrahimi         case GL_ALPHA4: return "GL_ALPHA";
2034*6467f958SSadaf Ebrahimi         case GL_ALPHA8: return "GL_ALPHA";
2035*6467f958SSadaf Ebrahimi         case GL_ALPHA12: return "GL_ALPHA";
2036*6467f958SSadaf Ebrahimi         case GL_ALPHA16: return "GL_ALPHA";
2037*6467f958SSadaf Ebrahimi         case GL_LUMINANCE4: return "GL_LUMINANCE";
2038*6467f958SSadaf Ebrahimi         case GL_LUMINANCE8: return "GL_LUMINANCE";
2039*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12: return "GL_LUMINANCE";
2040*6467f958SSadaf Ebrahimi         case GL_LUMINANCE16: return "GL_LUMINANCE";
2041*6467f958SSadaf Ebrahimi         case GL_LUMINANCE4_ALPHA4: return "GL_LUMINANCE_ALPHA";
2042*6467f958SSadaf Ebrahimi         case GL_LUMINANCE6_ALPHA2: return "GL_LUMINANCE_ALPHA";
2043*6467f958SSadaf Ebrahimi         case GL_LUMINANCE8_ALPHA8: return "GL_LUMINANCE_ALPHA";
2044*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12_ALPHA4: return "GL_LUMINANCE_ALPHA";
2045*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12_ALPHA12: return "GL_LUMINANCE_ALPHA";
2046*6467f958SSadaf Ebrahimi         case GL_LUMINANCE16_ALPHA16: return "GL_LUMINANCE_ALPHA";
2047*6467f958SSadaf Ebrahimi         case GL_INTENSITY: return "GL_INTENSITY";
2048*6467f958SSadaf Ebrahimi         case GL_INTENSITY4: return "GL_INTENSITY";
2049*6467f958SSadaf Ebrahimi         case GL_INTENSITY8: return "GL_INTENSITY";
2050*6467f958SSadaf Ebrahimi         case GL_INTENSITY12: return "GL_INTENSITY";
2051*6467f958SSadaf Ebrahimi         case GL_INTENSITY16: return "GL_INTENSITY";
2052*6467f958SSadaf Ebrahimi         case GL_R3_G3_B2: return "GL_RGB";
2053*6467f958SSadaf Ebrahimi         case GL_RGB4: return "GL_RGB";
2054*6467f958SSadaf Ebrahimi         case GL_RGB5: return "GL_RGB";
2055*6467f958SSadaf Ebrahimi         case GL_RGB8: return "GL_RGB";
2056*6467f958SSadaf Ebrahimi         case GL_RGB10: return "GL_RGB";
2057*6467f958SSadaf Ebrahimi         case GL_RGB12: return "GL_RGB";
2058*6467f958SSadaf Ebrahimi         case GL_RGB16: return "GL_RGB";
2059*6467f958SSadaf Ebrahimi         case GL_RGBA2: return "GL_RGBA";
2060*6467f958SSadaf Ebrahimi         case GL_RGBA4: return "GL_RGBA";
2061*6467f958SSadaf Ebrahimi         case GL_RGB5_A1: return "GL_RGBA";
2062*6467f958SSadaf Ebrahimi         case GL_RGB10_A2: return "GL_RGBA";
2063*6467f958SSadaf Ebrahimi         case GL_RGBA12: return "GL_RGBA";
2064*6467f958SSadaf Ebrahimi #ifdef GL_VERSION_3_2
2065*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT: return "GL_DEPTH_COMPONENT";
2066*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT16: return "GL_DEPTH_COMPONENT";
2067*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT24: return "GL_DEPTH_COMPONENT";
2068*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT32: return "GL_DEPTH_COMPONENT";
2069*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT32F: return "GL_DEPTH_COMPONENT";
2070*6467f958SSadaf Ebrahimi         case GL_DEPTH_STENCIL:      return "GL_DEPTH_STENCIL";
2071*6467f958SSadaf Ebrahimi         case GL_DEPTH24_STENCIL8:   return "GL_DEPTH_STENCIL";
2072*6467f958SSadaf Ebrahimi         case GL_DEPTH32F_STENCIL8:  return "GL_DEPTH_STENCIL";
2073*6467f958SSadaf Ebrahimi #endif
2074*6467f958SSadaf Ebrahimi         default:
2075*6467f958SSadaf Ebrahimi         {
2076*6467f958SSadaf Ebrahimi             static char foo[ 128 ];
2077*6467f958SSadaf Ebrahimi             sprintf( foo, "0x%04x", (int)baseformat );
2078*6467f958SSadaf Ebrahimi             return foo;
2079*6467f958SSadaf Ebrahimi         }
2080*6467f958SSadaf Ebrahimi     }
2081*6467f958SSadaf Ebrahimi }
2082*6467f958SSadaf Ebrahimi 
GetGLFormatName(GLenum format)2083*6467f958SSadaf Ebrahimi const char *GetGLFormatName( GLenum format )
2084*6467f958SSadaf Ebrahimi {
2085*6467f958SSadaf Ebrahimi     switch( format )
2086*6467f958SSadaf Ebrahimi     {
2087*6467f958SSadaf Ebrahimi         case GL_RGBA8:          return "GL_RGBA8";
2088*6467f958SSadaf Ebrahimi         case GL_RGBA16:         return "GL_RGBA16";
2089*6467f958SSadaf Ebrahimi         case GL_RGBA:           return "GL_RGBA";
2090*6467f958SSadaf Ebrahimi         case GL_BGRA:           return "GL_BGRA";
2091*6467f958SSadaf Ebrahimi         case GL_RGBA8I_EXT:     return "GL_RGBA8I_EXT";
2092*6467f958SSadaf Ebrahimi         case GL_RGBA16I_EXT:    return "GL_RGBA16I_EXT";
2093*6467f958SSadaf Ebrahimi         case GL_RGBA32I_EXT:    return "GL_RGBA32I_EXT";
2094*6467f958SSadaf Ebrahimi         case GL_RGBA8UI_EXT:    return "GL_RGBA8UI_EXT";
2095*6467f958SSadaf Ebrahimi         case GL_RGBA16UI_EXT:   return "GL_RGBA16UI_EXT";
2096*6467f958SSadaf Ebrahimi         case GL_RGBA32UI_EXT:   return "GL_RGBA32UI_EXT";
2097*6467f958SSadaf Ebrahimi         case GL_RGBA16F:        return "GL_RGBA16F";
2098*6467f958SSadaf Ebrahimi         case GL_RGBA32F:        return "GL_RGBA32F";
2099*6467f958SSadaf Ebrahimi 
2100*6467f958SSadaf Ebrahimi         case GL_RGBA_INTEGER_EXT:   return "GL_RGBA_INTEGER_EXT";
2101*6467f958SSadaf Ebrahimi 
2102*6467f958SSadaf Ebrahimi         case GL_ALPHA4: return "GL_ALPHA4";
2103*6467f958SSadaf Ebrahimi         case GL_ALPHA8: return "GL_ALPHA8";
2104*6467f958SSadaf Ebrahimi         case GL_ALPHA12: return "GL_ALPHA12";
2105*6467f958SSadaf Ebrahimi         case GL_ALPHA16: return "GL_ALPHA16";
2106*6467f958SSadaf Ebrahimi         case GL_LUMINANCE4: return "GL_LUMINANCE4";
2107*6467f958SSadaf Ebrahimi         case GL_LUMINANCE8: return "GL_LUMINANCE8";
2108*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12: return "GL_LUMINANCE12";
2109*6467f958SSadaf Ebrahimi         case GL_LUMINANCE16: return "GL_LUMINANCE16";
2110*6467f958SSadaf Ebrahimi         case GL_LUMINANCE4_ALPHA4: return "GL_LUMINANCE4_ALPHA4";
2111*6467f958SSadaf Ebrahimi         case GL_LUMINANCE6_ALPHA2: return "GL_LUMINANCE6_ALPHA2";
2112*6467f958SSadaf Ebrahimi         case GL_LUMINANCE8_ALPHA8: return "GL_LUMINANCE8_ALPHA8";
2113*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12_ALPHA4: return "GL_LUMINANCE12_ALPHA4";
2114*6467f958SSadaf Ebrahimi         case GL_LUMINANCE12_ALPHA12: return "GL_LUMINANCE12_ALPHA12";
2115*6467f958SSadaf Ebrahimi         case GL_LUMINANCE16_ALPHA16: return "GL_LUMINANCE16_ALPHA16";
2116*6467f958SSadaf Ebrahimi         case GL_INTENSITY: return "GL_INTENSITY";
2117*6467f958SSadaf Ebrahimi         case GL_INTENSITY4: return "GL_INTENSITY4";
2118*6467f958SSadaf Ebrahimi         case GL_INTENSITY8: return "GL_INTENSITY8";
2119*6467f958SSadaf Ebrahimi         case GL_INTENSITY12: return "GL_INTENSITY12";
2120*6467f958SSadaf Ebrahimi         case GL_INTENSITY16: return "GL_INTENSITY16";
2121*6467f958SSadaf Ebrahimi         case GL_R3_G3_B2: return "GL_R3_G3_B2";
2122*6467f958SSadaf Ebrahimi         case GL_RGB4: return "GL_RGB4";
2123*6467f958SSadaf Ebrahimi         case GL_RGB5: return "GL_RGB5";
2124*6467f958SSadaf Ebrahimi         case GL_RGB8: return "GL_RGB8";
2125*6467f958SSadaf Ebrahimi         case GL_RGB10: return "GL_RGB10";
2126*6467f958SSadaf Ebrahimi         case GL_RGB12: return "GL_RGB12";
2127*6467f958SSadaf Ebrahimi         case GL_RGB16: return "GL_RGB16";
2128*6467f958SSadaf Ebrahimi         case GL_RGBA2: return "GL_RGBA2";
2129*6467f958SSadaf Ebrahimi         case GL_RGBA4: return "GL_RGBA4";
2130*6467f958SSadaf Ebrahimi         case GL_RGB5_A1: return "GL_RGB5_A1";
2131*6467f958SSadaf Ebrahimi         case GL_RGB10_A2: return "GL_RGB10_A2";
2132*6467f958SSadaf Ebrahimi         case GL_RGBA12: return "GL_RGBA12";
2133*6467f958SSadaf Ebrahimi 
2134*6467f958SSadaf Ebrahimi         case GL_INT:            return "GL_INT";
2135*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_INT:   return "GL_UNSIGNED_INT";
2136*6467f958SSadaf Ebrahimi         case GL_SHORT:          return "GL_SHORT";
2137*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_SHORT: return "GL_UNSIGNED_SHORT";
2138*6467f958SSadaf Ebrahimi         case GL_BYTE:           return "GL_BYTE";
2139*6467f958SSadaf Ebrahimi         case GL_UNSIGNED_BYTE:  return "GL_UNSIGNED_BYTE";
2140*6467f958SSadaf Ebrahimi         case GL_FLOAT:          return "GL_FLOAT";
2141*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
2142*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT:     return "GL_HALF_FLOAT";
2143*6467f958SSadaf Ebrahimi #else
2144*6467f958SSadaf Ebrahimi         case GL_HALF_FLOAT_ARB: return "GL_HALF_FLOAT_ARB";
2145*6467f958SSadaf Ebrahimi #endif
2146*6467f958SSadaf Ebrahimi #ifdef GL_VERSION_3_2
2147*6467f958SSadaf Ebrahimi         case GL_DEPTH_STENCIL:      return "GL_DEPTH_STENCIL";
2148*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT:    return "GL_DEPTH_COMPONENT";
2149*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT16:  return "GL_DEPTH_COMPONENT16";
2150*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT24:  return "GL_DEPTH_COMPONENT24";
2151*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT32:  return "GL_DEPTH_COMPONENT32";
2152*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT32F: return "GL_DEPTH_COMPONENT32F";
2153*6467f958SSadaf Ebrahimi         case GL_DEPTH24_STENCIL8:   return "GL_DEPTH24_STENCIL8";
2154*6467f958SSadaf Ebrahimi         case GL_DEPTH32F_STENCIL8:  return "GL_DEPTH32F_STENCIL8";
2155*6467f958SSadaf Ebrahimi #endif
2156*6467f958SSadaf Ebrahimi         default:
2157*6467f958SSadaf Ebrahimi         {
2158*6467f958SSadaf Ebrahimi             static char foo[ 128 ];
2159*6467f958SSadaf Ebrahimi             sprintf( foo, "0x%04x", (int)format);
2160*6467f958SSadaf Ebrahimi             return foo;
2161*6467f958SSadaf Ebrahimi         }
2162*6467f958SSadaf Ebrahimi     }
2163*6467f958SSadaf Ebrahimi }
2164*6467f958SSadaf Ebrahimi 
CreateRandomData(ExplicitType type,size_t count,MTdata d)2165*6467f958SSadaf Ebrahimi void* CreateRandomData( ExplicitType type, size_t count, MTdata d )
2166*6467f958SSadaf Ebrahimi {
2167*6467f958SSadaf Ebrahimi     switch(type)
2168*6467f958SSadaf Ebrahimi     {
2169*6467f958SSadaf Ebrahimi         case (kChar):
2170*6467f958SSadaf Ebrahimi         {
2171*6467f958SSadaf Ebrahimi             cl_char *p = (cl_char *)malloc(count * sizeof(cl_char));
2172*6467f958SSadaf Ebrahimi             if(!p) return 0;
2173*6467f958SSadaf Ebrahimi 
2174*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
2175*6467f958SSadaf Ebrahimi             {
2176*6467f958SSadaf Ebrahimi                 p[ i ] = (cl_char)genrand_int32(d);
2177*6467f958SSadaf Ebrahimi             }
2178*6467f958SSadaf Ebrahimi             return (void*)p;
2179*6467f958SSadaf Ebrahimi         }
2180*6467f958SSadaf Ebrahimi         case (kUChar):
2181*6467f958SSadaf Ebrahimi         case (kUnsignedChar):
2182*6467f958SSadaf Ebrahimi         {
2183*6467f958SSadaf Ebrahimi             cl_uchar *p = (cl_uchar *)malloc(count * sizeof(cl_uchar));
2184*6467f958SSadaf Ebrahimi             if(!p) return 0;
2185*6467f958SSadaf Ebrahimi 
2186*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
2187*6467f958SSadaf Ebrahimi             {
2188*6467f958SSadaf Ebrahimi                 p[ i ] =  (cl_uchar)genrand_int32(d);
2189*6467f958SSadaf Ebrahimi             }
2190*6467f958SSadaf Ebrahimi 
2191*6467f958SSadaf Ebrahimi             return (void*)p;
2192*6467f958SSadaf Ebrahimi         }
2193*6467f958SSadaf Ebrahimi         case (kShort):
2194*6467f958SSadaf Ebrahimi         {
2195*6467f958SSadaf Ebrahimi             cl_short *p = (cl_short *)malloc(count * sizeof(cl_short));
2196*6467f958SSadaf Ebrahimi             if(!p) return 0;
2197*6467f958SSadaf Ebrahimi 
2198*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
2199*6467f958SSadaf Ebrahimi             {
2200*6467f958SSadaf Ebrahimi                 p[ i ] = (cl_short)genrand_int32(d);
2201*6467f958SSadaf Ebrahimi             }
2202*6467f958SSadaf Ebrahimi 
2203*6467f958SSadaf Ebrahimi             return (void*)p;
2204*6467f958SSadaf Ebrahimi         }
2205*6467f958SSadaf Ebrahimi         case (kUShort):
2206*6467f958SSadaf Ebrahimi         case (kUnsignedShort):
2207*6467f958SSadaf Ebrahimi         {
2208*6467f958SSadaf Ebrahimi             cl_ushort *p = (cl_ushort *)malloc(count * sizeof(cl_ushort));
2209*6467f958SSadaf Ebrahimi             if(!p) return 0;
2210*6467f958SSadaf Ebrahimi 
2211*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
2212*6467f958SSadaf Ebrahimi             {
2213*6467f958SSadaf Ebrahimi                 p[ i ] = (cl_ushort)genrand_int32(d);
2214*6467f958SSadaf Ebrahimi             }
2215*6467f958SSadaf Ebrahimi 
2216*6467f958SSadaf Ebrahimi             return (void*)p;
2217*6467f958SSadaf Ebrahimi         }
2218*6467f958SSadaf Ebrahimi         case (kInt):
2219*6467f958SSadaf Ebrahimi         {
2220*6467f958SSadaf Ebrahimi             cl_int *p = (cl_int *)malloc(count * sizeof(cl_int));
2221*6467f958SSadaf Ebrahimi             if(!p) return 0;
2222*6467f958SSadaf Ebrahimi 
2223*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
2224*6467f958SSadaf Ebrahimi             {
2225*6467f958SSadaf Ebrahimi                 p[ i ] = (cl_int)genrand_int32(d);
2226*6467f958SSadaf Ebrahimi             }
2227*6467f958SSadaf Ebrahimi 
2228*6467f958SSadaf Ebrahimi             return (void*)p;
2229*6467f958SSadaf Ebrahimi         }
2230*6467f958SSadaf Ebrahimi         case (kUInt):
2231*6467f958SSadaf Ebrahimi         case (kUnsignedInt):
2232*6467f958SSadaf Ebrahimi         {
2233*6467f958SSadaf Ebrahimi             cl_uint *p = (cl_uint *)malloc(count * sizeof(cl_uint));
2234*6467f958SSadaf Ebrahimi             if(!p) return 0;
2235*6467f958SSadaf Ebrahimi 
2236*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
2237*6467f958SSadaf Ebrahimi             {
2238*6467f958SSadaf Ebrahimi                 p[ i ] =  (cl_uint)genrand_int32(d);
2239*6467f958SSadaf Ebrahimi             }
2240*6467f958SSadaf Ebrahimi 
2241*6467f958SSadaf Ebrahimi             return (void*)p;
2242*6467f958SSadaf Ebrahimi         }
2243*6467f958SSadaf Ebrahimi 
2244*6467f958SSadaf Ebrahimi         case (kFloat):
2245*6467f958SSadaf Ebrahimi         {
2246*6467f958SSadaf Ebrahimi             cl_float *p = (cl_float *)malloc(count * sizeof(cl_float));
2247*6467f958SSadaf Ebrahimi             if(!p) return 0;
2248*6467f958SSadaf Ebrahimi 
2249*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
2250*6467f958SSadaf Ebrahimi             {
2251*6467f958SSadaf Ebrahimi                 p[ i ] = get_random_float( 0.f, 1.f, d );
2252*6467f958SSadaf Ebrahimi             }
2253*6467f958SSadaf Ebrahimi 
2254*6467f958SSadaf Ebrahimi             return (void*)p;
2255*6467f958SSadaf Ebrahimi         }
2256*6467f958SSadaf Ebrahimi         case (kHalf):
2257*6467f958SSadaf Ebrahimi         {
2258*6467f958SSadaf Ebrahimi             cl_half *p = (cl_half *)malloc(count * sizeof(cl_half));
2259*6467f958SSadaf Ebrahimi             if(!p) return 0;
2260*6467f958SSadaf Ebrahimi 
2261*6467f958SSadaf Ebrahimi             for( size_t i = 0; i < count; i++ )
2262*6467f958SSadaf Ebrahimi             {
2263*6467f958SSadaf Ebrahimi                 p[ i ] = convert_float_to_half( get_random_float( 0.f, 1.f, d ) );
2264*6467f958SSadaf Ebrahimi             }
2265*6467f958SSadaf Ebrahimi 
2266*6467f958SSadaf Ebrahimi             return (void*)p;
2267*6467f958SSadaf Ebrahimi         }
2268*6467f958SSadaf Ebrahimi         default:
2269*6467f958SSadaf Ebrahimi         {
2270*6467f958SSadaf Ebrahimi             log_error("Invalid explicit type specified for create random data!\n");
2271*6467f958SSadaf Ebrahimi             return 0;
2272*6467f958SSadaf Ebrahimi         }
2273*6467f958SSadaf Ebrahimi     }
2274*6467f958SSadaf Ebrahimi     return 0;
2275*6467f958SSadaf Ebrahimi }
2276*6467f958SSadaf Ebrahimi 
DumpGLBuffer(GLenum type,size_t width,size_t height,void * buffer)2277*6467f958SSadaf Ebrahimi void DumpGLBuffer(GLenum type, size_t width, size_t height, void* buffer)
2278*6467f958SSadaf Ebrahimi {
2279*6467f958SSadaf Ebrahimi     size_t i;
2280*6467f958SSadaf Ebrahimi     size_t count = width * height;
2281*6467f958SSadaf Ebrahimi     if(type == GL_BYTE)
2282*6467f958SSadaf Ebrahimi     {
2283*6467f958SSadaf Ebrahimi         cl_char* p = (cl_char*)buffer;
2284*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
2285*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
2286*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
2287*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
2288*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
2289*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
2290*6467f958SSadaf Ebrahimi     }
2291*6467f958SSadaf Ebrahimi     else if(type == GL_UNSIGNED_BYTE)
2292*6467f958SSadaf Ebrahimi     {
2293*6467f958SSadaf Ebrahimi         cl_uchar* p = (cl_uchar*)buffer;
2294*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
2295*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
2296*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
2297*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
2298*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
2299*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
2300*6467f958SSadaf Ebrahimi     }
2301*6467f958SSadaf Ebrahimi     else if(type == GL_INT)
2302*6467f958SSadaf Ebrahimi     {
2303*6467f958SSadaf Ebrahimi         cl_int* p = (cl_int*)buffer;
2304*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
2305*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
2306*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
2307*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
2308*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
2309*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
2310*6467f958SSadaf Ebrahimi     }
2311*6467f958SSadaf Ebrahimi     else if(type == GL_UNSIGNED_INT)
2312*6467f958SSadaf Ebrahimi     {
2313*6467f958SSadaf Ebrahimi         cl_uint* p = (cl_uint*)buffer;
2314*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
2315*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
2316*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
2317*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
2318*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
2319*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
2320*6467f958SSadaf Ebrahimi     }
2321*6467f958SSadaf Ebrahimi     else if(type == GL_SHORT)
2322*6467f958SSadaf Ebrahimi     {
2323*6467f958SSadaf Ebrahimi         cl_short* p = (cl_short*)buffer;
2324*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
2325*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
2326*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
2327*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
2328*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
2329*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
2330*6467f958SSadaf Ebrahimi     }
2331*6467f958SSadaf Ebrahimi     else if(type == GL_UNSIGNED_SHORT)
2332*6467f958SSadaf Ebrahimi     {
2333*6467f958SSadaf Ebrahimi         cl_ushort* p = (cl_ushort*)buffer;
2334*6467f958SSadaf Ebrahimi         for(i = 0; i <  count; i++)
2335*6467f958SSadaf Ebrahimi             log_info("[%4d] %3d %3d %3d %3d\n", (unsigned int)(i),
2336*6467f958SSadaf Ebrahimi                 p[i* 4 + 0],
2337*6467f958SSadaf Ebrahimi                 p[i* 4 + 1],
2338*6467f958SSadaf Ebrahimi                 p[i* 4 + 2],
2339*6467f958SSadaf Ebrahimi                 p[i* 4 + 3]);
2340*6467f958SSadaf Ebrahimi     }
2341*6467f958SSadaf Ebrahimi     else if(type == GL_FLOAT)
2342*6467f958SSadaf Ebrahimi     {
2343*6467f958SSadaf Ebrahimi         cl_float* p = (cl_float*)buffer;
2344*6467f958SSadaf Ebrahimi         for(i = 0; i < count; i++)
2345*6467f958SSadaf Ebrahimi             log_info("[%4d] %#f %#f %#f %#f\n", (unsigned int)(i),
2346*6467f958SSadaf Ebrahimi                p[i* 4 + 0],
2347*6467f958SSadaf Ebrahimi                p[i* 4 + 1],
2348*6467f958SSadaf Ebrahimi                p[i* 4 + 2],
2349*6467f958SSadaf Ebrahimi                p[i* 4 + 3]);
2350*6467f958SSadaf Ebrahimi     }
2351*6467f958SSadaf Ebrahimi }
2352*6467f958SSadaf Ebrahimi 
2353*6467f958SSadaf Ebrahimi #if defined(_WIN32)
2354*6467f958SSadaf Ebrahimi #include <string.h>
2355*6467f958SSadaf Ebrahimi 
gluCheckExtension(const GLubyte * extName,const GLubyte * extString)2356*6467f958SSadaf Ebrahimi GLboolean gluCheckExtension(const GLubyte *extName, const GLubyte *extString)
2357*6467f958SSadaf Ebrahimi {
2358*6467f958SSadaf Ebrahimi   const size_t len = strlen((const char*)extName);
2359*6467f958SSadaf Ebrahimi   const char* str = (const char*)extString;
2360*6467f958SSadaf Ebrahimi 
2361*6467f958SSadaf Ebrahimi   while (str != NULL) {
2362*6467f958SSadaf Ebrahimi     str = strstr(str, (const char*)extName);
2363*6467f958SSadaf Ebrahimi     if (str == NULL) {
2364*6467f958SSadaf Ebrahimi       break;
2365*6467f958SSadaf Ebrahimi     }
2366*6467f958SSadaf Ebrahimi     if ((str > (const char*)extString || str[-1] == ' ')
2367*6467f958SSadaf Ebrahimi         && (str[len] == ' ' || str[len] == '\0')) {
2368*6467f958SSadaf Ebrahimi       return GL_TRUE;
2369*6467f958SSadaf Ebrahimi     }
2370*6467f958SSadaf Ebrahimi     str = strchr(str + len, ' ');
2371*6467f958SSadaf Ebrahimi   }
2372*6467f958SSadaf Ebrahimi 
2373*6467f958SSadaf Ebrahimi   return GL_FALSE;
2374*6467f958SSadaf Ebrahimi }
2375*6467f958SSadaf Ebrahimi 
2376*6467f958SSadaf Ebrahimi #endif
2377*6467f958SSadaf Ebrahimi 
2378*6467f958SSadaf Ebrahimi // Function pointers for the GL/CL calls
2379*6467f958SSadaf Ebrahimi clCreateFromGLBuffer_fn clCreateFromGLBuffer_ptr;
2380*6467f958SSadaf Ebrahimi clCreateFromGLTexture_fn clCreateFromGLTexture_ptr;
2381*6467f958SSadaf Ebrahimi clCreateFromGLTexture2D_fn clCreateFromGLTexture2D_ptr;
2382*6467f958SSadaf Ebrahimi clCreateFromGLTexture3D_fn clCreateFromGLTexture3D_ptr;
2383*6467f958SSadaf Ebrahimi clCreateFromGLRenderbuffer_fn clCreateFromGLRenderbuffer_ptr;
2384*6467f958SSadaf Ebrahimi clGetGLObjectInfo_fn clGetGLObjectInfo_ptr;
2385*6467f958SSadaf Ebrahimi clGetGLTextureInfo_fn clGetGLTextureInfo_ptr;
2386*6467f958SSadaf Ebrahimi clEnqueueAcquireGLObjects_fn clEnqueueAcquireGLObjects_ptr;
2387*6467f958SSadaf Ebrahimi clEnqueueReleaseGLObjects_fn clEnqueueReleaseGLObjects_ptr;
2388*6467f958SSadaf Ebrahimi 
init_clgl_ext()2389*6467f958SSadaf Ebrahimi int init_clgl_ext() {
2390*6467f958SSadaf Ebrahimi 
2391*6467f958SSadaf Ebrahimi     // As OpenCL for the platforms.  Warn if more than one platform found,
2392*6467f958SSadaf Ebrahimi     // since this might not be the platform we want.  By default, we simply
2393*6467f958SSadaf Ebrahimi     // use the first returned platform.
2394*6467f958SSadaf Ebrahimi 
2395*6467f958SSadaf Ebrahimi     cl_uint nplatforms;
2396*6467f958SSadaf Ebrahimi     cl_platform_id platform;
2397*6467f958SSadaf Ebrahimi     clGetPlatformIDs(0, NULL, &nplatforms);
2398*6467f958SSadaf Ebrahimi     clGetPlatformIDs(1, &platform, NULL);
2399*6467f958SSadaf Ebrahimi 
2400*6467f958SSadaf Ebrahimi     if (nplatforms > 1) {
2401*6467f958SSadaf Ebrahimi         log_info("clGetPlatformIDs returned multiple values.  This is not "
2402*6467f958SSadaf Ebrahimi             "an error, but might result in obtaining incorrect function "
2403*6467f958SSadaf Ebrahimi             "pointers if you do not want the first returned platform.\n");
2404*6467f958SSadaf Ebrahimi 
2405*6467f958SSadaf Ebrahimi         // Show them the platform name, in case it is a problem.
2406*6467f958SSadaf Ebrahimi 
2407*6467f958SSadaf Ebrahimi         size_t size;
2408*6467f958SSadaf Ebrahimi         char *name;
2409*6467f958SSadaf Ebrahimi 
2410*6467f958SSadaf Ebrahimi         clGetPlatformInfo(platform, CL_PLATFORM_NAME, 0, NULL, &size);
2411*6467f958SSadaf Ebrahimi         name = (char*)malloc(size);
2412*6467f958SSadaf Ebrahimi         clGetPlatformInfo(platform, CL_PLATFORM_NAME, size, name, NULL);
2413*6467f958SSadaf Ebrahimi 
2414*6467f958SSadaf Ebrahimi         log_info("Using platform with name: %s \n", name);
2415*6467f958SSadaf Ebrahimi         free(name);
2416*6467f958SSadaf Ebrahimi     }
2417*6467f958SSadaf Ebrahimi 
2418*6467f958SSadaf Ebrahimi     // Create the function pointer table
2419*6467f958SSadaf Ebrahimi     clCreateFromGLBuffer_ptr = (clCreateFromGLBuffer_fn)clGetExtensionFunctionAddressForPlatform(platform,"clCreateFromGLBuffer");
2420*6467f958SSadaf Ebrahimi     if (clCreateFromGLBuffer_ptr == NULL) {
2421*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(platform,clCreateFromGLBuffer) returned NULL.\n");
2422*6467f958SSadaf Ebrahimi         return -1;
2423*6467f958SSadaf Ebrahimi     }
2424*6467f958SSadaf Ebrahimi     clCreateFromGLTexture2D_ptr = (clCreateFromGLTexture2D_fn)clGetExtensionFunctionAddressForPlatform(platform,"clCreateFromGLTexture2D");
2425*6467f958SSadaf Ebrahimi     if (clCreateFromGLTexture2D_ptr == NULL) {
2426*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(platform,clCreateFromGLTexture2D) returned NULL.\n");
2427*6467f958SSadaf Ebrahimi         return -1;
2428*6467f958SSadaf Ebrahimi     }
2429*6467f958SSadaf Ebrahimi     clCreateFromGLTexture3D_ptr = (clCreateFromGLTexture3D_fn)clGetExtensionFunctionAddressForPlatform(platform,"clCreateFromGLTexture3D");
2430*6467f958SSadaf Ebrahimi     if (clCreateFromGLTexture3D_ptr == NULL) {
2431*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(platform,clCreateFromGLTexture3D\") returned NULL.\n");
2432*6467f958SSadaf Ebrahimi         return -1;
2433*6467f958SSadaf Ebrahimi     }
2434*6467f958SSadaf Ebrahimi     clCreateFromGLTexture_ptr = (clCreateFromGLTexture_fn)clGetExtensionFunctionAddressForPlatform(platform,"clCreateFromGLTexture");
2435*6467f958SSadaf Ebrahimi     if (clCreateFromGLTexture_ptr == NULL) {
2436*6467f958SSadaf Ebrahimi          log_error("clGetExtensionFunctionAddressForPlatform(platform,\"clCreateFromGLTexture\") returned NULL.\n");
2437*6467f958SSadaf Ebrahimi          return -1;
2438*6467f958SSadaf Ebrahimi     }
2439*6467f958SSadaf Ebrahimi     clCreateFromGLRenderbuffer_ptr = (clCreateFromGLRenderbuffer_fn)clGetExtensionFunctionAddressForPlatform(platform,"clCreateFromGLRenderbuffer");
2440*6467f958SSadaf Ebrahimi     if (clCreateFromGLRenderbuffer_ptr == NULL) {
2441*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(platform,clCreateFromGLRenderbuffer) returned NULL.\n");
2442*6467f958SSadaf Ebrahimi         return -1;
2443*6467f958SSadaf Ebrahimi     }
2444*6467f958SSadaf Ebrahimi     clGetGLObjectInfo_ptr = (clGetGLObjectInfo_fn)clGetExtensionFunctionAddressForPlatform(platform,"clGetGLObjectInfo");
2445*6467f958SSadaf Ebrahimi     if (clGetGLObjectInfo_ptr == NULL) {
2446*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(platform,clGetGLObjectInfo) returned NULL.\n");
2447*6467f958SSadaf Ebrahimi         return -1;
2448*6467f958SSadaf Ebrahimi     }
2449*6467f958SSadaf Ebrahimi     clGetGLTextureInfo_ptr = (clGetGLTextureInfo_fn)clGetExtensionFunctionAddressForPlatform(platform,"clGetGLTextureInfo");
2450*6467f958SSadaf Ebrahimi     if (clGetGLTextureInfo_ptr == NULL) {
2451*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(platform,clGetGLTextureInfo) returned NULL.\n");
2452*6467f958SSadaf Ebrahimi         return -1;
2453*6467f958SSadaf Ebrahimi     }
2454*6467f958SSadaf Ebrahimi     clEnqueueAcquireGLObjects_ptr = (clEnqueueAcquireGLObjects_fn)clGetExtensionFunctionAddressForPlatform(platform,"clEnqueueAcquireGLObjects");
2455*6467f958SSadaf Ebrahimi     if (clEnqueueAcquireGLObjects_ptr == NULL) {
2456*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(platform,clEnqueueAcquireGLObjects) returned NULL.\n");
2457*6467f958SSadaf Ebrahimi         return -1;
2458*6467f958SSadaf Ebrahimi     }
2459*6467f958SSadaf Ebrahimi     clEnqueueReleaseGLObjects_ptr = (clEnqueueReleaseGLObjects_fn)clGetExtensionFunctionAddressForPlatform(platform,"clEnqueueReleaseGLObjects");
2460*6467f958SSadaf Ebrahimi     if (clEnqueueReleaseGLObjects_ptr == NULL) {
2461*6467f958SSadaf Ebrahimi         log_error("clGetExtensionFunctionAddressForPlatform(platform,clEnqueueReleaseGLObjects) returned NULL.\n");
2462*6467f958SSadaf Ebrahimi         return -1;
2463*6467f958SSadaf Ebrahimi     }
2464*6467f958SSadaf Ebrahimi 
2465*6467f958SSadaf Ebrahimi     return 0;
2466*6467f958SSadaf Ebrahimi }
2467*6467f958SSadaf Ebrahimi 
get_gl_max_samples(GLenum target,GLenum internalformat)2468*6467f958SSadaf Ebrahimi GLint get_gl_max_samples( GLenum target, GLenum internalformat )
2469*6467f958SSadaf Ebrahimi {
2470*6467f958SSadaf Ebrahimi     GLint max_samples = 0;
2471*6467f958SSadaf Ebrahimi #ifdef GL_VERSION_4_2
2472*6467f958SSadaf Ebrahimi     glGetInternalformativ(target, internalformat, GL_SAMPLES, 1, &max_samples);
2473*6467f958SSadaf Ebrahimi #else
2474*6467f958SSadaf Ebrahimi     switch (internalformat)
2475*6467f958SSadaf Ebrahimi     {
2476*6467f958SSadaf Ebrahimi         case GL_RGBA8I:
2477*6467f958SSadaf Ebrahimi         case GL_RGBA16I:
2478*6467f958SSadaf Ebrahimi         case GL_RGBA32I:
2479*6467f958SSadaf Ebrahimi         case GL_RGBA8UI:
2480*6467f958SSadaf Ebrahimi         case GL_RGBA16UI:
2481*6467f958SSadaf Ebrahimi         case GL_RGBA32UI:
2482*6467f958SSadaf Ebrahimi             glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &max_samples);
2483*6467f958SSadaf Ebrahimi             break;
2484*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT16:
2485*6467f958SSadaf Ebrahimi         case GL_DEPTH_COMPONENT32F:
2486*6467f958SSadaf Ebrahimi         case GL_DEPTH24_STENCIL8:
2487*6467f958SSadaf Ebrahimi         case GL_DEPTH32F_STENCIL8:
2488*6467f958SSadaf Ebrahimi             glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &max_samples);
2489*6467f958SSadaf Ebrahimi             break;
2490*6467f958SSadaf Ebrahimi         default:
2491*6467f958SSadaf Ebrahimi             glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &max_samples);
2492*6467f958SSadaf Ebrahimi             break;
2493*6467f958SSadaf Ebrahimi     }
2494*6467f958SSadaf Ebrahimi #endif
2495*6467f958SSadaf Ebrahimi     return max_samples;
2496*6467f958SSadaf Ebrahimi }
2497