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)
298 std::stringstream out;
299 out << target<<", "<<level<<", "<<width << ", " << height;
301 TraceCallStack::NamedParams namedParams;
302 namedParams["target"] = ToString(target);
303 namedParams["level"] = ToString(level);
304 namedParams["internalformat"] = ToString(internalformat);
305 namedParams["width"] = ToString(width);
306 namedParams["height"] = ToString(height);
307 namedParams["border"] = ToString(border);
308 namedParams["size"] = ToString(imageSize);
310 mTextureTrace.PushCall("CompressedTexImage2D", out.str(), namedParams);
313 inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
315 std::stringstream out;
316 out << target << ", "<<level <<", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
318 TraceCallStack::NamedParams namedParams;
319 namedParams["target"] = ToString(target);
320 namedParams["level"] = ToString(level);
321 namedParams["xoffset"] = ToString(xoffset);
322 namedParams["yoffset"] = ToString(yoffset);
323 namedParams["width"] = ToString(width);
324 namedParams["height"] = ToString(height);
325 mTextureTrace.PushCall("CompressedTexSubImage2D", out.str(), namedParams);
328 inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
332 inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
336 inline GLuint CreateProgram(void)
338 mShaderTrace.PushCall("CreateProgram", "");
340 ++mLastProgramIdUsed;
341 mUniforms[mLastProgramIdUsed] = UniformIDMap();
342 return mLastProgramIdUsed;
345 inline GLuint CreateShader(GLenum type)
347 std::stringstream out;
350 TraceCallStack::NamedParams namedParams;
351 namedParams["type"] = ToString(type);
352 mShaderTrace.PushCall("CreateShader", out.str(), namedParams);
354 return ++mLastShaderIdUsed;
357 inline void CullFace(GLenum mode)
359 std::stringstream out;
362 TraceCallStack::NamedParams namedParams;
363 namedParams["program"] = ToString(mode);
365 mCullFaceTrace.PushCall("CullFace", out.str(), namedParams);
368 inline void DeleteBuffers(GLsizei n, const GLuint* buffers)
372 inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
376 inline void DeleteProgram(GLuint program)
378 std::stringstream out;
381 TraceCallStack::NamedParams namedParams;
382 namedParams["program"] = ToString(program);
384 mShaderTrace.PushCall("DeleteProgram", out.str(), namedParams);
387 inline void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
391 inline void DeleteShader(GLuint shader)
393 std::stringstream out;
396 TraceCallStack::NamedParams namedParams;
397 namedParams["shader"] = ToString(shader);
399 mShaderTrace.PushCall("DeleteShader", out.str(), namedParams);
402 inline void DeleteTextures(GLsizei n, const GLuint* textures)
404 std::stringstream out;
405 out << n << ", " << textures << " = [";
407 TraceCallStack::NamedParams namedParams;
409 for(GLsizei i=0; i<n; i++)
411 out << textures[i] << ", ";
412 std::stringstream paramName;
413 paramName<<"texture["<<i<<"]";
414 namedParams[paramName.str()] = ToString(textures[i]);
415 mDeletedTextureIds.push_back(textures[i]);
419 mTextureTrace.PushCall("DeleteTextures", out.str(), namedParams);
422 inline bool CheckNoTexturesDeleted()
424 return mDeletedTextureIds.size() == 0;
427 inline bool CheckTextureDeleted( GLuint textureId )
431 for(std::vector<GLuint>::iterator iter=mDeletedTextureIds.begin(); iter != mDeletedTextureIds.end(); ++iter)
433 if(*iter == textureId)
442 inline void ClearDeletedTextures()
444 mDeletedTextureIds.clear();
447 inline void DepthFunc(GLenum func)
449 std::stringstream out;
452 TraceCallStack::NamedParams namedParams;
453 namedParams["func"] = ToString(func);
455 mDepthFunctionTrace.PushCall("DepthFunc", out.str(), namedParams);
458 inline void DepthMask(GLboolean flag)
462 inline void DepthRangef(GLclampf zNear, GLclampf zFar)
466 inline void DetachShader(GLuint program, GLuint shader)
468 std::stringstream out;
469 out << program << ", " << shader;
470 TraceCallStack::NamedParams namedParams;
471 namedParams["program"] = ToString(program);
472 namedParams["shader"] = ToString(shader);
473 mShaderTrace.PushCall("DetachShader", out.str(), namedParams);
476 inline void Disable(GLenum cap)
478 std::stringstream out;
480 TraceCallStack::NamedParams namedParams;
481 namedParams["cap"] = ToString(cap);
482 mEnableDisableTrace.PushCall("Disable", out.str(), namedParams);
485 inline void DisableVertexAttribArray(GLuint index)
487 SetVertexAttribArray( index, false );
490 inline void DrawArrays(GLenum mode, GLint first, GLsizei count)
492 std::stringstream out;
493 out << mode << ", " << first << ", " << count;
494 TraceCallStack::NamedParams namedParams;
495 namedParams["mode"] = ToString(mode);
496 namedParams["first"] = ToString(first);
497 namedParams["count"] = ToString(count);
498 mDrawTrace.PushCall("DrawArrays", out.str(), namedParams);
501 inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
503 std::stringstream out;
504 out << mode << ", " << count << ", " << type << ", indices";
506 TraceCallStack::NamedParams namedParams;
507 namedParams["mode"] = ToString(mode);
508 namedParams["count"] = ToString(count);
509 namedParams["type"] = ToString(type);
510 // Skip void pointers - are they of any use?
511 mDrawTrace.PushCall("DrawElements", out.str(), namedParams);
514 inline void Enable(GLenum cap)
516 std::stringstream out;
518 TraceCallStack::NamedParams namedParams;
519 namedParams["cap"] = ToString(cap);
520 mEnableDisableTrace.PushCall("Enable", out.str(), namedParams);
523 inline void EnableVertexAttribArray(GLuint index)
525 SetVertexAttribArray( index, true);
528 inline void Finish(void)
532 inline void Flush(void)
536 inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
538 if (attachment == GL_DEPTH_ATTACHMENT)
540 mFramebufferDepthAttached = true;
542 else if (attachment == GL_STENCIL_ATTACHMENT)
544 mFramebufferStencilAttached = true;
548 inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
551 mFramebufferStatus |= 4;
553 //We check 4 attachment colors
554 if ((attachment == GL_COLOR_ATTACHMENT0) || (attachment == GL_COLOR_ATTACHMENT1) || (attachment == GL_COLOR_ATTACHMENT2) || (attachment == GL_COLOR_ATTACHMENT4))
556 mFramebufferColorAttached = true;
560 inline void FrontFace(GLenum mode)
564 inline void GenBuffers(GLsizei n, GLuint* buffers)
566 // avoids an assert in GpuBuffers
570 inline void GenerateMipmap(GLenum target)
572 std::stringstream out;
574 TraceCallStack::NamedParams namedParams;
575 namedParams["target"] = ToString(target);
577 mTextureTrace.PushCall("GenerateMipmap", out.str(), namedParams);
580 inline void GenFramebuffers(GLsizei n, GLuint* framebuffers)
582 for( int i = 0; i < n; i++ )
584 framebuffers[i] = i + 1;
587 //Add 001 bit, this function needs to be called the first one in the chain
588 mFramebufferStatus = 1;
591 inline void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
593 for( int i = 0; i < n; i++ )
595 renderbuffers[i] = i + 1;
600 * This method can be used by test cases, to manipulate the texture IDs generated by GenTextures.
601 * @param[in] ids A vector containing the next IDs to be generated
603 inline void SetNextTextureIds( const std::vector<GLuint>& ids )
605 mNextTextureIds = ids;
608 inline const std::vector<GLuint>& GetNextTextureIds()
610 return mNextTextureIds;
613 inline void GenTextures(GLsizei count, GLuint* textures)
615 for( int i=0; i<count; ++i )
617 if( !mNextTextureIds.empty() )
619 *(textures+i) = mNextTextureIds[0];
620 mNextTextureIds.erase( mNextTextureIds.begin() );
624 *(textures+i) = ++mLastAutoTextureIdUsed;
628 TraceCallStack::NamedParams namedParams;
629 namedParams["count"] = ToString(count);
631 std::stringstream out;
632 for(int i=0; i<count; i++)
639 std::ostringstream oss;
640 oss<<"indices["<<i<<"]";
641 namedParams[oss.str()] = ToString(textures[i]);
644 mTextureTrace.PushCall("GenTextures", out.str(), namedParams);
647 inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
651 inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
656 *length = snprintf(name, bufsize, "sTexture");
657 *type = GL_SAMPLER_2D;
661 *length = snprintf(name, bufsize, "sEffect");
662 *type = GL_SAMPLER_2D;
666 *length = snprintf(name, bufsize, "sGloss");
667 *type = GL_SAMPLER_2D;
675 inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
679 inline int GetAttribLocation(GLuint program, const char* name)
681 std::string attribName(name);
683 for( unsigned int i = 0; i < ATTRIB_TYPE_LAST; ++i )
685 if( mStdAttribs[i] == attribName )
691 // 0 is a valid location
695 inline void GetBooleanv(GLenum pname, GLboolean* params)
699 inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
703 inline GLenum GetError(void)
705 return mGetErrorResult;
708 inline void GetFloatv(GLenum pname, GLfloat* params)
712 inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
716 inline void GetIntegerv(GLenum pname, GLint* params)
720 case GL_MAX_TEXTURE_SIZE:
723 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
726 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
727 *params = mNumBinaryFormats;
729 case GL_PROGRAM_BINARY_FORMATS_OES:
730 *params = mBinaryFormats;
735 inline void GetProgramiv(GLuint program, GLenum pname, GLint* params)
740 *params = mLinkStatus;
742 case GL_PROGRAM_BINARY_LENGTH_OES:
743 *params = mProgramBinaryLength;
745 case GL_ACTIVE_UNIFORMS:
746 *params = mNumberOfActiveUniforms;
748 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
754 inline void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
758 inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
762 inline void GetShaderiv(GLuint shader, GLenum pname, GLint* params)
765 case GL_COMPILE_STATUS:
766 *params = mCompileStatus;
771 inline void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
775 inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
779 inline const GLubyte* GetString(GLenum name)
781 return mGetStringResult;
784 inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
788 inline void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
792 inline void GetUniformfv(GLuint program, GLint location, GLfloat* params)
796 inline void GetUniformiv(GLuint program, GLint location, GLint* params)
800 inline GLint GetUniformLocation(GLuint program, const char* name)
802 ProgramUniformMap::iterator it = mUniforms.find(program);
803 if( it == mUniforms.end() )
805 // Not a valid program ID
806 mGetErrorResult = GL_INVALID_OPERATION;
810 UniformIDMap& uniformIDs = it->second;
811 UniformIDMap::iterator it2 = uniformIDs.find( name );
812 if( it2 == uniformIDs.end() )
814 // Uniform not found, so add it...
815 uniformIDs[name] = ++mLastUniformIdUsed;
816 return mLastUniformIdUsed;
822 inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
826 inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
830 inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
834 inline void Hint(GLenum target, GLenum mode)
838 inline GLboolean IsBuffer(GLuint buffer)
840 return mIsBufferResult;
843 inline GLboolean IsEnabled(GLenum cap)
845 return mIsEnabledResult;
848 inline GLboolean IsFramebuffer(GLuint framebuffer)
850 return mIsFramebufferResult;
853 inline GLboolean IsProgram(GLuint program)
855 return mIsProgramResult;
858 inline GLboolean IsRenderbuffer(GLuint renderbuffer)
860 return mIsRenderbufferResult;
863 inline GLboolean IsShader(GLuint shader)
865 return mIsShaderResult;
868 inline GLboolean IsTexture(GLuint texture)
870 return mIsTextureResult;
873 inline void LineWidth(GLfloat width)
877 inline void LinkProgram(GLuint program)
879 std::stringstream out;
882 TraceCallStack::NamedParams namedParams;
883 namedParams["program"] = ToString(program);
884 mShaderTrace.PushCall("LinkProgram", out.str(), namedParams);
886 mNumberOfActiveUniforms=3;
887 GetUniformLocation(program, "sTexture");
888 GetUniformLocation(program, "sEffect");
889 GetUniformLocation(program, "sGloss");
892 inline void PixelStorei(GLenum pname, GLint param)
896 inline void PolygonOffset(GLfloat factor, GLfloat units)
900 inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
904 inline void ReleaseShaderCompiler(void)
908 inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
912 inline void SampleCoverage(GLclampf value, GLboolean invert)
916 inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
918 mScissorParams.x = x;
919 mScissorParams.y = y;
920 mScissorParams.width = width;
921 mScissorParams.height = height;
924 inline void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
928 inline void ShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
930 std::string stringBuilder;
931 for(int i = 0; i < count; ++i)
933 stringBuilder += string[i];
935 mShaderSources[shader] = stringBuilder;
936 mLastShaderCompiled = shader;
939 inline void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
941 const std::string shaderSource = mShaderSources[shader];
942 if( static_cast<int>(shaderSource.length()) < bufsize )
944 strcpy(source, shaderSource.c_str());
945 *length = shaderSource.length();
949 *length = bufsize -1;
950 strncpy(source, shaderSource.c_str(), *length);
951 source[*length] = 0x0;
955 inline std::string GetShaderSource(GLuint shader)
957 return mShaderSources[shader];
960 inline void StencilFunc(GLenum func, GLint ref, GLuint mask)
964 inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
968 inline void StencilMask(GLuint mask)
972 inline void StencilMaskSeparate(GLenum face, GLuint mask)
976 inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
980 inline void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
984 inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
986 std::stringstream out;
987 out << target<<", "<<level<<", "<<width << ", " << height;
989 TraceCallStack::NamedParams namedParams;
990 namedParams["target"] = ToString(target);
991 namedParams["level"] = ToString(level);
992 namedParams["internalformat"] = ToString(internalformat);
993 namedParams["width"] = ToString(width);
994 namedParams["height"] = ToString(height);
995 namedParams["border"] = ToString(border);
996 namedParams["format"] = ToString(format);
997 namedParams["type"] = ToString(type);
999 mTextureTrace.PushCall("TexImage2D", out.str(), namedParams);
1002 inline void TexParameterf(GLenum target, GLenum pname, GLfloat param)
1004 std::stringstream out;
1005 out << target << ", " << pname << ", " << param;
1007 TraceCallStack::NamedParams namedParams;
1008 namedParams["target"] = ToString(target);
1009 namedParams["pname"] = ToString(pname);
1010 namedParams["param"] = ToString(param);
1012 mTexParamaterTrace.PushCall("TexParameterf", out.str(), namedParams);
1015 inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
1017 std::stringstream out;
1018 out << target << ", " << pname << ", " << params[0];
1020 TraceCallStack::NamedParams namedParams;
1021 namedParams["target"] = ToString(target);
1022 namedParams["pname"] = ToString(pname);
1023 namedParams["params[0]"] = ToString(params[0]);
1025 mTexParamaterTrace.PushCall("TexParameterfv", out.str(), namedParams);
1028 inline void TexParameteri(GLenum target, GLenum pname, GLint param)
1030 std::stringstream out;
1031 out << target << ", " << pname << ", " << param;
1032 TraceCallStack::NamedParams namedParams;
1033 namedParams["target"] = ToString(target);
1034 namedParams["pname"] = ToString(pname);
1035 namedParams["param"] = ToString(param);
1036 mTexParamaterTrace.PushCall("TexParameteri", out.str(), namedParams);
1039 inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
1041 std::stringstream out;
1042 out << target << ", " << pname << ", " << params[0];
1043 TraceCallStack::NamedParams namedParams;
1044 namedParams["target"] = ToString(target);
1045 namedParams["pname"] = ToString(pname);
1046 namedParams["params[0]"] = ToString(params[0]);
1047 mTexParamaterTrace.PushCall("TexParameteriv", out.str(), namedParams);
1050 inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
1052 std::stringstream out;
1053 out << target << ", "<<level <<", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
1055 TraceCallStack::NamedParams namedParams;
1056 namedParams["target"] = ToString(target);
1057 namedParams["level"] = ToString(level);
1058 namedParams["xoffset"] = ToString(xoffset);
1059 namedParams["yoffset"] = ToString(yoffset);
1060 namedParams["width"] = ToString(width);
1061 namedParams["height"] = ToString(height);
1062 mTextureTrace.PushCall("TexSubImage2D", out.str(), namedParams);
1065 inline void Uniform1f(GLint location, GLfloat x)
1067 if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, x ) )
1069 mGetErrorResult = GL_INVALID_OPERATION;
1073 inline void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
1075 for( int i = 0; i < count; ++i )
1077 if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, v[i] ) )
1079 mGetErrorResult = GL_INVALID_OPERATION;
1085 inline void Uniform1i(GLint location, GLint x)
1087 if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram, location, x ) )
1089 mGetErrorResult = GL_INVALID_OPERATION;
1093 inline void Uniform1iv(GLint location, GLsizei count, const GLint* v)
1095 for( int i = 0; i < count; ++i )
1097 if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram,
1101 mGetErrorResult = GL_INVALID_OPERATION;
1107 inline void Uniform2f(GLint location, GLfloat x, GLfloat y)
1109 if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
1113 mGetErrorResult = GL_INVALID_OPERATION;
1117 inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
1119 for( int i = 0; i < count; ++i )
1121 if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
1123 Vector2( v[2*i], v[2*i+1] ) ) )
1125 mGetErrorResult = GL_INVALID_OPERATION;
1131 inline void Uniform2i(GLint location, GLint x, GLint y)
1135 inline void Uniform2iv(GLint location, GLsizei count, const GLint* v)
1139 inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
1141 if( ! mProgramUniforms3f.SetUniformValue( mCurrentProgram,
1143 Vector3( x, y, z ) ) )
1145 mGetErrorResult = GL_INVALID_OPERATION;
1149 inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
1151 for( int i = 0; i < count; ++i )
1153 if( ! mProgramUniforms3f.SetUniformValue(
1156 Vector3( v[3*i], v[3*i+1], v[3*i+2] ) ) )
1158 mGetErrorResult = GL_INVALID_OPERATION;
1164 inline void Uniform3i(GLint location, GLint x, GLint y, GLint z)
1168 inline void Uniform3iv(GLint location, GLsizei count, const GLint* v)
1172 inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1174 if( ! mProgramUniforms4f.SetUniformValue( mCurrentProgram,
1176 Vector4( x, y, z, w ) ) )
1178 mGetErrorResult = GL_INVALID_OPERATION;
1182 inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
1184 for( int i = 0; i < count; ++i )
1186 if( ! mProgramUniforms4f.SetUniformValue(
1189 Vector4( v[4*i], v[4*i+1], v[4*i+2], v[4*i+3] ) ) )
1191 mGetErrorResult = GL_INVALID_OPERATION;
1197 inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
1201 inline void Uniform4iv(GLint location, GLsizei count, const GLint* v)
1205 inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1209 inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1211 for( int i = 0; i < count; ++i )
1213 if( ! mProgramUniformsMat3.SetUniformValue(
1216 Matrix3( value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8] ) ) )
1218 mGetErrorResult = GL_INVALID_OPERATION;
1224 inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1226 for( int i = 0; i < count; ++i )
1228 if( ! mProgramUniformsMat4.SetUniformValue(
1233 mGetErrorResult = GL_INVALID_OPERATION;
1239 inline void UseProgram(GLuint program)
1241 mCurrentProgram = program;
1244 inline void ValidateProgram(GLuint program)
1248 inline void VertexAttrib1f(GLuint indx, GLfloat x)
1252 inline void VertexAttrib1fv(GLuint indx, const GLfloat* values)
1256 inline void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
1260 inline void VertexAttrib2fv(GLuint indx, const GLfloat* values)
1264 inline void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
1268 inline void VertexAttrib3fv(GLuint indx, const GLfloat* values)
1272 inline void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1276 inline void VertexAttrib4fv(GLuint indx, const GLfloat* values)
1280 inline void VertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
1284 inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
1290 inline void ReadBuffer(GLenum mode)
1294 inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
1298 inline void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
1302 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)
1306 inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1310 inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
1314 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)
1318 inline void GenQueries(GLsizei n, GLuint* ids)
1322 inline void DeleteQueries(GLsizei n, const GLuint* ids)
1326 inline GLboolean IsQuery(GLuint id)
1331 inline void BeginQuery(GLenum target, GLuint id)
1335 inline void EndQuery(GLenum target)
1339 inline void GetQueryiv(GLenum target, GLenum pname, GLint* params)
1343 inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
1347 inline GLboolean UnmapBuffer(GLenum target)
1352 inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
1356 inline void DrawBuffers(GLsizei n, const GLenum* bufs)
1360 inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1364 inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1368 inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1372 inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1376 inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1380 inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1384 inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
1388 inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
1392 inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
1396 inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
1401 inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
1405 inline void BindVertexArray(GLuint array)
1409 inline void DeleteVertexArrays(GLsizei n, const GLuint* arrays)
1413 inline void GenVertexArrays(GLsizei n, GLuint* arrays)
1417 inline GLboolean IsVertexArray(GLuint array)
1422 inline void GetIntegeri_v(GLenum target, GLuint index, GLint* data)
1426 inline void BeginTransformFeedback(GLenum primitiveMode)
1430 inline void EndTransformFeedback(void)
1434 inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
1438 inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer)
1442 inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
1446 inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
1450 inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
1454 inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
1458 inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
1462 inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
1466 inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
1470 inline void VertexAttribI4iv(GLuint index, const GLint* v)
1474 inline void VertexAttribI4uiv(GLuint index, const GLuint* v)
1478 inline void GetUniformuiv(GLuint program, GLint location, GLuint* params)
1482 inline GLint GetFragDataLocation(GLuint program, const GLchar *name)
1487 inline void Uniform1ui(GLint location, GLuint v0)
1491 inline void Uniform2ui(GLint location, GLuint v0, GLuint v1)
1495 inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
1499 inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
1503 inline void Uniform1uiv(GLint location, GLsizei count, const GLuint* value)
1507 inline void Uniform2uiv(GLint location, GLsizei count, const GLuint* value)
1511 inline void Uniform3uiv(GLint location, GLsizei count, const GLuint* value)
1515 inline void Uniform4uiv(GLint location, GLsizei count, const GLuint* value)
1519 inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
1523 inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
1527 inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
1531 inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
1535 inline const GLubyte* GetStringi(GLenum name, GLuint index)
1540 inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
1544 inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
1548 inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
1552 inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
1554 return GL_INVALID_INDEX;
1557 inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
1561 inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
1565 inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
1569 inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1573 inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
1577 inline GLsync FenceSync(GLenum condition, GLbitfield flags)
1582 inline GLboolean IsSync(GLsync sync)
1587 inline void DeleteSync(GLsync sync)
1591 inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
1596 inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
1600 inline void GetInteger64v(GLenum pname, GLint64* params)
1604 inline void GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
1608 inline void GetInteger64i_v(GLenum target, GLuint index, GLint64* data)
1612 inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
1616 inline void GenSamplers(GLsizei count, GLuint* samplers)
1620 inline void DeleteSamplers(GLsizei count, const GLuint* samplers)
1624 inline GLboolean IsSampler(GLuint sampler)
1629 inline void BindSampler(GLuint unit, GLuint sampler)
1633 inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
1637 inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
1641 inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
1645 inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
1649 inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
1653 inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
1657 inline void VertexAttribDivisor(GLuint index, GLuint divisor)
1661 inline void BindTransformFeedback(GLenum target, GLuint id)
1665 inline void DeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
1669 inline void GenTransformFeedbacks(GLsizei n, GLuint* ids)
1673 inline GLboolean IsTransformFeedback(GLuint id)
1678 inline void PauseTransformFeedback(void)
1682 inline void ResumeTransformFeedback(void)
1686 inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
1688 mGetProgramBinaryCalled = true;
1691 inline void ProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
1695 inline void ProgramParameteri(GLuint program, GLenum pname, GLint value)
1699 inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
1703 inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
1707 inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
1711 inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
1715 inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
1719 public: // TEST FUNCTIONS
1720 inline void SetCompileStatus( GLuint value ) { mCompileStatus = value; }
1721 inline void SetLinkStatus( GLuint value ) { mLinkStatus = value; }
1722 inline void SetGetAttribLocationResult( int result) { mGetAttribLocationResult = result; }
1723 inline void SetGetErrorResult( GLenum result) { mGetErrorResult = result; }
1724 inline void SetGetStringResult( GLubyte* result) { mGetStringResult = result; }
1725 inline void SetIsBufferResult( GLboolean result) { mIsBufferResult = result; }
1726 inline void SetIsEnabledResult( GLboolean result) { mIsEnabledResult = result; }
1727 inline void SetIsFramebufferResult( GLboolean result) { mIsFramebufferResult = result; }
1728 inline void SetIsProgramResult( GLboolean result) { mIsProgramResult = result; }
1729 inline void SetIsRenderbufferResult( GLboolean result) { mIsRenderbufferResult = result; }
1730 inline void SetIsShaderResult( GLboolean result) { mIsShaderResult = result; }
1731 inline void SetIsTextureResult( GLboolean result) { mIsTextureResult = result; }
1732 inline void SetCheckFramebufferStatusResult( GLenum result) { mCheckFramebufferStatusResult = result; }
1733 inline void SetNumBinaryFormats( GLint numFormats ) { mNumBinaryFormats = numFormats; }
1734 inline void SetBinaryFormats( GLint binaryFormats ) { mBinaryFormats = binaryFormats; }
1735 inline void SetProgramBinaryLength( GLint length ) { mProgramBinaryLength = length; }
1737 inline bool GetVertexAttribArrayState(GLuint index)
1739 if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
1744 return mVertexAttribArrayState[ index ];
1746 inline void ClearVertexAttribArrayChanged() { mVertexAttribArrayChanged = false; }
1747 inline bool GetVertexAttribArrayChanged() { return mVertexAttribArrayChanged; }
1749 //Methods for CullFace verification
1750 inline void EnableCullFaceCallTrace(bool enable) { mCullFaceTrace.Enable(enable); }
1751 inline void ResetCullFaceCallStack() { mCullFaceTrace.Reset(); }
1752 inline TraceCallStack& GetCullFaceTrace() { return mCullFaceTrace; }
1754 //Methods for Enable/Disable call verification
1755 inline void EnableEnableDisableCallTrace(bool enable) { mEnableDisableTrace.Enable(enable); }
1756 inline void ResetEnableDisableCallStack() { mEnableDisableTrace.Reset(); }
1757 inline TraceCallStack& GetEnableDisableTrace() { return mEnableDisableTrace; }
1759 //Methods for Shader verification
1760 inline void EnableShaderCallTrace(bool enable) { mShaderTrace.Enable(enable); }
1761 inline void ResetShaderCallStack() { mShaderTrace.Reset(); }
1762 inline TraceCallStack& GetShaderTrace() { return mShaderTrace; }
1764 //Methods for Texture verification
1765 inline void EnableTextureCallTrace(bool enable) { mTextureTrace.Enable(enable); }
1766 inline void ResetTextureCallStack() { mTextureTrace.Reset(); }
1767 inline TraceCallStack& GetTextureTrace() { return mTextureTrace; }
1769 //Methods for Texture verification
1770 inline void EnableTexParameterCallTrace(bool enable) { mTexParamaterTrace.Enable(enable); }
1771 inline void ResetTexParameterCallStack() { mTexParamaterTrace.Reset(); }
1772 inline TraceCallStack& GetTexParameterTrace() { return mTexParamaterTrace; }
1774 //Methods for Draw verification
1775 inline void EnableDrawCallTrace(bool enable) { mDrawTrace.Enable(enable); }
1776 inline void ResetDrawCallStack() { mDrawTrace.Reset(); }
1777 inline TraceCallStack& GetDrawTrace() { return mDrawTrace; }
1779 //Methods for Depth function verification
1780 inline void EnableDepthFunctionCallTrace(bool enable) { mDepthFunctionTrace.Enable(enable); }
1781 inline void ResetDepthFunctionCallStack() { mDepthFunctionTrace.Reset(); }
1782 inline TraceCallStack& GetDepthFunctionTrace() { return mDepthFunctionTrace; }
1784 template <typename T>
1785 inline bool GetUniformValue( const char* name, T& value ) const
1787 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1788 program_it != mUniforms.end();
1791 const UniformIDMap &uniformIDs = program_it->second;
1793 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1794 if( uniform_it != uniformIDs.end() )
1796 // found one matching uniform name, lets check the value...
1797 GLuint programId = program_it->first;
1798 GLint uniformId = uniform_it->second;
1800 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1801 return mProgramUniforms.GetUniformValue( programId, uniformId, value );
1808 template <typename T>
1809 inline bool CheckUniformValue( const char* name, const T& value ) const
1811 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1812 program_it != mUniforms.end();
1815 const UniformIDMap &uniformIDs = program_it->second;
1817 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1818 if( uniform_it != uniformIDs.end() )
1820 // found one matching uniform name, lets check the value...
1821 GLuint programId = program_it->first;
1822 GLint uniformId = uniform_it->second;
1824 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1825 if( mProgramUniforms.CheckUniformValue( programId, uniformId, value ) )
1827 // the value matches
1833 fprintf(stderr, "Not found, printing possible values:\n" );
1834 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1835 program_it != mUniforms.end();
1838 const UniformIDMap &uniformIDs = program_it->second;
1840 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1841 if( uniform_it != uniformIDs.end() )
1843 // found one matching uniform name, lets check the value...
1844 GLuint programId = program_it->first;
1845 GLint uniformId = uniform_it->second;
1847 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1849 if ( mProgramUniforms.GetUniformValue(programId, uniformId, origValue) )
1851 std::stringstream out;
1852 out << uniform_it->first << ": " << origValue;
1853 fprintf(stderr, "%s\n", out.str().c_str() );
1860 template <typename T>
1861 inline bool GetUniformValue( GLuint programId, GLuint uniformId, T& outValue) const
1863 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( outValue );
1864 return mProgramUniforms.GetUniformValue( programId, uniformId, outValue );
1867 inline bool GetUniformIds( const char* name, GLuint& programId, GLuint& uniformId ) const
1869 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1870 program_it != mUniforms.end();
1873 const UniformIDMap &uniformIDs = program_it->second;
1875 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1876 if( uniform_it != uniformIDs.end() )
1878 programId = program_it->first;
1879 uniformId = uniform_it->second;
1886 inline GLuint GetLastShaderCompiled() const
1888 return mLastShaderCompiled;
1891 inline GLuint GetLastProgramCreated() const
1893 return mLastProgramIdUsed;
1896 inline GLbitfield GetLastClearMask() const
1898 return mLastClearBitMask;
1903 ATTRIB_UNKNOWN = -1,
1908 ATTRIB_BONE_WEIGHTS,
1909 ATTRIB_BONE_INDICES,
1913 struct ScissorParams
1920 ScissorParams() : x( 0 ), y( 0 ), width( 0 ), height( 0 ) { }
1923 // Methods to check scissor tests
1924 inline const ScissorParams& GetScissorParams() const { return mScissorParams; }
1926 inline bool GetProgramBinaryCalled() const { return mGetProgramBinaryCalled; }
1928 inline unsigned int GetClearCountCalled() const { return mClearCount; }
1930 typedef std::vector<size_t> BufferDataCalls;
1931 inline const BufferDataCalls& GetBufferDataCalls() const { return mBufferDataCalls; }
1932 inline void ResetBufferDataCalls() { mBufferDataCalls.clear(); }
1934 typedef std::vector<size_t> BufferSubDataCalls;
1935 inline const BufferSubDataCalls& GetBufferSubDataCalls() const { return mBufferSubDataCalls; }
1936 inline void ResetBufferSubDataCalls() { mBufferSubDataCalls.clear(); }
1939 GLuint mCurrentProgram;
1940 GLuint mCompileStatus;
1941 BufferDataCalls mBufferDataCalls;
1942 BufferSubDataCalls mBufferSubDataCalls;
1944 GLint mNumberOfActiveUniforms;
1945 GLint mGetAttribLocationResult;
1946 GLenum mGetErrorResult;
1947 GLubyte* mGetStringResult;
1948 GLboolean mIsBufferResult;
1949 GLboolean mIsEnabledResult;
1950 GLboolean mIsFramebufferResult;
1951 GLboolean mIsProgramResult;
1952 GLboolean mIsRenderbufferResult;
1953 GLboolean mIsShaderResult;
1954 GLboolean mIsTextureResult;
1955 GLenum mActiveTextureUnit;
1956 GLenum mCheckFramebufferStatusResult;
1957 GLint mFramebufferStatus;
1958 GLenum mFramebufferColorAttached;
1959 GLenum mFramebufferDepthAttached;
1960 GLenum mFramebufferStencilAttached;
1961 GLint mNumBinaryFormats;
1962 GLint mBinaryFormats;
1963 GLint mProgramBinaryLength;
1964 bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE];
1965 bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed
1966 bool mGetProgramBinaryCalled;
1967 typedef std::map< GLuint, std::string> ShaderSourceMap;
1968 ShaderSourceMap mShaderSources;
1969 GLuint mLastShaderCompiled;
1970 GLbitfield mLastClearBitMask;
1971 unsigned int mClearCount;
1973 Vector4 mLastBlendColor;
1974 GLenum mLastBlendEquationRgb;
1975 GLenum mLastBlendEquationAlpha;
1976 GLenum mLastBlendFuncSrcRgb;
1977 GLenum mLastBlendFuncDstRgb;
1978 GLenum mLastBlendFuncSrcAlpha;
1979 GLenum mLastBlendFuncDstAlpha;
1981 // Data for manipulating the IDs returned by GenTextures
1982 GLuint mLastAutoTextureIdUsed;
1983 std::vector<GLuint> mNextTextureIds;
1984 std::vector<GLuint> mDeletedTextureIds;
1985 std::vector<GLuint> mBoundTextures;
1987 struct ActiveTextureType
1989 std::vector<GLuint> mBoundTextures;
1992 ActiveTextureType mActiveTextures[ MIN_TEXTURE_UNIT_LIMIT ];
1994 TraceCallStack mCullFaceTrace;
1995 TraceCallStack mEnableDisableTrace;
1996 TraceCallStack mShaderTrace;
1997 TraceCallStack mTextureTrace;
1998 TraceCallStack mTexParamaterTrace;
1999 TraceCallStack mDrawTrace;
2000 TraceCallStack mDepthFunctionTrace;
2002 // Shaders & Uniforms
2003 GLuint mLastShaderIdUsed;
2004 GLuint mLastProgramIdUsed;
2005 GLuint mLastUniformIdUsed;
2006 typedef std::map< std::string, GLint > UniformIDMap;
2007 typedef std::map< GLuint, UniformIDMap > ProgramUniformMap;
2008 ProgramUniformMap mUniforms;
2010 template <typename T>
2011 struct ProgramUniformValue : public std::map< GLuint, std::map< GLint, T > >
2014 typedef std::map< GLint, T > UniformValueMap;
2015 typedef std::map< GLuint, UniformValueMap > Map;
2017 bool SetUniformValue( GLuint program, GLuint uniform, const T& value )
2024 typename Map::iterator it = Map::find( program );
2025 if( it == Map::end() )
2027 // if its the first uniform for this program add it
2028 std::pair< typename Map::iterator, bool > result =
2029 Map::insert( typename Map::value_type( program, UniformValueMap() ) );
2033 UniformValueMap& uniforms = it->second;
2034 uniforms[uniform] = value;
2039 bool CheckUniformValue( GLuint program, GLuint uniform, const T& value ) const
2042 if ( GetUniformValue( program, uniform, uniformValue ) )
2044 return value == uniformValue;
2050 bool GetUniformValue( GLuint program, GLuint uniform, T& value ) const
2057 typename Map::const_iterator it = Map::find( program );
2058 if( it == Map::end() )
2060 // Uniform values always initialised as 0
2065 const UniformValueMap& uniforms = it->second;
2066 typename UniformValueMap::const_iterator it2 = uniforms.find( uniform );
2067 if( it2 == uniforms.end() )
2069 // Uniform values always initialised as 0
2073 value = it2->second;
2080 ProgramUniformValue<int> mProgramUniforms1i;
2081 ProgramUniformValue<float> mProgramUniforms1f;
2082 ProgramUniformValue<Vector2> mProgramUniforms2f;
2083 ProgramUniformValue<Vector3> mProgramUniforms3f;
2084 ProgramUniformValue<Vector4> mProgramUniforms4f;
2085 ProgramUniformValue<Matrix> mProgramUniformsMat4;
2086 ProgramUniformValue<Matrix3> mProgramUniformsMat3;
2088 inline const ProgramUniformValue<int>& GetProgramUniformsForType( const int ) const
2090 return mProgramUniforms1i;
2092 inline const ProgramUniformValue<float>& GetProgramUniformsForType( const float ) const
2094 return mProgramUniforms1f;
2096 inline const ProgramUniformValue<Vector2>& GetProgramUniformsForType( const Vector2& ) const
2098 return mProgramUniforms2f;
2100 inline const ProgramUniformValue<Vector3>& GetProgramUniformsForType( const Vector3& ) const
2102 return mProgramUniforms3f;
2104 inline const ProgramUniformValue<Vector4>& GetProgramUniformsForType( const Vector4& ) const
2106 return mProgramUniforms4f;
2108 inline const ProgramUniformValue<Matrix>& GetProgramUniformsForType( const Matrix& ) const
2110 return mProgramUniformsMat4;
2112 inline const ProgramUniformValue<Matrix3>& GetProgramUniformsForType( const Matrix3& ) const
2114 return mProgramUniformsMat3;
2116 inline void SetVertexAttribArray(GLuint index, bool state)
2118 if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
2123 mVertexAttribArrayState[ index ] = state;
2124 mVertexAttribArrayChanged = true;
2127 ScissorParams mScissorParams;
2131 inline int TestGlAbstraction::ProgramUniformValue<int>::GetZero() const
2137 inline float TestGlAbstraction::ProgramUniformValue<float>::GetZero() const
2143 inline Vector2 TestGlAbstraction::ProgramUniformValue<Vector2>::GetZero() const
2145 return Vector2::ZERO;
2149 inline Vector3 TestGlAbstraction::ProgramUniformValue<Vector3>::GetZero() const
2151 return Vector3::ZERO;
2155 inline Vector4 TestGlAbstraction::ProgramUniformValue<Vector4>::GetZero() const
2157 return Vector4::ZERO;
2161 inline Matrix TestGlAbstraction::ProgramUniformValue<Matrix>::GetZero() const
2167 inline Matrix3 TestGlAbstraction::ProgramUniformValue<Matrix3>::GetZero() const
2169 return Matrix3( Matrix() );
2174 bool BlendEnabled(const Dali::TraceCallStack& callStack);
2175 bool BlendDisabled(const Dali::TraceCallStack& callStack);
2180 #endif // __TEST_GL_ES_H__