1 #ifndef TEST_GL_ABSTRACTION_H
2 #define TEST_GL_ABSTRACTION_H
5 * Copyright (c) 2024 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.
24 #include <cstring> // for strcmp
31 #include <dali/devel-api/rendering/frame-buffer-devel.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 <dali/public-api/dali-core.h>
36 #include <test-compare-types.h>
37 #include <test-trace-call-stack.h>
45 UniformData(const std::string& name, Property::Type type = Property::Type::NONE)
55 GLenum type{GL_FLOAT};
60 class DALI_CORE_API TestGlAbstraction : public Dali::Integration::GlAbstraction
63 static const int MAX_ATTRIBUTE_CACHE_SIZE{64};
66 ~TestGlAbstraction() override;
69 void PreRender() override;
70 void PostRender() override;
72 bool IsSurfacelessContextSupported() const override;
74 bool IsAdvancedBlendEquationSupported() override;
76 bool IsMultisampledRenderToTextureSupported() override;
78 bool IsBlendEquationSupported(DevelBlendEquation::Type blendEquation) override;
80 uint32_t GetShaderLanguageVersion();
82 std::string GetShaderVersionPrefix();
84 std::string GetVertexShaderPrefix();
86 std::string GetFragmentShaderPrefix();
88 bool TextureRequiresConverting(const GLenum imageGlFormat, const GLenum textureGlFormat, const bool isSubImage) const override;
92 inline void ActiveTexture(GLenum textureUnit) override
94 mActiveTextureUnit = textureUnit - GL_TEXTURE0;
97 inline GLenum GetActiveTextureUnit() const
99 return mActiveTextureUnit + GL_TEXTURE0;
102 inline void AttachShader(GLuint program, GLuint shader) override
104 std::stringstream out;
105 out << program << ", " << shader;
107 TraceCallStack::NamedParams namedParams;
108 namedParams["program"] << program;
109 namedParams["shader"] << shader;
110 mShaderTrace.PushCall("AttachShader", out.str(), namedParams);
113 inline void BindAttribLocation(GLuint program, GLuint index, const char* name) override
117 inline void BindBuffer(GLenum target, GLuint buffer) override
119 std::ostringstream o;
120 o << std::hex << target << ", " << buffer;
121 TraceCallStack::NamedParams namedParams;
122 namedParams["target"] << target;
123 namedParams["buffer"] << buffer;
124 mBufferTrace.PushCall("BindBuffer", o.str(), namedParams);
127 inline void BindFramebuffer(GLenum target, GLuint framebuffer) override
130 mFramebufferStatus |= 2;
133 inline void BindRenderbuffer(GLenum target, GLuint renderbuffer) override
138 * This method can be used by test cases, to query the texture IDs that have been bound by BindTexture.
139 * @return A vector containing the IDs that were bound.
141 inline const std::vector<GLuint>& GetBoundTextures() const
143 return mBoundTextures;
147 * Query the texture IDs that have been bound with BindTexture, with a specific active texture unit.
148 * @param[in] activeTextureUnit The specific active texture unit.
149 * @return A vector containing the IDs that were bound.
151 inline const std::vector<GLuint>& GetBoundTextures(GLuint activeTextureUnit) const
153 return mActiveTextures[activeTextureUnit - GL_TEXTURE0].mBoundTextures;
157 * This method can be used by test cases, to clear the record of texture IDs that have been bound by BindTexture.
159 inline void ClearBoundTextures()
161 mBoundTextures.clear();
163 for(unsigned int i = 0; i < MIN_TEXTURE_UNIT_LIMIT; ++i)
165 mActiveTextures[i].mBoundTextures.clear();
169 inline void BindTexture(GLenum target, GLuint texture) override
171 // Record the bound textures for future checks
174 mBoundTextures.push_back(texture);
176 if(mActiveTextureUnit < MIN_TEXTURE_UNIT_LIMIT)
178 mActiveTextures[mActiveTextureUnit].mBoundTextures.push_back(texture);
182 std::stringstream out;
183 out << std::hex << target << ", " << std::dec << texture;
185 TraceCallStack::NamedParams namedParams;
186 namedParams["target"] << std::hex << target;
187 namedParams["texture"] << texture;
189 mTextureTrace.PushCall("BindTexture", out.str(), namedParams);
192 inline void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) override
194 mLastBlendColor.r = red;
195 mLastBlendColor.g = green;
196 mLastBlendColor.b = blue;
197 mLastBlendColor.a = alpha;
200 inline const Vector4& GetLastBlendColor() const
202 return mLastBlendColor;
205 inline void BlendEquation(GLenum mode) override
207 mLastBlendEquationRgb = mode;
208 mLastBlendEquationAlpha = mode;
211 inline void BlendEquationSeparate(GLenum modeRgb, GLenum modeAlpha) override
213 mLastBlendEquationRgb = modeRgb;
214 mLastBlendEquationAlpha = modeAlpha;
217 inline GLenum GetLastBlendEquationRgb() const
219 return mLastBlendEquationRgb;
222 inline GLenum GetLastBlendEquationAlpha() const
224 return mLastBlendEquationAlpha;
227 inline void BlendFunc(GLenum sfactor, GLenum dfactor) override
229 mLastBlendFuncSrcRgb = sfactor;
230 mLastBlendFuncDstRgb = dfactor;
231 mLastBlendFuncSrcAlpha = sfactor;
232 mLastBlendFuncDstAlpha = dfactor;
235 inline void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) override
237 mLastBlendFuncSrcRgb = srcRGB;
238 mLastBlendFuncDstRgb = dstRGB;
239 mLastBlendFuncSrcAlpha = srcAlpha;
240 mLastBlendFuncDstAlpha = dstAlpha;
243 inline GLenum GetLastBlendFuncSrcRgb() const
245 return mLastBlendFuncSrcRgb;
248 inline GLenum GetLastBlendFuncDstRgb() const
250 return mLastBlendFuncDstRgb;
253 inline GLenum GetLastBlendFuncSrcAlpha() const
255 return mLastBlendFuncSrcAlpha;
258 inline GLenum GetLastBlendFuncDstAlpha() const
260 return mLastBlendFuncDstAlpha;
263 inline void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) override
265 std::ostringstream o;
266 o << std::hex << target << ", " << size << ", " << data << ", " << usage;
267 TraceCallStack::NamedParams namedParams;
268 namedParams["target"] << std::hex << target;
269 namedParams["size"] << size;
270 namedParams["usage"] << usage;
272 mBufferTrace.PushCall("BufferData", o.str(), namedParams);
274 mBufferDataCalls.push_back(size);
277 inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) override
279 std::ostringstream o;
280 o << std::hex << target << ", " << offset << ", " << size << ", " << data;
281 TraceCallStack::NamedParams namedParams;
282 namedParams["target"] << std::hex << target;
283 namedParams["offset"] << offset;
284 namedParams["size"] << size;
285 mBufferTrace.PushCall("BufferSubData", o.str());
287 mBufferSubDataCalls.push_back(size);
290 inline GLenum CheckFramebufferStatus(GLenum target) override
292 //If it has the three last bits set to 1 - 111, then the three minimum functions to create a
293 //Framebuffer texture have been called
294 if(mFramebufferStatus == 7)
296 return GL_FRAMEBUFFER_COMPLETE;
299 return mCheckFramebufferStatusResult;
302 inline GLuint CheckFramebufferColorAttachmentCount()
304 return mFramebufferColorAttachmentCount;
307 inline GLuint CheckFramebufferDepthAttachmentCount()
309 return mFramebufferDepthAttachmentCount;
312 inline GLuint CheckFramebufferStencilAttachmentCount()
314 return mFramebufferStencilAttachmentCount;
317 inline GLuint CheckFramebufferDepthStencilAttachmentCount()
319 return mFramebufferDepthStencilAttachmentCount;
322 inline GLenum CheckFramebufferDepthAttachment()
324 return mFramebufferDepthAttached;
327 inline GLenum CheckFramebufferStencilAttachment()
329 return mFramebufferStencilAttached;
332 inline GLenum CheckFramebufferDepthStencilAttachment()
334 return mFramebufferDepthStencilAttached;
337 inline void Clear(GLbitfield mask) override
340 mLastClearBitMask = mask;
343 inline void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) override
345 mLastClearColor.r = red;
346 mLastClearColor.g = green;
347 mLastClearColor.b = blue;
348 mLastClearColor.a = alpha;
351 inline const Vector4& GetLastClearColor() const
353 return mLastClearColor;
356 inline void ClearDepthf(GLclampf depth) override
360 inline void ClearStencil(GLint s) override
362 std::stringstream out;
365 TraceCallStack::NamedParams namedParams;
366 namedParams["s"] << s;
368 mStencilFunctionTrace.PushCall("ClearStencil", out.str(), namedParams);
371 inline void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) override
373 mColorMaskParams.red = red;
374 mColorMaskParams.green = green;
375 mColorMaskParams.blue = blue;
376 mColorMaskParams.alpha = alpha;
379 inline void CompileShader(GLuint shader) override
381 std::stringstream out;
383 TraceCallStack::NamedParams namedParams;
384 namedParams["shader"] << shader;
386 mShaderTrace.PushCall("CompileShader", out.str(), namedParams);
389 inline void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) override
391 std::stringstream out;
392 out << target << ", " << level << ", " << width << ", " << height;
394 TraceCallStack::NamedParams namedParams;
395 namedParams["target"] << std::hex << target;
396 namedParams["level"] << level;
397 namedParams["internalformat"] << internalformat;
398 namedParams["width"] << width;
399 namedParams["height"] << height;
400 namedParams["border"] << border;
401 namedParams["size"] << imageSize;
403 mTextureTrace.PushCall("CompressedTexImage2D", out.str(), namedParams);
406 inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) override
408 std::stringstream out;
409 out << target << ", " << level << ", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
411 TraceCallStack::NamedParams namedParams;
412 namedParams["target"] << std::hex << target;
413 namedParams["level"] << level;
414 namedParams["xoffset"] << xoffset;
415 namedParams["yoffset"] << yoffset;
416 namedParams["width"] << width;
417 namedParams["height"] << height;
418 mTextureTrace.PushCall("CompressedTexSubImage2D", out.str(), namedParams);
421 inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) override
425 inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) override
429 inline GLuint CreateProgram(void) override
431 mShaderTrace.PushCall("CreateProgram", "");
433 ++mLastProgramIdUsed;
434 mUniforms[mLastProgramIdUsed] = UniformIDMap();
435 return mLastProgramIdUsed;
438 inline GLuint CreateShader(GLenum type) override
440 std::stringstream out;
443 TraceCallStack::NamedParams namedParams;
444 namedParams["type"] << std::hex << type;
445 mShaderTrace.PushCall("CreateShader", out.str(), namedParams);
447 return ++mLastShaderIdUsed;
450 inline void CullFace(GLenum mode) override
452 std::stringstream out;
453 out << std::hex << mode;
455 TraceCallStack::NamedParams namedParams;
456 namedParams["mode"] << std::hex << mode;
458 mCullFaceTrace.PushCall("CullFace", out.str(), namedParams);
461 inline void DeleteBuffers(GLsizei n, const GLuint* buffers) override
463 TraceCallStack::NamedParams namedParams;
464 namedParams["n"] << n;
465 namedParams["id"] << buffers[0];
466 mBufferTrace.PushCall("DeleteBuffers", namedParams.str(), namedParams);
469 inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) override
473 inline void DeleteProgram(GLuint program) override
475 std::stringstream out;
478 TraceCallStack::NamedParams namedParams;
479 namedParams["program"] << program;
481 mShaderTrace.PushCall("DeleteProgram", out.str(), namedParams);
484 inline void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) override
488 inline void DeleteShader(GLuint shader) override
490 std::stringstream out;
493 TraceCallStack::NamedParams namedParams;
494 namedParams["shader"] << shader;
496 mShaderTrace.PushCall("DeleteShader", out.str(), namedParams);
499 inline void DeleteTextures(GLsizei n, const GLuint* textures) override
501 std::stringstream out;
502 out << "n:" << n << " textures[";
504 TraceCallStack::NamedParams namedParams;
506 for(GLsizei i = 0; i < n; i++)
508 out << (i > 0 ? ", " : "") << textures[i];
509 std::stringstream paramName;
510 paramName << "texture[" << i << "]";
511 namedParams[paramName.str()] << textures[i];
512 mDeletedTextureIds.push_back(textures[i]);
513 mNumGeneratedTextures--;
517 mTextureTrace.PushCall("DeleteTextures", out.str(), namedParams);
520 inline bool CheckNoTexturesDeleted()
522 return mDeletedTextureIds.size() == 0;
525 inline bool CheckTextureDeleted(GLuint textureId)
529 for(std::vector<GLuint>::iterator iter = mDeletedTextureIds.begin(); iter != mDeletedTextureIds.end(); ++iter)
531 if(*iter == textureId)
540 inline void ClearDeletedTextures()
542 mDeletedTextureIds.clear();
545 inline void DepthFunc(GLenum func) override
547 std::stringstream out;
548 out << std::hex << func;
550 TraceCallStack::NamedParams namedParams;
551 namedParams["func"] << std::hex << func;
553 mDepthFunctionTrace.PushCall("DepthFunc", out.str(), namedParams);
556 inline void DepthMask(GLboolean flag) override
558 mLastDepthMask = flag;
561 inline bool GetLastDepthMask() const
563 return mLastDepthMask;
566 inline void DepthRangef(GLclampf zNear, GLclampf zFar) override
570 inline void DetachShader(GLuint program, GLuint shader) override
572 std::stringstream out;
573 out << program << ", " << shader;
574 TraceCallStack::NamedParams namedParams;
575 namedParams["program"] << program;
576 namedParams["shader"] << shader;
577 mShaderTrace.PushCall("DetachShader", out.str(), namedParams);
580 inline void Disable(GLenum cap) override
582 std::stringstream out;
583 out << std::hex << cap;
584 TraceCallStack::NamedParams namedParams;
585 namedParams["cap"] << std::hex << cap;
586 mEnableDisableTrace.PushCall("Disable", out.str(), namedParams);
589 inline void DisableVertexAttribArray(GLuint index) override
591 std::stringstream out;
593 TraceCallStack::NamedParams namedParams;
594 namedParams["index"] << index;
595 mBufferTrace.PushCall("DisableVertexAttribArray", out.str(), namedParams);
596 SetVertexAttribArray(index, false);
599 inline void DrawArrays(GLenum mode, GLint first, GLsizei count) override
601 std::stringstream out;
602 out << mode << ", " << first << ", " << count;
603 TraceCallStack::NamedParams namedParams;
604 namedParams["mode"] << std::hex << mode;
605 namedParams["first"] << first;
606 namedParams["count"] << count;
607 mDrawTrace.PushCall("DrawArrays", out.str(), namedParams);
610 inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices) override
612 std::stringstream out;
613 out << mode << ", " << count << ", " << type << ", indices";
615 TraceCallStack::NamedParams namedParams;
616 namedParams["mode"] << std::hex << mode;
617 namedParams["count"] << count;
618 namedParams["type"] << type;
619 // Skip void pointers - are they of any use?
620 mDrawTrace.PushCall("DrawElements", out.str(), namedParams);
623 inline void Enable(GLenum cap) override
625 std::stringstream out;
626 out << std::hex << cap;
627 TraceCallStack::NamedParams namedParams;
628 namedParams["cap"] << std::hex << cap;
629 mEnableDisableTrace.PushCall("Enable", out.str(), namedParams);
632 inline void EnableVertexAttribArray(GLuint index) override
634 std::stringstream out;
636 TraceCallStack::NamedParams namedParams;
637 namedParams["index"] << index;
638 mBufferTrace.PushCall("EnableVertexAttribArray", out.str(), namedParams);
639 SetVertexAttribArray(index, true);
642 inline void Finish(void) override
646 inline void Flush(void) override
650 inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) override
652 if(attachment == GL_DEPTH_ATTACHMENT)
654 mFramebufferDepthAttached = true;
656 else if(attachment == GL_STENCIL_ATTACHMENT)
658 mFramebufferStencilAttached = true;
660 else if(attachment == GL_DEPTH_STENCIL_ATTACHMENT)
662 mFramebufferStencilAttached = true;
663 mFramebufferDepthAttached = true;
664 mFramebufferDepthStencilAttached = true;
668 inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) override
671 mFramebufferStatus |= 4;
673 //We check 4 attachment colors
674 if((attachment >= GL_COLOR_ATTACHMENT0) && (attachment < GL_COLOR_ATTACHMENT0 + Dali::DevelFrameBuffer::MAX_COLOR_ATTACHMENTS))
676 uint8_t mask = 1 << (attachment - GL_COLOR_ATTACHMENT0);
677 if((mFrameBufferColorStatus & mask) == 0)
679 mFrameBufferColorStatus |= mask;
680 ++mFramebufferColorAttachmentCount;
683 else if(attachment == GL_DEPTH_ATTACHMENT)
685 ++mFramebufferDepthAttachmentCount;
687 else if(attachment == GL_STENCIL_ATTACHMENT)
689 ++mFramebufferStencilAttachmentCount;
691 else if(attachment == GL_DEPTH_STENCIL_ATTACHMENT)
693 ++mFramebufferDepthAttachmentCount;
694 ++mFramebufferStencilAttachmentCount;
695 ++mFramebufferDepthStencilAttachmentCount;
699 inline void FrontFace(GLenum mode) override
704 inline void GenBuffers(GLsizei n, GLuint* buffers) override
706 // avoids an assert in GpuBuffers
707 static GLuint id = 1;
709 TraceCallStack::NamedParams namedParams;
710 namedParams["n"] << n;
712 // Allocate some buffer names
716 namedParams["buffers"] << (first ? "" : ", ") << id;
721 mBufferTrace.PushCall("GenBuffers", namedParams.str(), namedParams);
724 inline void GenerateMipmap(GLenum target) override
726 std::stringstream out;
728 TraceCallStack::NamedParams namedParams;
729 namedParams["target"] << std::hex << target;
731 mTextureTrace.PushCall("GenerateMipmap", out.str(), namedParams);
734 inline void GenFramebuffers(GLsizei n, GLuint* framebuffers) override
736 for(int i = 0; i < n; i++)
738 framebuffers[i] = i + 1;
741 //Add 001 bit, this function needs to be called the first one in the chain
742 mFramebufferStatus = 1;
745 inline void GenRenderbuffers(GLsizei n, GLuint* renderbuffers) override
747 for(int i = 0; i < n; i++)
749 renderbuffers[i] = i + 1;
754 * This method can be used by test cases, to manipulate the texture IDs generated by GenTextures.
755 * @param[in] ids A vector containing the next IDs to be generated
757 inline void SetNextTextureIds(const std::vector<GLuint>& ids)
759 mNextTextureIds = ids;
762 inline const std::vector<GLuint>& GetNextTextureIds()
764 return mNextTextureIds;
767 inline void GenTextures(GLsizei count, GLuint* textures) override
769 for(int i = 0; i < count; ++i)
771 if(!mNextTextureIds.empty())
773 *(textures + i) = mNextTextureIds[0];
774 mNextTextureIds.erase(mNextTextureIds.begin());
778 *(textures + i) = ++mLastAutoTextureIdUsed;
780 mNumGeneratedTextures++;
783 TraceCallStack::NamedParams namedParams;
784 namedParams["count"] << count;
786 std::stringstream out;
787 for(int i = 0; i < count; i++)
794 std::ostringstream oss;
795 oss << "indices[" << i << "]";
796 namedParams[oss.str()] << textures[i];
799 mTextureTrace.PushCall("GenTextures", out.str(), namedParams);
802 inline GLuint GetLastGenTextureId()
804 return mLastAutoTextureIdUsed;
807 inline GLuint GetNumGeneratedTextures()
809 return mNumGeneratedTextures;
812 inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) override
814 strncpy(name, mAttribLocs[index].c_str(), 99);
815 *type = mAttribTypes[index];
818 void SetActiveUniforms(const std::vector<ActiveUniform>& uniforms);
820 inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) override
822 if(index < mActiveUniforms.size())
824 *length = snprintf(name, bufsize, "%s", mActiveUniforms[index].name.c_str());
825 *type = mActiveUniforms[index].type;
826 *size = mActiveUniforms[index].size;
830 inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) override
834 inline int GetAttribLocation(GLuint program, const char* name) override
836 std::string check(name);
837 auto iter = std::find(mAttribLocs.begin(), mAttribLocs.end(), check);
838 if(iter == mAttribLocs.end())
840 return iter - mAttribLocs.begin();
843 inline void GetBooleanv(GLenum pname, GLboolean* params) override
847 inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params) override
851 inline GLenum GetError(void) override
853 return mGetErrorResult;
856 inline void GetFloatv(GLenum pname, GLfloat* params) override
860 inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) override
864 inline void GetIntegerv(GLenum pname, GLint* params) override
868 case GL_MAX_TEXTURE_SIZE:
871 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
874 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
875 *params = mNumBinaryFormats;
877 case GL_PROGRAM_BINARY_FORMATS_OES:
878 *params = mBinaryFormats;
880 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
881 *params = mUniformBufferOffsetAlignment;
886 inline void GetProgramiv(GLuint program, GLenum pname, GLint* params) override
891 *params = mLinkStatus;
893 case GL_PROGRAM_BINARY_LENGTH_OES:
894 *params = mProgramBinaryLength;
896 case GL_ACTIVE_UNIFORMS:
897 *params = mActiveUniforms.size();
899 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
902 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
905 case GL_ACTIVE_ATTRIBUTES:
906 *params = static_cast<GLint>(mAttribLocs.size());
911 inline void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) override
915 inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) override
919 inline void GetShaderiv(GLuint shader, GLenum pname, GLint* params) override
923 case GL_COMPILE_STATUS:
924 *params = mCompileStatus;
929 inline void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) override
933 inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) override
937 inline const GLubyte* GetString(GLenum name) override
939 return mGetStringResult;
942 inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) override
946 inline void GetTexParameteriv(GLenum target, GLenum pname, GLint* params) override
950 inline void GetUniformfv(GLuint program, GLint location, GLfloat* params) override
954 inline void GetUniformiv(GLuint program, GLint location, GLint* params) override
958 inline GLint GetUniformLocation(GLuint program, const char* name) override
960 ProgramUniformMap::iterator it = mUniforms.find(program);
961 if(it == mUniforms.end())
963 // Not a valid program ID
964 mGetErrorResult = GL_INVALID_OPERATION;
968 UniformIDMap& uniformIDs = it->second;
969 UniformIDMap::iterator it2 = uniformIDs.find(name);
970 if(it2 == uniformIDs.end())
972 // Uniform not found, so add it...
973 uniformIDs[name] = ++mLastUniformIdUsed;
974 return uniformIDs[name];
980 inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) override
984 inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params) override
988 inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) override
992 inline void Hint(GLenum target, GLenum mode) override
996 inline GLboolean IsBuffer(GLuint buffer) override
998 return mIsBufferResult;
1001 inline GLboolean IsEnabled(GLenum cap) override
1003 return mIsEnabledResult;
1006 inline GLboolean IsFramebuffer(GLuint framebuffer) override
1008 return mIsFramebufferResult;
1011 inline GLboolean IsProgram(GLuint program) override
1013 return mIsProgramResult;
1016 inline GLboolean IsRenderbuffer(GLuint renderbuffer) override
1018 return mIsRenderbufferResult;
1021 inline GLboolean IsShader(GLuint shader) override
1023 return mIsShaderResult;
1026 inline GLboolean IsTexture(GLuint texture) override
1028 return mIsTextureResult;
1031 inline void LineWidth(GLfloat width) override
1035 inline void LinkProgram(GLuint program) override
1037 std::stringstream out;
1040 TraceCallStack::NamedParams namedParams;
1041 namedParams["program"] << program;
1042 mShaderTrace.PushCall("LinkProgram", out.str(), namedParams);
1044 for(const auto& uniform : mActiveUniforms)
1046 std::string name = uniform.name;
1047 if(uniform.size <= 1)
1049 GetUniformLocation(program, name.c_str());
1053 // Convert single active uniform from "uBlah[0]" or "uStruct[0].element" to N versions of the same
1055 auto iter = name.find("["); // Search for index operator
1056 if(iter != std::string::npos)
1058 name = uniform.name.substr(0, iter); // Strip off index operator
1059 iter = uniform.name.find("]");
1060 if(iter != std::string::npos && iter + 1 != uniform.name.length())
1062 suffix = uniform.name.substr(iter + 1);
1065 for(int i = 0; i < uniform.size; ++i)
1067 std::stringstream nss;
1068 nss << name << "[" << i << "]" << suffix;
1069 GetUniformLocation(program, nss.str().c_str()); // Generate N uniforms in the uniform map
1074 for(const auto& uniform : mCustomUniformData)
1076 auto iter = uniform.name.find("[");
1077 auto name = uniform.name;
1078 if(iter != std::string::npos)
1080 name = uniform.name.substr(0, iter);
1081 auto arrayCount = std::stoi(uniform.name.substr(iter + 1));
1082 iter = uniform.name.find("]");
1084 if(iter != std::string::npos && iter + 1 != uniform.name.length())
1086 suffix = uniform.name.substr(iter + 1); // If there is a suffix, it means its an element of an array of struct
1089 for(int i = 0; i < arrayCount; ++i)
1091 std::stringstream nss;
1092 nss << name << "[" << i << "]" << suffix;
1093 GetUniformLocation(program, nss.str().c_str()); // Generate a GL loc per element
1098 GetUniformLocation(program, name.c_str());
1103 inline void PixelStorei(GLenum pname, GLint param) override
1107 inline void PolygonOffset(GLfloat factor, GLfloat units) override
1111 inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) override
1115 inline void ReleaseShaderCompiler(void) override
1119 inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) override
1123 inline void SampleCoverage(GLclampf value, GLboolean invert) override
1127 inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) override
1129 mScissorParams.x = x;
1130 mScissorParams.y = y;
1131 mScissorParams.width = width;
1132 mScissorParams.height = height;
1134 std::stringstream out;
1135 out << x << ", " << y << ", " << width << ", " << height;
1136 TraceCallStack::NamedParams namedParams;
1137 namedParams["x"] << x;
1138 namedParams["y"] << y;
1139 namedParams["width"] << width;
1140 namedParams["height"] << height;
1141 mScissorTrace.PushCall("Scissor", out.str(), namedParams);
1144 inline void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) override
1148 inline void ShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length) override
1150 std::string stringBuilder;
1151 for(int i = 0; i < count; ++i)
1153 stringBuilder += string[i];
1155 mShaderSources[shader] = stringBuilder;
1156 mLastShaderCompiled = shader;
1159 inline void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source) override
1161 const std::string shaderSource = mShaderSources[shader];
1162 const int shaderSourceLength = static_cast<int>(shaderSource.length());
1163 if(shaderSourceLength < bufsize)
1165 strncpy(source, shaderSource.c_str(), shaderSourceLength);
1166 *length = shaderSourceLength;
1170 *length = bufsize - 1;
1171 strncpy(source, shaderSource.c_str(), *length);
1172 source[*length] = 0x0;
1176 inline std::string GetShaderSource(GLuint shader)
1178 return mShaderSources[shader];
1181 inline void StencilFunc(GLenum func, GLint ref, GLuint mask) override
1183 std::stringstream out;
1184 out << func << ", " << ref << ", " << mask;
1186 TraceCallStack::NamedParams namedParams;
1187 namedParams["func"] << std::hex << func;
1188 namedParams["ref"] << ref;
1189 namedParams["mask"] << mask;
1191 mStencilFunctionTrace.PushCall("StencilFunc", out.str(), namedParams);
1194 inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) override
1196 std::stringstream out;
1197 out << face << ", " << func << ", " << ref << ", " << mask;
1199 TraceCallStack::NamedParams namedParams;
1200 namedParams["face"] << std::hex << face;
1201 namedParams["func"] << std::hex << func;
1202 namedParams["ref"] << ref;
1203 namedParams["mask"] << mask;
1205 mStencilFunctionTrace.PushCall("StencilFuncSeparate", out.str(), namedParams);
1208 inline void StencilMask(GLuint mask) override
1210 std::stringstream out;
1213 TraceCallStack::NamedParams namedParams;
1214 namedParams["mask"] << mask;
1216 mStencilFunctionTrace.PushCall("StencilMask", out.str(), namedParams);
1219 inline void StencilMaskSeparate(GLenum face, GLuint mask) override
1221 std::stringstream out;
1222 out << face << ", " << mask;
1224 TraceCallStack::NamedParams namedParams;
1225 namedParams["face"] << std::hex << face;
1226 namedParams["mask"] << mask;
1228 mStencilFunctionTrace.PushCall("StencilMaskSeparate", out.str(), namedParams);
1231 inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) override
1233 std::stringstream out;
1234 out << fail << ", " << zfail << ", " << zpass;
1236 TraceCallStack::NamedParams namedParams;
1237 namedParams["fail"] << std::hex << fail;
1238 namedParams["zfail"] << std::hex << zfail;
1239 namedParams["zpass"] << std::hex << zpass;
1241 mStencilFunctionTrace.PushCall("StencilOp", out.str(), namedParams);
1244 inline void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) override
1246 std::stringstream out;
1247 out << face << ", " << fail << ", " << zfail << "," << zpass;
1249 TraceCallStack::NamedParams namedParams;
1250 namedParams["face"] << std::hex << face;
1251 namedParams["fail"] << std::hex << fail;
1252 namedParams["zfail"] << std::hex << zfail;
1253 namedParams["zpass"] << std::hex << zpass;
1255 mStencilFunctionTrace.PushCall("StencilOpSeparate", out.str(), namedParams);
1258 inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) override
1260 std::stringstream out;
1261 out << target << ", " << level << ", " << width << ", " << height;
1263 TraceCallStack::NamedParams namedParams;
1264 namedParams["target"] << std::hex << target;
1265 namedParams["level"] << level;
1266 namedParams["internalformat"] << internalformat;
1267 namedParams["width"] << width;
1268 namedParams["height"] << height;
1269 namedParams["border"] << border;
1270 namedParams["format"] << std::hex << format;
1271 namedParams["type"] << std::hex << type;
1273 mTextureTrace.PushCall("TexImage2D", out.str(), namedParams);
1276 inline void TexParameterf(GLenum target, GLenum pname, GLfloat param) override
1278 std::stringstream out;
1279 out << target << ", " << pname << ", " << param;
1281 TraceCallStack::NamedParams namedParams;
1282 namedParams["target"] << std::hex << target;
1283 namedParams["pname"] << std::hex << pname;
1284 namedParams["param"] << param;
1286 mTexParameterTrace.PushCall("TexParameterf", out.str(), namedParams);
1289 inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params) override
1291 std::stringstream out;
1292 out << target << ", " << pname << ", " << params[0];
1294 TraceCallStack::NamedParams namedParams;
1295 namedParams["target"] << std::hex << target;
1296 namedParams["pname"] << std::hex << pname;
1297 namedParams["params[0]"] << params[0];
1299 mTexParameterTrace.PushCall("TexParameterfv", out.str(), namedParams);
1302 inline void TexParameteri(GLenum target, GLenum pname, GLint param) override
1304 std::stringstream out;
1305 out << std::hex << target << ", " << pname << ", " << param;
1306 std::string params = out.str();
1308 TraceCallStack::NamedParams namedParams;
1309 namedParams["target"] << std::hex << target;
1310 namedParams["pname"] << std::hex << pname;
1311 namedParams["param"] << param;
1312 mTexParameterTrace.PushCall("TexParameteri", params, namedParams);
1315 inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params) override
1317 std::stringstream out;
1318 out << target << ", " << pname << ", " << params[0];
1319 TraceCallStack::NamedParams namedParams;
1320 namedParams["target"] << std::hex << target;
1321 namedParams["pname"] << std::hex << pname;
1322 namedParams["params[0]"] << params[0];
1323 mTexParameterTrace.PushCall("TexParameteriv", out.str(), namedParams);
1326 inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) override
1328 std::stringstream out;
1329 out << target << ", " << level << ", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
1331 TraceCallStack::NamedParams namedParams;
1332 namedParams["target"] << std::hex << target;
1333 namedParams["level"] << level;
1334 namedParams["xoffset"] << xoffset;
1335 namedParams["yoffset"] << yoffset;
1336 namedParams["width"] << width;
1337 namedParams["height"] << height;
1338 mTextureTrace.PushCall("TexSubImage2D", out.str(), namedParams);
1341 inline void Uniform1f(GLint location, GLfloat value) override
1343 std::string params = std::to_string(value);
1344 AddUniformCallToTraceStack(location, params);
1346 if(!mProgramUniforms1f.SetUniformValue(mCurrentProgram, location, value))
1348 mGetErrorResult = GL_INVALID_OPERATION;
1352 inline void Uniform1fv(GLint location, GLsizei count, const GLfloat* v) override
1355 for(int i = 0; i < count; ++i)
1357 params = params + std::to_string(v[i]) + ",";
1360 AddUniformCallToTraceStack(location, params);
1362 for(int i = 0; i < count; ++i)
1364 if(!mProgramUniforms1f.SetUniformValue(mCurrentProgram, location, v[i]))
1366 mGetErrorResult = GL_INVALID_OPERATION;
1372 inline void Uniform1i(GLint location, GLint x) override
1374 std::string params = std::to_string(x);
1376 AddUniformCallToTraceStack(location, params);
1378 if(!mProgramUniforms1i.SetUniformValue(mCurrentProgram, location, x))
1380 mGetErrorResult = GL_INVALID_OPERATION;
1384 inline void Uniform1iv(GLint location, GLsizei count, const GLint* v) override
1386 std::ostringstream out;
1387 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1388 AddUniformCallToTraceStack(location, out.str());
1390 for(int i = 0; i < count; ++i)
1392 if(!mProgramUniforms1i.SetUniformValue(mCurrentProgram,
1396 mGetErrorResult = GL_INVALID_OPERATION;
1402 inline void Uniform2f(GLint location, GLfloat x, GLfloat y) override
1404 std::string params = std::to_string(x) + "," + std::to_string(y);
1405 AddUniformCallToTraceStack(location, params);
1407 if(!mProgramUniforms2f.SetUniformValue(mCurrentProgram,
1411 mGetErrorResult = GL_INVALID_OPERATION;
1415 inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) override
1417 std::ostringstream out;
1418 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1419 AddUniformCallToTraceStack(location, out.str());
1421 for(int i = 0; i < count; ++i)
1423 if(!mProgramUniforms2f.SetUniformValue(mCurrentProgram,
1425 Vector2(v[2 * i], v[2 * i + 1])))
1427 mGetErrorResult = GL_INVALID_OPERATION;
1433 inline void Uniform2i(GLint location, GLint x, GLint y) override
1435 std::string params = std::to_string(x) + "," + std::to_string(y);
1436 AddUniformCallToTraceStack(location, params);
1439 inline void Uniform2iv(GLint location, GLsizei count, const GLint* v) override
1441 std::ostringstream out;
1442 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1443 AddUniformCallToTraceStack(location, out.str());
1446 inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) override
1448 std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z);
1449 AddUniformCallToTraceStack(location, params);
1451 if(!mProgramUniforms3f.SetUniformValue(mCurrentProgram,
1455 mGetErrorResult = GL_INVALID_OPERATION;
1459 inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) override
1461 std::ostringstream out;
1462 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1463 AddUniformCallToTraceStack(location, out.str());
1465 for(int i = 0; i < count; ++i)
1467 if(!mProgramUniforms3f.SetUniformValue(
1470 Vector3(v[3 * i], v[3 * i + 1], v[3 * i + 2])))
1472 mGetErrorResult = GL_INVALID_OPERATION;
1478 inline void Uniform3i(GLint location, GLint x, GLint y, GLint z) override
1480 std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z);
1481 AddUniformCallToTraceStack(location, params);
1484 inline void Uniform3iv(GLint location, GLsizei count, const GLint* v) override
1486 std::ostringstream out;
1487 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1488 AddUniformCallToTraceStack(location, out.str());
1491 inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) override
1493 std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z) + "," + std::to_string(w);
1494 AddUniformCallToTraceStack(location, params);
1496 if(!mProgramUniforms4f.SetUniformValue(mCurrentProgram,
1498 Vector4(x, y, z, w)))
1500 mGetErrorResult = GL_INVALID_OPERATION;
1504 inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) override
1506 std::ostringstream out;
1507 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1508 AddUniformCallToTraceStack(location, out.str());
1510 for(int i = 0; i < count; ++i)
1512 if(!mProgramUniforms4f.SetUniformValue(
1515 Vector4(v[4 * i], v[4 * i + 1], v[4 * i + 2], v[4 * i + 3])))
1517 mGetErrorResult = GL_INVALID_OPERATION;
1523 inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) override
1525 std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z) + "," + std::to_string(w);
1526 AddUniformCallToTraceStack(location, params);
1529 inline void Uniform4iv(GLint location, GLsizei count, const GLint* v) override
1531 std::ostringstream out;
1532 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1533 AddUniformCallToTraceStack(location, out.str());
1536 inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1538 std::ostringstream out;
1539 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i];
1540 AddUniformCallToTraceStack(location, out.str());
1543 inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1545 std::ostringstream out;
1546 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i];
1547 AddUniformCallToTraceStack(location, out.str());
1549 for(int i = 0; i < count; ++i)
1551 if(!mProgramUniformsMat3.SetUniformValue(
1554 Matrix3(value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8])))
1556 mGetErrorResult = GL_INVALID_OPERATION;
1562 inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1564 std::ostringstream out;
1565 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i];
1566 AddUniformCallToTraceStack(location, out.str());
1568 for(int i = 0; i < count; ++i)
1570 if(!mProgramUniformsMat4.SetUniformValue(
1575 mGetErrorResult = GL_INVALID_OPERATION;
1581 inline void UseProgram(GLuint program) override
1583 mCurrentProgram = program;
1586 inline void ValidateProgram(GLuint program) override
1590 inline void VertexAttrib1f(GLuint indx, GLfloat x) override
1594 inline void VertexAttrib1fv(GLuint indx, const GLfloat* values) override
1598 inline void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) override
1602 inline void VertexAttrib2fv(GLuint indx, const GLfloat* values) override
1606 inline void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) override
1610 inline void VertexAttrib3fv(GLuint indx, const GLfloat* values) override
1614 inline void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) override
1618 inline void VertexAttrib4fv(GLuint indx, const GLfloat* values) override
1622 inline void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) override
1624 TraceCallStack::NamedParams namedParams;
1625 namedParams["index"] << index;
1626 namedParams["size"] << size;
1627 namedParams["type"] << std::hex << type;
1628 namedParams["normalized"] << (normalized ? "T" : "F");
1629 namedParams["stride"] << stride;
1630 namedParams["offset"] << std::to_string(reinterpret_cast<unsigned long>(ptr));
1632 mBufferTrace.PushCall("VertexAttribPointer", namedParams.str(), namedParams);
1635 inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) override
1637 TraceCallStack::NamedParams namedParams;
1638 namedParams["index"] << index;
1639 namedParams["size"] << size;
1640 namedParams["type"] << std::hex << type;
1641 namedParams["stride"] << stride;
1642 namedParams["offset"] << std::to_string(reinterpret_cast<unsigned long>(pointer));
1644 mBufferTrace.PushCall("VertexAttribIPointer", namedParams.str(), namedParams);
1647 inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) override
1649 std::string commaString(", ");
1650 std::string params(std::to_string(x) + commaString + std::to_string(y) + commaString + std::to_string(width) + commaString + std::to_string(height));
1652 mViewportTrace.PushCall("Viewport", params);
1657 inline void ReadBuffer(GLenum mode) override
1661 inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices) override
1665 inline void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels) override
1669 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) override
1673 inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) override
1677 inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data) override
1681 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) override
1685 inline void GenQueries(GLsizei n, GLuint* ids) override
1689 inline void DeleteQueries(GLsizei n, const GLuint* ids) override
1693 inline GLboolean IsQuery(GLuint id) override
1698 inline void BeginQuery(GLenum target, GLuint id) override
1702 inline void EndQuery(GLenum target) override
1706 inline void GetQueryiv(GLenum target, GLenum pname, GLint* params) override
1710 inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params) override
1714 inline GLboolean UnmapBuffer(GLenum target) override
1718 free(mMappedBuffer);
1719 mMappedBuffer = nullptr;
1721 return true; // false indicates corruption, nothing else.
1724 inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params) override
1728 inline void DrawBuffers(GLsizei n, const GLenum* bufs) override
1732 inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1736 inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1740 inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1744 inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1748 inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1752 inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1756 inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) override
1760 inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) override
1764 inline void FramebufferTexture2DMultisample(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) override
1766 // TODO : Check it if need
1767 FramebufferTexture2D(target, attachment, textarget, texture, level);
1770 inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) override
1774 inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) override
1776 mMappedBuffer = reinterpret_cast<GLvoid*>(malloc(offset + length));
1777 return mMappedBuffer;
1780 inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) override
1784 inline void BindVertexArray(GLuint array) override
1788 inline void DeleteVertexArrays(GLsizei n, const GLuint* arrays) override
1792 inline void GenVertexArrays(GLsizei n, GLuint* arrays) override
1796 inline GLboolean IsVertexArray(GLuint array) override
1801 inline void GetIntegeri_v(GLenum target, GLuint index, GLint* data) override
1805 inline void BeginTransformFeedback(GLenum primitiveMode) override
1809 inline void EndTransformFeedback(void) override
1813 inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) override
1817 inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer) override
1821 inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode) override
1825 inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) override
1829 inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params) override
1833 inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params) override
1837 inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w) override
1841 inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) override
1845 inline void VertexAttribI4iv(GLuint index, const GLint* v) override
1849 inline void VertexAttribI4uiv(GLuint index, const GLuint* v) override
1853 inline void GetUniformuiv(GLuint program, GLint location, GLuint* params) override
1857 inline GLint GetFragDataLocation(GLuint program, const GLchar* name) override
1862 inline void Uniform1ui(GLint location, GLuint v0) override
1866 inline void Uniform2ui(GLint location, GLuint v0, GLuint v1) override
1870 inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) override
1874 inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) override
1878 inline void Uniform1uiv(GLint location, GLsizei count, const GLuint* value) override
1882 inline void Uniform2uiv(GLint location, GLsizei count, const GLuint* value) override
1886 inline void Uniform3uiv(GLint location, GLsizei count, const GLuint* value) override
1890 inline void Uniform4uiv(GLint location, GLsizei count, const GLuint* value) override
1894 inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value) override
1898 inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value) override
1902 inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value) override
1906 inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) override
1910 inline const GLubyte* GetStringi(GLenum name, GLuint index) override
1915 inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) override
1919 inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices) override
1923 inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params) override
1925 for(int i = 0; i < uniformCount; ++i)
1927 if(i < int(mActiveUniforms.size()))
1931 case GL_UNIFORM_TYPE:
1933 params[i] = mActiveUniforms[i].type;
1936 case GL_UNIFORM_SIZE:
1938 params[i] = mActiveUniforms[i].size;
1941 case GL_UNIFORM_NAME_LENGTH:
1943 params[i] = mActiveUniforms[i].name.length();
1946 case GL_UNIFORM_BLOCK_INDEX:
1951 case GL_UNIFORM_OFFSET:
1953 params[i] = mActiveUniforms[i].offset;
1956 case GL_UNIFORM_MATRIX_STRIDE:
1965 inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName) override
1967 return GL_INVALID_INDEX;
1970 inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) override
1974 inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName) override
1978 inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) override
1982 inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount) override
1984 std::stringstream out;
1985 out << mode << ", " << first << ", " << count << ", " << instanceCount;
1986 TraceCallStack::NamedParams namedParams;
1987 namedParams["mode"] << std::hex << mode;
1988 namedParams["first"] << first;
1989 namedParams["count"] << count;
1990 namedParams["instanceCount"] << instanceCount;
1991 mDrawTrace.PushCall("DrawArraysInstanced", out.str(), namedParams);
1994 inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount) override
1996 std::stringstream out;
1997 out << mode << ", " << count << ", " << type << ", " << instanceCount;
1998 TraceCallStack::NamedParams namedParams;
1999 namedParams["mode"] << std::hex << mode;
2000 namedParams["count"] << count;
2001 namedParams["type"] << std::hex << type;
2002 namedParams["indexCount"] << instanceCount;
2003 mDrawTrace.PushCall("DrawElementsInstanced", out.str(), namedParams);
2006 inline GLsync FenceSync(GLenum condition, GLbitfield flags) override
2011 inline GLboolean IsSync(GLsync sync) override
2016 inline void DeleteSync(GLsync sync) override
2020 inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) override
2025 inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) override
2029 inline void GetInteger64v(GLenum pname, GLint64* params) override
2033 inline void GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) override
2037 inline void GetInteger64i_v(GLenum target, GLuint index, GLint64* data) override
2041 inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params) override
2045 inline void GenSamplers(GLsizei count, GLuint* samplers) override
2049 inline void DeleteSamplers(GLsizei count, const GLuint* samplers) override
2053 inline GLboolean IsSampler(GLuint sampler) override
2058 inline void BindSampler(GLuint unit, GLuint sampler) override
2062 inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param) override
2066 inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param) override
2070 inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) override
2074 inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param) override
2078 inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) override
2082 inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) override
2086 inline void VertexAttribDivisor(GLuint index, GLuint divisor) override
2088 std::stringstream out;
2089 out << index << ", " << divisor;
2090 TraceCallStack::NamedParams namedParams;
2091 namedParams["index"] << index;
2092 namedParams["divisor"] << divisor;
2093 mBufferTrace.PushCall("VertexAttribDivisor", out.str(), namedParams);
2096 inline void BindTransformFeedback(GLenum target, GLuint id) override
2100 inline void DeleteTransformFeedbacks(GLsizei n, const GLuint* ids) override
2104 inline void GenTransformFeedbacks(GLsizei n, GLuint* ids) override
2108 inline GLboolean IsTransformFeedback(GLuint id) override
2113 inline void PauseTransformFeedback(void) override
2117 inline void ResumeTransformFeedback(void) override
2121 inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary) override
2123 mGetProgramBinaryCalled = true;
2126 inline void ProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length) override
2130 inline void ProgramParameteri(GLuint program, GLenum pname, GLint value) override
2134 inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments) override
2138 inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height) override
2142 inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) override
2146 inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) override
2150 inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params) override
2154 inline void BlendBarrier(void)
2159 inline void AddUniformCallToTraceStack(GLint location, const std::string& value)
2161 std::string name = "<not found>";
2162 bool matched = false;
2164 UniformIDMap& map = mUniforms[mCurrentProgram];
2165 for(UniformIDMap::iterator it = map.begin(); it != map.end(); ++it)
2167 if(it->second == location)
2177 mSetUniformTrace.PushCall(name, value);
2181 public: // TEST FUNCTIONS
2182 inline void SetCompileStatus(GLuint value)
2184 mCompileStatus = value;
2186 inline void SetLinkStatus(GLuint value)
2188 mLinkStatus = value;
2190 inline void SetAttribLocations(std::vector<std::string>& locs)
2194 inline void SetAttribTypes(std::vector<GLenum>& types)
2196 mAttribTypes = types;
2198 inline void SetGetErrorResult(GLenum result)
2200 mGetErrorResult = result;
2202 inline void SetGetStringResult(GLubyte* result)
2204 mGetStringResult = result;
2206 inline void SetIsBufferResult(GLboolean result)
2208 mIsBufferResult = result;
2210 inline void SetIsEnabledResult(GLboolean result)
2212 mIsEnabledResult = result;
2214 inline void SetIsFramebufferResult(GLboolean result)
2216 mIsFramebufferResult = result;
2218 inline void SetIsProgramResult(GLboolean result)
2220 mIsProgramResult = result;
2222 inline void SetIsRenderbufferResult(GLboolean result)
2224 mIsRenderbufferResult = result;
2226 inline void SetIsShaderResult(GLboolean result)
2228 mIsShaderResult = result;
2230 inline void SetIsTextureResult(GLboolean result)
2232 mIsTextureResult = result;
2234 inline void SetCheckFramebufferStatusResult(GLenum result)
2236 mCheckFramebufferStatusResult = result;
2238 inline void SetNumBinaryFormats(GLint numFormats)
2240 mNumBinaryFormats = numFormats;
2242 inline void SetBinaryFormats(GLint binaryFormats)
2244 mBinaryFormats = binaryFormats;
2246 inline void SetProgramBinaryLength(GLint length)
2248 mProgramBinaryLength = length;
2250 inline void SetUniformBufferOffsetAlignment(GLint align)
2252 mUniformBufferOffsetAlignment = align;
2254 inline bool GetVertexAttribArrayState(GLuint index)
2256 if(index >= MAX_ATTRIBUTE_CACHE_SIZE)
2261 return mVertexAttribArrayState[index];
2263 inline void ClearVertexAttribArrayChanged()
2265 mVertexAttribArrayChanged = false;
2267 inline bool GetVertexAttribArrayChanged()
2269 return mVertexAttribArrayChanged;
2272 //Methods for CullFace verification
2273 inline void EnableCullFaceCallTrace(bool enable)
2275 mCullFaceTrace.Enable(enable);
2277 inline void ResetCullFaceCallStack()
2279 mCullFaceTrace.Reset();
2281 inline TraceCallStack& GetCullFaceTrace()
2283 return mCullFaceTrace;
2286 //Methods for Enable/Disable call verification
2287 inline void EnableEnableDisableCallTrace(bool enable)
2289 mEnableDisableTrace.Enable(enable);
2291 inline void ResetEnableDisableCallStack()
2293 mEnableDisableTrace.Reset();
2295 inline TraceCallStack& GetEnableDisableTrace()
2297 return mEnableDisableTrace;
2300 //Methods for Shader verification
2301 inline void EnableShaderCallTrace(bool enable)
2303 mShaderTrace.Enable(enable);
2305 inline void ResetShaderCallStack()
2307 mShaderTrace.Reset();
2309 inline TraceCallStack& GetShaderTrace()
2311 return mShaderTrace;
2314 //Methods for Texture verification
2315 inline void EnableTextureCallTrace(bool enable)
2317 mTextureTrace.Enable(enable);
2319 inline void ResetTextureCallStack()
2321 mTextureTrace.Reset();
2323 inline TraceCallStack& GetTextureTrace()
2325 return mTextureTrace;
2328 //Methods for Texture verification
2329 inline void EnableTexParameterCallTrace(bool enable)
2331 mTexParameterTrace.Enable(enable);
2333 inline void ResetTexParameterCallStack()
2335 mTexParameterTrace.Reset();
2337 inline TraceCallStack& GetTexParameterTrace()
2339 return mTexParameterTrace;
2342 //Methods for Draw verification
2343 inline void EnableDrawCallTrace(bool enable)
2345 mDrawTrace.Enable(enable);
2347 inline void ResetDrawCallStack()
2351 inline TraceCallStack& GetDrawTrace()
2356 //Methods for Depth function verification
2357 inline void EnableDepthFunctionCallTrace(bool enable)
2359 mDepthFunctionTrace.Enable(enable);
2361 inline void ResetDepthFunctionCallStack()
2363 mDepthFunctionTrace.Reset();
2365 inline TraceCallStack& GetDepthFunctionTrace()
2367 return mDepthFunctionTrace;
2370 //Methods for Stencil function verification
2371 inline void EnableStencilFunctionCallTrace(bool enable)
2373 mStencilFunctionTrace.Enable(enable);
2375 inline void ResetStencilFunctionCallStack()
2377 mStencilFunctionTrace.Reset();
2379 inline TraceCallStack& GetStencilFunctionTrace()
2381 return mStencilFunctionTrace;
2384 //Methods for Scissor verification
2385 inline void EnableScissorCallTrace(bool enable)
2387 mScissorTrace.Enable(enable);
2389 inline void ResetScissorCallStack()
2391 mScissorTrace.Reset();
2393 inline TraceCallStack& GetScissorTrace()
2395 return mScissorTrace;
2398 //Methods for Uniform function verification
2399 inline void EnableSetUniformCallTrace(bool enable)
2401 mSetUniformTrace.Enable(enable);
2403 inline void ResetSetUniformCallStack()
2405 mSetUniformTrace.Reset();
2407 inline TraceCallStack& GetSetUniformTrace()
2409 return mSetUniformTrace;
2412 //Methods for Viewport verification
2413 inline void EnableViewportCallTrace(bool enable)
2415 mViewportTrace.Enable(enable);
2417 inline void ResetViewportCallStack()
2419 mViewportTrace.Reset();
2421 inline TraceCallStack& GetViewportTrace()
2423 return mViewportTrace;
2425 inline TraceCallStack& GetBufferTrace()
2427 return mBufferTrace;
2430 template<typename T>
2431 inline bool GetUniformValue(const char* name, T& value) const
2433 for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2434 program_it != mUniforms.end();
2437 const UniformIDMap& uniformIDs = program_it->second;
2439 UniformIDMap::const_iterator uniform_it = uniformIDs.find(name);
2440 if(uniform_it != uniformIDs.end())
2442 // found one matching uniform name, lets check the value...
2443 GLuint programId = program_it->first;
2444 GLint uniformId = uniform_it->second;
2446 const ProgramUniformValue<T>& mProgramUniforms = GetProgramUniformsForType(value);
2447 return mProgramUniforms.GetUniformValue(programId, uniformId, value);
2453 template<typename T>
2454 inline bool CheckUniformValue(const char* name, const T& value) const
2456 for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2457 program_it != mUniforms.end();
2460 const UniformIDMap& uniformIDs = program_it->second;
2462 UniformIDMap::const_iterator uniform_it = uniformIDs.find(name);
2463 if(uniform_it != uniformIDs.end())
2465 // found one matching uniform name, lets check the value...
2466 GLuint programId = program_it->first;
2467 GLint uniformId = uniform_it->second;
2469 const ProgramUniformValue<T>& mProgramUniforms = GetProgramUniformsForType(value);
2470 if(mProgramUniforms.CheckUniformValue(programId, uniformId, value))
2472 // the value matches
2478 fprintf(stderr, "%s Not found, printing possible values:\n", name);
2479 for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2480 program_it != mUniforms.end();
2483 const UniformIDMap& uniformIDs = program_it->second;
2485 UniformIDMap::const_iterator uniform_it = uniformIDs.find(name);
2486 if(uniform_it != uniformIDs.end())
2488 // found one matching uniform name, lets check the value...
2489 GLuint programId = program_it->first;
2490 GLint uniformId = uniform_it->second;
2492 const ProgramUniformValue<T>& mProgramUniforms = GetProgramUniformsForType(value);
2494 if(mProgramUniforms.GetUniformValue(programId, uniformId, origValue))
2496 std::stringstream out;
2497 out << "Program: " << programId << ", " << uniform_it->first << ": " << origValue;
2498 fprintf(stderr, "%s\n", out.str().c_str());
2505 template<typename T>
2506 inline bool GetUniformValue(GLuint programId, GLuint uniformId, T& outValue) const
2508 const ProgramUniformValue<T>& mProgramUniforms = GetProgramUniformsForType(outValue);
2509 return mProgramUniforms.GetUniformValue(programId, uniformId, outValue);
2512 inline bool GetUniformIds(const char* name, GLuint& programId, GLuint& uniformId) const
2514 for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2515 program_it != mUniforms.end();
2518 const UniformIDMap& uniformIDs = program_it->second;
2520 UniformIDMap::const_iterator uniform_it = uniformIDs.find(name);
2521 if(uniform_it != uniformIDs.end())
2523 programId = program_it->first;
2524 uniformId = uniform_it->second;
2531 inline void SetCustomUniforms(std::vector<UniformData>& customUniformData)
2533 mCustomUniformData = customUniformData;
2536 inline GLuint GetLastShaderCompiled() const
2538 return mLastShaderCompiled;
2541 inline GLuint GetLastProgramCreated() const
2543 return mLastProgramIdUsed;
2546 inline GLbitfield GetLastClearMask() const
2548 return mLastClearBitMask;
2553 ATTRIB_UNKNOWN = -1,
2558 ATTRIB_BONE_WEIGHTS,
2559 ATTRIB_BONE_INDICES,
2563 struct ScissorParams
2579 // Methods to check scissor tests
2580 inline const ScissorParams& GetScissorParams() const
2582 return mScissorParams;
2585 struct ColorMaskParams
2601 inline bool GetProgramBinaryCalled() const
2603 return mGetProgramBinaryCalled;
2606 inline unsigned int GetClearCountCalled() const
2611 inline const ColorMaskParams& GetColorMaskParams() const
2613 return mColorMaskParams;
2616 typedef std::vector<size_t> BufferDataCalls;
2617 inline const BufferDataCalls& GetBufferDataCalls() const
2619 return mBufferDataCalls;
2621 inline void ResetBufferDataCalls()
2623 mBufferDataCalls.clear();
2626 typedef std::vector<size_t> BufferSubDataCalls;
2627 inline const BufferSubDataCalls& GetBufferSubDataCalls() const
2629 return mBufferSubDataCalls;
2631 inline void ResetBufferSubDataCalls()
2633 mBufferSubDataCalls.clear();
2637 GLuint mCurrentProgram;
2638 GLuint mCompileStatus;
2639 BufferDataCalls mBufferDataCalls;
2640 BufferSubDataCalls mBufferSubDataCalls;
2641 GLvoid* mMappedBuffer{nullptr};
2643 GLenum mGetErrorResult;
2644 GLubyte* mGetStringResult;
2645 GLboolean mIsBufferResult;
2646 GLboolean mIsEnabledResult;
2647 GLboolean mIsFramebufferResult;
2648 GLboolean mIsProgramResult;
2649 GLboolean mIsRenderbufferResult;
2650 GLboolean mIsShaderResult;
2651 GLboolean mIsTextureResult;
2652 GLenum mActiveTextureUnit;
2653 GLenum mCheckFramebufferStatusResult;
2654 GLint mFramebufferStatus;
2655 GLenum mFramebufferDepthAttached;
2656 GLenum mFramebufferStencilAttached;
2657 GLenum mFramebufferDepthStencilAttached;
2658 GLuint mFramebufferColorAttachmentCount;
2659 GLuint mFrameBufferColorStatus;
2660 GLuint mFramebufferDepthAttachmentCount;
2661 GLuint mFramebufferStencilAttachmentCount;
2662 GLuint mFramebufferDepthStencilAttachmentCount;
2663 GLint mNumBinaryFormats;
2664 GLint mBinaryFormats;
2665 GLint mProgramBinaryLength;
2666 GLint mUniformBufferOffsetAlignment{1};
2667 bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE];
2668 bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed
2669 bool mGetProgramBinaryCalled;
2670 typedef std::map<GLuint, std::string> ShaderSourceMap;
2671 ShaderSourceMap mShaderSources;
2672 std::vector<std::string> mAttribLocs; // should be bound to shader
2673 std::vector<GLenum> mAttribTypes; // should be bound to shader
2674 GLuint mLastShaderCompiled;
2675 GLbitfield mLastClearBitMask;
2676 Vector4 mLastClearColor;
2677 unsigned int mClearCount;
2679 Vector4 mLastBlendColor;
2680 GLenum mLastBlendEquationRgb;
2681 GLenum mLastBlendEquationAlpha;
2682 GLenum mLastBlendFuncSrcRgb;
2683 GLenum mLastBlendFuncDstRgb;
2684 GLenum mLastBlendFuncSrcAlpha;
2685 GLenum mLastBlendFuncDstAlpha;
2687 GLboolean mLastDepthMask;
2689 // Data for manipulating the IDs returned by GenTextures
2690 GLuint mLastAutoTextureIdUsed;
2691 GLuint mNumGeneratedTextures;
2692 std::vector<GLuint> mNextTextureIds;
2693 std::vector<GLuint> mDeletedTextureIds;
2694 std::vector<GLuint> mBoundTextures;
2696 struct ActiveTextureType
2698 std::vector<GLuint> mBoundTextures;
2701 ActiveTextureType mActiveTextures[MIN_TEXTURE_UNIT_LIMIT];
2703 TraceCallStack mBufferTrace;
2704 TraceCallStack mCullFaceTrace;
2705 TraceCallStack mEnableDisableTrace;
2706 TraceCallStack mShaderTrace;
2707 TraceCallStack mTextureTrace;
2708 TraceCallStack mTexParameterTrace;
2709 TraceCallStack mDrawTrace;
2710 TraceCallStack mDepthFunctionTrace;
2711 TraceCallStack mStencilFunctionTrace;
2712 TraceCallStack mScissorTrace;
2713 TraceCallStack mSetUniformTrace;
2714 TraceCallStack mViewportTrace;
2716 // Shaders & Uniforms
2717 uint32_t mShaderLanguageVersion{320u};
2719 GLuint mLastShaderIdUsed;
2720 GLuint mLastProgramIdUsed{0u};
2721 GLuint mLastUniformIdUsed;
2722 typedef std::map<std::string, GLint> UniformIDMap;
2723 typedef std::map<GLuint, UniformIDMap> ProgramUniformMap;
2724 ProgramUniformMap mUniforms;
2725 std::vector<ActiveUniform> mActiveUniforms;
2726 std::vector<UniformData> mCustomUniformData{};
2728 template<typename T>
2729 struct ProgramUniformValue : public std::map<GLuint, std::map<GLint, T> >
2732 typedef std::map<GLint, T> UniformValueMap;
2733 typedef std::map<GLuint, UniformValueMap> Map;
2735 bool SetUniformValue(GLuint program, GLuint uniform, const T& value)
2742 typename Map::iterator it = Map::find(program);
2743 if(it == Map::end())
2745 // if its the first uniform for this program add it
2746 std::pair<typename Map::iterator, bool> result =
2747 Map::insert(typename Map::value_type(program, UniformValueMap()));
2751 UniformValueMap& uniforms = it->second;
2752 uniforms[uniform] = value;
2757 bool CheckUniformValue(GLuint program, GLuint uniform, const T& value) const
2760 if(GetUniformValue(program, uniform, uniformValue))
2762 return CompareType<T>(value, uniformValue, Math::MACHINE_EPSILON_10);
2768 bool GetUniformValue(GLuint program, GLuint uniform, T& value) const
2775 typename Map::const_iterator it = Map::find(program);
2776 if(it == Map::end())
2778 // Uniform values always initialised as 0
2783 const UniformValueMap& uniforms = it->second;
2784 typename UniformValueMap::const_iterator it2 = uniforms.find(uniform);
2785 if(it2 == uniforms.end())
2787 // Uniform values always initialised as 0
2791 value = it2->second;
2798 ProgramUniformValue<int> mProgramUniforms1i;
2799 ProgramUniformValue<float> mProgramUniforms1f;
2800 ProgramUniformValue<Vector2> mProgramUniforms2f;
2801 ProgramUniformValue<Vector3> mProgramUniforms3f;
2802 ProgramUniformValue<Vector4> mProgramUniforms4f;
2803 ProgramUniformValue<Matrix> mProgramUniformsMat4;
2804 ProgramUniformValue<Matrix3> mProgramUniformsMat3;
2806 inline const ProgramUniformValue<int>& GetProgramUniformsForType(const int) const
2808 return mProgramUniforms1i;
2810 inline const ProgramUniformValue<float>& GetProgramUniformsForType(const float) const
2812 return mProgramUniforms1f;
2814 inline const ProgramUniformValue<Vector2>& GetProgramUniformsForType(const Vector2&) const
2816 return mProgramUniforms2f;
2818 inline const ProgramUniformValue<Vector3>& GetProgramUniformsForType(const Vector3&) const
2820 return mProgramUniforms3f;
2822 inline const ProgramUniformValue<Vector4>& GetProgramUniformsForType(const Vector4&) const
2824 return mProgramUniforms4f;
2826 inline const ProgramUniformValue<Matrix>& GetProgramUniformsForType(const Matrix&) const
2828 return mProgramUniformsMat4;
2830 inline const ProgramUniformValue<Matrix3>& GetProgramUniformsForType(const Matrix3&) const
2832 return mProgramUniformsMat3;
2834 inline void SetVertexAttribArray(GLuint index, bool state)
2836 if(index >= MAX_ATTRIBUTE_CACHE_SIZE)
2841 mVertexAttribArrayState[index] = state;
2842 mVertexAttribArrayChanged = true;
2845 ScissorParams mScissorParams;
2846 ColorMaskParams mColorMaskParams;
2850 inline int TestGlAbstraction::ProgramUniformValue<int>::GetZero() const
2856 inline float TestGlAbstraction::ProgramUniformValue<float>::GetZero() const
2862 inline Vector2 TestGlAbstraction::ProgramUniformValue<Vector2>::GetZero() const
2864 return Vector2::ZERO;
2868 inline Vector3 TestGlAbstraction::ProgramUniformValue<Vector3>::GetZero() const
2870 return Vector3::ZERO;
2874 inline Vector4 TestGlAbstraction::ProgramUniformValue<Vector4>::GetZero() const
2876 return Vector4::ZERO;
2880 inline Matrix TestGlAbstraction::ProgramUniformValue<Matrix>::GetZero() const
2886 inline Matrix3 TestGlAbstraction::ProgramUniformValue<Matrix3>::GetZero() const
2888 return Matrix3(Matrix());
2893 bool BlendEnabled(const Dali::TraceCallStack& callStack);
2894 bool BlendDisabled(const Dali::TraceCallStack& callStack);
2896 #endif // TEST_GL_ABSTRACTION_H