1 #ifndef TEST_GL_ABSTRACTION_H
2 #define TEST_GL_ABSTRACTION_H
5 * Copyright (c) 2019 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
31 #include <dali/public-api/dali-core.h>
32 #include <dali/integration-api/core.h>
33 #include <dali/integration-api/gl-abstraction.h>
34 #include <dali/integration-api/gl-defines.h>
35 #include <test-trace-call-stack.h>
36 #include <test-compare-types.h>
41 static const unsigned int MAX_ATTRIBUTE_CACHE_SIZE = 64;
42 static const char *mStdAttribs[MAX_ATTRIBUTE_CACHE_SIZE] =
44 "aPosition", // ATTRIB_POSITION
45 "aNormal", // ATTRIB_NORMAL
46 "aTexCoord", // ATTRIB_TEXCOORD
47 "aColor", // ATTRIB_COLOR
48 "aBoneWeights", // ATTRIB_BONE_WEIGHTS
49 "aBoneIndices" // ATTRIB_BONE_INDICES
52 class DALI_CORE_API TestGlAbstraction: public Dali::Integration::GlAbstraction
62 void ConvertTexture( uint8_t* buffer, GLenum& imageGlFormat, const uint32_t dataSize, const GLenum textureGlFormat, const bool isSubImage );
66 inline void ActiveTexture( GLenum textureUnit )
68 mActiveTextureUnit = textureUnit - GL_TEXTURE0;
71 inline GLenum GetActiveTextureUnit() const
73 return mActiveTextureUnit + GL_TEXTURE0;
76 inline void AttachShader( GLuint program, GLuint shader )
78 std::stringstream out;
79 out << program << ", " << shader;
81 TraceCallStack::NamedParams namedParams;
82 namedParams["program"] = ToString(program);
83 namedParams["shader"] = ToString(shader);
84 mShaderTrace.PushCall("AttachShader", out.str(), namedParams);
87 inline void BindAttribLocation( GLuint program, GLuint index, const char* name )
91 inline void BindBuffer( GLenum target, GLuint buffer )
95 inline void BindFramebuffer( GLenum target, GLuint framebuffer )
98 mFramebufferStatus |= 2;
101 inline void BindRenderbuffer( GLenum target, GLuint renderbuffer )
106 * This method can be used by test cases, to query the texture IDs that have been bound by BindTexture.
107 * @return A vector containing the IDs that were bound.
109 inline const std::vector<GLuint>& GetBoundTextures() const
111 return mBoundTextures;
115 * Query the texture IDs that have been bound with BindTexture, with a specific active texture unit.
116 * @param[in] activeTextureUnit The specific active texture unit.
117 * @return A vector containing the IDs that were bound.
119 inline const std::vector<GLuint>& GetBoundTextures( GLuint activeTextureUnit ) const
121 return mActiveTextures[ activeTextureUnit - GL_TEXTURE0 ].mBoundTextures;
125 * This method can be used by test cases, to clear the record of texture IDs that have been bound by BindTexture.
127 inline void ClearBoundTextures()
129 mBoundTextures.clear();
131 for( unsigned int i=0; i<MIN_TEXTURE_UNIT_LIMIT; ++i )
133 mActiveTextures[ i ].mBoundTextures.clear();
137 inline void BindTexture( GLenum target, GLuint texture )
139 // Record the bound textures for future checks
142 mBoundTextures.push_back( texture );
144 if( mActiveTextureUnit < MIN_TEXTURE_UNIT_LIMIT )
146 mActiveTextures[ mActiveTextureUnit ].mBoundTextures.push_back( texture );
150 std::stringstream out;
151 out << target << ", " << texture;
153 TraceCallStack::NamedParams namedParams;
154 namedParams["target"] = ToString(target);
155 namedParams["texture"] = ToString(texture);
157 mTextureTrace.PushCall("BindTexture", out.str(), namedParams);
160 inline void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
162 mLastBlendColor.r = red;
163 mLastBlendColor.g = green;
164 mLastBlendColor.b = blue;
165 mLastBlendColor.a = alpha;
168 inline const Vector4& GetLastBlendColor() const
170 return mLastBlendColor;
173 inline void BlendEquation( GLenum mode )
175 mLastBlendEquationRgb = mode;
176 mLastBlendEquationAlpha = mode;
179 inline void BlendEquationSeparate( GLenum modeRgb, GLenum modeAlpha )
181 mLastBlendEquationRgb = modeRgb;
182 mLastBlendEquationAlpha = modeAlpha;
185 inline GLenum GetLastBlendEquationRgb() const
187 return mLastBlendEquationRgb;
190 inline GLenum GetLastBlendEquationAlpha() const
192 return mLastBlendEquationAlpha;
195 inline void BlendFunc(GLenum sfactor, GLenum dfactor)
197 mLastBlendFuncSrcRgb = sfactor;
198 mLastBlendFuncDstRgb = dfactor;
199 mLastBlendFuncSrcAlpha = sfactor;
200 mLastBlendFuncDstAlpha = dfactor;
203 inline void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
205 mLastBlendFuncSrcRgb = srcRGB;
206 mLastBlendFuncDstRgb = dstRGB;
207 mLastBlendFuncSrcAlpha = srcAlpha;
208 mLastBlendFuncDstAlpha = dstAlpha;
211 inline GLenum GetLastBlendFuncSrcRgb() const
213 return mLastBlendFuncSrcRgb;
216 inline GLenum GetLastBlendFuncDstRgb() const
218 return mLastBlendFuncDstRgb;
221 inline GLenum GetLastBlendFuncSrcAlpha() const
223 return mLastBlendFuncSrcAlpha;
226 inline GLenum GetLastBlendFuncDstAlpha() const
228 return mLastBlendFuncDstAlpha;
231 inline void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
233 mBufferDataCalls.push_back(size);
236 inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
238 mBufferSubDataCalls.push_back(size);
241 inline GLenum CheckFramebufferStatus(GLenum target)
243 //If it has the three last bits set to 1 - 111, then the three minimum functions to create a
244 //Framebuffer texture have been called
245 if( mFramebufferStatus == 7 )
247 return GL_FRAMEBUFFER_COMPLETE;
250 return mCheckFramebufferStatusResult;
253 inline GLenum CheckFramebufferColorAttachment()
255 return mFramebufferColorAttached;
258 inline GLenum CheckFramebufferDepthAttachment()
260 return mFramebufferDepthAttached;
263 inline GLenum CheckFramebufferStencilAttachment()
265 return mFramebufferStencilAttached;
268 inline void Clear(GLbitfield mask)
271 mLastClearBitMask = mask;
274 inline void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
278 inline void ClearDepthf(GLclampf depth)
282 inline void ClearStencil(GLint s)
284 std::stringstream out;
287 TraceCallStack::NamedParams namedParams;
288 namedParams["s"] = ToString( s );
290 mStencilFunctionTrace.PushCall( "ClearStencil", out.str(), namedParams );
293 inline void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
295 mColorMaskParams.red = red;
296 mColorMaskParams.green = green;
297 mColorMaskParams.blue = blue;
298 mColorMaskParams.alpha = alpha;
301 inline void CompileShader(GLuint shader)
303 std::stringstream out;
305 TraceCallStack::NamedParams namedParams;
306 namedParams["shader"] = ToString(shader);
308 mShaderTrace.PushCall("CompileShader", out.str(), namedParams);
311 inline void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
313 std::stringstream out;
314 out << target<<", "<<level<<", "<<width << ", " << height;
316 TraceCallStack::NamedParams namedParams;
317 namedParams["target"] = ToString(target);
318 namedParams["level"] = ToString(level);
319 namedParams["internalformat"] = ToString(internalformat);
320 namedParams["width"] = ToString(width);
321 namedParams["height"] = ToString(height);
322 namedParams["border"] = ToString(border);
323 namedParams["size"] = ToString(imageSize);
325 mTextureTrace.PushCall("CompressedTexImage2D", out.str(), namedParams);
328 inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
330 std::stringstream out;
331 out << target << ", "<<level <<", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
333 TraceCallStack::NamedParams namedParams;
334 namedParams["target"] = ToString(target);
335 namedParams["level"] = ToString(level);
336 namedParams["xoffset"] = ToString(xoffset);
337 namedParams["yoffset"] = ToString(yoffset);
338 namedParams["width"] = ToString(width);
339 namedParams["height"] = ToString(height);
340 mTextureTrace.PushCall("CompressedTexSubImage2D", out.str(), namedParams);
343 inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
347 inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
351 inline GLuint CreateProgram(void)
353 mShaderTrace.PushCall("CreateProgram", "");
355 ++mLastProgramIdUsed;
356 mUniforms[mLastProgramIdUsed] = UniformIDMap();
357 return mLastProgramIdUsed;
360 inline GLuint CreateShader(GLenum type)
362 std::stringstream out;
365 TraceCallStack::NamedParams namedParams;
366 namedParams["type"] = ToString(type);
367 mShaderTrace.PushCall("CreateShader", out.str(), namedParams);
369 return ++mLastShaderIdUsed;
372 inline void CullFace(GLenum mode)
374 std::stringstream out;
377 TraceCallStack::NamedParams namedParams;
378 namedParams["program"] = ToString(mode);
380 mCullFaceTrace.PushCall("CullFace", out.str(), namedParams);
383 inline void DeleteBuffers(GLsizei n, const GLuint* buffers)
387 inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
391 inline void DeleteProgram(GLuint program)
393 std::stringstream out;
396 TraceCallStack::NamedParams namedParams;
397 namedParams["program"] = ToString(program);
399 mShaderTrace.PushCall("DeleteProgram", out.str(), namedParams);
402 inline void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
406 inline void DeleteShader(GLuint shader)
408 std::stringstream out;
411 TraceCallStack::NamedParams namedParams;
412 namedParams["shader"] = ToString(shader);
414 mShaderTrace.PushCall("DeleteShader", out.str(), namedParams);
417 inline void DeleteTextures(GLsizei n, const GLuint* textures)
419 std::stringstream out;
420 out << n << ", " << textures << " = [";
422 TraceCallStack::NamedParams namedParams;
424 for(GLsizei i=0; i<n; i++)
426 out << textures[i] << ", ";
427 std::stringstream paramName;
428 paramName<<"texture["<<i<<"]";
429 namedParams[paramName.str()] = ToString(textures[i]);
430 mDeletedTextureIds.push_back(textures[i]);
431 mNumGeneratedTextures--;
435 mTextureTrace.PushCall("DeleteTextures", out.str(), namedParams);
438 inline bool CheckNoTexturesDeleted()
440 return mDeletedTextureIds.size() == 0;
443 inline bool CheckTextureDeleted( GLuint textureId )
447 for(std::vector<GLuint>::iterator iter=mDeletedTextureIds.begin(); iter != mDeletedTextureIds.end(); ++iter)
449 if(*iter == textureId)
458 inline void ClearDeletedTextures()
460 mDeletedTextureIds.clear();
463 inline void DepthFunc(GLenum func)
465 std::stringstream out;
468 TraceCallStack::NamedParams namedParams;
469 namedParams["func"] = ToString(func);
471 mDepthFunctionTrace.PushCall("DepthFunc", out.str(), namedParams);
474 inline void DepthMask(GLboolean flag)
476 mLastDepthMask = flag;
479 inline bool GetLastDepthMask() const
481 return mLastDepthMask;
484 inline void DepthRangef(GLclampf zNear, GLclampf zFar)
488 inline void DetachShader(GLuint program, GLuint shader)
490 std::stringstream out;
491 out << program << ", " << shader;
492 TraceCallStack::NamedParams namedParams;
493 namedParams["program"] = ToString(program);
494 namedParams["shader"] = ToString(shader);
495 mShaderTrace.PushCall("DetachShader", out.str(), namedParams);
498 inline void Disable(GLenum cap)
500 std::stringstream out;
502 TraceCallStack::NamedParams namedParams;
503 namedParams["cap"] = ToString(cap);
504 mEnableDisableTrace.PushCall("Disable", out.str(), namedParams);
507 inline void DisableVertexAttribArray(GLuint index)
509 SetVertexAttribArray( index, false );
512 inline void DrawArrays(GLenum mode, GLint first, GLsizei count)
514 std::stringstream out;
515 out << mode << ", " << first << ", " << count;
516 TraceCallStack::NamedParams namedParams;
517 namedParams["mode"] = ToString(mode);
518 namedParams["first"] = ToString(first);
519 namedParams["count"] = ToString(count);
520 mDrawTrace.PushCall("DrawArrays", out.str(), namedParams);
523 inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
525 std::stringstream out;
526 out << mode << ", " << count << ", " << type << ", indices";
528 TraceCallStack::NamedParams namedParams;
529 namedParams["mode"] = ToString(mode);
530 namedParams["count"] = ToString(count);
531 namedParams["type"] = ToString(type);
532 // Skip void pointers - are they of any use?
533 mDrawTrace.PushCall("DrawElements", out.str(), namedParams);
536 inline void Enable(GLenum cap)
538 std::stringstream out;
540 TraceCallStack::NamedParams namedParams;
541 namedParams["cap"] = ToString(cap);
542 mEnableDisableTrace.PushCall("Enable", out.str(), namedParams);
545 inline void EnableVertexAttribArray(GLuint index)
547 SetVertexAttribArray( index, true);
550 inline void Finish(void)
554 inline void Flush(void)
558 inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
560 if (attachment == GL_DEPTH_ATTACHMENT)
562 mFramebufferDepthAttached = true;
564 else if (attachment == GL_STENCIL_ATTACHMENT)
566 mFramebufferStencilAttached = true;
570 inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
573 mFramebufferStatus |= 4;
575 //We check 4 attachment colors
576 if ((attachment == GL_COLOR_ATTACHMENT0) || (attachment == GL_COLOR_ATTACHMENT1) || (attachment == GL_COLOR_ATTACHMENT2) || (attachment == GL_COLOR_ATTACHMENT4))
578 mFramebufferColorAttached = true;
582 inline void FrontFace(GLenum mode)
586 inline void GenBuffers(GLsizei n, GLuint* buffers)
588 // avoids an assert in GpuBuffers
592 inline void GenerateMipmap(GLenum target)
594 std::stringstream out;
596 TraceCallStack::NamedParams namedParams;
597 namedParams["target"] = ToString(target);
599 mTextureTrace.PushCall("GenerateMipmap", out.str(), namedParams);
602 inline void GenFramebuffers(GLsizei n, GLuint* framebuffers)
604 for( int i = 0; i < n; i++ )
606 framebuffers[i] = i + 1;
609 //Add 001 bit, this function needs to be called the first one in the chain
610 mFramebufferStatus = 1;
613 inline void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
615 for( int i = 0; i < n; i++ )
617 renderbuffers[i] = i + 1;
622 * This method can be used by test cases, to manipulate the texture IDs generated by GenTextures.
623 * @param[in] ids A vector containing the next IDs to be generated
625 inline void SetNextTextureIds( const std::vector<GLuint>& ids )
627 mNextTextureIds = ids;
630 inline const std::vector<GLuint>& GetNextTextureIds()
632 return mNextTextureIds;
635 inline void GenTextures(GLsizei count, GLuint* textures)
637 for( int i=0; i<count; ++i )
639 if( !mNextTextureIds.empty() )
641 *(textures+i) = mNextTextureIds[0];
642 mNextTextureIds.erase( mNextTextureIds.begin() );
646 *(textures+i) = ++mLastAutoTextureIdUsed;
648 mNumGeneratedTextures++;
651 TraceCallStack::NamedParams namedParams;
652 namedParams["count"] = ToString(count);
654 std::stringstream out;
655 for(int i=0; i<count; i++)
662 std::ostringstream oss;
663 oss<<"indices["<<i<<"]";
664 namedParams[oss.str()] = ToString(textures[i]);
667 mTextureTrace.PushCall("GenTextures", out.str(), namedParams);
670 inline GLuint GetLastGenTextureId()
672 return mLastAutoTextureIdUsed;
674 inline GLuint GetNumGeneratedTextures()
676 return mNumGeneratedTextures;
679 inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
683 inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
688 *length = snprintf(name, bufsize, "sTexture");
689 *type = GL_SAMPLER_2D;
693 *length = snprintf(name, bufsize, "sEffect");
694 *type = GL_SAMPLER_2D;
698 *length = snprintf(name, bufsize, "sGloss");
699 *type = GL_SAMPLER_2D;
707 inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
711 inline int GetAttribLocation(GLuint program, const char* name)
713 std::string attribName(name);
715 for( unsigned int i = 0; i < ATTRIB_TYPE_LAST; ++i )
717 if( mStdAttribs[i] == attribName )
723 // 0 is a valid location
727 inline void GetBooleanv(GLenum pname, GLboolean* params)
731 inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
735 inline GLenum GetError(void)
737 return mGetErrorResult;
740 inline void GetFloatv(GLenum pname, GLfloat* params)
744 inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
748 inline void GetIntegerv(GLenum pname, GLint* params)
752 case GL_MAX_TEXTURE_SIZE:
755 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
758 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
759 *params = mNumBinaryFormats;
761 case GL_PROGRAM_BINARY_FORMATS_OES:
762 *params = mBinaryFormats;
767 inline void GetProgramiv(GLuint program, GLenum pname, GLint* params)
772 *params = mLinkStatus;
774 case GL_PROGRAM_BINARY_LENGTH_OES:
775 *params = mProgramBinaryLength;
777 case GL_ACTIVE_UNIFORMS:
778 *params = mNumberOfActiveUniforms;
780 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
786 inline void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
790 inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
794 inline void GetShaderiv(GLuint shader, GLenum pname, GLint* params)
797 case GL_COMPILE_STATUS:
798 *params = mCompileStatus;
803 inline void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
807 inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
811 inline const GLubyte* GetString(GLenum name)
813 return mGetStringResult;
816 inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
820 inline void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
824 inline void GetUniformfv(GLuint program, GLint location, GLfloat* params)
828 inline void GetUniformiv(GLuint program, GLint location, GLint* params)
832 inline GLint GetUniformLocation(GLuint program, const char* name)
834 ProgramUniformMap::iterator it = mUniforms.find(program);
835 if( it == mUniforms.end() )
837 // Not a valid program ID
838 mGetErrorResult = GL_INVALID_OPERATION;
842 UniformIDMap& uniformIDs = it->second;
843 UniformIDMap::iterator it2 = uniformIDs.find( name );
844 if( it2 == uniformIDs.end() )
846 // Uniform not found, so add it...
847 uniformIDs[name] = ++mLastUniformIdUsed;
848 return mLastUniformIdUsed;
854 inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
858 inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
862 inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
866 inline void Hint(GLenum target, GLenum mode)
870 inline GLboolean IsBuffer(GLuint buffer)
872 return mIsBufferResult;
875 inline GLboolean IsEnabled(GLenum cap)
877 return mIsEnabledResult;
880 inline GLboolean IsFramebuffer(GLuint framebuffer)
882 return mIsFramebufferResult;
885 inline GLboolean IsProgram(GLuint program)
887 return mIsProgramResult;
890 inline GLboolean IsRenderbuffer(GLuint renderbuffer)
892 return mIsRenderbufferResult;
895 inline GLboolean IsShader(GLuint shader)
897 return mIsShaderResult;
900 inline GLboolean IsTexture(GLuint texture)
902 return mIsTextureResult;
905 inline void LineWidth(GLfloat width)
909 inline void LinkProgram(GLuint program)
911 std::stringstream out;
914 TraceCallStack::NamedParams namedParams;
915 namedParams["program"] = ToString(program);
916 mShaderTrace.PushCall("LinkProgram", out.str(), namedParams);
918 mNumberOfActiveUniforms=3;
919 GetUniformLocation(program, "sTexture");
920 GetUniformLocation(program, "sEffect");
921 GetUniformLocation(program, "sGloss");
924 inline void PixelStorei(GLenum pname, GLint param)
928 inline void PolygonOffset(GLfloat factor, GLfloat units)
932 inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
936 inline void ReleaseShaderCompiler(void)
940 inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
944 inline void SampleCoverage(GLclampf value, GLboolean invert)
948 inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
950 mScissorParams.x = x;
951 mScissorParams.y = y;
952 mScissorParams.width = width;
953 mScissorParams.height = height;
955 std::stringstream out;
956 out << x << ", " << y << ", " << width << ", " << height;
957 TraceCallStack::NamedParams namedParams;
958 namedParams["x"] = ToString( x );
959 namedParams["y"] = ToString( y );
960 namedParams["width"] = ToString( width );
961 namedParams["height"] = ToString( height );
962 mScissorTrace.PushCall( "Scissor", out.str(), namedParams );
965 inline void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
969 inline void ShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
971 std::string stringBuilder;
972 for(int i = 0; i < count; ++i)
974 stringBuilder += string[i];
976 mShaderSources[shader] = stringBuilder;
977 mLastShaderCompiled = shader;
980 inline void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
982 const std::string shaderSource = mShaderSources[shader];
983 const int shaderSourceLength = static_cast<int>(shaderSource.length());
984 if( shaderSourceLength < bufsize )
986 strncpy( source, shaderSource.c_str(), shaderSourceLength );
987 *length = shaderSourceLength;
991 *length = bufsize -1;
992 strncpy(source, shaderSource.c_str(), *length);
993 source[*length] = 0x0;
997 inline std::string GetShaderSource(GLuint shader)
999 return mShaderSources[shader];
1002 inline void StencilFunc(GLenum func, GLint ref, GLuint mask)
1004 std::stringstream out;
1005 out << func << ", " << ref << ", " << mask;
1007 TraceCallStack::NamedParams namedParams;
1008 namedParams["func"] = ToString( func );
1009 namedParams["ref"] = ToString( ref );
1010 namedParams["mask"] = ToString( mask );
1012 mStencilFunctionTrace.PushCall( "StencilFunc", out.str(), namedParams );
1015 inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
1017 std::stringstream out;
1018 out << face << ", " << func << ", " << ref << ", " << mask;
1020 TraceCallStack::NamedParams namedParams;
1021 namedParams["face"] = ToString( face );
1022 namedParams["func"] = ToString( func );
1023 namedParams["ref"] = ToString( ref );
1024 namedParams["mask"] = ToString( mask );
1026 mStencilFunctionTrace.PushCall( "StencilFuncSeparate", out.str(), namedParams );
1029 inline void StencilMask(GLuint mask)
1031 std::stringstream out;
1034 TraceCallStack::NamedParams namedParams;
1035 namedParams["mask"] = ToString( mask );
1037 mStencilFunctionTrace.PushCall( "StencilMask", out.str(), namedParams );
1040 inline void StencilMaskSeparate(GLenum face, GLuint mask)
1042 std::stringstream out;
1043 out << face << ", " << mask;
1045 TraceCallStack::NamedParams namedParams;
1046 namedParams["face"] = ToString( face );
1047 namedParams["mask"] = ToString( mask );
1049 mStencilFunctionTrace.PushCall( "StencilMaskSeparate", out.str(), namedParams );
1052 inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
1054 std::stringstream out;
1055 out << fail << ", " << zfail << ", " << zpass;
1057 TraceCallStack::NamedParams namedParams;
1058 namedParams["fail"] = ToString( fail );
1059 namedParams["zfail"] = ToString( zfail );
1060 namedParams["zpass"] = ToString( zpass );
1062 mStencilFunctionTrace.PushCall( "StencilOp", out.str(), namedParams );
1065 inline void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
1067 std::stringstream out;
1068 out << face << ", " << fail << ", " << zfail << "," << zpass;
1070 TraceCallStack::NamedParams namedParams;
1071 namedParams["face"] = ToString( face );
1072 namedParams["fail"] = ToString( fail );
1073 namedParams["zfail"] = ToString( zfail );
1074 namedParams["zpass"] = ToString( zpass );
1076 mStencilFunctionTrace.PushCall( "StencilOpSeparate", out.str(), namedParams );
1079 inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
1081 std::stringstream out;
1082 out << target<<", "<<level<<", "<<width << ", " << height;
1084 TraceCallStack::NamedParams namedParams;
1085 namedParams["target"] = ToString(target);
1086 namedParams["level"] = ToString(level);
1087 namedParams["internalformat"] = ToString(internalformat);
1088 namedParams["width"] = ToString(width);
1089 namedParams["height"] = ToString(height);
1090 namedParams["border"] = ToString(border);
1091 namedParams["format"] = ToString(format);
1092 namedParams["type"] = ToString(type);
1094 mTextureTrace.PushCall("TexImage2D", out.str(), namedParams);
1097 inline void TexParameterf(GLenum target, GLenum pname, GLfloat param)
1099 std::stringstream out;
1100 out << target << ", " << pname << ", " << param;
1102 TraceCallStack::NamedParams namedParams;
1103 namedParams["target"] = ToString(target);
1104 namedParams["pname"] = ToString(pname);
1105 namedParams["param"] = ToString(param);
1107 mTexParamaterTrace.PushCall("TexParameterf", out.str(), namedParams);
1110 inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
1112 std::stringstream out;
1113 out << target << ", " << pname << ", " << params[0];
1115 TraceCallStack::NamedParams namedParams;
1116 namedParams["target"] = ToString(target);
1117 namedParams["pname"] = ToString(pname);
1118 namedParams["params[0]"] = ToString(params[0]);
1120 mTexParamaterTrace.PushCall("TexParameterfv", out.str(), namedParams);
1123 inline void TexParameteri(GLenum target, GLenum pname, GLint param)
1125 std::stringstream out;
1126 out << target << ", " << pname << ", " << param;
1127 TraceCallStack::NamedParams namedParams;
1128 namedParams["target"] = ToString(target);
1129 namedParams["pname"] = ToString(pname);
1130 namedParams["param"] = ToString(param);
1131 mTexParamaterTrace.PushCall("TexParameteri", out.str(), namedParams);
1134 inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
1136 std::stringstream out;
1137 out << target << ", " << pname << ", " << params[0];
1138 TraceCallStack::NamedParams namedParams;
1139 namedParams["target"] = ToString(target);
1140 namedParams["pname"] = ToString(pname);
1141 namedParams["params[0]"] = ToString(params[0]);
1142 mTexParamaterTrace.PushCall("TexParameteriv", out.str(), namedParams);
1145 inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
1147 std::stringstream out;
1148 out << target << ", "<<level <<", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
1150 TraceCallStack::NamedParams namedParams;
1151 namedParams["target"] = ToString(target);
1152 namedParams["level"] = ToString(level);
1153 namedParams["xoffset"] = ToString(xoffset);
1154 namedParams["yoffset"] = ToString(yoffset);
1155 namedParams["width"] = ToString(width);
1156 namedParams["height"] = ToString(height);
1157 mTextureTrace.PushCall("TexSubImage2D", out.str(), namedParams);
1160 inline void Uniform1f(GLint location, GLfloat value )
1162 std::string params = ToString( value );
1163 AddUniformCallToTraceStack( location, params );
1165 if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, value ) )
1167 mGetErrorResult = GL_INVALID_OPERATION;
1171 inline void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
1174 for( int i = 0; i < count; ++i )
1176 params = params + ToString( v[i] ) + ",";
1179 AddUniformCallToTraceStack( location, params );
1181 for( int i = 0; i < count; ++i )
1183 if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, v[i] ) )
1185 mGetErrorResult = GL_INVALID_OPERATION;
1191 inline void Uniform1i(GLint location, GLint x)
1193 std::string params = ToString( x );
1195 AddUniformCallToTraceStack( location, params );
1197 if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram, location, x ) )
1199 mGetErrorResult = GL_INVALID_OPERATION;
1203 inline void Uniform1iv(GLint location, GLsizei count, const GLint* v)
1205 std::string params = ToString( v );
1206 AddUniformCallToTraceStack( location, params );
1208 for( int i = 0; i < count; ++i )
1210 if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram,
1214 mGetErrorResult = GL_INVALID_OPERATION;
1220 inline void Uniform2f(GLint location, GLfloat x, GLfloat y)
1222 std::string params = ToString( x ) + "," + ToString( y );
1223 AddUniformCallToTraceStack( location, params );
1225 if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
1229 mGetErrorResult = GL_INVALID_OPERATION;
1233 inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
1235 std::string params = ToString( v );
1236 AddUniformCallToTraceStack( location, params );
1238 for( int i = 0; i < count; ++i )
1240 if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
1242 Vector2( v[2*i], v[2*i+1] ) ) )
1244 mGetErrorResult = GL_INVALID_OPERATION;
1250 inline void Uniform2i(GLint location, GLint x, GLint y)
1252 std::string params = ToString( x ) + "," + ToString( y );
1253 AddUniformCallToTraceStack( location, params );
1256 inline void Uniform2iv(GLint location, GLsizei count, const GLint* v)
1258 std::string params = ToString( v );
1259 AddUniformCallToTraceStack( location, params );
1262 inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
1264 std::string params = ToString( x ) + "," + ToString( y ) + "," + ToString( z );
1265 AddUniformCallToTraceStack( location, params );
1267 if( ! mProgramUniforms3f.SetUniformValue( mCurrentProgram,
1269 Vector3( x, y, z ) ) )
1271 mGetErrorResult = GL_INVALID_OPERATION;
1275 inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
1277 std::string params = ToString( v );
1278 AddUniformCallToTraceStack( location, params );
1280 for( int i = 0; i < count; ++i )
1282 if( ! mProgramUniforms3f.SetUniformValue(
1285 Vector3( v[3*i], v[3*i+1], v[3*i+2] ) ) )
1287 mGetErrorResult = GL_INVALID_OPERATION;
1293 inline void Uniform3i(GLint location, GLint x, GLint y, GLint z)
1295 std::string params = ToString( x ) + "," + ToString( y ) + "," + ToString( z );
1296 AddUniformCallToTraceStack( location, params );
1299 inline void Uniform3iv(GLint location, GLsizei count, const GLint* v)
1301 std::string params = ToString( v );
1302 AddUniformCallToTraceStack( location, params );
1305 inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1307 std::string params = ToString( x ) + "," + ToString( y ) + "," + ToString( z ) + "," + ToString( w );
1308 AddUniformCallToTraceStack( location, params );
1310 if( ! mProgramUniforms4f.SetUniformValue( mCurrentProgram,
1312 Vector4( x, y, z, w ) ) )
1314 mGetErrorResult = GL_INVALID_OPERATION;
1318 inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
1320 std::string params = ToString( v );
1321 AddUniformCallToTraceStack( location, params );
1323 for( int i = 0; i < count; ++i )
1325 if( ! mProgramUniforms4f.SetUniformValue(
1328 Vector4( v[4*i], v[4*i+1], v[4*i+2], v[4*i+3] ) ) )
1330 mGetErrorResult = GL_INVALID_OPERATION;
1336 inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
1338 std::string params = ToString( x ) + "," + ToString( y ) + "," + ToString( z ) + "," + ToString( w );
1339 AddUniformCallToTraceStack( location, params );
1342 inline void Uniform4iv(GLint location, GLsizei count, const GLint* v)
1344 std::string params = ToString( v );
1345 AddUniformCallToTraceStack( location, params );
1348 inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1350 std::string params = ToString( value );
1351 AddUniformCallToTraceStack( location, params );
1354 inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1356 std::string params = ToString( value );
1357 AddUniformCallToTraceStack( location, params );
1359 for( int i = 0; i < count; ++i )
1361 if( ! mProgramUniformsMat3.SetUniformValue(
1364 Matrix3( value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8] ) ) )
1366 mGetErrorResult = GL_INVALID_OPERATION;
1372 inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1374 std::string params = ToString( value );
1375 AddUniformCallToTraceStack( location, params );
1377 for( int i = 0; i < count; ++i )
1379 if( ! mProgramUniformsMat4.SetUniformValue(
1384 mGetErrorResult = GL_INVALID_OPERATION;
1390 inline void UseProgram(GLuint program)
1392 mCurrentProgram = program;
1395 inline void ValidateProgram(GLuint program)
1399 inline void VertexAttrib1f(GLuint indx, GLfloat x)
1403 inline void VertexAttrib1fv(GLuint indx, const GLfloat* values)
1407 inline void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
1411 inline void VertexAttrib2fv(GLuint indx, const GLfloat* values)
1415 inline void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
1419 inline void VertexAttrib3fv(GLuint indx, const GLfloat* values)
1423 inline void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1427 inline void VertexAttrib4fv(GLuint indx, const GLfloat* values)
1431 inline void VertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
1435 inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
1441 inline void ReadBuffer(GLenum mode)
1445 inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
1449 inline void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
1453 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)
1457 inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1461 inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
1465 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)
1469 inline void GenQueries(GLsizei n, GLuint* ids)
1473 inline void DeleteQueries(GLsizei n, const GLuint* ids)
1477 inline GLboolean IsQuery(GLuint id)
1482 inline void BeginQuery(GLenum target, GLuint id)
1486 inline void EndQuery(GLenum target)
1490 inline void GetQueryiv(GLenum target, GLenum pname, GLint* params)
1494 inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
1498 inline GLboolean UnmapBuffer(GLenum target)
1503 inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
1507 inline void DrawBuffers(GLsizei n, const GLenum* bufs)
1511 inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1515 inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1519 inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1523 inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1527 inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1531 inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1535 inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
1539 inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
1543 inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
1547 inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
1552 inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
1556 inline void BindVertexArray(GLuint array)
1560 inline void DeleteVertexArrays(GLsizei n, const GLuint* arrays)
1564 inline void GenVertexArrays(GLsizei n, GLuint* arrays)
1568 inline GLboolean IsVertexArray(GLuint array)
1573 inline void GetIntegeri_v(GLenum target, GLuint index, GLint* data)
1577 inline void BeginTransformFeedback(GLenum primitiveMode)
1581 inline void EndTransformFeedback(void)
1585 inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
1589 inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer)
1593 inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
1597 inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
1601 inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
1605 inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
1609 inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
1613 inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
1617 inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
1621 inline void VertexAttribI4iv(GLuint index, const GLint* v)
1625 inline void VertexAttribI4uiv(GLuint index, const GLuint* v)
1629 inline void GetUniformuiv(GLuint program, GLint location, GLuint* params)
1633 inline GLint GetFragDataLocation(GLuint program, const GLchar *name)
1638 inline void Uniform1ui(GLint location, GLuint v0)
1642 inline void Uniform2ui(GLint location, GLuint v0, GLuint v1)
1646 inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
1650 inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
1654 inline void Uniform1uiv(GLint location, GLsizei count, const GLuint* value)
1658 inline void Uniform2uiv(GLint location, GLsizei count, const GLuint* value)
1662 inline void Uniform3uiv(GLint location, GLsizei count, const GLuint* value)
1666 inline void Uniform4uiv(GLint location, GLsizei count, const GLuint* value)
1670 inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
1674 inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
1678 inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
1682 inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
1686 inline const GLubyte* GetStringi(GLenum name, GLuint index)
1691 inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
1695 inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
1699 inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
1703 inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
1705 return GL_INVALID_INDEX;
1708 inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
1712 inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
1716 inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
1720 inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1724 inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
1728 inline GLsync FenceSync(GLenum condition, GLbitfield flags)
1733 inline GLboolean IsSync(GLsync sync)
1738 inline void DeleteSync(GLsync sync)
1742 inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
1747 inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
1751 inline void GetInteger64v(GLenum pname, GLint64* params)
1755 inline void GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
1759 inline void GetInteger64i_v(GLenum target, GLuint index, GLint64* data)
1763 inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
1767 inline void GenSamplers(GLsizei count, GLuint* samplers)
1771 inline void DeleteSamplers(GLsizei count, const GLuint* samplers)
1775 inline GLboolean IsSampler(GLuint sampler)
1780 inline void BindSampler(GLuint unit, GLuint sampler)
1784 inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
1788 inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
1792 inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
1796 inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
1800 inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
1804 inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
1808 inline void VertexAttribDivisor(GLuint index, GLuint divisor)
1812 inline void BindTransformFeedback(GLenum target, GLuint id)
1816 inline void DeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
1820 inline void GenTransformFeedbacks(GLsizei n, GLuint* ids)
1824 inline GLboolean IsTransformFeedback(GLuint id)
1829 inline void PauseTransformFeedback(void)
1833 inline void ResumeTransformFeedback(void)
1837 inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
1839 mGetProgramBinaryCalled = true;
1842 inline void ProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
1846 inline void ProgramParameteri(GLuint program, GLenum pname, GLint value)
1850 inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
1854 inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
1858 inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
1862 inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
1866 inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
1872 inline void AddUniformCallToTraceStack( GLint location, std::string& value )
1874 std::string name = "<not found>";
1875 bool matched = false;
1877 UniformIDMap& map = mUniforms[mCurrentProgram];
1878 for (UniformIDMap::iterator it=map.begin(); it!=map.end(); ++it)
1880 if( it->second == location )
1890 mSetUniformTrace.PushCall( name, value );
1895 public: // TEST FUNCTIONS
1896 inline void SetCompileStatus( GLuint value ) { mCompileStatus = value; }
1897 inline void SetLinkStatus( GLuint value ) { mLinkStatus = value; }
1898 inline void SetGetAttribLocationResult( int result) { mGetAttribLocationResult = result; }
1899 inline void SetGetErrorResult( GLenum result) { mGetErrorResult = result; }
1900 inline void SetGetStringResult( GLubyte* result) { mGetStringResult = result; }
1901 inline void SetIsBufferResult( GLboolean result) { mIsBufferResult = result; }
1902 inline void SetIsEnabledResult( GLboolean result) { mIsEnabledResult = result; }
1903 inline void SetIsFramebufferResult( GLboolean result) { mIsFramebufferResult = result; }
1904 inline void SetIsProgramResult( GLboolean result) { mIsProgramResult = result; }
1905 inline void SetIsRenderbufferResult( GLboolean result) { mIsRenderbufferResult = result; }
1906 inline void SetIsShaderResult( GLboolean result) { mIsShaderResult = result; }
1907 inline void SetIsTextureResult( GLboolean result) { mIsTextureResult = result; }
1908 inline void SetCheckFramebufferStatusResult( GLenum result) { mCheckFramebufferStatusResult = result; }
1909 inline void SetNumBinaryFormats( GLint numFormats ) { mNumBinaryFormats = numFormats; }
1910 inline void SetBinaryFormats( GLint binaryFormats ) { mBinaryFormats = binaryFormats; }
1911 inline void SetProgramBinaryLength( GLint length ) { mProgramBinaryLength = length; }
1913 inline bool GetVertexAttribArrayState(GLuint index)
1915 if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
1920 return mVertexAttribArrayState[ index ];
1922 inline void ClearVertexAttribArrayChanged() { mVertexAttribArrayChanged = false; }
1923 inline bool GetVertexAttribArrayChanged() { return mVertexAttribArrayChanged; }
1925 //Methods for CullFace verification
1926 inline void EnableCullFaceCallTrace(bool enable) { mCullFaceTrace.Enable(enable); }
1927 inline void ResetCullFaceCallStack() { mCullFaceTrace.Reset(); }
1928 inline TraceCallStack& GetCullFaceTrace() { return mCullFaceTrace; }
1930 //Methods for Enable/Disable call verification
1931 inline void EnableEnableDisableCallTrace(bool enable) { mEnableDisableTrace.Enable(enable); }
1932 inline void ResetEnableDisableCallStack() { mEnableDisableTrace.Reset(); }
1933 inline TraceCallStack& GetEnableDisableTrace() { return mEnableDisableTrace; }
1935 //Methods for Shader verification
1936 inline void EnableShaderCallTrace(bool enable) { mShaderTrace.Enable(enable); }
1937 inline void ResetShaderCallStack() { mShaderTrace.Reset(); }
1938 inline TraceCallStack& GetShaderTrace() { return mShaderTrace; }
1940 //Methods for Texture verification
1941 inline void EnableTextureCallTrace(bool enable) { mTextureTrace.Enable(enable); }
1942 inline void ResetTextureCallStack() { mTextureTrace.Reset(); }
1943 inline TraceCallStack& GetTextureTrace() { return mTextureTrace; }
1945 //Methods for Texture verification
1946 inline void EnableTexParameterCallTrace(bool enable) { mTexParamaterTrace.Enable(enable); }
1947 inline void ResetTexParameterCallStack() { mTexParamaterTrace.Reset(); }
1948 inline TraceCallStack& GetTexParameterTrace() { return mTexParamaterTrace; }
1950 //Methods for Draw verification
1951 inline void EnableDrawCallTrace(bool enable) { mDrawTrace.Enable(enable); }
1952 inline void ResetDrawCallStack() { mDrawTrace.Reset(); }
1953 inline TraceCallStack& GetDrawTrace() { return mDrawTrace; }
1955 //Methods for Depth function verification
1956 inline void EnableDepthFunctionCallTrace(bool enable) { mDepthFunctionTrace.Enable(enable); }
1957 inline void ResetDepthFunctionCallStack() { mDepthFunctionTrace.Reset(); }
1958 inline TraceCallStack& GetDepthFunctionTrace() { return mDepthFunctionTrace; }
1960 //Methods for Stencil function verification
1961 inline void EnableStencilFunctionCallTrace(bool enable) { mStencilFunctionTrace.Enable(enable); }
1962 inline void ResetStencilFunctionCallStack() { mStencilFunctionTrace.Reset(); }
1963 inline TraceCallStack& GetStencilFunctionTrace() { return mStencilFunctionTrace; }
1965 //Methods for Scissor verification
1966 inline void EnableScissorCallTrace(bool enable) { mScissorTrace.Enable(enable); }
1967 inline void ResetScissorCallStack() { mScissorTrace.Reset(); }
1968 inline TraceCallStack& GetScissorTrace() { return mScissorTrace; }
1970 //Methods for Uniform function verification
1971 inline void EnableSetUniformCallTrace(bool enable) { mSetUniformTrace.Enable(enable); }
1972 inline void ResetSetUniformCallStack() { mSetUniformTrace.Reset(); }
1973 inline TraceCallStack& GetSetUniformTrace() { return mSetUniformTrace; }
1975 template <typename T>
1976 inline bool GetUniformValue( const char* name, T& value ) const
1978 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
1979 program_it != mUniforms.end();
1982 const UniformIDMap &uniformIDs = program_it->second;
1984 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
1985 if( uniform_it != uniformIDs.end() )
1987 // found one matching uniform name, lets check the value...
1988 GLuint programId = program_it->first;
1989 GLint uniformId = uniform_it->second;
1991 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
1992 return mProgramUniforms.GetUniformValue( programId, uniformId, value );
1999 template <typename T>
2000 inline bool CheckUniformValue( const char* name, const T& value ) const
2002 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2003 program_it != mUniforms.end();
2006 const UniformIDMap &uniformIDs = program_it->second;
2008 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
2009 if( uniform_it != uniformIDs.end() )
2011 // found one matching uniform name, lets check the value...
2012 GLuint programId = program_it->first;
2013 GLint uniformId = uniform_it->second;
2015 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
2016 if( mProgramUniforms.CheckUniformValue( programId, uniformId, value ) )
2018 // the value matches
2024 fprintf(stderr, "Not found, printing possible values:\n" );
2025 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2026 program_it != mUniforms.end();
2029 const UniformIDMap &uniformIDs = program_it->second;
2031 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
2032 if( uniform_it != uniformIDs.end() )
2034 // found one matching uniform name, lets check the value...
2035 GLuint programId = program_it->first;
2036 GLint uniformId = uniform_it->second;
2038 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
2040 if ( mProgramUniforms.GetUniformValue(programId, uniformId, origValue) )
2042 std::stringstream out;
2043 out << uniform_it->first << ": " << origValue;
2044 fprintf(stderr, "%s\n", out.str().c_str() );
2051 template <typename T>
2052 inline bool GetUniformValue( GLuint programId, GLuint uniformId, T& outValue) const
2054 const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( outValue );
2055 return mProgramUniforms.GetUniformValue( programId, uniformId, outValue );
2058 inline bool GetUniformIds( const char* name, GLuint& programId, GLuint& uniformId ) const
2060 for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2061 program_it != mUniforms.end();
2064 const UniformIDMap &uniformIDs = program_it->second;
2066 UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
2067 if( uniform_it != uniformIDs.end() )
2069 programId = program_it->first;
2070 uniformId = uniform_it->second;
2077 inline GLuint GetLastShaderCompiled() const
2079 return mLastShaderCompiled;
2082 inline GLuint GetLastProgramCreated() const
2084 return mLastProgramIdUsed;
2087 inline GLbitfield GetLastClearMask() const
2089 return mLastClearBitMask;
2094 ATTRIB_UNKNOWN = -1,
2099 ATTRIB_BONE_WEIGHTS,
2100 ATTRIB_BONE_INDICES,
2104 struct ScissorParams
2111 ScissorParams() : x( 0 ), y( 0 ), width( 0 ), height( 0 ) { }
2114 // Methods to check scissor tests
2115 inline const ScissorParams& GetScissorParams() const { return mScissorParams; }
2117 struct ColorMaskParams
2124 ColorMaskParams() : red( true ), green( true ), blue( true ), alpha( true ) { }
2127 inline bool GetProgramBinaryCalled() const { return mGetProgramBinaryCalled; }
2129 inline unsigned int GetClearCountCalled() const { return mClearCount; }
2131 inline const ColorMaskParams& GetColorMaskParams() const { return mColorMaskParams; }
2133 typedef std::vector<size_t> BufferDataCalls;
2134 inline const BufferDataCalls& GetBufferDataCalls() const { return mBufferDataCalls; }
2135 inline void ResetBufferDataCalls() { mBufferDataCalls.clear(); }
2137 typedef std::vector<size_t> BufferSubDataCalls;
2138 inline const BufferSubDataCalls& GetBufferSubDataCalls() const { return mBufferSubDataCalls; }
2139 inline void ResetBufferSubDataCalls() { mBufferSubDataCalls.clear(); }
2142 GLuint mCurrentProgram;
2143 GLuint mCompileStatus;
2144 BufferDataCalls mBufferDataCalls;
2145 BufferSubDataCalls mBufferSubDataCalls;
2147 GLint mNumberOfActiveUniforms;
2148 GLint mGetAttribLocationResult;
2149 GLenum mGetErrorResult;
2150 GLubyte* mGetStringResult;
2151 GLboolean mIsBufferResult;
2152 GLboolean mIsEnabledResult;
2153 GLboolean mIsFramebufferResult;
2154 GLboolean mIsProgramResult;
2155 GLboolean mIsRenderbufferResult;
2156 GLboolean mIsShaderResult;
2157 GLboolean mIsTextureResult;
2158 GLenum mActiveTextureUnit;
2159 GLenum mCheckFramebufferStatusResult;
2160 GLint mFramebufferStatus;
2161 GLenum mFramebufferColorAttached;
2162 GLenum mFramebufferDepthAttached;
2163 GLenum mFramebufferStencilAttached;
2164 GLint mNumBinaryFormats;
2165 GLint mBinaryFormats;
2166 GLint mProgramBinaryLength;
2167 bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE];
2168 bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed
2169 bool mGetProgramBinaryCalled;
2170 typedef std::map< GLuint, std::string> ShaderSourceMap;
2171 ShaderSourceMap mShaderSources;
2172 GLuint mLastShaderCompiled;
2173 GLbitfield mLastClearBitMask;
2174 unsigned int mClearCount;
2176 Vector4 mLastBlendColor;
2177 GLenum mLastBlendEquationRgb;
2178 GLenum mLastBlendEquationAlpha;
2179 GLenum mLastBlendFuncSrcRgb;
2180 GLenum mLastBlendFuncDstRgb;
2181 GLenum mLastBlendFuncSrcAlpha;
2182 GLenum mLastBlendFuncDstAlpha;
2184 GLboolean mLastDepthMask;
2186 // Data for manipulating the IDs returned by GenTextures
2187 GLuint mLastAutoTextureIdUsed;
2188 GLuint mNumGeneratedTextures;
2189 std::vector<GLuint> mNextTextureIds;
2190 std::vector<GLuint> mDeletedTextureIds;
2191 std::vector<GLuint> mBoundTextures;
2193 struct ActiveTextureType
2195 std::vector<GLuint> mBoundTextures;
2198 ActiveTextureType mActiveTextures[ MIN_TEXTURE_UNIT_LIMIT ];
2200 TraceCallStack mCullFaceTrace;
2201 TraceCallStack mEnableDisableTrace;
2202 TraceCallStack mShaderTrace;
2203 TraceCallStack mTextureTrace;
2204 TraceCallStack mTexParamaterTrace;
2205 TraceCallStack mDrawTrace;
2206 TraceCallStack mDepthFunctionTrace;
2207 TraceCallStack mStencilFunctionTrace;
2208 TraceCallStack mScissorTrace;
2209 TraceCallStack mSetUniformTrace;
2211 // Shaders & Uniforms
2212 GLuint mLastShaderIdUsed;
2213 GLuint mLastProgramIdUsed;
2214 GLuint mLastUniformIdUsed;
2215 typedef std::map< std::string, GLint > UniformIDMap;
2216 typedef std::map< GLuint, UniformIDMap > ProgramUniformMap;
2217 ProgramUniformMap mUniforms;
2219 template <typename T>
2220 struct ProgramUniformValue : public std::map< GLuint, std::map< GLint, T > >
2223 typedef std::map< GLint, T > UniformValueMap;
2224 typedef std::map< GLuint, UniformValueMap > Map;
2226 bool SetUniformValue( GLuint program, GLuint uniform, const T& value )
2233 typename Map::iterator it = Map::find( program );
2234 if( it == Map::end() )
2236 // if its the first uniform for this program add it
2237 std::pair< typename Map::iterator, bool > result =
2238 Map::insert( typename Map::value_type( program, UniformValueMap() ) );
2242 UniformValueMap& uniforms = it->second;
2243 uniforms[uniform] = value;
2248 bool CheckUniformValue( GLuint program, GLuint uniform, const T& value ) const
2251 if ( GetUniformValue( program, uniform, uniformValue ) )
2253 return CompareType<T>(value, uniformValue, Math::MACHINE_EPSILON_10);
2259 bool GetUniformValue( GLuint program, GLuint uniform, T& value ) const
2266 typename Map::const_iterator it = Map::find( program );
2267 if( it == Map::end() )
2269 // Uniform values always initialised as 0
2274 const UniformValueMap& uniforms = it->second;
2275 typename UniformValueMap::const_iterator it2 = uniforms.find( uniform );
2276 if( it2 == uniforms.end() )
2278 // Uniform values always initialised as 0
2282 value = it2->second;
2289 ProgramUniformValue<int> mProgramUniforms1i;
2290 ProgramUniformValue<float> mProgramUniforms1f;
2291 ProgramUniformValue<Vector2> mProgramUniforms2f;
2292 ProgramUniformValue<Vector3> mProgramUniforms3f;
2293 ProgramUniformValue<Vector4> mProgramUniforms4f;
2294 ProgramUniformValue<Matrix> mProgramUniformsMat4;
2295 ProgramUniformValue<Matrix3> mProgramUniformsMat3;
2297 inline const ProgramUniformValue<int>& GetProgramUniformsForType( const int ) const
2299 return mProgramUniforms1i;
2301 inline const ProgramUniformValue<float>& GetProgramUniformsForType( const float ) const
2303 return mProgramUniforms1f;
2305 inline const ProgramUniformValue<Vector2>& GetProgramUniformsForType( const Vector2& ) const
2307 return mProgramUniforms2f;
2309 inline const ProgramUniformValue<Vector3>& GetProgramUniformsForType( const Vector3& ) const
2311 return mProgramUniforms3f;
2313 inline const ProgramUniformValue<Vector4>& GetProgramUniformsForType( const Vector4& ) const
2315 return mProgramUniforms4f;
2317 inline const ProgramUniformValue<Matrix>& GetProgramUniformsForType( const Matrix& ) const
2319 return mProgramUniformsMat4;
2321 inline const ProgramUniformValue<Matrix3>& GetProgramUniformsForType( const Matrix3& ) const
2323 return mProgramUniformsMat3;
2325 inline void SetVertexAttribArray(GLuint index, bool state)
2327 if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
2332 mVertexAttribArrayState[ index ] = state;
2333 mVertexAttribArrayChanged = true;
2336 ScissorParams mScissorParams;
2337 ColorMaskParams mColorMaskParams;
2341 inline int TestGlAbstraction::ProgramUniformValue<int>::GetZero() const
2347 inline float TestGlAbstraction::ProgramUniformValue<float>::GetZero() const
2353 inline Vector2 TestGlAbstraction::ProgramUniformValue<Vector2>::GetZero() const
2355 return Vector2::ZERO;
2359 inline Vector3 TestGlAbstraction::ProgramUniformValue<Vector3>::GetZero() const
2361 return Vector3::ZERO;
2365 inline Vector4 TestGlAbstraction::ProgramUniformValue<Vector4>::GetZero() const
2367 return Vector4::ZERO;
2371 inline Matrix TestGlAbstraction::ProgramUniformValue<Matrix>::GetZero() const
2377 inline Matrix3 TestGlAbstraction::ProgramUniformValue<Matrix3>::GetZero() const
2379 return Matrix3( Matrix() );
2384 bool BlendEnabled(const Dali::TraceCallStack& callStack);
2385 bool BlendDisabled(const Dali::TraceCallStack& callStack);
2388 #endif // TEST_GL_ABSTRACTION_H