1 #ifndef TEST_GL_ABSTRACTION_H
2 #define TEST_GL_ABSTRACTION_H
5 * Copyright (c) 2021 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>
41 class DALI_CORE_API TestGlAbstraction : public Dali::Integration::GlAbstraction
44 static const int MAX_ATTRIBUTE_CACHE_SIZE{64};
47 ~TestGlAbstraction() override;
50 void PreRender() override;
51 void PostRender() override;
53 bool IsSurfacelessContextSupported() const override;
55 bool IsAdvancedBlendEquationSupported() override;
57 bool IsBlendEquationSupported(DevelBlendEquation::Type blendEquation) override;
59 std::string GetShaderVersionPrefix();
61 std::string GetVertexShaderPrefix();
63 std::string GetFragmentShaderPrefix();
65 bool TextureRequiresConverting(const GLenum imageGlFormat, const GLenum textureGlFormat, const bool isSubImage) const override;
69 inline void ActiveTexture(GLenum textureUnit) override
71 mActiveTextureUnit = textureUnit - GL_TEXTURE0;
74 inline GLenum GetActiveTextureUnit() const
76 return mActiveTextureUnit + GL_TEXTURE0;
79 inline void AttachShader(GLuint program, GLuint shader) override
81 std::stringstream out;
82 out << program << ", " << shader;
84 TraceCallStack::NamedParams namedParams;
85 namedParams["program"] << program;
86 namedParams["shader"] << shader;
87 mShaderTrace.PushCall("AttachShader", out.str(), namedParams);
90 inline void BindAttribLocation(GLuint program, GLuint index, const char* name) override
94 inline void BindBuffer(GLenum target, GLuint buffer) override
97 o << std::hex << target << ", " << buffer;
98 TraceCallStack::NamedParams namedParams;
99 namedParams["target"] << target;
100 namedParams["buffer"] << buffer;
101 mBufferTrace.PushCall("BindBuffer", o.str(), namedParams);
104 inline void BindFramebuffer(GLenum target, GLuint framebuffer) override
107 mFramebufferStatus |= 2;
110 inline void BindRenderbuffer(GLenum target, GLuint renderbuffer) override
115 * This method can be used by test cases, to query the texture IDs that have been bound by BindTexture.
116 * @return A vector containing the IDs that were bound.
118 inline const std::vector<GLuint>& GetBoundTextures() const
120 return mBoundTextures;
124 * Query the texture IDs that have been bound with BindTexture, with a specific active texture unit.
125 * @param[in] activeTextureUnit The specific active texture unit.
126 * @return A vector containing the IDs that were bound.
128 inline const std::vector<GLuint>& GetBoundTextures(GLuint activeTextureUnit) const
130 return mActiveTextures[activeTextureUnit - GL_TEXTURE0].mBoundTextures;
134 * This method can be used by test cases, to clear the record of texture IDs that have been bound by BindTexture.
136 inline void ClearBoundTextures()
138 mBoundTextures.clear();
140 for(unsigned int i = 0; i < MIN_TEXTURE_UNIT_LIMIT; ++i)
142 mActiveTextures[i].mBoundTextures.clear();
146 inline void BindTexture(GLenum target, GLuint texture) override
148 // Record the bound textures for future checks
151 mBoundTextures.push_back(texture);
153 if(mActiveTextureUnit < MIN_TEXTURE_UNIT_LIMIT)
155 mActiveTextures[mActiveTextureUnit].mBoundTextures.push_back(texture);
159 std::stringstream out;
160 out << std::hex << target << ", " << std::dec << texture;
162 TraceCallStack::NamedParams namedParams;
163 namedParams["target"] << std::hex << target;
164 namedParams["texture"] << texture;
166 mTextureTrace.PushCall("BindTexture", out.str(), namedParams);
169 inline void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) override
171 mLastBlendColor.r = red;
172 mLastBlendColor.g = green;
173 mLastBlendColor.b = blue;
174 mLastBlendColor.a = alpha;
177 inline const Vector4& GetLastBlendColor() const
179 return mLastBlendColor;
182 inline void BlendEquation(GLenum mode) override
184 mLastBlendEquationRgb = mode;
185 mLastBlendEquationAlpha = mode;
188 inline void BlendEquationSeparate(GLenum modeRgb, GLenum modeAlpha) override
190 mLastBlendEquationRgb = modeRgb;
191 mLastBlendEquationAlpha = modeAlpha;
194 inline GLenum GetLastBlendEquationRgb() const
196 return mLastBlendEquationRgb;
199 inline GLenum GetLastBlendEquationAlpha() const
201 return mLastBlendEquationAlpha;
204 inline void BlendFunc(GLenum sfactor, GLenum dfactor) override
206 mLastBlendFuncSrcRgb = sfactor;
207 mLastBlendFuncDstRgb = dfactor;
208 mLastBlendFuncSrcAlpha = sfactor;
209 mLastBlendFuncDstAlpha = dfactor;
212 inline void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) override
214 mLastBlendFuncSrcRgb = srcRGB;
215 mLastBlendFuncDstRgb = dstRGB;
216 mLastBlendFuncSrcAlpha = srcAlpha;
217 mLastBlendFuncDstAlpha = dstAlpha;
220 inline GLenum GetLastBlendFuncSrcRgb() const
222 return mLastBlendFuncSrcRgb;
225 inline GLenum GetLastBlendFuncDstRgb() const
227 return mLastBlendFuncDstRgb;
230 inline GLenum GetLastBlendFuncSrcAlpha() const
232 return mLastBlendFuncSrcAlpha;
235 inline GLenum GetLastBlendFuncDstAlpha() const
237 return mLastBlendFuncDstAlpha;
240 inline void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) override
242 std::ostringstream o;
243 o << std::hex << target << ", " << size << ", " << data << ", " << usage;
244 TraceCallStack::NamedParams namedParams;
245 namedParams["target"] << std::hex << target;
246 namedParams["size"] << size;
247 namedParams["usage"] << usage;
249 mBufferTrace.PushCall("BufferData", o.str(), namedParams);
251 mBufferDataCalls.push_back(size);
254 inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) override
256 std::ostringstream o;
257 o << std::hex << target << ", " << offset << ", " << size << ", " << data;
258 TraceCallStack::NamedParams namedParams;
259 namedParams["target"] << std::hex << target;
260 namedParams["offset"] << offset;
261 namedParams["size"] << size;
262 mBufferTrace.PushCall("BufferSubData", o.str());
264 mBufferSubDataCalls.push_back(size);
267 inline GLenum CheckFramebufferStatus(GLenum target) override
269 //If it has the three last bits set to 1 - 111, then the three minimum functions to create a
270 //Framebuffer texture have been called
271 if(mFramebufferStatus == 7)
273 return GL_FRAMEBUFFER_COMPLETE;
276 return mCheckFramebufferStatusResult;
279 inline GLuint CheckFramebufferColorAttachmentCount()
281 return mFramebufferColorAttachmentCount;
284 inline GLenum CheckFramebufferDepthAttachment()
286 return mFramebufferDepthAttached;
289 inline GLenum CheckFramebufferStencilAttachment()
291 return mFramebufferStencilAttached;
294 inline void Clear(GLbitfield mask) override
297 mLastClearBitMask = mask;
300 inline void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) override
302 mLastClearColor.r = red;
303 mLastClearColor.g = green;
304 mLastClearColor.b = blue;
305 mLastClearColor.a = alpha;
308 inline const Vector4& GetLastClearColor() const
310 return mLastClearColor;
313 inline void ClearDepthf(GLclampf depth) override
317 inline void ClearStencil(GLint s) override
319 std::stringstream out;
322 TraceCallStack::NamedParams namedParams;
323 namedParams["s"] << s;
325 mStencilFunctionTrace.PushCall("ClearStencil", out.str(), namedParams);
328 inline void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) override
330 mColorMaskParams.red = red;
331 mColorMaskParams.green = green;
332 mColorMaskParams.blue = blue;
333 mColorMaskParams.alpha = alpha;
336 inline void CompileShader(GLuint shader) override
338 std::stringstream out;
340 TraceCallStack::NamedParams namedParams;
341 namedParams["shader"] << shader;
343 mShaderTrace.PushCall("CompileShader", out.str(), namedParams);
346 inline void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) override
348 std::stringstream out;
349 out << target << ", " << level << ", " << width << ", " << height;
351 TraceCallStack::NamedParams namedParams;
352 namedParams["target"] << std::hex << target;
353 namedParams["level"] << level;
354 namedParams["internalformat"] << internalformat;
355 namedParams["width"] << width;
356 namedParams["height"] << height;
357 namedParams["border"] << border;
358 namedParams["size"] << imageSize;
360 mTextureTrace.PushCall("CompressedTexImage2D", out.str(), namedParams);
363 inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) override
365 std::stringstream out;
366 out << target << ", " << level << ", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
368 TraceCallStack::NamedParams namedParams;
369 namedParams["target"] << std::hex << target;
370 namedParams["level"] << level;
371 namedParams["xoffset"] << xoffset;
372 namedParams["yoffset"] << yoffset;
373 namedParams["width"] << width;
374 namedParams["height"] << height;
375 mTextureTrace.PushCall("CompressedTexSubImage2D", out.str(), namedParams);
378 inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) override
382 inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) override
386 inline GLuint CreateProgram(void) override
388 mShaderTrace.PushCall("CreateProgram", "");
390 ++mLastProgramIdUsed;
391 mUniforms[mLastProgramIdUsed] = UniformIDMap();
392 return mLastProgramIdUsed;
395 inline GLuint CreateShader(GLenum type) override
397 std::stringstream out;
400 TraceCallStack::NamedParams namedParams;
401 namedParams["type"] << std::hex << type;
402 mShaderTrace.PushCall("CreateShader", out.str(), namedParams);
404 return ++mLastShaderIdUsed;
407 inline void CullFace(GLenum mode) override
409 std::stringstream out;
410 out << std::hex << mode;
412 TraceCallStack::NamedParams namedParams;
413 namedParams["mode"] << std::hex << mode;
415 mCullFaceTrace.PushCall("CullFace", out.str(), namedParams);
418 inline void DeleteBuffers(GLsizei n, const GLuint* buffers) override
422 inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) override
426 inline void DeleteProgram(GLuint program) override
428 std::stringstream out;
431 TraceCallStack::NamedParams namedParams;
432 namedParams["program"] << program;
434 mShaderTrace.PushCall("DeleteProgram", out.str(), namedParams);
437 inline void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) override
441 inline void DeleteShader(GLuint shader) override
443 std::stringstream out;
446 TraceCallStack::NamedParams namedParams;
447 namedParams["shader"] << shader;
449 mShaderTrace.PushCall("DeleteShader", out.str(), namedParams);
452 inline void DeleteTextures(GLsizei n, const GLuint* textures) override
454 std::stringstream out;
455 out << "n:" << n << " textures[";
457 TraceCallStack::NamedParams namedParams;
459 for(GLsizei i = 0; i < n; i++)
461 out << (i > 0 ? ", " : "") << textures[i];
462 std::stringstream paramName;
463 paramName << "texture[" << i << "]";
464 namedParams[paramName.str()] << textures[i];
465 mDeletedTextureIds.push_back(textures[i]);
466 mNumGeneratedTextures--;
470 mTextureTrace.PushCall("DeleteTextures", out.str(), namedParams);
473 inline bool CheckNoTexturesDeleted()
475 return mDeletedTextureIds.size() == 0;
478 inline bool CheckTextureDeleted(GLuint textureId)
482 for(std::vector<GLuint>::iterator iter = mDeletedTextureIds.begin(); iter != mDeletedTextureIds.end(); ++iter)
484 if(*iter == textureId)
493 inline void ClearDeletedTextures()
495 mDeletedTextureIds.clear();
498 inline void DepthFunc(GLenum func) override
500 std::stringstream out;
501 out << std::hex << func;
503 TraceCallStack::NamedParams namedParams;
504 namedParams["func"] << std::hex << func;
506 mDepthFunctionTrace.PushCall("DepthFunc", out.str(), namedParams);
509 inline void DepthMask(GLboolean flag) override
511 mLastDepthMask = flag;
514 inline bool GetLastDepthMask() const
516 return mLastDepthMask;
519 inline void DepthRangef(GLclampf zNear, GLclampf zFar) override
523 inline void DetachShader(GLuint program, GLuint shader) override
525 std::stringstream out;
526 out << program << ", " << shader;
527 TraceCallStack::NamedParams namedParams;
528 namedParams["program"] << program;
529 namedParams["shader"] << shader;
530 mShaderTrace.PushCall("DetachShader", out.str(), namedParams);
533 inline void Disable(GLenum cap) override
535 std::stringstream out;
536 out << std::hex << cap;
537 TraceCallStack::NamedParams namedParams;
538 namedParams["cap"] << std::hex << cap;
539 mEnableDisableTrace.PushCall("Disable", out.str(), namedParams);
542 inline void DisableVertexAttribArray(GLuint index) override
544 std::stringstream out;
546 TraceCallStack::NamedParams namedParams;
547 namedParams["index"] << index;
548 mBufferTrace.PushCall("DisableVertexAttribArray", out.str(), namedParams);
549 SetVertexAttribArray(index, false);
552 inline void DrawArrays(GLenum mode, GLint first, GLsizei count) override
554 std::stringstream out;
555 out << mode << ", " << first << ", " << count;
556 TraceCallStack::NamedParams namedParams;
557 namedParams["mode"] << std::hex << mode;
558 namedParams["first"] << first;
559 namedParams["count"] << count;
560 mDrawTrace.PushCall("DrawArrays", out.str(), namedParams);
563 inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices) override
565 std::stringstream out;
566 out << mode << ", " << count << ", " << type << ", indices";
568 TraceCallStack::NamedParams namedParams;
569 namedParams["mode"] << std::hex << mode;
570 namedParams["count"] << count;
571 namedParams["type"] << type;
572 // Skip void pointers - are they of any use?
573 mDrawTrace.PushCall("DrawElements", out.str(), namedParams);
576 inline void Enable(GLenum cap) override
578 std::stringstream out;
579 out << std::hex << cap;
580 TraceCallStack::NamedParams namedParams;
581 namedParams["cap"] << std::hex << cap;
582 mEnableDisableTrace.PushCall("Enable", out.str(), namedParams);
585 inline void EnableVertexAttribArray(GLuint index) override
587 std::stringstream out;
589 TraceCallStack::NamedParams namedParams;
590 namedParams["index"] << index;
591 mBufferTrace.PushCall("EnableVertexAttribArray", out.str(), namedParams);
592 SetVertexAttribArray(index, true);
595 inline void Finish(void) override
599 inline void Flush(void) override
603 inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) override
605 if(attachment == GL_DEPTH_ATTACHMENT)
607 mFramebufferDepthAttached = true;
609 else if(attachment == GL_STENCIL_ATTACHMENT)
611 mFramebufferStencilAttached = true;
615 inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) override
618 mFramebufferStatus |= 4;
620 //We check 4 attachment colors
621 if((attachment >= GL_COLOR_ATTACHMENT0) && (attachment < GL_COLOR_ATTACHMENT0 + Dali::DevelFrameBuffer::MAX_COLOR_ATTACHMENTS))
623 uint8_t mask = 1 << (attachment - GL_COLOR_ATTACHMENT0);
624 if((mFrameBufferColorStatus & mask) == 0)
626 mFrameBufferColorStatus |= mask;
627 ++mFramebufferColorAttachmentCount;
632 inline void FrontFace(GLenum mode) override
637 inline void GenBuffers(GLsizei n, GLuint* buffers) override
639 // avoids an assert in GpuBuffers
642 std::ostringstream o;
644 TraceCallStack::NamedParams namedParams;
645 namedParams["n"] << o.str();
646 mBufferTrace.PushCall("GenBuffers", o.str(), namedParams);
649 inline void GenerateMipmap(GLenum target) override
651 std::stringstream out;
653 TraceCallStack::NamedParams namedParams;
654 namedParams["target"] << std::hex << target;
656 mTextureTrace.PushCall("GenerateMipmap", out.str(), namedParams);
659 inline void GenFramebuffers(GLsizei n, GLuint* framebuffers) override
661 for(int i = 0; i < n; i++)
663 framebuffers[i] = i + 1;
666 //Add 001 bit, this function needs to be called the first one in the chain
667 mFramebufferStatus = 1;
670 inline void GenRenderbuffers(GLsizei n, GLuint* renderbuffers) override
672 for(int i = 0; i < n; i++)
674 renderbuffers[i] = i + 1;
679 * This method can be used by test cases, to manipulate the texture IDs generated by GenTextures.
680 * @param[in] ids A vector containing the next IDs to be generated
682 inline void SetNextTextureIds(const std::vector<GLuint>& ids)
684 mNextTextureIds = ids;
687 inline const std::vector<GLuint>& GetNextTextureIds()
689 return mNextTextureIds;
692 inline void GenTextures(GLsizei count, GLuint* textures) override
694 for(int i = 0; i < count; ++i)
696 if(!mNextTextureIds.empty())
698 *(textures + i) = mNextTextureIds[0];
699 mNextTextureIds.erase(mNextTextureIds.begin());
703 *(textures + i) = ++mLastAutoTextureIdUsed;
705 mNumGeneratedTextures++;
708 TraceCallStack::NamedParams namedParams;
709 namedParams["count"] << count;
711 std::stringstream out;
712 for(int i = 0; i < count; i++)
719 std::ostringstream oss;
720 oss << "indices[" << i << "]";
721 namedParams[oss.str()] << textures[i];
724 mTextureTrace.PushCall("GenTextures", out.str(), namedParams);
727 inline GLuint GetLastGenTextureId()
729 return mLastAutoTextureIdUsed;
732 inline GLuint GetNumGeneratedTextures()
734 return mNumGeneratedTextures;
737 inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) override
741 inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) override
746 *length = snprintf(name, bufsize, "sTexture");
747 *type = GL_SAMPLER_2D;
751 *length = snprintf(name, bufsize, "sEffect");
752 *type = GL_SAMPLER_2D;
756 *length = snprintf(name, bufsize, "sGloss");
757 *type = GL_SAMPLER_2D;
765 inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) override
769 inline int GetAttribLocation(GLuint program, const char* name) override
771 std::string check(name);
772 auto iter = std::find(mAttribLocs.begin(), mAttribLocs.end(), check);
773 if(iter == mAttribLocs.end())
775 return iter - mAttribLocs.begin();
778 inline void GetBooleanv(GLenum pname, GLboolean* params) override
782 inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params) override
786 inline GLenum GetError(void) override
788 return mGetErrorResult;
791 inline void GetFloatv(GLenum pname, GLfloat* params) override
795 inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) override
799 inline void GetIntegerv(GLenum pname, GLint* params) override
803 case GL_MAX_TEXTURE_SIZE:
806 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
809 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
810 *params = mNumBinaryFormats;
812 case GL_PROGRAM_BINARY_FORMATS_OES:
813 *params = mBinaryFormats;
818 inline void GetProgramiv(GLuint program, GLenum pname, GLint* params) override
823 *params = mLinkStatus;
825 case GL_PROGRAM_BINARY_LENGTH_OES:
826 *params = mProgramBinaryLength;
828 case GL_ACTIVE_UNIFORMS:
829 *params = mNumberOfActiveUniforms;
831 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
834 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
840 inline void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) override
844 inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) override
848 inline void GetShaderiv(GLuint shader, GLenum pname, GLint* params) override
852 case GL_COMPILE_STATUS:
853 *params = mCompileStatus;
858 inline void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) override
862 inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) override
866 inline const GLubyte* GetString(GLenum name) override
868 return mGetStringResult;
871 inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) override
875 inline void GetTexParameteriv(GLenum target, GLenum pname, GLint* params) override
879 inline void GetUniformfv(GLuint program, GLint location, GLfloat* params) override
883 inline void GetUniformiv(GLuint program, GLint location, GLint* params) override
887 inline GLint GetUniformLocation(GLuint program, const char* name) override
889 ProgramUniformMap::iterator it = mUniforms.find(program);
890 if(it == mUniforms.end())
892 // Not a valid program ID
893 mGetErrorResult = GL_INVALID_OPERATION;
897 UniformIDMap& uniformIDs = it->second;
898 UniformIDMap::iterator it2 = uniformIDs.find(name);
899 if(it2 == uniformIDs.end())
901 // Uniform not found, so add it...
902 uniformIDs[name] = mLastUniformIdUsed++;
903 return mLastUniformIdUsed;
909 inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) override
913 inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params) override
917 inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) override
921 inline void Hint(GLenum target, GLenum mode) override
925 inline GLboolean IsBuffer(GLuint buffer) override
927 return mIsBufferResult;
930 inline GLboolean IsEnabled(GLenum cap) override
932 return mIsEnabledResult;
935 inline GLboolean IsFramebuffer(GLuint framebuffer) override
937 return mIsFramebufferResult;
940 inline GLboolean IsProgram(GLuint program) override
942 return mIsProgramResult;
945 inline GLboolean IsRenderbuffer(GLuint renderbuffer) override
947 return mIsRenderbufferResult;
950 inline GLboolean IsShader(GLuint shader) override
952 return mIsShaderResult;
955 inline GLboolean IsTexture(GLuint texture) override
957 return mIsTextureResult;
960 inline void LineWidth(GLfloat width) override
964 inline void LinkProgram(GLuint program) override
966 std::stringstream out;
969 TraceCallStack::NamedParams namedParams;
970 namedParams["program"] << program;
971 mShaderTrace.PushCall("LinkProgram", out.str(), namedParams);
973 mNumberOfActiveUniforms = 3;
975 GetUniformLocation(program, "uRendererColor");
976 GetUniformLocation(program, "uCustom");
977 GetUniformLocation(program, "uCustom3");
978 GetUniformLocation(program, "uFadeColor");
979 GetUniformLocation(program, "uUniform1");
980 GetUniformLocation(program, "uUniform2");
981 GetUniformLocation(program, "uUniform3");
982 GetUniformLocation(program, "uFadeProgress");
983 GetUniformLocation(program, "uANormalMatrix");
984 GetUniformLocation(program, "sEffect");
985 GetUniformLocation(program, "sTexture");
986 GetUniformLocation(program, "sTextureRect");
987 GetUniformLocation(program, "sGloss");
988 GetUniformLocation(program, "uColor");
989 GetUniformLocation(program, "uModelMatrix");
990 GetUniformLocation(program, "uModelView");
991 GetUniformLocation(program, "uMvpMatrix");
992 GetUniformLocation(program, "uNormalMatrix");
993 GetUniformLocation(program, "uProjection");
994 GetUniformLocation(program, "uSize");
995 GetUniformLocation(program, "uViewMatrix");
996 GetUniformLocation(program, "uLightCameraProjectionMatrix");
997 GetUniformLocation(program, "uLightCameraViewMatrix");
1000 inline void PixelStorei(GLenum pname, GLint param) override
1004 inline void PolygonOffset(GLfloat factor, GLfloat units) override
1008 inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) override
1012 inline void ReleaseShaderCompiler(void) override
1016 inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) override
1020 inline void SampleCoverage(GLclampf value, GLboolean invert) override
1024 inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) override
1026 mScissorParams.x = x;
1027 mScissorParams.y = y;
1028 mScissorParams.width = width;
1029 mScissorParams.height = height;
1031 std::stringstream out;
1032 out << x << ", " << y << ", " << width << ", " << height;
1033 TraceCallStack::NamedParams namedParams;
1034 namedParams["x"] << x;
1035 namedParams["y"] << y;
1036 namedParams["width"] << width;
1037 namedParams["height"] << height;
1038 mScissorTrace.PushCall("Scissor", out.str(), namedParams);
1041 inline void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) override
1045 inline void ShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length) override
1047 std::string stringBuilder;
1048 for(int i = 0; i < count; ++i)
1050 stringBuilder += string[i];
1052 mShaderSources[shader] = stringBuilder;
1053 mLastShaderCompiled = shader;
1056 inline void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source) override
1058 const std::string shaderSource = mShaderSources[shader];
1059 const int shaderSourceLength = static_cast<int>(shaderSource.length());
1060 if(shaderSourceLength < bufsize)
1062 strncpy(source, shaderSource.c_str(), shaderSourceLength);
1063 *length = shaderSourceLength;
1067 *length = bufsize - 1;
1068 strncpy(source, shaderSource.c_str(), *length);
1069 source[*length] = 0x0;
1073 inline std::string GetShaderSource(GLuint shader)
1075 return mShaderSources[shader];
1078 inline void StencilFunc(GLenum func, GLint ref, GLuint mask) override
1080 std::stringstream out;
1081 out << func << ", " << ref << ", " << mask;
1083 TraceCallStack::NamedParams namedParams;
1084 namedParams["func"] << std::hex << func;
1085 namedParams["ref"] << ref;
1086 namedParams["mask"] << mask;
1088 mStencilFunctionTrace.PushCall("StencilFunc", out.str(), namedParams);
1091 inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) override
1093 std::stringstream out;
1094 out << face << ", " << func << ", " << ref << ", " << mask;
1096 TraceCallStack::NamedParams namedParams;
1097 namedParams["face"] << std::hex << face;
1098 namedParams["func"] << std::hex << func;
1099 namedParams["ref"] << ref;
1100 namedParams["mask"] << mask;
1102 mStencilFunctionTrace.PushCall("StencilFuncSeparate", out.str(), namedParams);
1105 inline void StencilMask(GLuint mask) override
1107 std::stringstream out;
1110 TraceCallStack::NamedParams namedParams;
1111 namedParams["mask"] << mask;
1113 mStencilFunctionTrace.PushCall("StencilMask", out.str(), namedParams);
1116 inline void StencilMaskSeparate(GLenum face, GLuint mask) override
1118 std::stringstream out;
1119 out << face << ", " << mask;
1121 TraceCallStack::NamedParams namedParams;
1122 namedParams["face"] << std::hex << face;
1123 namedParams["mask"] << mask;
1125 mStencilFunctionTrace.PushCall("StencilMaskSeparate", out.str(), namedParams);
1128 inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) override
1130 std::stringstream out;
1131 out << fail << ", " << zfail << ", " << zpass;
1133 TraceCallStack::NamedParams namedParams;
1134 namedParams["fail"] << std::hex << fail;
1135 namedParams["zfail"] << std::hex << zfail;
1136 namedParams["zpass"] << std::hex << zpass;
1138 mStencilFunctionTrace.PushCall("StencilOp", out.str(), namedParams);
1141 inline void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) override
1143 std::stringstream out;
1144 out << face << ", " << fail << ", " << zfail << "," << zpass;
1146 TraceCallStack::NamedParams namedParams;
1147 namedParams["face"] << std::hex << face;
1148 namedParams["fail"] << std::hex << fail;
1149 namedParams["zfail"] << std::hex << zfail;
1150 namedParams["zpass"] << std::hex << zpass;
1152 mStencilFunctionTrace.PushCall("StencilOpSeparate", out.str(), namedParams);
1155 inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) override
1157 std::stringstream out;
1158 out << target << ", " << level << ", " << width << ", " << height;
1160 TraceCallStack::NamedParams namedParams;
1161 namedParams["target"] << std::hex << target;
1162 namedParams["level"] << level;
1163 namedParams["internalformat"] << internalformat;
1164 namedParams["width"] << width;
1165 namedParams["height"] << height;
1166 namedParams["border"] << border;
1167 namedParams["format"] << std::hex << format;
1168 namedParams["type"] << std::hex << type;
1170 mTextureTrace.PushCall("TexImage2D", out.str(), namedParams);
1173 inline void TexParameterf(GLenum target, GLenum pname, GLfloat param) override
1175 std::stringstream out;
1176 out << target << ", " << pname << ", " << param;
1178 TraceCallStack::NamedParams namedParams;
1179 namedParams["target"] << std::hex << target;
1180 namedParams["pname"] << std::hex << pname;
1181 namedParams["param"] << param;
1183 mTexParameterTrace.PushCall("TexParameterf", out.str(), namedParams);
1186 inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params) override
1188 std::stringstream out;
1189 out << target << ", " << pname << ", " << params[0];
1191 TraceCallStack::NamedParams namedParams;
1192 namedParams["target"] << std::hex << target;
1193 namedParams["pname"] << std::hex << pname;
1194 namedParams["params[0]"] << params[0];
1196 mTexParameterTrace.PushCall("TexParameterfv", out.str(), namedParams);
1199 inline void TexParameteri(GLenum target, GLenum pname, GLint param) override
1201 std::stringstream out;
1202 out << std::hex << target << ", " << pname << ", " << param;
1203 std::string params = out.str();
1205 TraceCallStack::NamedParams namedParams;
1206 namedParams["target"] << std::hex << target;
1207 namedParams["pname"] << std::hex << pname;
1208 namedParams["param"] << param;
1209 mTexParameterTrace.PushCall("TexParameteri", params, namedParams);
1212 inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params) override
1214 std::stringstream out;
1215 out << target << ", " << pname << ", " << params[0];
1216 TraceCallStack::NamedParams namedParams;
1217 namedParams["target"] << std::hex << target;
1218 namedParams["pname"] << std::hex << pname;
1219 namedParams["params[0]"] << params[0];
1220 mTexParameterTrace.PushCall("TexParameteriv", out.str(), namedParams);
1223 inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) override
1225 std::stringstream out;
1226 out << target << ", " << level << ", " << xoffset << ", " << yoffset << ", " << width << ", " << height;
1228 TraceCallStack::NamedParams namedParams;
1229 namedParams["target"] << std::hex << target;
1230 namedParams["level"] << level;
1231 namedParams["xoffset"] << xoffset;
1232 namedParams["yoffset"] << yoffset;
1233 namedParams["width"] << width;
1234 namedParams["height"] << height;
1235 mTextureTrace.PushCall("TexSubImage2D", out.str(), namedParams);
1238 inline void Uniform1f(GLint location, GLfloat value) override
1240 std::string params = std::to_string(value);
1241 AddUniformCallToTraceStack(location, params);
1243 if(!mProgramUniforms1f.SetUniformValue(mCurrentProgram, location, value))
1245 mGetErrorResult = GL_INVALID_OPERATION;
1249 inline void Uniform1fv(GLint location, GLsizei count, const GLfloat* v) override
1252 for(int i = 0; i < count; ++i)
1254 params = params + std::to_string(v[i]) + ",";
1257 AddUniformCallToTraceStack(location, params);
1259 for(int i = 0; i < count; ++i)
1261 if(!mProgramUniforms1f.SetUniformValue(mCurrentProgram, location, v[i]))
1263 mGetErrorResult = GL_INVALID_OPERATION;
1269 inline void Uniform1i(GLint location, GLint x) override
1271 std::string params = std::to_string(x);
1273 AddUniformCallToTraceStack(location, params);
1275 if(!mProgramUniforms1i.SetUniformValue(mCurrentProgram, location, x))
1277 mGetErrorResult = GL_INVALID_OPERATION;
1281 inline void Uniform1iv(GLint location, GLsizei count, const GLint* v) override
1283 std::ostringstream out;
1284 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1285 AddUniformCallToTraceStack(location, out.str());
1287 for(int i = 0; i < count; ++i)
1289 if(!mProgramUniforms1i.SetUniformValue(mCurrentProgram,
1293 mGetErrorResult = GL_INVALID_OPERATION;
1299 inline void Uniform2f(GLint location, GLfloat x, GLfloat y) override
1301 std::string params = std::to_string(x) + "," + std::to_string(y);
1302 AddUniformCallToTraceStack(location, params);
1304 if(!mProgramUniforms2f.SetUniformValue(mCurrentProgram,
1308 mGetErrorResult = GL_INVALID_OPERATION;
1312 inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) override
1314 std::ostringstream out;
1315 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1316 AddUniformCallToTraceStack(location, out.str());
1318 for(int i = 0; i < count; ++i)
1320 if(!mProgramUniforms2f.SetUniformValue(mCurrentProgram,
1322 Vector2(v[2 * i], v[2 * i + 1])))
1324 mGetErrorResult = GL_INVALID_OPERATION;
1330 inline void Uniform2i(GLint location, GLint x, GLint y) override
1332 std::string params = std::to_string(x) + "," + std::to_string(y);
1333 AddUniformCallToTraceStack(location, params);
1336 inline void Uniform2iv(GLint location, GLsizei count, const GLint* v) override
1338 std::ostringstream out;
1339 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1340 AddUniformCallToTraceStack(location, out.str());
1343 inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) override
1345 std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z);
1346 AddUniformCallToTraceStack(location, params);
1348 if(!mProgramUniforms3f.SetUniformValue(mCurrentProgram,
1352 mGetErrorResult = GL_INVALID_OPERATION;
1356 inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) override
1358 std::ostringstream out;
1359 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1360 AddUniformCallToTraceStack(location, out.str());
1362 for(int i = 0; i < count; ++i)
1364 if(!mProgramUniforms3f.SetUniformValue(
1367 Vector3(v[3 * i], v[3 * i + 1], v[3 * i + 2])))
1369 mGetErrorResult = GL_INVALID_OPERATION;
1375 inline void Uniform3i(GLint location, GLint x, GLint y, GLint z) override
1377 std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z);
1378 AddUniformCallToTraceStack(location, params);
1381 inline void Uniform3iv(GLint location, GLsizei count, const GLint* v) override
1383 std::ostringstream out;
1384 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1385 AddUniformCallToTraceStack(location, out.str());
1388 inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) override
1390 std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z) + "," + std::to_string(w);
1391 AddUniformCallToTraceStack(location, params);
1393 if(!mProgramUniforms4f.SetUniformValue(mCurrentProgram,
1395 Vector4(x, y, z, w)))
1397 mGetErrorResult = GL_INVALID_OPERATION;
1401 inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) override
1403 std::ostringstream out;
1404 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1405 AddUniformCallToTraceStack(location, out.str());
1407 for(int i = 0; i < count; ++i)
1409 if(!mProgramUniforms4f.SetUniformValue(
1412 Vector4(v[4 * i], v[4 * i + 1], v[4 * i + 2], v[4 * i + 3])))
1414 mGetErrorResult = GL_INVALID_OPERATION;
1420 inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) override
1422 std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z) + "," + std::to_string(w);
1423 AddUniformCallToTraceStack(location, params);
1426 inline void Uniform4iv(GLint location, GLsizei count, const GLint* v) override
1428 std::ostringstream out;
1429 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i];
1430 AddUniformCallToTraceStack(location, out.str());
1433 inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1435 std::ostringstream out;
1436 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i];
1437 AddUniformCallToTraceStack(location, out.str());
1440 inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1442 std::ostringstream out;
1443 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i];
1444 AddUniformCallToTraceStack(location, out.str());
1446 for(int i = 0; i < count; ++i)
1448 if(!mProgramUniformsMat3.SetUniformValue(
1451 Matrix3(value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8])))
1453 mGetErrorResult = GL_INVALID_OPERATION;
1459 inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1461 std::ostringstream out;
1462 for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i];
1463 AddUniformCallToTraceStack(location, out.str());
1465 for(int i = 0; i < count; ++i)
1467 if(!mProgramUniformsMat4.SetUniformValue(
1472 mGetErrorResult = GL_INVALID_OPERATION;
1478 inline void UseProgram(GLuint program) override
1480 mCurrentProgram = program;
1483 inline void ValidateProgram(GLuint program) override
1487 inline void VertexAttrib1f(GLuint indx, GLfloat x) override
1491 inline void VertexAttrib1fv(GLuint indx, const GLfloat* values) override
1495 inline void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) override
1499 inline void VertexAttrib2fv(GLuint indx, const GLfloat* values) override
1503 inline void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) override
1507 inline void VertexAttrib3fv(GLuint indx, const GLfloat* values) override
1511 inline void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) override
1515 inline void VertexAttrib4fv(GLuint indx, const GLfloat* values) override
1519 inline void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) override
1521 TraceCallStack::NamedParams namedParams;
1522 namedParams["index"] << index;
1523 namedParams["size"] << size;
1524 namedParams["type"] << std::hex << type;
1525 namedParams["normalized"] << (normalized ? "T" : "F");
1526 namedParams["stride"] << stride;
1527 namedParams["offset"] << std::to_string(reinterpret_cast<unsigned long>(ptr));
1529 mBufferTrace.PushCall("VertexAttribPointer", namedParams.str(), namedParams);
1532 inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) override
1534 std::string commaString(", ");
1535 std::string params(std::to_string(x) + commaString + std::to_string(y) + commaString + std::to_string(width) + commaString + std::to_string(height));
1537 mViewportTrace.PushCall("Viewport", params);
1542 inline void ReadBuffer(GLenum mode) override
1546 inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices) override
1550 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
1554 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
1558 inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) override
1562 inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data) override
1566 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
1570 inline void GenQueries(GLsizei n, GLuint* ids) override
1574 inline void DeleteQueries(GLsizei n, const GLuint* ids) override
1578 inline GLboolean IsQuery(GLuint id) override
1583 inline void BeginQuery(GLenum target, GLuint id) override
1587 inline void EndQuery(GLenum target) override
1591 inline void GetQueryiv(GLenum target, GLenum pname, GLint* params) override
1595 inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params) override
1599 inline GLboolean UnmapBuffer(GLenum target) override
1603 free(mMappedBuffer);
1604 mMappedBuffer = nullptr;
1606 return true; // false indicates corruption, nothing else.
1609 inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params) override
1613 inline void DrawBuffers(GLsizei n, const GLenum* bufs) override
1617 inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1621 inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1625 inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1629 inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1633 inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1637 inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override
1641 inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) override
1645 inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) override
1649 inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) override
1653 inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) override
1655 mMappedBuffer = reinterpret_cast<GLvoid*>(malloc(offset + length));
1656 return mMappedBuffer;
1659 inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) override
1663 inline void BindVertexArray(GLuint array) override
1667 inline void DeleteVertexArrays(GLsizei n, const GLuint* arrays) override
1671 inline void GenVertexArrays(GLsizei n, GLuint* arrays) override
1675 inline GLboolean IsVertexArray(GLuint array) override
1680 inline void GetIntegeri_v(GLenum target, GLuint index, GLint* data) override
1684 inline void BeginTransformFeedback(GLenum primitiveMode) override
1688 inline void EndTransformFeedback(void) override
1692 inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) override
1696 inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer) override
1700 inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode) override
1704 inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) override
1708 inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) override
1712 inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params) override
1716 inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params) override
1720 inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w) override
1724 inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) override
1728 inline void VertexAttribI4iv(GLuint index, const GLint* v) override
1732 inline void VertexAttribI4uiv(GLuint index, const GLuint* v) override
1736 inline void GetUniformuiv(GLuint program, GLint location, GLuint* params) override
1740 inline GLint GetFragDataLocation(GLuint program, const GLchar* name) override
1745 inline void Uniform1ui(GLint location, GLuint v0) override
1749 inline void Uniform2ui(GLint location, GLuint v0, GLuint v1) override
1753 inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) override
1757 inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) override
1761 inline void Uniform1uiv(GLint location, GLsizei count, const GLuint* value) override
1765 inline void Uniform2uiv(GLint location, GLsizei count, const GLuint* value) override
1769 inline void Uniform3uiv(GLint location, GLsizei count, const GLuint* value) override
1773 inline void Uniform4uiv(GLint location, GLsizei count, const GLuint* value) override
1777 inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value) override
1781 inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value) override
1785 inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value) override
1789 inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) override
1793 inline const GLubyte* GetStringi(GLenum name, GLuint index) override
1798 inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) override
1802 inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices) override
1806 inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params) override
1810 inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName) override
1812 return GL_INVALID_INDEX;
1815 inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) override
1819 inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName) override
1823 inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) override
1827 inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount) override
1831 inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount) override
1835 inline GLsync FenceSync(GLenum condition, GLbitfield flags) override
1840 inline GLboolean IsSync(GLsync sync) override
1845 inline void DeleteSync(GLsync sync) override
1849 inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) override
1854 inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) override
1858 inline void GetInteger64v(GLenum pname, GLint64* params) override
1862 inline void GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) override
1866 inline void GetInteger64i_v(GLenum target, GLuint index, GLint64* data) override
1870 inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params) override
1874 inline void GenSamplers(GLsizei count, GLuint* samplers) override
1878 inline void DeleteSamplers(GLsizei count, const GLuint* samplers) override
1882 inline GLboolean IsSampler(GLuint sampler) override
1887 inline void BindSampler(GLuint unit, GLuint sampler) override
1891 inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param) override
1895 inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param) override
1899 inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) override
1903 inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param) override
1907 inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) override
1911 inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) override
1915 inline void VertexAttribDivisor(GLuint index, GLuint divisor) override
1919 inline void BindTransformFeedback(GLenum target, GLuint id) override
1923 inline void DeleteTransformFeedbacks(GLsizei n, const GLuint* ids) override
1927 inline void GenTransformFeedbacks(GLsizei n, GLuint* ids) override
1931 inline GLboolean IsTransformFeedback(GLuint id) override
1936 inline void PauseTransformFeedback(void) override
1940 inline void ResumeTransformFeedback(void) override
1944 inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary) override
1946 mGetProgramBinaryCalled = true;
1949 inline void ProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length) override
1953 inline void ProgramParameteri(GLuint program, GLenum pname, GLint value) override
1957 inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments) override
1961 inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height) override
1965 inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) override
1969 inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) override
1973 inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params) override
1977 inline void BlendBarrier(void)
1982 inline void AddUniformCallToTraceStack(GLint location, const std::string& value)
1984 std::string name = "<not found>";
1985 bool matched = false;
1987 UniformIDMap& map = mUniforms[mCurrentProgram];
1988 for(UniformIDMap::iterator it = map.begin(); it != map.end(); ++it)
1990 if(it->second == location)
2000 mSetUniformTrace.PushCall(name, value);
2004 public: // TEST FUNCTIONS
2005 inline void SetCompileStatus(GLuint value)
2007 mCompileStatus = value;
2009 inline void SetLinkStatus(GLuint value)
2011 mLinkStatus = value;
2013 inline void SetAttribLocations(std::vector<std::string> locs)
2017 inline void SetGetErrorResult(GLenum result)
2019 mGetErrorResult = result;
2021 inline void SetGetStringResult(GLubyte* result)
2023 mGetStringResult = result;
2025 inline void SetIsBufferResult(GLboolean result)
2027 mIsBufferResult = result;
2029 inline void SetIsEnabledResult(GLboolean result)
2031 mIsEnabledResult = result;
2033 inline void SetIsFramebufferResult(GLboolean result)
2035 mIsFramebufferResult = result;
2037 inline void SetIsProgramResult(GLboolean result)
2039 mIsProgramResult = result;
2041 inline void SetIsRenderbufferResult(GLboolean result)
2043 mIsRenderbufferResult = result;
2045 inline void SetIsShaderResult(GLboolean result)
2047 mIsShaderResult = result;
2049 inline void SetIsTextureResult(GLboolean result)
2051 mIsTextureResult = result;
2053 inline void SetCheckFramebufferStatusResult(GLenum result)
2055 mCheckFramebufferStatusResult = result;
2057 inline void SetNumBinaryFormats(GLint numFormats)
2059 mNumBinaryFormats = numFormats;
2061 inline void SetBinaryFormats(GLint binaryFormats)
2063 mBinaryFormats = binaryFormats;
2065 inline void SetProgramBinaryLength(GLint length)
2067 mProgramBinaryLength = length;
2070 inline bool GetVertexAttribArrayState(GLuint index)
2072 if(index >= MAX_ATTRIBUTE_CACHE_SIZE)
2077 return mVertexAttribArrayState[index];
2079 inline void ClearVertexAttribArrayChanged()
2081 mVertexAttribArrayChanged = false;
2083 inline bool GetVertexAttribArrayChanged()
2085 return mVertexAttribArrayChanged;
2088 //Methods for CullFace verification
2089 inline void EnableCullFaceCallTrace(bool enable)
2091 mCullFaceTrace.Enable(enable);
2093 inline void ResetCullFaceCallStack()
2095 mCullFaceTrace.Reset();
2097 inline TraceCallStack& GetCullFaceTrace()
2099 return mCullFaceTrace;
2102 //Methods for Enable/Disable call verification
2103 inline void EnableEnableDisableCallTrace(bool enable)
2105 mEnableDisableTrace.Enable(enable);
2107 inline void ResetEnableDisableCallStack()
2109 mEnableDisableTrace.Reset();
2111 inline TraceCallStack& GetEnableDisableTrace()
2113 return mEnableDisableTrace;
2116 //Methods for Shader verification
2117 inline void EnableShaderCallTrace(bool enable)
2119 mShaderTrace.Enable(enable);
2121 inline void ResetShaderCallStack()
2123 mShaderTrace.Reset();
2125 inline TraceCallStack& GetShaderTrace()
2127 return mShaderTrace;
2130 //Methods for Texture verification
2131 inline void EnableTextureCallTrace(bool enable)
2133 mTextureTrace.Enable(enable);
2135 inline void ResetTextureCallStack()
2137 mTextureTrace.Reset();
2139 inline TraceCallStack& GetTextureTrace()
2141 return mTextureTrace;
2144 //Methods for Texture verification
2145 inline void EnableTexParameterCallTrace(bool enable)
2147 mTexParameterTrace.Enable(enable);
2149 inline void ResetTexParameterCallStack()
2151 mTexParameterTrace.Reset();
2153 inline TraceCallStack& GetTexParameterTrace()
2155 return mTexParameterTrace;
2158 //Methods for Draw verification
2159 inline void EnableDrawCallTrace(bool enable)
2161 mDrawTrace.Enable(enable);
2163 inline void ResetDrawCallStack()
2167 inline TraceCallStack& GetDrawTrace()
2172 //Methods for Depth function verification
2173 inline void EnableDepthFunctionCallTrace(bool enable)
2175 mDepthFunctionTrace.Enable(enable);
2177 inline void ResetDepthFunctionCallStack()
2179 mDepthFunctionTrace.Reset();
2181 inline TraceCallStack& GetDepthFunctionTrace()
2183 return mDepthFunctionTrace;
2186 //Methods for Stencil function verification
2187 inline void EnableStencilFunctionCallTrace(bool enable)
2189 mStencilFunctionTrace.Enable(enable);
2191 inline void ResetStencilFunctionCallStack()
2193 mStencilFunctionTrace.Reset();
2195 inline TraceCallStack& GetStencilFunctionTrace()
2197 return mStencilFunctionTrace;
2200 //Methods for Scissor verification
2201 inline void EnableScissorCallTrace(bool enable)
2203 mScissorTrace.Enable(enable);
2205 inline void ResetScissorCallStack()
2207 mScissorTrace.Reset();
2209 inline TraceCallStack& GetScissorTrace()
2211 return mScissorTrace;
2214 //Methods for Uniform function verification
2215 inline void EnableSetUniformCallTrace(bool enable)
2217 mSetUniformTrace.Enable(enable);
2219 inline void ResetSetUniformCallStack()
2221 mSetUniformTrace.Reset();
2223 inline TraceCallStack& GetSetUniformTrace()
2225 return mSetUniformTrace;
2228 //Methods for Viewport verification
2229 inline void EnableViewportCallTrace(bool enable)
2231 mViewportTrace.Enable(enable);
2233 inline void ResetViewportCallStack()
2235 mViewportTrace.Reset();
2237 inline TraceCallStack& GetViewportTrace()
2239 return mViewportTrace;
2241 inline TraceCallStack& GetBufferTrace()
2243 return mBufferTrace;
2246 template<typename T>
2247 inline bool GetUniformValue(const char* name, T& value) const
2249 for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2250 program_it != mUniforms.end();
2253 const UniformIDMap& uniformIDs = program_it->second;
2255 UniformIDMap::const_iterator uniform_it = uniformIDs.find(name);
2256 if(uniform_it != uniformIDs.end())
2258 // found one matching uniform name, lets check the value...
2259 GLuint programId = program_it->first;
2260 GLint uniformId = uniform_it->second;
2262 const ProgramUniformValue<T>& mProgramUniforms = GetProgramUniformsForType(value);
2263 return mProgramUniforms.GetUniformValue(programId, uniformId, value);
2269 template<typename T>
2270 inline bool CheckUniformValue(const char* name, const T& value) const
2272 for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2273 program_it != mUniforms.end();
2276 const UniformIDMap& uniformIDs = program_it->second;
2278 UniformIDMap::const_iterator uniform_it = uniformIDs.find(name);
2279 if(uniform_it != uniformIDs.end())
2281 // found one matching uniform name, lets check the value...
2282 GLuint programId = program_it->first;
2283 GLint uniformId = uniform_it->second;
2285 const ProgramUniformValue<T>& mProgramUniforms = GetProgramUniformsForType(value);
2286 if(mProgramUniforms.CheckUniformValue(programId, uniformId, value))
2288 // the value matches
2294 fprintf(stderr, "Not found, printing possible values:\n");
2295 for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2296 program_it != mUniforms.end();
2299 const UniformIDMap& uniformIDs = program_it->second;
2301 UniformIDMap::const_iterator uniform_it = uniformIDs.find(name);
2302 if(uniform_it != uniformIDs.end())
2304 // found one matching uniform name, lets check the value...
2305 GLuint programId = program_it->first;
2306 GLint uniformId = uniform_it->second;
2308 const ProgramUniformValue<T>& mProgramUniforms = GetProgramUniformsForType(value);
2310 if(mProgramUniforms.GetUniformValue(programId, uniformId, origValue))
2312 std::stringstream out;
2313 out << uniform_it->first << ": " << origValue;
2314 fprintf(stderr, "%s\n", out.str().c_str());
2321 template<typename T>
2322 inline bool GetUniformValue(GLuint programId, GLuint uniformId, T& outValue) const
2324 const ProgramUniformValue<T>& mProgramUniforms = GetProgramUniformsForType(outValue);
2325 return mProgramUniforms.GetUniformValue(programId, uniformId, outValue);
2328 inline bool GetUniformIds(const char* name, GLuint& programId, GLuint& uniformId) const
2330 for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
2331 program_it != mUniforms.end();
2334 const UniformIDMap& uniformIDs = program_it->second;
2336 UniformIDMap::const_iterator uniform_it = uniformIDs.find(name);
2337 if(uniform_it != uniformIDs.end())
2339 programId = program_it->first;
2340 uniformId = uniform_it->second;
2347 inline GLuint GetLastShaderCompiled() const
2349 return mLastShaderCompiled;
2352 inline GLuint GetLastProgramCreated() const
2354 return mLastProgramIdUsed;
2357 inline GLbitfield GetLastClearMask() const
2359 return mLastClearBitMask;
2364 ATTRIB_UNKNOWN = -1,
2369 ATTRIB_BONE_WEIGHTS,
2370 ATTRIB_BONE_INDICES,
2374 struct ScissorParams
2390 // Methods to check scissor tests
2391 inline const ScissorParams& GetScissorParams() const
2393 return mScissorParams;
2396 struct ColorMaskParams
2412 inline bool GetProgramBinaryCalled() const
2414 return mGetProgramBinaryCalled;
2417 inline unsigned int GetClearCountCalled() const
2422 inline const ColorMaskParams& GetColorMaskParams() const
2424 return mColorMaskParams;
2427 typedef std::vector<size_t> BufferDataCalls;
2428 inline const BufferDataCalls& GetBufferDataCalls() const
2430 return mBufferDataCalls;
2432 inline void ResetBufferDataCalls()
2434 mBufferDataCalls.clear();
2437 typedef std::vector<size_t> BufferSubDataCalls;
2438 inline const BufferSubDataCalls& GetBufferSubDataCalls() const
2440 return mBufferSubDataCalls;
2442 inline void ResetBufferSubDataCalls()
2444 mBufferSubDataCalls.clear();
2448 GLuint mCurrentProgram;
2449 GLuint mCompileStatus;
2450 BufferDataCalls mBufferDataCalls;
2451 BufferSubDataCalls mBufferSubDataCalls;
2452 GLvoid* mMappedBuffer{nullptr};
2454 GLint mNumberOfActiveUniforms;
2455 GLenum mGetErrorResult;
2456 GLubyte* mGetStringResult;
2457 GLboolean mIsBufferResult;
2458 GLboolean mIsEnabledResult;
2459 GLboolean mIsFramebufferResult;
2460 GLboolean mIsProgramResult;
2461 GLboolean mIsRenderbufferResult;
2462 GLboolean mIsShaderResult;
2463 GLboolean mIsTextureResult;
2464 GLenum mActiveTextureUnit;
2465 GLenum mCheckFramebufferStatusResult;
2466 GLint mFramebufferStatus;
2467 GLenum mFramebufferDepthAttached;
2468 GLenum mFramebufferStencilAttached;
2469 GLuint mFramebufferColorAttachmentCount;
2470 GLuint mFrameBufferColorStatus;
2471 GLint mNumBinaryFormats;
2472 GLint mBinaryFormats;
2473 GLint mProgramBinaryLength;
2474 bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE];
2475 bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed
2476 bool mGetProgramBinaryCalled;
2477 typedef std::map<GLuint, std::string> ShaderSourceMap;
2478 ShaderSourceMap mShaderSources;
2479 std::vector<std::string> mAttribLocs; // should be bound to shader
2480 GLuint mLastShaderCompiled;
2481 GLbitfield mLastClearBitMask;
2482 Vector4 mLastClearColor;
2483 unsigned int mClearCount;
2485 Vector4 mLastBlendColor;
2486 GLenum mLastBlendEquationRgb;
2487 GLenum mLastBlendEquationAlpha;
2488 GLenum mLastBlendFuncSrcRgb;
2489 GLenum mLastBlendFuncDstRgb;
2490 GLenum mLastBlendFuncSrcAlpha;
2491 GLenum mLastBlendFuncDstAlpha;
2493 GLboolean mLastDepthMask;
2495 // Data for manipulating the IDs returned by GenTextures
2496 GLuint mLastAutoTextureIdUsed;
2497 GLuint mNumGeneratedTextures;
2498 std::vector<GLuint> mNextTextureIds;
2499 std::vector<GLuint> mDeletedTextureIds;
2500 std::vector<GLuint> mBoundTextures;
2502 struct ActiveTextureType
2504 std::vector<GLuint> mBoundTextures;
2507 ActiveTextureType mActiveTextures[MIN_TEXTURE_UNIT_LIMIT];
2509 TraceCallStack mBufferTrace;
2510 TraceCallStack mCullFaceTrace;
2511 TraceCallStack mEnableDisableTrace;
2512 TraceCallStack mShaderTrace;
2513 TraceCallStack mTextureTrace;
2514 TraceCallStack mTexParameterTrace;
2515 TraceCallStack mDrawTrace;
2516 TraceCallStack mDepthFunctionTrace;
2517 TraceCallStack mStencilFunctionTrace;
2518 TraceCallStack mScissorTrace;
2519 TraceCallStack mSetUniformTrace;
2520 TraceCallStack mViewportTrace;
2522 // Shaders & Uniforms
2523 GLuint mLastShaderIdUsed;
2524 GLuint mLastProgramIdUsed{0u};
2525 GLuint mLastUniformIdUsed;
2526 typedef std::map<std::string, GLint> UniformIDMap;
2527 typedef std::map<GLuint, UniformIDMap> ProgramUniformMap;
2528 ProgramUniformMap mUniforms;
2530 template<typename T>
2531 struct ProgramUniformValue : public std::map<GLuint, std::map<GLint, T> >
2534 typedef std::map<GLint, T> UniformValueMap;
2535 typedef std::map<GLuint, UniformValueMap> Map;
2537 bool SetUniformValue(GLuint program, GLuint uniform, const T& value)
2544 typename Map::iterator it = Map::find(program);
2545 if(it == Map::end())
2547 // if its the first uniform for this program add it
2548 std::pair<typename Map::iterator, bool> result =
2549 Map::insert(typename Map::value_type(program, UniformValueMap()));
2553 UniformValueMap& uniforms = it->second;
2554 uniforms[uniform] = value;
2559 bool CheckUniformValue(GLuint program, GLuint uniform, const T& value) const
2562 if(GetUniformValue(program, uniform, uniformValue))
2564 return CompareType<T>(value, uniformValue, Math::MACHINE_EPSILON_10);
2570 bool GetUniformValue(GLuint program, GLuint uniform, T& value) const
2577 typename Map::const_iterator it = Map::find(program);
2578 if(it == Map::end())
2580 // Uniform values always initialised as 0
2585 const UniformValueMap& uniforms = it->second;
2586 typename UniformValueMap::const_iterator it2 = uniforms.find(uniform);
2587 if(it2 == uniforms.end())
2589 // Uniform values always initialised as 0
2593 value = it2->second;
2600 ProgramUniformValue<int> mProgramUniforms1i;
2601 ProgramUniformValue<float> mProgramUniforms1f;
2602 ProgramUniformValue<Vector2> mProgramUniforms2f;
2603 ProgramUniformValue<Vector3> mProgramUniforms3f;
2604 ProgramUniformValue<Vector4> mProgramUniforms4f;
2605 ProgramUniformValue<Matrix> mProgramUniformsMat4;
2606 ProgramUniformValue<Matrix3> mProgramUniformsMat3;
2608 inline const ProgramUniformValue<int>& GetProgramUniformsForType(const int) const
2610 return mProgramUniforms1i;
2612 inline const ProgramUniformValue<float>& GetProgramUniformsForType(const float) const
2614 return mProgramUniforms1f;
2616 inline const ProgramUniformValue<Vector2>& GetProgramUniformsForType(const Vector2&) const
2618 return mProgramUniforms2f;
2620 inline const ProgramUniformValue<Vector3>& GetProgramUniformsForType(const Vector3&) const
2622 return mProgramUniforms3f;
2624 inline const ProgramUniformValue<Vector4>& GetProgramUniformsForType(const Vector4&) const
2626 return mProgramUniforms4f;
2628 inline const ProgramUniformValue<Matrix>& GetProgramUniformsForType(const Matrix&) const
2630 return mProgramUniformsMat4;
2632 inline const ProgramUniformValue<Matrix3>& GetProgramUniformsForType(const Matrix3&) const
2634 return mProgramUniformsMat3;
2636 inline void SetVertexAttribArray(GLuint index, bool state)
2638 if(index >= MAX_ATTRIBUTE_CACHE_SIZE)
2643 mVertexAttribArrayState[index] = state;
2644 mVertexAttribArrayChanged = true;
2647 ScissorParams mScissorParams;
2648 ColorMaskParams mColorMaskParams;
2652 inline int TestGlAbstraction::ProgramUniformValue<int>::GetZero() const
2658 inline float TestGlAbstraction::ProgramUniformValue<float>::GetZero() const
2664 inline Vector2 TestGlAbstraction::ProgramUniformValue<Vector2>::GetZero() const
2666 return Vector2::ZERO;
2670 inline Vector3 TestGlAbstraction::ProgramUniformValue<Vector3>::GetZero() const
2672 return Vector3::ZERO;
2676 inline Vector4 TestGlAbstraction::ProgramUniformValue<Vector4>::GetZero() const
2678 return Vector4::ZERO;
2682 inline Matrix TestGlAbstraction::ProgramUniformValue<Matrix>::GetZero() const
2688 inline Matrix3 TestGlAbstraction::ProgramUniformValue<Matrix3>::GetZero() const
2690 return Matrix3(Matrix());
2695 bool BlendEnabled(const Dali::TraceCallStack& callStack);
2696 bool BlendDisabled(const Dali::TraceCallStack& callStack);
2698 #endif // TEST_GL_ABSTRACTION_H