1 #ifndef __TEST_GL_ABSTRACTION_H__
2 #define __TEST_GL_ABSTRACTION_H__
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
27 #include <dali/public-api/dali-core-capi-internal.h>
28 #include <dali/public-api/dali-core.h>
29 #include <dali/integration-api/core.h>
30 #include <dali/integration-api/gl-abstraction.h>
31 #include "test-trace-call-stack.h"
36 static const unsigned int MAX_ATTRIBUTE_CACHE_SIZE = 64;
37 static const char *mStdAttribs[MAX_ATTRIBUTE_CACHE_SIZE] =
39 "aPosition", // ATTRIB_POSITION
40 "aNormal", // ATTRIB_NORMAL
41 "aTexCoord", // ATTRIB_TEXCOORD
42 "aColor", // ATTRIB_COLOR
43 "aBoneWeights", // ATTRIB_BONE_WEIGHTS
44 "aBoneIndices" // ATTRIB_BONE_INDICES
47 class DALI_IMPORT_API TestGlAbstraction: public Dali::Integration::GlAbstraction
56 inline void ActiveTexture( GLenum textureUnit )
58 mActiveTextureUnit = textureUnit - GL_TEXTURE0;
61 inline GLenum GetActiveTextureUnit() const
63 return mActiveTextureUnit + GL_TEXTURE0;
66 inline void AttachShader( GLuint program, GLuint shader )
68 std::stringstream out;
69 out << program << ", " << shader;
70 mShaderTrace.PushCall("AttachShader", out.str());
73 inline void BindAttribLocation( GLuint program, GLuint index, const char* name )
77 inline void BindBuffer( GLenum target, GLuint buffer )
81 inline void BindFramebuffer( GLenum target, GLuint framebuffer )
85 inline void BindRenderbuffer( GLenum target, GLuint renderbuffer )
90 * This method can be used by test cases, to query the texture IDs that have been bound by BindTexture.
91 * @return A vector containing the IDs that were bound.
93 inline const std::vector<GLuint>& GetBoundTextures() const
95 return mBoundTextures;
99 * Query the texture IDs that have been bound with BindTexture, with a specific active texture unit.
100 * @param[in] activeTextureUnit The specific active texture unit.
101 * @return A vector containing the IDs that were bound.
103 inline const std::vector<GLuint>& GetBoundTextures( GLuint activeTextureUnit ) const
105 return mActiveTextures[ activeTextureUnit - GL_TEXTURE0 ].mBoundTextures;
109 * This method can be used by test cases, to clear the record of texture IDs that have been bound by BindTexture.
111 inline void ClearBoundTextures()
113 mBoundTextures.clear();
115 for( unsigned int i=0; i<MIN_TEXTURE_UNIT_LIMIT; ++i )
117 mActiveTextures[ i ].mBoundTextures.clear();
121 inline void BindTexture( GLenum target, GLuint texture )
123 // Record the bound textures for future checks
126 mBoundTextures.push_back( texture );
128 if( mActiveTextureUnit < MIN_TEXTURE_UNIT_LIMIT )
130 mActiveTextures[ mActiveTextureUnit ].mBoundTextures.push_back( texture );
135 inline void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
137 mLastBlendColor.r = red;
138 mLastBlendColor.g = green;
139 mLastBlendColor.b = blue;
140 mLastBlendColor.a = alpha;
143 inline const Vector4& GetLastBlendColor() const
145 return mLastBlendColor;
148 inline void BlendEquation( GLenum mode )
150 mLastBlendEquationRgb = mode;
151 mLastBlendEquationAlpha = mode;
154 inline void BlendEquationSeparate( GLenum modeRgb, GLenum modeAlpha )
156 mLastBlendEquationRgb = modeRgb;
157 mLastBlendEquationAlpha = modeAlpha;
160 inline GLenum GetLastBlendEquationRgb() const
162 return mLastBlendEquationRgb;
165 inline GLenum GetLastBlendEquationAlpha() const
167 return mLastBlendEquationAlpha;
170 inline void BlendFunc(GLenum sfactor, GLenum dfactor)
172 mLastBlendFuncSrcRgb = sfactor;
173 mLastBlendFuncDstRgb = dfactor;
174 mLastBlendFuncSrcAlpha = sfactor;
175 mLastBlendFuncDstAlpha = dfactor;
178 inline void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
180 mLastBlendFuncSrcRgb = srcRGB;
181 mLastBlendFuncDstRgb = dstRGB;
182 mLastBlendFuncSrcAlpha = srcAlpha;
183 mLastBlendFuncDstAlpha = dstAlpha;
186 inline GLenum GetLastBlendFuncSrcRgb() const
188 return mLastBlendFuncSrcRgb;
191 inline GLenum GetLastBlendFuncDstRgb() const
193 return mLastBlendFuncDstRgb;
196 inline GLenum GetLastBlendFuncSrcAlpha() const
198 return mLastBlendFuncSrcAlpha;
201 inline GLenum GetLastBlendFuncDstAlpha() const
203 return mLastBlendFuncDstAlpha;
206 inline void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
210 inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
214 inline GLenum CheckFramebufferStatus(GLenum target)
216 return mCheckFramebufferStatusResult;
219 inline void Clear(GLbitfield mask)
223 inline void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
227 inline void ClearDepthf(GLclampf depth)
231 inline void ClearStencil(GLint s)
235 inline void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
239 inline void CompileShader(GLuint shader)
241 std::stringstream out;
243 mShaderTrace.PushCall("CompileShader", out.str());
246 inline void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
250 inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
254 inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
258 inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
262 inline GLuint CreateProgram(void)
264 mShaderTrace.PushCall("CreateProgram", "");
266 ++mLastProgramIdUsed;
267 mUniforms[mLastProgramIdUsed] = UniformIDMap();
268 return mLastProgramIdUsed;
271 inline GLuint CreateShader(GLenum type)
273 std::stringstream out;
275 mShaderTrace.PushCall("CreateShader", out.str());
277 return ++mLastShaderIdUsed;
280 inline void CullFace(GLenum mode)
282 std::stringstream out;
284 mCullFaceTrace.PushCall("CullFace", out.str());
287 inline void DeleteBuffers(GLsizei n, const GLuint* buffers)
291 inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
295 inline void DeleteProgram(GLuint program)
297 std::stringstream out;
299 mShaderTrace.PushCall("DeleteProgram", out.str());
302 inline void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
306 inline void DeleteShader(GLuint shader)
308 std::stringstream out;
310 mShaderTrace.PushCall("DeleteShader", out.str());
313 inline void DeleteTextures(GLsizei n, const GLuint* textures)
315 std::stringstream out;
316 out << n << ", " << textures << " = [" ;
318 for(GLsizei i=0; i<n; i++)
320 out << textures[i] << ", " ;
321 mDeletedTextureIds.push_back(textures[i]);
324 mTextureTrace.PushCall("DeleteTextures", out.str());
327 inline bool CheckNoTexturesDeleted()
329 return mDeletedTextureIds.size() == 0;
332 inline bool CheckTextureDeleted( GLuint textureId )
336 for(std::vector<GLuint>::iterator iter=mDeletedTextureIds.begin(); iter != mDeletedTextureIds.end(); ++iter)
338 if(*iter == textureId)
347 inline void ClearDeletedTextures()
349 mDeletedTextureIds.clear();
352 inline void DepthFunc(GLenum func)
356 inline void DepthMask(GLboolean flag)
360 inline void DepthRangef(GLclampf zNear, GLclampf zFar)
364 inline void DetachShader(GLuint program, GLuint shader)
366 std::stringstream out;
367 out << program << ", " << shader;
368 mShaderTrace.PushCall("DetachShader", out.str());
371 inline void Disable(GLenum cap)
373 std::stringstream out;
375 mCullFaceTrace.PushCall("Disable", out.str());
378 inline void DisableVertexAttribArray(GLuint index)
380 SetVertexAttribArray( index, false );
383 inline void DrawArrays(GLenum mode, GLint first, GLsizei count)
385 std::stringstream out;
386 out << mode << ", " << first << ", " << count;
387 mDrawTrace.PushCall("DrawArrays", out.str());
390 inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
392 std::stringstream out;
393 out << mode << ", " << count << ", " << type << ", indices";
394 mDrawTrace.PushCall("DrawElements", out.str());
397 inline void Enable(GLenum cap)
399 std::stringstream out;
401 mCullFaceTrace.PushCall("Enable", out.str());
404 inline void EnableVertexAttribArray(GLuint index)
406 SetVertexAttribArray( index, true);
409 inline void Finish(void)
413 inline void Flush(void)
417 inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
421 inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
425 inline void FrontFace(GLenum mode)
429 inline void GenBuffers(GLsizei n, GLuint* buffers)
431 // avoids an assert in GpuBuffers
435 inline void GenerateMipmap(GLenum target)
439 inline void GenFramebuffers(GLsizei n, GLuint* framebuffers)
443 inline void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
448 * This method can be used by test cases, to manipulate the texture IDs generated by GenTextures.
449 * @param[in] ids A vector containing the next IDs to be generated
451 inline void SetNextTextureIds( const std::vector<GLuint>& ids )
453 mNextTextureIds = ids;
456 inline const std::vector<GLuint>& GetNextTextureIds()
458 return mNextTextureIds;
461 inline void GenTextures(GLsizei n, GLuint* textures)
463 for( int i=0; i<n; ++i )
465 if( !mNextTextureIds.empty() )
467 *(textures+i) = mNextTextureIds[0];
468 mNextTextureIds.erase( mNextTextureIds.begin() );
472 *(textures+i) = ++mLastAutoTextureIdUsed;
477 inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
481 inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
485 inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
489 inline int GetAttribLocation(GLuint program, const char* name)
491 std::string attribName(name);
493 for( unsigned int i = 0; i < ATTRIB_TYPE_LAST; ++i )
495 if( mStdAttribs[i] == attribName )
501 // 0 is a valid location
505 inline void GetBooleanv(GLenum pname, GLboolean* params)
509 inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
513 inline GLenum GetError(void)
515 return mGetErrorResult;
518 inline void GetFloatv(GLenum pname, GLfloat* params)
522 inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
526 inline void GetIntegerv(GLenum pname, GLint* params)
530 case GL_MAX_TEXTURE_SIZE:
533 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
536 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
537 *params = mNumBinaryFormats;
539 case GL_PROGRAM_BINARY_FORMATS_OES:
540 *params = mBinaryFormats;
545 inline void GetProgramiv(GLuint program, GLenum pname, GLint* params)
549 *params = mLinkStatus;
551 case GL_PROGRAM_BINARY_LENGTH_OES:
552 *params = mProgramBinaryLength;
557 inline void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
562 inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
566 inline void GetShaderiv(GLuint shader, GLenum pname, GLint* params)
569 case GL_COMPILE_STATUS:
570 *params = mCompileStatus;
575 inline void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
579 inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
583 inline const GLubyte* GetString(GLenum name)
585 return mGetStringResult;
588 inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
592 inline void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
596 inline void GetUniformfv(GLuint program, GLint location, GLfloat* params)
600 inline void GetUniformiv(GLuint program, GLint location, GLint* params)
604 inline GLint GetUniformLocation(GLuint program, const char* name)
606 ProgramUniformMap::iterator it = mUniforms.find(program);
607 if( it == mUniforms.end() )
609 // Not a valid program ID
610 mGetErrorResult = GL_INVALID_OPERATION;
614 UniformIDMap& uniformIDs = it->second;
615 UniformIDMap::iterator it2 = uniformIDs.find( name );
616 if( it2 == uniformIDs.end() )
618 // Uniform not found, so add it...
619 uniformIDs[name] = ++mLastUniformIdUsed;
620 return mLastUniformIdUsed;
626 inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
630 inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
634 inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
638 inline void Hint(GLenum target, GLenum mode)
642 inline GLboolean IsBuffer(GLuint buffer)
644 return mIsBufferResult;
647 inline GLboolean IsEnabled(GLenum cap)
649 return mIsEnabledResult;
652 inline GLboolean IsFramebuffer(GLuint framebuffer)
654 return mIsFramebufferResult;
657 inline GLboolean IsProgram(GLuint program)
659 return mIsProgramResult;
662 inline GLboolean IsRenderbuffer(GLuint renderbuffer)
664 return mIsRenderbufferResult;
667 inline GLboolean IsShader(GLuint shader)
669 return mIsShaderResult;
672 inline GLboolean IsTexture(GLuint texture)
674 return mIsTextureResult;
677 inline void LineWidth(GLfloat width)
681 inline void LinkProgram(GLuint program)
683 std::stringstream out;
685 mShaderTrace.PushCall("LinkProgram", out.str());
688 inline void PixelStorei(GLenum pname, GLint param)
692 inline void PolygonOffset(GLfloat factor, GLfloat units)
696 inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
700 inline void ReleaseShaderCompiler(void)
704 inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
708 inline void SampleCoverage(GLclampf value, GLboolean invert)
712 inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
716 inline void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
720 inline void ShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
722 std::string stringBuilder;
723 for(int i = 0; i < count; ++i)
725 stringBuilder += string[i];
727 mShaderSources[shader] = stringBuilder;
728 mLastShaderCompiled = shader;
731 inline void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
733 const std::string shaderSource = mShaderSources[shader];
734 if( static_cast<int>(shaderSource.length()) < bufsize )
736 strcpy(source, shaderSource.c_str());
737 *length = shaderSource.length();
741 *length = bufsize -1;
742 strncpy(source, shaderSource.c_str(), *length);
743 source[*length] = 0x0;
747 inline void StencilFunc(GLenum func, GLint ref, GLuint mask)
751 inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
755 inline void StencilMask(GLuint mask)
759 inline void StencilMaskSeparate(GLenum face, GLuint mask)
763 inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
767 inline void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
771 inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
773 std::stringstream out;
774 out << width << ", " << height;
775 mTextureTrace.PushCall("TexImage2D", out.str());
778 inline void TexParameterf(GLenum target, GLenum pname, GLfloat param)
782 inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
786 inline void TexParameteri(GLenum target, GLenum pname, GLint param)
790 inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
794 inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
796 std::stringstream out;
797 out << xoffset << ", " << yoffset << ", " << width << ", " << height;
798 mTextureTrace.PushCall("TexSubImage2D", out.str());
801 inline void Uniform1f(GLint location, GLfloat x)
803 if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, x ) )
805 mGetErrorResult = GL_INVALID_OPERATION;
809 inline void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
811 for( int i = 0; i < count; ++i )
813 if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, v[i] ) )
815 mGetErrorResult = GL_INVALID_OPERATION;
821 inline void Uniform1i(GLint location, GLint x)
823 if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram, location, x ) )
825 mGetErrorResult = GL_INVALID_OPERATION;
829 inline void Uniform1iv(GLint location, GLsizei count, const GLint* v)
831 for( int i = 0; i < count; ++i )
833 if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram,
837 mGetErrorResult = GL_INVALID_OPERATION;
843 inline void Uniform2f(GLint location, GLfloat x, GLfloat y)
845 if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
849 mGetErrorResult = GL_INVALID_OPERATION;
853 inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
855 for( int i = 0; i < count; ++i )
857 if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
859 Vector2( v[2*i], v[2*i+1] ) ) )
861 mGetErrorResult = GL_INVALID_OPERATION;
867 inline void Uniform2i(GLint location, GLint x, GLint y)
871 inline void Uniform2iv(GLint location, GLsizei count, const GLint* v)
875 inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
877 if( ! mProgramUniforms3f.SetUniformValue( mCurrentProgram,
879 Vector3( x, y, z ) ) )
881 mGetErrorResult = GL_INVALID_OPERATION;
885 inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
887 for( int i = 0; i < count; ++i )
889 if( ! mProgramUniforms3f.SetUniformValue(
892 Vector3( v[3*i], v[3*i+1], v[3*i+2] ) ) )
894 mGetErrorResult = GL_INVALID_OPERATION;
900 inline void Uniform3i(GLint location, GLint x, GLint y, GLint z)
904 inline void Uniform3iv(GLint location, GLsizei count, const GLint* v)
908 inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
910 if( ! mProgramUniforms4f.SetUniformValue( mCurrentProgram,
912 Vector4( x, y, z, w ) ) )
914 mGetErrorResult = GL_INVALID_OPERATION;
918 inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
920 for( int i = 0; i < count; ++i )
922 if( ! mProgramUniforms4f.SetUniformValue(
925 Vector4( v[4*i], v[4*i+1], v[4*i+2], v[4*i+3] ) ) )
927 mGetErrorResult = GL_INVALID_OPERATION;
933 inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
937 inline void Uniform4iv(GLint location, GLsizei count, const GLint* v)
941 inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
945 inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
947 for( int i = 0; i < count; ++i )
949 if( ! mProgramUniformsMat3.SetUniformValue(
952 Matrix3( value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8] ) ) )
954 mGetErrorResult = GL_INVALID_OPERATION;
960 inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
962 for( int i = 0; i < count; ++i )
964 if( ! mProgramUniformsMat4.SetUniformValue(
969 mGetErrorResult = GL_INVALID_OPERATION;
975 inline void UseProgram(GLuint program)
977 mCurrentProgram = program;
980 inline void ValidateProgram(GLuint program)
984 inline void VertexAttrib1f(GLuint indx, GLfloat x)
988 inline void VertexAttrib1fv(GLuint indx, const GLfloat* values)
992 inline void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
996 inline void VertexAttrib2fv(GLuint indx, const GLfloat* values)
1000 inline void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
1004 inline void VertexAttrib3fv(GLuint indx, const GLfloat* values)
1008 inline void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1012 inline void VertexAttrib4fv(GLuint indx, const GLfloat* values)
1016 inline void VertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
1020 inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
1026 inline void ReadBuffer(GLenum mode)
1030 inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
1034 inline void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
1038 inline void TexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
1042 inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1046 inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
1050 inline void CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
1054 inline void GenQueries(GLsizei n, GLuint* ids)
1058 inline void DeleteQueries(GLsizei n, const GLuint* ids)
1062 inline GLboolean IsQuery(GLuint id)
1067 inline void BeginQuery(GLenum target, GLuint id)
1071 inline void EndQuery(GLenum target)
1075 inline void GetQueryiv(GLenum target, GLenum pname, GLint* params)
1079 inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
1083 inline GLboolean UnmapBuffer(GLenum target)
1088 inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
1092 inline void DrawBuffers(GLsizei n, const GLenum* bufs)
1096 inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1100 inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1104 inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1108 inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1112 inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1116 inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1120 inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
1124 inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
1128 inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
1132 inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
1137 inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
1141 inline void BindVertexArray(GLuint array)
1145 inline void DeleteVertexArrays(GLsizei n, const GLuint* arrays)
1149 inline void GenVertexArrays(GLsizei n, GLuint* arrays)
1153 inline GLboolean IsVertexArray(GLuint array)
1158 inline void GetIntegeri_v(GLenum target, GLuint index, GLint* data)
1162 inline void BeginTransformFeedback(GLenum primitiveMode)
1166 inline void EndTransformFeedback(void)
1170 inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
1174 inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer)
1178 inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
1182 inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
1186 inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
1190 inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
1194 inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
1198 inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
1202 inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
1206 inline void VertexAttribI4iv(GLuint index, const GLint* v)
1210 inline void VertexAttribI4uiv(GLuint index, const GLuint* v)
1214 inline void GetUniformuiv(GLuint program, GLint location, GLuint* params)
1218 inline GLint GetFragDataLocation(GLuint program, const GLchar *name)
1223 inline void Uniform1ui(GLint location, GLuint v0)
1227 inline void Uniform2ui(GLint location, GLuint v0, GLuint v1)
1231 inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
1235 inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
1239 inline void Uniform1uiv(GLint location, GLsizei count, const GLuint* value)
1243 inline void Uniform2uiv(GLint location, GLsizei count, const GLuint* value)
1247 inline void Uniform3uiv(GLint location, GLsizei count, const GLuint* value)
1251 inline void Uniform4uiv(GLint location, GLsizei count, const GLuint* value)
1255 inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
1259 inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
1263 inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
1267 inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
1271 inline const GLubyte* GetStringi(GLenum name, GLuint index)
1276 inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
1280 inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
1284 inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
1288 inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
1290 return GL_INVALID_INDEX;
1293 inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
1297 inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
1301 inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
1305 inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1309 inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
1313 inline GLsync FenceSync(GLenum condition, GLbitfield flags)
1318 inline GLboolean IsSync(GLsync sync)
1323 inline void DeleteSync(GLsync sync)
1327 inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
1332 inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
1336 inline void GetInteger64v(GLenum pname, GLint64* params)
1340 inline void GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
1344 inline void GetInteger64i_v(GLenum target, GLuint index, GLint64* data)
1348 inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
1352 inline void GenSamplers(GLsizei count, GLuint* samplers)
1356 inline void DeleteSamplers(GLsizei count, const GLuint* samplers)
1360 inline GLboolean IsSampler(GLuint sampler)
1365 inline void BindSampler(GLuint unit, GLuint sampler)
1369 inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
1373 inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
1377 inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
1381 inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
1385 inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
1389 inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
1393 inline void VertexAttribDivisor(GLuint index, GLuint divisor)
1397 inline void BindTransformFeedback(GLenum target, GLuint id)
1401 inline void DeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
1405 inline void GenTransformFeedbacks(GLsizei n, GLuint* ids)
1409 inline GLboolean IsTransformFeedback(GLuint id)
1414 inline void PauseTransformFeedback(void)
1418 inline void ResumeTransformFeedback(void)
1422 inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
1426 inline void ProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
1430 inline void ProgramParameteri(GLuint program, GLenum pname, GLint value)
1434 inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
1438 inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
1442 inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
1446 inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
1450 inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
1454 public: // TEST FUNCTIONS
1455 inline void SetCompileStatus( GLuint value ) { mCompileStatus = value; }
1456 inline void SetLinkStatus( GLuint value ) { mLinkStatus = value; }
1457 inline void SetGetAttribLocationResult( int result) { mGetAttribLocationResult = result; }
1458 inline void SetGetErrorResult( GLenum result) { mGetErrorResult = result; }
1459 inline void SetGetStringResult( GLubyte* result) { mGetStringResult = result; }
1460 inline void SetIsBufferResult( GLboolean result) { mIsBufferResult = result; }
1461 inline void SetIsEnabledResult( GLboolean result) { mIsEnabledResult = result; }
1462 inline void SetIsFramebufferResult( GLboolean result) { mIsFramebufferResult = result; }
1463 inline void SetIsProgramResult( GLboolean result) { mIsProgramResult = result; }
1464 inline void SetIsRenderbufferResult( GLboolean result) { mIsRenderbufferResult = result; }
1465 inline void SetIsShaderResult( GLboolean result) { mIsShaderResult = result; }
1466 inline void SetIsTextureResult( GLboolean result) { mIsTextureResult = result; }
1467 inline void SetCheckFramebufferStatusResult( GLenum result) { mCheckFramebufferStatusResult = result; }
1468 inline void SetNumBinaryFormats( GLint numFormats ) { mNumBinaryFormats = numFormats; }
1469 inline void SetBinaryFormats( GLint binaryFormats ) { mBinaryFormats = binaryFormats; }
1470 inline void SetProgramBinaryLength( GLint length ) { mProgramBinaryLength = length; }
1472 inline bool GetVertexAttribArrayState(GLuint index)
1474 if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
1479 return mVertexAttribArrayState[ index ];
1481 inline void ClearVertexAttribArrayChanged() { mVertexAttribArrayChanged = false; }
1482 inline bool GetVertexAttribArrayChanged() { return mVertexAttribArrayChanged; }
1484 //Methods for CullFace verification
1485 inline void EnableCullFaceCallTrace(bool enable) { mCullFaceTrace.Enable(enable); }
1486 inline void ResetCullFaceCallStack() { mCullFaceTrace.Reset(); }
1487 inline TraceCallStack& GetCullFaceTrace() { return mCullFaceTrace; }
1489 //Methods for Shader verification
1490 inline void EnableShaderCallTrace(bool enable) { mShaderTrace.Enable(enable); }
1491 inline void ResetShaderCallStack() { mShaderTrace.Reset(); }
1492 inline TraceCallStack& GetShaderTrace() { return mShaderTrace; }
1494 //Methods for Texture verification
1495 inline void EnableTextureCallTrace(bool enable) { mTextureTrace.Enable(enable); }
1496 inline void ResetTextureCallStack() { mTextureTrace.Reset(); }
1497 inline TraceCallStack& GetTextureTrace() { return mTextureTrace; }
1499 //Methods for Draw verification
1500 inline void EnableDrawCallTrace(bool enable) { mDrawTrace.Enable(enable); }
1501 inline void ResetDrawCallStack() { mDrawTrace.Reset(); }
1502 inline TraceCallStack& GetDrawTrace() { return mDrawTrace; }
1504 template <typename T>
1505 inline bool CheckUniformValue( const char* name, const T& value ) const
1507 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1508 program_it != mUniforms.end();
1511 const UniformIDMap &uniformIDs = program_it->second;
1513 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1514 if( uniform_it != uniformIDs.end() )
1516 // found one matching uniform name, lets check the value...
1517 GLuint programId = program_it->first;
1518 GLint uniformId = uniform_it->second;
1520 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1521 if( mProgramUniforms.CheckUniformValue( programId, uniformId, value ) )
1523 // the value matches
1529 fprintf(stderr, "Not found, printing possible values:" );
1530 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1531 program_it != mUniforms.end();
1534 const UniformIDMap &uniformIDs = program_it->second;
1536 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1537 if( uniform_it != uniformIDs.end() )
1539 // found one matching uniform name, lets check the value...
1540 GLuint programId = program_it->first;
1541 GLint uniformId = uniform_it->second;
1543 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1545 if ( mProgramUniforms.GetUniformValue(programId, uniformId, origValue) )
1547 std::stringstream out;
1548 out << uniform_it->first << ": " << origValue;
1549 fprintf(stderr, "%s", out.str().c_str() );
1556 template <typename T>
1557 inline bool GetUniformValue( GLuint programId, GLuint uniformId, T& outValue) const
1559 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( outValue );
1560 return mProgramUniforms.GetUniformValue( programId, uniformId, outValue );
1563 inline bool GetUniformIds( const char* name, GLuint& programId, GLuint& uniformId ) const
1565 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1566 program_it != mUniforms.end();
1569 const UniformIDMap &uniformIDs = program_it->second;
1571 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1572 if( uniform_it != uniformIDs.end() )
1574 programId = program_it->first;
1575 uniformId = uniform_it->second;
1584 inline GLuint GetLastShaderCompiled() const
1586 return mLastShaderCompiled;
1589 inline GLuint GetLastProgramCreated() const
1591 return mLastProgramIdUsed;
1596 ATTRIB_UNKNOWN = -1,
1601 ATTRIB_BONE_WEIGHTS,
1602 ATTRIB_BONE_INDICES,
1608 GLuint mCurrentProgram;
1609 GLuint mCompileStatus;
1611 GLint mGetAttribLocationResult;
1612 GLenum mGetErrorResult;
1613 GLubyte* mGetStringResult;
1614 GLboolean mIsBufferResult;
1615 GLboolean mIsEnabledResult;
1616 GLboolean mIsFramebufferResult;
1617 GLboolean mIsProgramResult;
1618 GLboolean mIsRenderbufferResult;
1619 GLboolean mIsShaderResult;
1620 GLboolean mIsTextureResult;
1621 GLenum mActiveTextureUnit;
1622 GLenum mCheckFramebufferStatusResult;
1623 GLint mNumBinaryFormats;
1624 GLint mBinaryFormats;
1625 GLint mProgramBinaryLength;
1626 bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE];
1627 bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed
1628 typedef std::map< GLuint, std::string> ShaderSourceMap;
1629 ShaderSourceMap mShaderSources;
1630 GLuint mLastShaderCompiled;
1632 Vector4 mLastBlendColor;
1633 GLenum mLastBlendEquationRgb;
1634 GLenum mLastBlendEquationAlpha;
1635 GLenum mLastBlendFuncSrcRgb;
1636 GLenum mLastBlendFuncDstRgb;
1637 GLenum mLastBlendFuncSrcAlpha;
1638 GLenum mLastBlendFuncDstAlpha;
1640 // Data for manipulating the IDs returned by GenTextures
1641 GLuint mLastAutoTextureIdUsed;
1642 std::vector<GLuint> mNextTextureIds;
1643 std::vector<GLuint> mDeletedTextureIds;
1644 std::vector<GLuint> mBoundTextures;
1646 struct ActiveTextureType
1648 std::vector<GLuint> mBoundTextures;
1651 ActiveTextureType mActiveTextures[ MIN_TEXTURE_UNIT_LIMIT ];
1653 TraceCallStack mCullFaceTrace;
1654 TraceCallStack mShaderTrace;
1655 TraceCallStack mTextureTrace;
1656 TraceCallStack mDrawTrace;
1658 // Shaders & Uniforms
1659 GLuint mLastShaderIdUsed;
1660 GLuint mLastProgramIdUsed;
1661 GLuint mLastUniformIdUsed;
1662 typedef std::map< std::string, GLint > UniformIDMap;
1663 typedef std::map< GLuint, UniformIDMap > ProgramUniformMap;
1664 ProgramUniformMap mUniforms;
1666 template <typename T>
1667 struct ProgramUniformValue : public std::map< GLuint, std::map< GLint, T > >
1670 typedef std::map< GLint, T > UniformValueMap;
1671 typedef std::map< GLuint, UniformValueMap > Map;
1673 bool SetUniformValue( GLuint program, GLuint uniform, const T& value )
1680 typename Map::iterator it = Map::find( program );
1681 if( it == Map::end() )
1683 // if its the first uniform for this program add it
1684 std::pair< typename Map::iterator, bool > result =
1685 Map::insert( typename Map::value_type( program, UniformValueMap() ) );
1689 UniformValueMap& uniforms = it->second;
1690 uniforms[uniform] = value;
1695 bool CheckUniformValue( GLuint program, GLuint uniform, const T& value ) const
1698 if ( GetUniformValue( program, uniform, uniformValue ) )
1700 return value == uniformValue;
1706 bool GetUniformValue( GLuint program, GLuint uniform, T& value ) const
1713 typename Map::const_iterator it = Map::find( program );
1714 if( it == Map::end() )
1716 // Uniform values always initialised as 0
1721 const UniformValueMap& uniforms = it->second;
1722 typename UniformValueMap::const_iterator it2 = uniforms.find( uniform );
1723 if( it2 == uniforms.end() )
1725 // Uniform values always initialised as 0
1729 value = it2->second;
1736 ProgramUniformValue<int> mProgramUniforms1i;
1737 ProgramUniformValue<float> mProgramUniforms1f;
1738 ProgramUniformValue<Vector2> mProgramUniforms2f;
1739 ProgramUniformValue<Vector3> mProgramUniforms3f;
1740 ProgramUniformValue<Vector4> mProgramUniforms4f;
1741 ProgramUniformValue<Matrix> mProgramUniformsMat4;
1742 ProgramUniformValue<Matrix3> mProgramUniformsMat3;
1744 inline const ProgramUniformValue<int>& GetProgramUniformsForType( const int ) const
1746 return mProgramUniforms1i;
1748 inline const ProgramUniformValue<float>& GetProgramUniformsForType( const float ) const
1750 return mProgramUniforms1f;
1752 inline const ProgramUniformValue<Vector2>& GetProgramUniformsForType( const Vector2& ) const
1754 return mProgramUniforms2f;
1756 inline const ProgramUniformValue<Vector3>& GetProgramUniformsForType( const Vector3& ) const
1758 return mProgramUniforms3f;
1760 inline const ProgramUniformValue<Vector4>& GetProgramUniformsForType( const Vector4& ) const
1762 return mProgramUniforms4f;
1764 inline const ProgramUniformValue<Matrix>& GetProgramUniformsForType( const Matrix& ) const
1766 return mProgramUniformsMat4;
1768 inline const ProgramUniformValue<Matrix3>& GetProgramUniformsForType( const Matrix3& ) const
1770 return mProgramUniformsMat3;
1772 inline void SetVertexAttribArray(GLuint index, bool state)
1774 if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
1779 mVertexAttribArrayState[ index ] = state;
1780 mVertexAttribArrayChanged = true;
1785 inline int TestGlAbstraction::ProgramUniformValue<int>::GetZero() const
1791 inline float TestGlAbstraction::ProgramUniformValue<float>::GetZero() const
1797 inline Vector2 TestGlAbstraction::ProgramUniformValue<Vector2>::GetZero() const
1799 return Vector2::ZERO;
1803 inline Vector3 TestGlAbstraction::ProgramUniformValue<Vector3>::GetZero() const
1805 return Vector3::ZERO;
1809 inline Vector4 TestGlAbstraction::ProgramUniformValue<Vector4>::GetZero() const
1811 return Vector4::ZERO;
1815 inline Matrix TestGlAbstraction::ProgramUniformValue<Matrix>::GetZero() const
1821 inline Matrix3 TestGlAbstraction::ProgramUniformValue<Matrix3>::GetZero() const
1823 return Matrix3( Matrix() );
1828 bool BlendEnabled(const Dali::TraceCallStack& callStack);
1829 bool BlendDisabled(const Dali::TraceCallStack& callStack);
1834 #endif // __TEST_GL_ES_H__