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 <cstring> // for strcmp
30 #include <dali/public-api/dali-core.h>
31 #include <dali/integration-api/core.h>
32 #include <dali/integration-api/gl-abstraction.h>
33 #include <dali/integration-api/gl-defines.h>
34 #include "test-trace-call-stack.h"
39 static const unsigned int MAX_ATTRIBUTE_CACHE_SIZE = 64;
40 static const char *mStdAttribs[MAX_ATTRIBUTE_CACHE_SIZE] =
42 "aPosition", // ATTRIB_POSITION
43 "aNormal", // ATTRIB_NORMAL
44 "aTexCoord", // ATTRIB_TEXCOORD
45 "aColor", // ATTRIB_COLOR
46 "aBoneWeights", // ATTRIB_BONE_WEIGHTS
47 "aBoneIndices" // ATTRIB_BONE_INDICES
50 class DALI_IMPORT_API TestGlAbstraction: public Dali::Integration::GlAbstraction
62 inline void ActiveTexture( GLenum textureUnit )
64 mActiveTextureUnit = textureUnit - GL_TEXTURE0;
67 inline GLenum GetActiveTextureUnit() const
69 return mActiveTextureUnit + GL_TEXTURE0;
72 inline void AttachShader( GLuint program, GLuint shader )
74 std::stringstream out;
75 out << program << ", " << shader;
77 TraceCallStack::NamedParams namedParams;
78 namedParams["program"] = ToString(program);
79 namedParams["shader"] = ToString(shader);
80 mShaderTrace.PushCall("AttachShader", out.str(), namedParams);
83 inline void BindAttribLocation( GLuint program, GLuint index, const char* name )
87 inline void BindBuffer( GLenum target, GLuint buffer )
91 inline void BindFramebuffer( GLenum target, GLuint framebuffer )
94 mFramebufferStatus |= 2;
97 inline void BindRenderbuffer( GLenum target, GLuint renderbuffer )
102 * This method can be used by test cases, to query the texture IDs that have been bound by BindTexture.
103 * @return A vector containing the IDs that were bound.
105 inline const std::vector<GLuint>& GetBoundTextures() const
107 return mBoundTextures;
111 * Query the texture IDs that have been bound with BindTexture, with a specific active texture unit.
112 * @param[in] activeTextureUnit The specific active texture unit.
113 * @return A vector containing the IDs that were bound.
115 inline const std::vector<GLuint>& GetBoundTextures( GLuint activeTextureUnit ) const
117 return mActiveTextures[ activeTextureUnit - GL_TEXTURE0 ].mBoundTextures;
121 * This method can be used by test cases, to clear the record of texture IDs that have been bound by BindTexture.
123 inline void ClearBoundTextures()
125 mBoundTextures.clear();
127 for( unsigned int i=0; i<MIN_TEXTURE_UNIT_LIMIT; ++i )
129 mActiveTextures[ i ].mBoundTextures.clear();
133 inline void BindTexture( GLenum target, GLuint texture )
135 // Record the bound textures for future checks
138 mBoundTextures.push_back( texture );
140 if( mActiveTextureUnit < MIN_TEXTURE_UNIT_LIMIT )
142 mActiveTextures[ mActiveTextureUnit ].mBoundTextures.push_back( texture );
146 std::stringstream out;
147 out << target << ", " << texture;
149 TraceCallStack::NamedParams namedParams;
150 namedParams["target"] = ToString(target);
151 namedParams["texture"] = ToString(texture);
153 mTextureTrace.PushCall("BindTexture", out.str(), namedParams);
156 inline void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
158 mLastBlendColor.r = red;
159 mLastBlendColor.g = green;
160 mLastBlendColor.b = blue;
161 mLastBlendColor.a = alpha;
164 inline const Vector4& GetLastBlendColor() const
166 return mLastBlendColor;
169 inline void BlendEquation( GLenum mode )
171 mLastBlendEquationRgb = mode;
172 mLastBlendEquationAlpha = mode;
175 inline void BlendEquationSeparate( GLenum modeRgb, GLenum modeAlpha )
177 mLastBlendEquationRgb = modeRgb;
178 mLastBlendEquationAlpha = modeAlpha;
181 inline GLenum GetLastBlendEquationRgb() const
183 return mLastBlendEquationRgb;
186 inline GLenum GetLastBlendEquationAlpha() const
188 return mLastBlendEquationAlpha;
191 inline void BlendFunc(GLenum sfactor, GLenum dfactor)
193 mLastBlendFuncSrcRgb = sfactor;
194 mLastBlendFuncDstRgb = dfactor;
195 mLastBlendFuncSrcAlpha = sfactor;
196 mLastBlendFuncDstAlpha = dfactor;
199 inline void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
201 mLastBlendFuncSrcRgb = srcRGB;
202 mLastBlendFuncDstRgb = dstRGB;
203 mLastBlendFuncSrcAlpha = srcAlpha;
204 mLastBlendFuncDstAlpha = dstAlpha;
207 inline GLenum GetLastBlendFuncSrcRgb() const
209 return mLastBlendFuncSrcRgb;
212 inline GLenum GetLastBlendFuncDstRgb() const
214 return mLastBlendFuncDstRgb;
217 inline GLenum GetLastBlendFuncSrcAlpha() const
219 return mLastBlendFuncSrcAlpha;
222 inline GLenum GetLastBlendFuncDstAlpha() const
224 return mLastBlendFuncDstAlpha;
227 inline void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
229 mBufferDataCalls.push_back(size);
232 inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
234 mBufferSubDataCalls.push_back(size);
237 inline GLenum CheckFramebufferStatus(GLenum target)
239 //If it has the three last bits set to 1 - 111, then the three minimum functions to create a
240 //Framebuffer texture have been called
241 if( mFramebufferStatus == 7 )
243 return GL_FRAMEBUFFER_COMPLETE;
246 return mCheckFramebufferStatusResult;
249 inline GLenum CheckFramebufferColorAttachment()
251 return mFramebufferColorAttached;
254 inline GLenum CheckFramebufferDepthAttachment()
256 return mFramebufferDepthAttached;
259 inline GLenum CheckFramebufferStencilAttachment()
261 return mFramebufferStencilAttached;
264 inline void Clear(GLbitfield mask)
267 mLastClearBitMask = mask;
270 inline void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
274 inline void ClearDepthf(GLclampf depth)
278 inline void ClearStencil(GLint s)
282 inline void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
286 inline void CompileShader(GLuint shader)
288 std::stringstream out;
290 TraceCallStack::NamedParams namedParams;
291 namedParams["shader"] = ToString(shader);
293 mShaderTrace.PushCall("CompileShader", out.str(), namedParams);
296 inline void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
300 inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
304 inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
308 inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
312 inline GLuint CreateProgram(void)
314 mShaderTrace.PushCall("CreateProgram", "");
316 ++mLastProgramIdUsed;
317 mUniforms[mLastProgramIdUsed] = UniformIDMap();
318 return mLastProgramIdUsed;
321 inline GLuint CreateShader(GLenum type)
323 std::stringstream out;
326 TraceCallStack::NamedParams namedParams;
327 namedParams["type"] = ToString(type);
328 mShaderTrace.PushCall("CreateShader", out.str(), namedParams);
330 return ++mLastShaderIdUsed;
333 inline void CullFace(GLenum mode)
335 std::stringstream out;
338 TraceCallStack::NamedParams namedParams;
339 namedParams["program"] = ToString(mode);
341 mCullFaceTrace.PushCall("CullFace", out.str(), namedParams);
344 inline void DeleteBuffers(GLsizei n, const GLuint* buffers)
348 inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
352 inline void DeleteProgram(GLuint program)
354 std::stringstream out;
357 TraceCallStack::NamedParams namedParams;
358 namedParams["program"] = ToString(program);
360 mShaderTrace.PushCall("DeleteProgram", out.str(), namedParams);
363 inline void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
367 inline void DeleteShader(GLuint shader)
369 std::stringstream out;
372 TraceCallStack::NamedParams namedParams;
373 namedParams["shader"] = ToString(shader);
375 mShaderTrace.PushCall("DeleteShader", out.str(), namedParams);
378 inline void DeleteTextures(GLsizei n, const GLuint* textures)
380 std::stringstream out;
381 out << n << ", " << textures << " = [";
383 TraceCallStack::NamedParams namedParams;
385 for(GLsizei i=0; i<n; i++)
387 out << textures[i] << ", ";
388 std::stringstream paramName;
389 paramName<<"texture["<<i<<"]";
390 namedParams[paramName.str()] = ToString(textures[i]);
391 mDeletedTextureIds.push_back(textures[i]);
395 mTextureTrace.PushCall("DeleteTextures", out.str(), namedParams);
398 inline bool CheckNoTexturesDeleted()
400 return mDeletedTextureIds.size() == 0;
403 inline bool CheckTextureDeleted( GLuint textureId )
407 for(std::vector<GLuint>::iterator iter=mDeletedTextureIds.begin(); iter != mDeletedTextureIds.end(); ++iter)
409 if(*iter == textureId)
418 inline void ClearDeletedTextures()
420 mDeletedTextureIds.clear();
423 inline void DepthFunc(GLenum func)
425 std::stringstream out;
428 TraceCallStack::NamedParams namedParams;
429 namedParams["func"] = ToString(func);
431 mDepthFunctionTrace.PushCall("DepthFunc", out.str(), namedParams);
434 inline void DepthMask(GLboolean flag)
438 inline void DepthRangef(GLclampf zNear, GLclampf zFar)
442 inline void DetachShader(GLuint program, GLuint shader)
444 std::stringstream out;
445 out << program << ", " << shader;
446 TraceCallStack::NamedParams namedParams;
447 namedParams["program"] = ToString(program);
448 namedParams["shader"] = ToString(shader);
449 mShaderTrace.PushCall("DetachShader", out.str(), namedParams);
452 inline void Disable(GLenum cap)
454 std::stringstream out;
456 TraceCallStack::NamedParams namedParams;
457 namedParams["cap"] = ToString(cap);
458 mEnableDisableTrace.PushCall("Disable", out.str(), namedParams);
461 inline void DisableVertexAttribArray(GLuint index)
463 SetVertexAttribArray( index, false );
466 inline void DrawArrays(GLenum mode, GLint first, GLsizei count)
468 std::stringstream out;
469 out << mode << ", " << first << ", " << count;
470 TraceCallStack::NamedParams namedParams;
471 namedParams["mode"] = ToString(mode);
472 namedParams["first"] = ToString(first);
473 namedParams["count"] = ToString(count);
474 mDrawTrace.PushCall("DrawArrays", out.str(), namedParams);
477 inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
479 std::stringstream out;
480 out << mode << ", " << count << ", " << type << ", indices";
482 TraceCallStack::NamedParams namedParams;
483 namedParams["mode"] = ToString(mode);
484 namedParams["count"] = ToString(count);
485 namedParams["type"] = ToString(type);
486 // Skip void pointers - are they of any use?
487 mDrawTrace.PushCall("DrawElements", out.str(), namedParams);
490 inline void Enable(GLenum cap)
492 std::stringstream out;
494 TraceCallStack::NamedParams namedParams;
495 namedParams["cap"] = ToString(cap);
496 mEnableDisableTrace.PushCall("Enable", out.str(), namedParams);
499 inline void EnableVertexAttribArray(GLuint index)
501 SetVertexAttribArray( index, true);
504 inline void Finish(void)
508 inline void Flush(void)
512 inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
514 if (attachment == GL_DEPTH_ATTACHMENT)
516 mFramebufferDepthAttached = true;
518 else if (attachment == GL_STENCIL_ATTACHMENT)
520 mFramebufferStencilAttached = true;
524 inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
527 mFramebufferStatus |= 4;
529 //We check 4 attachment colors
530 if ((attachment == GL_COLOR_ATTACHMENT0) || (attachment == GL_COLOR_ATTACHMENT1) || (attachment == GL_COLOR_ATTACHMENT2) || (attachment == GL_COLOR_ATTACHMENT4))
532 mFramebufferColorAttached = true;
536 inline void FrontFace(GLenum mode)
540 inline void GenBuffers(GLsizei n, GLuint* buffers)
542 // avoids an assert in GpuBuffers
546 inline void GenerateMipmap(GLenum target)
548 std::stringstream out;
550 TraceCallStack::NamedParams namedParams;
551 namedParams["target"] = ToString(target);
553 mTextureTrace.PushCall("GenerateMipmap", out.str(), namedParams);
556 inline void GenFramebuffers(GLsizei n, GLuint* framebuffers)
558 for( int i = 0; i < n; i++ )
560 framebuffers[i] = i + 1;
563 //Add 001 bit, this function needs to be called the first one in the chain
564 mFramebufferStatus = 1;
567 inline void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
569 for( int i = 0; i < n; i++ )
571 renderbuffers[i] = i + 1;
576 * This method can be used by test cases, to manipulate the texture IDs generated by GenTextures.
577 * @param[in] ids A vector containing the next IDs to be generated
579 inline void SetNextTextureIds( const std::vector<GLuint>& ids )
581 mNextTextureIds = ids;
584 inline const std::vector<GLuint>& GetNextTextureIds()
586 return mNextTextureIds;
589 inline void GenTextures(GLsizei count, GLuint* textures)
591 for( int i=0; i<count; ++i )
593 if( !mNextTextureIds.empty() )
595 *(textures+i) = mNextTextureIds[0];
596 mNextTextureIds.erase( mNextTextureIds.begin() );
600 *(textures+i) = ++mLastAutoTextureIdUsed;
604 TraceCallStack::NamedParams namedParams;
605 namedParams["count"] = ToString(count);
607 std::stringstream out;
608 for(int i=0; i<count; i++)
615 std::ostringstream oss;
616 oss<<"indices["<<i<<"]";
617 namedParams[oss.str()] = ToString(textures[i]);
620 mTextureTrace.PushCall("GenTextures", out.str(), namedParams);
623 inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
627 inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
632 *length = snprintf(name, bufsize, "sTexture");
633 *type = GL_SAMPLER_2D;
637 *length = snprintf(name, bufsize, "sEffect");
638 *type = GL_SAMPLER_2D;
646 inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
650 inline int GetAttribLocation(GLuint program, const char* name)
652 std::string attribName(name);
654 for( unsigned int i = 0; i < ATTRIB_TYPE_LAST; ++i )
656 if( mStdAttribs[i] == attribName )
662 // 0 is a valid location
666 inline void GetBooleanv(GLenum pname, GLboolean* params)
670 inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
674 inline GLenum GetError(void)
676 return mGetErrorResult;
679 inline void GetFloatv(GLenum pname, GLfloat* params)
683 inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
687 inline void GetIntegerv(GLenum pname, GLint* params)
691 case GL_MAX_TEXTURE_SIZE:
694 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
697 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
698 *params = mNumBinaryFormats;
700 case GL_PROGRAM_BINARY_FORMATS_OES:
701 *params = mBinaryFormats;
706 inline void GetProgramiv(GLuint program, GLenum pname, GLint* params)
711 *params = mLinkStatus;
713 case GL_PROGRAM_BINARY_LENGTH_OES:
714 *params = mProgramBinaryLength;
716 case GL_ACTIVE_UNIFORMS:
717 *params = mNumberOfActiveUniforms;
719 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
725 inline void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
729 inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
733 inline void GetShaderiv(GLuint shader, GLenum pname, GLint* params)
736 case GL_COMPILE_STATUS:
737 *params = mCompileStatus;
742 inline void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
746 inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
750 inline const GLubyte* GetString(GLenum name)
752 return mGetStringResult;
755 inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
759 inline void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
763 inline void GetUniformfv(GLuint program, GLint location, GLfloat* params)
767 inline void GetUniformiv(GLuint program, GLint location, GLint* params)
771 inline GLint GetUniformLocation(GLuint program, const char* name)
773 ProgramUniformMap::iterator it = mUniforms.find(program);
774 if( it == mUniforms.end() )
776 // Not a valid program ID
777 mGetErrorResult = GL_INVALID_OPERATION;
781 UniformIDMap& uniformIDs = it->second;
782 UniformIDMap::iterator it2 = uniformIDs.find( name );
783 if( it2 == uniformIDs.end() )
785 // Uniform not found, so add it...
786 uniformIDs[name] = ++mLastUniformIdUsed;
787 return mLastUniformIdUsed;
793 inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
797 inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
801 inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
805 inline void Hint(GLenum target, GLenum mode)
809 inline GLboolean IsBuffer(GLuint buffer)
811 return mIsBufferResult;
814 inline GLboolean IsEnabled(GLenum cap)
816 return mIsEnabledResult;
819 inline GLboolean IsFramebuffer(GLuint framebuffer)
821 return mIsFramebufferResult;
824 inline GLboolean IsProgram(GLuint program)
826 return mIsProgramResult;
829 inline GLboolean IsRenderbuffer(GLuint renderbuffer)
831 return mIsRenderbufferResult;
834 inline GLboolean IsShader(GLuint shader)
836 return mIsShaderResult;
839 inline GLboolean IsTexture(GLuint texture)
841 return mIsTextureResult;
844 inline void LineWidth(GLfloat width)
848 inline void LinkProgram(GLuint program)
850 std::stringstream out;
853 TraceCallStack::NamedParams namedParams;
854 namedParams["program"] = ToString(program);
855 mShaderTrace.PushCall("LinkProgram", out.str(), namedParams);
857 mNumberOfActiveUniforms=2;
858 GetUniformLocation(program, "sTexture");
859 GetUniformLocation(program, "sEffect");
862 inline void PixelStorei(GLenum pname, GLint param)
866 inline void PolygonOffset(GLfloat factor, GLfloat units)
870 inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
874 inline void ReleaseShaderCompiler(void)
878 inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
882 inline void SampleCoverage(GLclampf value, GLboolean invert)
886 inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
888 mScissorParams.x = x;
889 mScissorParams.y = y;
890 mScissorParams.width = width;
891 mScissorParams.height = height;
894 inline void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
898 inline void ShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
900 std::string stringBuilder;
901 for(int i = 0; i < count; ++i)
903 stringBuilder += string[i];
905 mShaderSources[shader] = stringBuilder;
906 mLastShaderCompiled = shader;
909 inline void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
911 const std::string shaderSource = mShaderSources[shader];
912 if( static_cast<int>(shaderSource.length()) < bufsize )
914 strcpy(source, shaderSource.c_str());
915 *length = shaderSource.length();
919 *length = bufsize -1;
920 strncpy(source, shaderSource.c_str(), *length);
921 source[*length] = 0x0;
925 inline std::string GetShaderSource(GLuint shader)
927 return mShaderSources[shader];
930 inline void StencilFunc(GLenum func, GLint ref, GLuint mask)
934 inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
938 inline void StencilMask(GLuint mask)
942 inline void StencilMaskSeparate(GLenum face, GLuint mask)
946 inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
950 inline void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
954 inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
956 std::stringstream out;
957 out << target<<", "<<level<<", "<<width << ", " << height;
959 TraceCallStack::NamedParams namedParams;
960 namedParams["target"] = ToString(target);
961 namedParams["level"] = ToString(level);
962 namedParams["internalformat"] = ToString(internalformat);
963 namedParams["width"] = ToString(width);
964 namedParams["height"] = ToString(height);
965 namedParams["border"] = ToString(border);
966 namedParams["format"] = ToString(format);
967 namedParams["type"] = ToString(type);
969 mTextureTrace.PushCall("TexImage2D", out.str(), namedParams);
972 inline void TexParameterf(GLenum target, GLenum pname, GLfloat param)
974 std::stringstream out;
975 out << target << ", " << pname << ", " << param;
977 TraceCallStack::NamedParams namedParams;
978 namedParams["target"] = ToString(target);
979 namedParams["pname"] = ToString(pname);
980 namedParams["param"] = ToString(param);
982 mTexParamaterTrace.PushCall("TexParameterf", out.str(), namedParams);
985 inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
987 std::stringstream out;
988 out << target << ", " << pname << ", " << params[0];
990 TraceCallStack::NamedParams namedParams;
991 namedParams["target"] = ToString(target);
992 namedParams["pname"] = ToString(pname);
993 namedParams["params[0]"] = ToString(params[0]);
995 mTexParamaterTrace.PushCall("TexParameterfv", out.str(), namedParams);
998 inline void TexParameteri(GLenum target, GLenum pname, GLint param)
1000 std::stringstream out;
1001 out << target << ", " << pname << ", " << param;
1002 TraceCallStack::NamedParams namedParams;
1003 namedParams["target"] = ToString(target);
1004 namedParams["pname"] = ToString(pname);
1005 namedParams["param"] = ToString(param);
1006 mTexParamaterTrace.PushCall("TexParameteri", out.str(), namedParams);
1009 inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
1011 std::stringstream out;
1012 out << target << ", " << pname << ", " << params[0];
1013 TraceCallStack::NamedParams namedParams;
1014 namedParams["target"] = ToString(target);
1015 namedParams["pname"] = ToString(pname);
1016 namedParams["params[0]"] = ToString(params[0]);
1017 mTexParamaterTrace.PushCall("TexParameteriv", out.str(), namedParams);
1020 inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
1022 std::stringstream out;
1023 out << target << ", "<<level <<", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
1025 TraceCallStack::NamedParams namedParams;
1026 namedParams["target"] = ToString(target);
1027 namedParams["level"] = ToString(level);
1028 namedParams["xoffset"] = ToString(xoffset);
1029 namedParams["yoffset"] = ToString(yoffset);
1030 namedParams["width"] = ToString(width);
1031 namedParams["height"] = ToString(height);
1032 mTextureTrace.PushCall("TexSubImage2D", out.str(), namedParams);
1035 inline void Uniform1f(GLint location, GLfloat x)
1037 if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, x ) )
1039 mGetErrorResult = GL_INVALID_OPERATION;
1043 inline void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
1045 for( int i = 0; i < count; ++i )
1047 if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, v[i] ) )
1049 mGetErrorResult = GL_INVALID_OPERATION;
1055 inline void Uniform1i(GLint location, GLint x)
1057 if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram, location, x ) )
1059 mGetErrorResult = GL_INVALID_OPERATION;
1063 inline void Uniform1iv(GLint location, GLsizei count, const GLint* v)
1065 for( int i = 0; i < count; ++i )
1067 if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram,
1071 mGetErrorResult = GL_INVALID_OPERATION;
1077 inline void Uniform2f(GLint location, GLfloat x, GLfloat y)
1079 if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
1083 mGetErrorResult = GL_INVALID_OPERATION;
1087 inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
1089 for( int i = 0; i < count; ++i )
1091 if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
1093 Vector2( v[2*i], v[2*i+1] ) ) )
1095 mGetErrorResult = GL_INVALID_OPERATION;
1101 inline void Uniform2i(GLint location, GLint x, GLint y)
1105 inline void Uniform2iv(GLint location, GLsizei count, const GLint* v)
1109 inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
1111 if( ! mProgramUniforms3f.SetUniformValue( mCurrentProgram,
1113 Vector3( x, y, z ) ) )
1115 mGetErrorResult = GL_INVALID_OPERATION;
1119 inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
1121 for( int i = 0; i < count; ++i )
1123 if( ! mProgramUniforms3f.SetUniformValue(
1126 Vector3( v[3*i], v[3*i+1], v[3*i+2] ) ) )
1128 mGetErrorResult = GL_INVALID_OPERATION;
1134 inline void Uniform3i(GLint location, GLint x, GLint y, GLint z)
1138 inline void Uniform3iv(GLint location, GLsizei count, const GLint* v)
1142 inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1144 if( ! mProgramUniforms4f.SetUniformValue( mCurrentProgram,
1146 Vector4( x, y, z, w ) ) )
1148 mGetErrorResult = GL_INVALID_OPERATION;
1152 inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
1154 for( int i = 0; i < count; ++i )
1156 if( ! mProgramUniforms4f.SetUniformValue(
1159 Vector4( v[4*i], v[4*i+1], v[4*i+2], v[4*i+3] ) ) )
1161 mGetErrorResult = GL_INVALID_OPERATION;
1167 inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
1171 inline void Uniform4iv(GLint location, GLsizei count, const GLint* v)
1175 inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1179 inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1181 for( int i = 0; i < count; ++i )
1183 if( ! mProgramUniformsMat3.SetUniformValue(
1186 Matrix3( value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8] ) ) )
1188 mGetErrorResult = GL_INVALID_OPERATION;
1194 inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1196 for( int i = 0; i < count; ++i )
1198 if( ! mProgramUniformsMat4.SetUniformValue(
1203 mGetErrorResult = GL_INVALID_OPERATION;
1209 inline void UseProgram(GLuint program)
1211 mCurrentProgram = program;
1214 inline void ValidateProgram(GLuint program)
1218 inline void VertexAttrib1f(GLuint indx, GLfloat x)
1222 inline void VertexAttrib1fv(GLuint indx, const GLfloat* values)
1226 inline void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
1230 inline void VertexAttrib2fv(GLuint indx, const GLfloat* values)
1234 inline void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
1238 inline void VertexAttrib3fv(GLuint indx, const GLfloat* values)
1242 inline void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1246 inline void VertexAttrib4fv(GLuint indx, const GLfloat* values)
1250 inline void VertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
1254 inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
1260 inline void ReadBuffer(GLenum mode)
1264 inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
1268 inline void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
1272 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)
1276 inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1280 inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
1284 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)
1288 inline void GenQueries(GLsizei n, GLuint* ids)
1292 inline void DeleteQueries(GLsizei n, const GLuint* ids)
1296 inline GLboolean IsQuery(GLuint id)
1301 inline void BeginQuery(GLenum target, GLuint id)
1305 inline void EndQuery(GLenum target)
1309 inline void GetQueryiv(GLenum target, GLenum pname, GLint* params)
1313 inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
1317 inline GLboolean UnmapBuffer(GLenum target)
1322 inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
1326 inline void DrawBuffers(GLsizei n, const GLenum* bufs)
1330 inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1334 inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1338 inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1342 inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1346 inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1350 inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1354 inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
1358 inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
1362 inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
1366 inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
1371 inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
1375 inline void BindVertexArray(GLuint array)
1379 inline void DeleteVertexArrays(GLsizei n, const GLuint* arrays)
1383 inline void GenVertexArrays(GLsizei n, GLuint* arrays)
1387 inline GLboolean IsVertexArray(GLuint array)
1392 inline void GetIntegeri_v(GLenum target, GLuint index, GLint* data)
1396 inline void BeginTransformFeedback(GLenum primitiveMode)
1400 inline void EndTransformFeedback(void)
1404 inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
1408 inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer)
1412 inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
1416 inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
1420 inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
1424 inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
1428 inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
1432 inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
1436 inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
1440 inline void VertexAttribI4iv(GLuint index, const GLint* v)
1444 inline void VertexAttribI4uiv(GLuint index, const GLuint* v)
1448 inline void GetUniformuiv(GLuint program, GLint location, GLuint* params)
1452 inline GLint GetFragDataLocation(GLuint program, const GLchar *name)
1457 inline void Uniform1ui(GLint location, GLuint v0)
1461 inline void Uniform2ui(GLint location, GLuint v0, GLuint v1)
1465 inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
1469 inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
1473 inline void Uniform1uiv(GLint location, GLsizei count, const GLuint* value)
1477 inline void Uniform2uiv(GLint location, GLsizei count, const GLuint* value)
1481 inline void Uniform3uiv(GLint location, GLsizei count, const GLuint* value)
1485 inline void Uniform4uiv(GLint location, GLsizei count, const GLuint* value)
1489 inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
1493 inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
1497 inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
1501 inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
1505 inline const GLubyte* GetStringi(GLenum name, GLuint index)
1510 inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
1514 inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
1518 inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
1522 inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
1524 return GL_INVALID_INDEX;
1527 inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
1531 inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
1535 inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
1539 inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1543 inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
1547 inline GLsync FenceSync(GLenum condition, GLbitfield flags)
1552 inline GLboolean IsSync(GLsync sync)
1557 inline void DeleteSync(GLsync sync)
1561 inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
1566 inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
1570 inline void GetInteger64v(GLenum pname, GLint64* params)
1574 inline void GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
1578 inline void GetInteger64i_v(GLenum target, GLuint index, GLint64* data)
1582 inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
1586 inline void GenSamplers(GLsizei count, GLuint* samplers)
1590 inline void DeleteSamplers(GLsizei count, const GLuint* samplers)
1594 inline GLboolean IsSampler(GLuint sampler)
1599 inline void BindSampler(GLuint unit, GLuint sampler)
1603 inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
1607 inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
1611 inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
1615 inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
1619 inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
1623 inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
1627 inline void VertexAttribDivisor(GLuint index, GLuint divisor)
1631 inline void BindTransformFeedback(GLenum target, GLuint id)
1635 inline void DeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
1639 inline void GenTransformFeedbacks(GLsizei n, GLuint* ids)
1643 inline GLboolean IsTransformFeedback(GLuint id)
1648 inline void PauseTransformFeedback(void)
1652 inline void ResumeTransformFeedback(void)
1656 inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
1658 mGetProgramBinaryCalled = true;
1661 inline void ProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
1665 inline void ProgramParameteri(GLuint program, GLenum pname, GLint value)
1669 inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
1673 inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
1677 inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
1681 inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
1685 inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
1689 public: // TEST FUNCTIONS
1690 inline void SetCompileStatus( GLuint value ) { mCompileStatus = value; }
1691 inline void SetLinkStatus( GLuint value ) { mLinkStatus = value; }
1692 inline void SetGetAttribLocationResult( int result) { mGetAttribLocationResult = result; }
1693 inline void SetGetErrorResult( GLenum result) { mGetErrorResult = result; }
1694 inline void SetGetStringResult( GLubyte* result) { mGetStringResult = result; }
1695 inline void SetIsBufferResult( GLboolean result) { mIsBufferResult = result; }
1696 inline void SetIsEnabledResult( GLboolean result) { mIsEnabledResult = result; }
1697 inline void SetIsFramebufferResult( GLboolean result) { mIsFramebufferResult = result; }
1698 inline void SetIsProgramResult( GLboolean result) { mIsProgramResult = result; }
1699 inline void SetIsRenderbufferResult( GLboolean result) { mIsRenderbufferResult = result; }
1700 inline void SetIsShaderResult( GLboolean result) { mIsShaderResult = result; }
1701 inline void SetIsTextureResult( GLboolean result) { mIsTextureResult = result; }
1702 inline void SetCheckFramebufferStatusResult( GLenum result) { mCheckFramebufferStatusResult = result; }
1703 inline void SetNumBinaryFormats( GLint numFormats ) { mNumBinaryFormats = numFormats; }
1704 inline void SetBinaryFormats( GLint binaryFormats ) { mBinaryFormats = binaryFormats; }
1705 inline void SetProgramBinaryLength( GLint length ) { mProgramBinaryLength = length; }
1707 inline bool GetVertexAttribArrayState(GLuint index)
1709 if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
1714 return mVertexAttribArrayState[ index ];
1716 inline void ClearVertexAttribArrayChanged() { mVertexAttribArrayChanged = false; }
1717 inline bool GetVertexAttribArrayChanged() { return mVertexAttribArrayChanged; }
1719 //Methods for CullFace verification
1720 inline void EnableCullFaceCallTrace(bool enable) { mCullFaceTrace.Enable(enable); }
1721 inline void ResetCullFaceCallStack() { mCullFaceTrace.Reset(); }
1722 inline TraceCallStack& GetCullFaceTrace() { return mCullFaceTrace; }
1724 //Methods for Enable/Disable call verification
1725 inline void EnableEnableDisableCallTrace(bool enable) { mEnableDisableTrace.Enable(enable); }
1726 inline void ResetEnableDisableCallStack() { mEnableDisableTrace.Reset(); }
1727 inline TraceCallStack& GetEnableDisableTrace() { return mEnableDisableTrace; }
1729 //Methods for Shader verification
1730 inline void EnableShaderCallTrace(bool enable) { mShaderTrace.Enable(enable); }
1731 inline void ResetShaderCallStack() { mShaderTrace.Reset(); }
1732 inline TraceCallStack& GetShaderTrace() { return mShaderTrace; }
1734 //Methods for Texture verification
1735 inline void EnableTextureCallTrace(bool enable) { mTextureTrace.Enable(enable); }
1736 inline void ResetTextureCallStack() { mTextureTrace.Reset(); }
1737 inline TraceCallStack& GetTextureTrace() { return mTextureTrace; }
1739 //Methods for Texture verification
1740 inline void EnableTexParameterCallTrace(bool enable) { mTexParamaterTrace.Enable(enable); }
1741 inline void ResetTexParameterCallStack() { mTexParamaterTrace.Reset(); }
1742 inline TraceCallStack& GetTexParameterTrace() { return mTexParamaterTrace; }
1744 //Methods for Draw verification
1745 inline void EnableDrawCallTrace(bool enable) { mDrawTrace.Enable(enable); }
1746 inline void ResetDrawCallStack() { mDrawTrace.Reset(); }
1747 inline TraceCallStack& GetDrawTrace() { return mDrawTrace; }
1749 //Methods for Depth function verification
1750 inline void EnableDepthFunctionCallTrace(bool enable) { mDepthFunctionTrace.Enable(enable); }
1751 inline void ResetDepthFunctionCallStack() { mDepthFunctionTrace.Reset(); }
1752 inline TraceCallStack& GetDepthFunctionTrace() { return mDepthFunctionTrace; }
1754 template <typename T>
1755 inline bool GetUniformValue( const char* name, T& value ) const
1757 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1758 program_it != mUniforms.end();
1761 const UniformIDMap &uniformIDs = program_it->second;
1763 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1764 if( uniform_it != uniformIDs.end() )
1766 // found one matching uniform name, lets check the value...
1767 GLuint programId = program_it->first;
1768 GLint uniformId = uniform_it->second;
1770 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1771 return mProgramUniforms.GetUniformValue( programId, uniformId, value );
1778 template <typename T>
1779 inline bool CheckUniformValue( const char* name, const T& value ) const
1781 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1782 program_it != mUniforms.end();
1785 const UniformIDMap &uniformIDs = program_it->second;
1787 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1788 if( uniform_it != uniformIDs.end() )
1790 // found one matching uniform name, lets check the value...
1791 GLuint programId = program_it->first;
1792 GLint uniformId = uniform_it->second;
1794 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1795 if( mProgramUniforms.CheckUniformValue( programId, uniformId, value ) )
1797 // the value matches
1803 fprintf(stderr, "Not found, printing possible values:\n" );
1804 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1805 program_it != mUniforms.end();
1808 const UniformIDMap &uniformIDs = program_it->second;
1810 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1811 if( uniform_it != uniformIDs.end() )
1813 // found one matching uniform name, lets check the value...
1814 GLuint programId = program_it->first;
1815 GLint uniformId = uniform_it->second;
1817 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1819 if ( mProgramUniforms.GetUniformValue(programId, uniformId, origValue) )
1821 std::stringstream out;
1822 out << uniform_it->first << ": " << origValue;
1823 fprintf(stderr, "%s\n", out.str().c_str() );
1830 template <typename T>
1831 inline bool GetUniformValue( GLuint programId, GLuint uniformId, T& outValue) const
1833 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( outValue );
1834 return mProgramUniforms.GetUniformValue( programId, uniformId, outValue );
1837 inline bool GetUniformIds( const char* name, GLuint& programId, GLuint& uniformId ) const
1839 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1840 program_it != mUniforms.end();
1843 const UniformIDMap &uniformIDs = program_it->second;
1845 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1846 if( uniform_it != uniformIDs.end() )
1848 programId = program_it->first;
1849 uniformId = uniform_it->second;
1856 inline GLuint GetLastShaderCompiled() const
1858 return mLastShaderCompiled;
1861 inline GLuint GetLastProgramCreated() const
1863 return mLastProgramIdUsed;
1866 inline GLbitfield GetLastClearMask() const
1868 return mLastClearBitMask;
1873 ATTRIB_UNKNOWN = -1,
1878 ATTRIB_BONE_WEIGHTS,
1879 ATTRIB_BONE_INDICES,
1883 struct ScissorParams
1890 ScissorParams() : x( 0 ), y( 0 ), width( 0 ), height( 0 ) { }
1893 // Methods to check scissor tests
1894 inline const ScissorParams& GetScissorParams() const { return mScissorParams; }
1896 inline bool GetProgramBinaryCalled() const { return mGetProgramBinaryCalled; }
1898 inline unsigned int GetClearCountCalled() const { return mClearCount; }
1900 typedef std::vector<size_t> BufferDataCalls;
1901 inline const BufferDataCalls& GetBufferDataCalls() const { return mBufferDataCalls; }
1902 inline void ResetBufferDataCalls() { mBufferDataCalls.clear(); }
1904 typedef std::vector<size_t> BufferSubDataCalls;
1905 inline const BufferSubDataCalls& GetBufferSubDataCalls() const { return mBufferSubDataCalls; }
1906 inline void ResetBufferSubDataCalls() { mBufferSubDataCalls.clear(); }
1909 GLuint mCurrentProgram;
1910 GLuint mCompileStatus;
1911 BufferDataCalls mBufferDataCalls;
1912 BufferSubDataCalls mBufferSubDataCalls;
1914 GLint mNumberOfActiveUniforms;
1915 GLint mGetAttribLocationResult;
1916 GLenum mGetErrorResult;
1917 GLubyte* mGetStringResult;
1918 GLboolean mIsBufferResult;
1919 GLboolean mIsEnabledResult;
1920 GLboolean mIsFramebufferResult;
1921 GLboolean mIsProgramResult;
1922 GLboolean mIsRenderbufferResult;
1923 GLboolean mIsShaderResult;
1924 GLboolean mIsTextureResult;
1925 GLenum mActiveTextureUnit;
1926 GLenum mCheckFramebufferStatusResult;
1927 GLint mFramebufferStatus;
1928 GLenum mFramebufferColorAttached;
1929 GLenum mFramebufferDepthAttached;
1930 GLenum mFramebufferStencilAttached;
1931 GLint mNumBinaryFormats;
1932 GLint mBinaryFormats;
1933 GLint mProgramBinaryLength;
1934 bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE];
1935 bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed
1936 bool mGetProgramBinaryCalled;
1937 typedef std::map< GLuint, std::string> ShaderSourceMap;
1938 ShaderSourceMap mShaderSources;
1939 GLuint mLastShaderCompiled;
1940 GLbitfield mLastClearBitMask;
1941 unsigned int mClearCount;
1943 Vector4 mLastBlendColor;
1944 GLenum mLastBlendEquationRgb;
1945 GLenum mLastBlendEquationAlpha;
1946 GLenum mLastBlendFuncSrcRgb;
1947 GLenum mLastBlendFuncDstRgb;
1948 GLenum mLastBlendFuncSrcAlpha;
1949 GLenum mLastBlendFuncDstAlpha;
1951 // Data for manipulating the IDs returned by GenTextures
1952 GLuint mLastAutoTextureIdUsed;
1953 std::vector<GLuint> mNextTextureIds;
1954 std::vector<GLuint> mDeletedTextureIds;
1955 std::vector<GLuint> mBoundTextures;
1957 struct ActiveTextureType
1959 std::vector<GLuint> mBoundTextures;
1962 ActiveTextureType mActiveTextures[ MIN_TEXTURE_UNIT_LIMIT ];
1964 TraceCallStack mCullFaceTrace;
1965 TraceCallStack mEnableDisableTrace;
1966 TraceCallStack mShaderTrace;
1967 TraceCallStack mTextureTrace;
1968 TraceCallStack mTexParamaterTrace;
1969 TraceCallStack mDrawTrace;
1970 TraceCallStack mDepthFunctionTrace;
1972 // Shaders & Uniforms
1973 GLuint mLastShaderIdUsed;
1974 GLuint mLastProgramIdUsed;
1975 GLuint mLastUniformIdUsed;
1976 typedef std::map< std::string, GLint > UniformIDMap;
1977 typedef std::map< GLuint, UniformIDMap > ProgramUniformMap;
1978 ProgramUniformMap mUniforms;
1980 template <typename T>
1981 struct ProgramUniformValue : public std::map< GLuint, std::map< GLint, T > >
1984 typedef std::map< GLint, T > UniformValueMap;
1985 typedef std::map< GLuint, UniformValueMap > Map;
1987 bool SetUniformValue( GLuint program, GLuint uniform, const T& value )
1994 typename Map::iterator it = Map::find( program );
1995 if( it == Map::end() )
1997 // if its the first uniform for this program add it
1998 std::pair< typename Map::iterator, bool > result =
1999 Map::insert( typename Map::value_type( program, UniformValueMap() ) );
2003 UniformValueMap& uniforms = it->second;
2004 uniforms[uniform] = value;
2009 bool CheckUniformValue( GLuint program, GLuint uniform, const T& value ) const
2012 if ( GetUniformValue( program, uniform, uniformValue ) )
2014 return value == uniformValue;
2020 bool GetUniformValue( GLuint program, GLuint uniform, T& value ) const
2027 typename Map::const_iterator it = Map::find( program );
2028 if( it == Map::end() )
2030 // Uniform values always initialised as 0
2035 const UniformValueMap& uniforms = it->second;
2036 typename UniformValueMap::const_iterator it2 = uniforms.find( uniform );
2037 if( it2 == uniforms.end() )
2039 // Uniform values always initialised as 0
2043 value = it2->second;
2050 ProgramUniformValue<int> mProgramUniforms1i;
2051 ProgramUniformValue<float> mProgramUniforms1f;
2052 ProgramUniformValue<Vector2> mProgramUniforms2f;
2053 ProgramUniformValue<Vector3> mProgramUniforms3f;
2054 ProgramUniformValue<Vector4> mProgramUniforms4f;
2055 ProgramUniformValue<Matrix> mProgramUniformsMat4;
2056 ProgramUniformValue<Matrix3> mProgramUniformsMat3;
2058 inline const ProgramUniformValue<int>& GetProgramUniformsForType( const int ) const
2060 return mProgramUniforms1i;
2062 inline const ProgramUniformValue<float>& GetProgramUniformsForType( const float ) const
2064 return mProgramUniforms1f;
2066 inline const ProgramUniformValue<Vector2>& GetProgramUniformsForType( const Vector2& ) const
2068 return mProgramUniforms2f;
2070 inline const ProgramUniformValue<Vector3>& GetProgramUniformsForType( const Vector3& ) const
2072 return mProgramUniforms3f;
2074 inline const ProgramUniformValue<Vector4>& GetProgramUniformsForType( const Vector4& ) const
2076 return mProgramUniforms4f;
2078 inline const ProgramUniformValue<Matrix>& GetProgramUniformsForType( const Matrix& ) const
2080 return mProgramUniformsMat4;
2082 inline const ProgramUniformValue<Matrix3>& GetProgramUniformsForType( const Matrix3& ) const
2084 return mProgramUniformsMat3;
2086 inline void SetVertexAttribArray(GLuint index, bool state)
2088 if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
2093 mVertexAttribArrayState[ index ] = state;
2094 mVertexAttribArrayChanged = true;
2097 ScissorParams mScissorParams;
2101 inline int TestGlAbstraction::ProgramUniformValue<int>::GetZero() const
2107 inline float TestGlAbstraction::ProgramUniformValue<float>::GetZero() const
2113 inline Vector2 TestGlAbstraction::ProgramUniformValue<Vector2>::GetZero() const
2115 return Vector2::ZERO;
2119 inline Vector3 TestGlAbstraction::ProgramUniformValue<Vector3>::GetZero() const
2121 return Vector3::ZERO;
2125 inline Vector4 TestGlAbstraction::ProgramUniformValue<Vector4>::GetZero() const
2127 return Vector4::ZERO;
2131 inline Matrix TestGlAbstraction::ProgramUniformValue<Matrix>::GetZero() const
2137 inline Matrix3 TestGlAbstraction::ProgramUniformValue<Matrix3>::GetZero() const
2139 return Matrix3( Matrix() );
2144 bool BlendEnabled(const Dali::TraceCallStack& callStack);
2145 bool BlendDisabled(const Dali::TraceCallStack& callStack);
2150 #endif // __TEST_GL_ES_H__