X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Fdali-toolkit-test-utils%2Ftest-gl-abstraction.h;h=a70c21f40c50941975feeb75cb4aa03dbf9252fc;hb=HEAD;hp=99dca10ead056eb7c4f925095327a281bfb84acc;hpb=893ec494389e7fe476a64e220ae97eedb73e74d7;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-gl-abstraction.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-gl-abstraction.h index 99dca10..a70c21f 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-gl-abstraction.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-gl-abstraction.h @@ -2,7 +2,7 @@ #define TEST_GL_ABSTRACTION_H /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,20 +38,30 @@ namespace Dali { -static const unsigned int MAX_ATTRIBUTE_CACHE_SIZE = 64; -static const char* mStdAttribs[MAX_ATTRIBUTE_CACHE_SIZE] = - { - "aPosition", // ATTRIB_POSITION - "aNormal", // ATTRIB_NORMAL - "aTexCoord", // ATTRIB_TEXCOORD - "aColor", // ATTRIB_COLOR - "aBoneWeights", // ATTRIB_BONE_WEIGHTS - "aBoneIndices" // ATTRIB_BONE_INDICES +struct UniformData +{ + std::string name; + Property::Type type; + UniformData(const std::string& name, Property::Type type = Property::Type::NONE) + : name(name), + type(type) + { + } +}; + +struct ActiveUniform +{ + std::string name{}; + GLenum type{GL_FLOAT}; + GLint size{0}; + GLint offset{0}; }; class DALI_CORE_API TestGlAbstraction : public Dali::Integration::GlAbstraction { public: + static const int MAX_ATTRIBUTE_CACHE_SIZE{64}; + TestGlAbstraction(); ~TestGlAbstraction() override; void Initialize(); @@ -61,6 +71,20 @@ public: bool IsSurfacelessContextSupported() const override; + bool IsAdvancedBlendEquationSupported() override; + + bool IsMultisampledRenderToTextureSupported() override; + + bool IsBlendEquationSupported(DevelBlendEquation::Type blendEquation) override; + + uint32_t GetShaderLanguageVersion(); + + std::string GetShaderVersionPrefix(); + + std::string GetVertexShaderPrefix(); + + std::string GetFragmentShaderPrefix(); + bool TextureRequiresConverting(const GLenum imageGlFormat, const GLenum textureGlFormat, const bool isSubImage) const override; /* OpenGL ES 2.0 */ @@ -81,8 +105,8 @@ public: out << program << ", " << shader; TraceCallStack::NamedParams namedParams; - namedParams["program"] = ToString(program); - namedParams["shader"] = ToString(shader); + namedParams["program"] << program; + namedParams["shader"] << shader; mShaderTrace.PushCall("AttachShader", out.str(), namedParams); } @@ -92,6 +116,12 @@ public: inline void BindBuffer(GLenum target, GLuint buffer) override { + std::ostringstream o; + o << std::hex << target << ", " << buffer; + TraceCallStack::NamedParams namedParams; + namedParams["target"] << target; + namedParams["buffer"] << buffer; + mBufferTrace.PushCall("BindBuffer", o.str(), namedParams); } inline void BindFramebuffer(GLenum target, GLuint framebuffer) override @@ -150,11 +180,11 @@ public: } std::stringstream out; - out << target << ", " << texture; + out << std::hex << target << ", " << std::dec << texture; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["texture"] = ToString(texture); + namedParams["target"] << std::hex << target; + namedParams["texture"] << texture; mTextureTrace.PushCall("BindTexture", out.str(), namedParams); } @@ -232,11 +262,28 @@ public: inline void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) override { + std::ostringstream o; + o << std::hex << target << ", " << size << ", " << data << ", " << usage; + TraceCallStack::NamedParams namedParams; + namedParams["target"] << std::hex << target; + namedParams["size"] << size; + namedParams["usage"] << usage; + + mBufferTrace.PushCall("BufferData", o.str(), namedParams); + mBufferDataCalls.push_back(size); } inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) override { + std::ostringstream o; + o << std::hex << target << ", " << offset << ", " << size << ", " << data; + TraceCallStack::NamedParams namedParams; + namedParams["target"] << std::hex << target; + namedParams["offset"] << offset; + namedParams["size"] << size; + mBufferTrace.PushCall("BufferSubData", o.str()); + mBufferSubDataCalls.push_back(size); } @@ -257,6 +304,21 @@ public: return mFramebufferColorAttachmentCount; } + inline GLuint CheckFramebufferDepthAttachmentCount() + { + return mFramebufferDepthAttachmentCount; + } + + inline GLuint CheckFramebufferStencilAttachmentCount() + { + return mFramebufferStencilAttachmentCount; + } + + inline GLuint CheckFramebufferDepthStencilAttachmentCount() + { + return mFramebufferDepthStencilAttachmentCount; + } + inline GLenum CheckFramebufferDepthAttachment() { return mFramebufferDepthAttached; @@ -267,6 +329,11 @@ public: return mFramebufferStencilAttached; } + inline GLenum CheckFramebufferDepthStencilAttachment() + { + return mFramebufferDepthStencilAttached; + } + inline void Clear(GLbitfield mask) override { mClearCount++; @@ -296,7 +363,7 @@ public: out << s; TraceCallStack::NamedParams namedParams; - namedParams["s"] = ToString(s); + namedParams["s"] << s; mStencilFunctionTrace.PushCall("ClearStencil", out.str(), namedParams); } @@ -314,7 +381,7 @@ public: std::stringstream out; out << shader; TraceCallStack::NamedParams namedParams; - namedParams["shader"] = ToString(shader); + namedParams["shader"] << shader; mShaderTrace.PushCall("CompileShader", out.str(), namedParams); } @@ -325,13 +392,13 @@ public: out << target << ", " << level << ", " << width << ", " << height; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["level"] = ToString(level); - namedParams["internalformat"] = ToString(internalformat); - namedParams["width"] = ToString(width); - namedParams["height"] = ToString(height); - namedParams["border"] = ToString(border); - namedParams["size"] = ToString(imageSize); + namedParams["target"] << std::hex << target; + namedParams["level"] << level; + namedParams["internalformat"] << internalformat; + namedParams["width"] << width; + namedParams["height"] << height; + namedParams["border"] << border; + namedParams["size"] << imageSize; mTextureTrace.PushCall("CompressedTexImage2D", out.str(), namedParams); } @@ -342,12 +409,12 @@ public: out << target << ", " << level << ", " << xoffset << ", " << yoffset << ", " << width << ", " << height; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["level"] = ToString(level); - namedParams["xoffset"] = ToString(xoffset); - namedParams["yoffset"] = ToString(yoffset); - namedParams["width"] = ToString(width); - namedParams["height"] = ToString(height); + namedParams["target"] << std::hex << target; + namedParams["level"] << level; + namedParams["xoffset"] << xoffset; + namedParams["yoffset"] << yoffset; + namedParams["width"] << width; + namedParams["height"] << height; mTextureTrace.PushCall("CompressedTexSubImage2D", out.str(), namedParams); } @@ -374,7 +441,7 @@ public: out << type; TraceCallStack::NamedParams namedParams; - namedParams["type"] = ToString(type); + namedParams["type"] << std::hex << type; mShaderTrace.PushCall("CreateShader", out.str(), namedParams); return ++mLastShaderIdUsed; @@ -383,16 +450,20 @@ public: inline void CullFace(GLenum mode) override { std::stringstream out; - out << mode; + out << std::hex << mode; TraceCallStack::NamedParams namedParams; - namedParams["program"] = ToString(mode); + namedParams["mode"] << std::hex << mode; mCullFaceTrace.PushCall("CullFace", out.str(), namedParams); } inline void DeleteBuffers(GLsizei n, const GLuint* buffers) override { + TraceCallStack::NamedParams namedParams; + namedParams["n"] << n; + namedParams["id"] << buffers[0]; + mBufferTrace.PushCall("DeleteBuffers", namedParams.str(), namedParams); } inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) override @@ -405,7 +476,7 @@ public: out << program; TraceCallStack::NamedParams namedParams; - namedParams["program"] = ToString(program); + namedParams["program"] << program; mShaderTrace.PushCall("DeleteProgram", out.str(), namedParams); } @@ -420,7 +491,7 @@ public: out << shader; TraceCallStack::NamedParams namedParams; - namedParams["shader"] = ToString(shader); + namedParams["shader"] << shader; mShaderTrace.PushCall("DeleteShader", out.str(), namedParams); } @@ -428,16 +499,16 @@ public: inline void DeleteTextures(GLsizei n, const GLuint* textures) override { std::stringstream out; - out << n << ", " << textures << " = ["; + out << "n:" << n << " textures["; TraceCallStack::NamedParams namedParams; for(GLsizei i = 0; i < n; i++) { - out << textures[i] << ", "; + out << (i > 0 ? ", " : "") << textures[i]; std::stringstream paramName; paramName << "texture[" << i << "]"; - namedParams[paramName.str()] = ToString(textures[i]); + namedParams[paramName.str()] << textures[i]; mDeletedTextureIds.push_back(textures[i]); mNumGeneratedTextures--; } @@ -474,10 +545,10 @@ public: inline void DepthFunc(GLenum func) override { std::stringstream out; - out << func; + out << std::hex << func; TraceCallStack::NamedParams namedParams; - namedParams["func"] = ToString(func); + namedParams["func"] << std::hex << func; mDepthFunctionTrace.PushCall("DepthFunc", out.str(), namedParams); } @@ -501,22 +572,27 @@ public: std::stringstream out; out << program << ", " << shader; TraceCallStack::NamedParams namedParams; - namedParams["program"] = ToString(program); - namedParams["shader"] = ToString(shader); + namedParams["program"] << program; + namedParams["shader"] << shader; mShaderTrace.PushCall("DetachShader", out.str(), namedParams); } inline void Disable(GLenum cap) override { std::stringstream out; - out << cap; + out << std::hex << cap; TraceCallStack::NamedParams namedParams; - namedParams["cap"] = ToString(cap); + namedParams["cap"] << std::hex << cap; mEnableDisableTrace.PushCall("Disable", out.str(), namedParams); } inline void DisableVertexAttribArray(GLuint index) override { + std::stringstream out; + out << index; + TraceCallStack::NamedParams namedParams; + namedParams["index"] << index; + mBufferTrace.PushCall("DisableVertexAttribArray", out.str(), namedParams); SetVertexAttribArray(index, false); } @@ -525,9 +601,9 @@ public: std::stringstream out; out << mode << ", " << first << ", " << count; TraceCallStack::NamedParams namedParams; - namedParams["mode"] = ToString(mode); - namedParams["first"] = ToString(first); - namedParams["count"] = ToString(count); + namedParams["mode"] << std::hex << mode; + namedParams["first"] << first; + namedParams["count"] << count; mDrawTrace.PushCall("DrawArrays", out.str(), namedParams); } @@ -537,9 +613,9 @@ public: out << mode << ", " << count << ", " << type << ", indices"; TraceCallStack::NamedParams namedParams; - namedParams["mode"] = ToString(mode); - namedParams["count"] = ToString(count); - namedParams["type"] = ToString(type); + namedParams["mode"] << std::hex << mode; + namedParams["count"] << count; + namedParams["type"] << type; // Skip void pointers - are they of any use? mDrawTrace.PushCall("DrawElements", out.str(), namedParams); } @@ -547,14 +623,19 @@ public: inline void Enable(GLenum cap) override { std::stringstream out; - out << cap; + out << std::hex << cap; TraceCallStack::NamedParams namedParams; - namedParams["cap"] = ToString(cap); + namedParams["cap"] << std::hex << cap; mEnableDisableTrace.PushCall("Enable", out.str(), namedParams); } inline void EnableVertexAttribArray(GLuint index) override { + std::stringstream out; + out << index; + TraceCallStack::NamedParams namedParams; + namedParams["index"] << index; + mBufferTrace.PushCall("EnableVertexAttribArray", out.str(), namedParams); SetVertexAttribArray(index, true); } @@ -576,6 +657,12 @@ public: { mFramebufferStencilAttached = true; } + else if(attachment == GL_DEPTH_STENCIL_ATTACHMENT) + { + mFramebufferStencilAttached = true; + mFramebufferDepthAttached = true; + mFramebufferDepthStencilAttached = true; + } } inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) override @@ -593,16 +680,45 @@ public: ++mFramebufferColorAttachmentCount; } } + else if(attachment == GL_DEPTH_ATTACHMENT) + { + ++mFramebufferDepthAttachmentCount; + } + else if(attachment == GL_STENCIL_ATTACHMENT) + { + ++mFramebufferStencilAttachmentCount; + } + else if(attachment == GL_DEPTH_STENCIL_ATTACHMENT) + { + ++mFramebufferDepthAttachmentCount; + ++mFramebufferStencilAttachmentCount; + ++mFramebufferDepthStencilAttachmentCount; + } } inline void FrontFace(GLenum mode) override { + // do nothing } inline void GenBuffers(GLsizei n, GLuint* buffers) override { // avoids an assert in GpuBuffers - *buffers = 1u; + static GLuint id = 1; + + TraceCallStack::NamedParams namedParams; + namedParams["n"] << n; + + // Allocate some buffer names + bool first = true; + while(n) + { + namedParams["buffers"] << (first ? "" : ", ") << id; + first = false; + *buffers++ = id++; + --n; + } + mBufferTrace.PushCall("GenBuffers", namedParams.str(), namedParams); } inline void GenerateMipmap(GLenum target) override @@ -610,7 +726,7 @@ public: std::stringstream out; out << target; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); + namedParams["target"] << std::hex << target; mTextureTrace.PushCall("GenerateMipmap", out.str(), namedParams); } @@ -665,7 +781,7 @@ public: } TraceCallStack::NamedParams namedParams; - namedParams["count"] = ToString(count); + namedParams["count"] << count; std::stringstream out; for(int i = 0; i < count; i++) @@ -677,7 +793,7 @@ public: } std::ostringstream oss; oss << "indices[" << i << "]"; - namedParams[oss.str()] = ToString(textures[i]); + namedParams[oss.str()] << textures[i]; } mTextureTrace.PushCall("GenTextures", out.str(), namedParams); @@ -695,29 +811,19 @@ public: inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) override { + strncpy(name, mAttribLocs[index].c_str(), 99); + *type = mAttribTypes[index]; } + void SetActiveUniforms(const std::vector& uniforms); + inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) override { - switch(index) + if(index < mActiveUniforms.size()) { - case 0: - *length = snprintf(name, bufsize, "sTexture"); - *type = GL_SAMPLER_2D; - *size = 1; - break; - case 1: - *length = snprintf(name, bufsize, "sEffect"); - *type = GL_SAMPLER_2D; - *size = 1; - break; - case 2: - *length = snprintf(name, bufsize, "sGloss"); - *type = GL_SAMPLER_2D; - *size = 1; - break; - default: - break; + *length = snprintf(name, bufsize, "%s", mActiveUniforms[index].name.c_str()); + *type = mActiveUniforms[index].type; + *size = mActiveUniforms[index].size; } } @@ -727,18 +833,11 @@ public: inline int GetAttribLocation(GLuint program, const char* name) override { - std::string attribName(name); - - for(unsigned int i = 0; i < ATTRIB_TYPE_LAST; ++i) - { - if(mStdAttribs[i] == attribName) - { - return i; - } - } - - // 0 is a valid location - return 0; + std::string check(name); + auto iter = std::find(mAttribLocs.begin(), mAttribLocs.end(), check); + if(iter == mAttribLocs.end()) + return -1; + return iter - mAttribLocs.begin(); } inline void GetBooleanv(GLenum pname, GLboolean* params) override @@ -778,6 +877,9 @@ public: case GL_PROGRAM_BINARY_FORMATS_OES: *params = mBinaryFormats; break; + case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: + *params = mUniformBufferOffsetAlignment; + break; } } @@ -792,11 +894,17 @@ public: *params = mProgramBinaryLength; break; case GL_ACTIVE_UNIFORMS: - *params = mNumberOfActiveUniforms; + *params = mActiveUniforms.size(); break; case GL_ACTIVE_UNIFORM_MAX_LENGTH: *params = 100; break; + case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: + *params = 100; + break; + case GL_ACTIVE_ATTRIBUTES: + *params = static_cast(mAttribLocs.size()); + break; } } @@ -863,7 +971,7 @@ public: { // Uniform not found, so add it... uniformIDs[name] = ++mLastUniformIdUsed; - return mLastUniformIdUsed; + return uniformIDs[name]; } return it2->second; @@ -930,13 +1038,66 @@ public: out << program; TraceCallStack::NamedParams namedParams; - namedParams["program"] = ToString(program); + namedParams["program"] << program; mShaderTrace.PushCall("LinkProgram", out.str(), namedParams); - mNumberOfActiveUniforms = 3; - GetUniformLocation(program, "sTexture"); - GetUniformLocation(program, "sEffect"); - GetUniformLocation(program, "sGloss"); + for(const auto& uniform : mActiveUniforms) + { + std::string name = uniform.name; + if(uniform.size <= 1) + { + GetUniformLocation(program, name.c_str()); + } + else + { + // Convert single active uniform from "uBlah[0]" or "uStruct[0].element" to N versions of the same + std::string suffix; + auto iter = name.find("["); // Search for index operator + if(iter != std::string::npos) + { + name = uniform.name.substr(0, iter); // Strip off index operator + iter = uniform.name.find("]"); + if(iter != std::string::npos && iter + 1 != uniform.name.length()) + { + suffix = uniform.name.substr(iter + 1); + } + } + for(int i = 0; i < uniform.size; ++i) + { + std::stringstream nss; + nss << name << "[" << i << "]" << suffix; + GetUniformLocation(program, nss.str().c_str()); // Generate N uniforms in the uniform map + } + } + } + + for(const auto& uniform : mCustomUniformData) + { + auto iter = uniform.name.find("["); + auto name = uniform.name; + if(iter != std::string::npos) + { + name = uniform.name.substr(0, iter); + auto arrayCount = std::stoi(uniform.name.substr(iter + 1)); + iter = uniform.name.find("]"); + std::string suffix; + if(iter != std::string::npos && iter + 1 != uniform.name.length()) + { + suffix = uniform.name.substr(iter + 1); // If there is a suffix, it means its an element of an array of struct + } + + for(int i = 0; i < arrayCount; ++i) + { + std::stringstream nss; + nss << name << "[" << i << "]" << suffix; + GetUniformLocation(program, nss.str().c_str()); // Generate a GL loc per element + } + } + else + { + GetUniformLocation(program, name.c_str()); + } + } } inline void PixelStorei(GLenum pname, GLint param) override @@ -973,10 +1134,10 @@ public: std::stringstream out; out << x << ", " << y << ", " << width << ", " << height; TraceCallStack::NamedParams namedParams; - namedParams["x"] = ToString(x); - namedParams["y"] = ToString(y); - namedParams["width"] = ToString(width); - namedParams["height"] = ToString(height); + namedParams["x"] << x; + namedParams["y"] << y; + namedParams["width"] << width; + namedParams["height"] << height; mScissorTrace.PushCall("Scissor", out.str(), namedParams); } @@ -1023,9 +1184,9 @@ public: out << func << ", " << ref << ", " << mask; TraceCallStack::NamedParams namedParams; - namedParams["func"] = ToString(func); - namedParams["ref"] = ToString(ref); - namedParams["mask"] = ToString(mask); + namedParams["func"] << std::hex << func; + namedParams["ref"] << ref; + namedParams["mask"] << mask; mStencilFunctionTrace.PushCall("StencilFunc", out.str(), namedParams); } @@ -1036,10 +1197,10 @@ public: out << face << ", " << func << ", " << ref << ", " << mask; TraceCallStack::NamedParams namedParams; - namedParams["face"] = ToString(face); - namedParams["func"] = ToString(func); - namedParams["ref"] = ToString(ref); - namedParams["mask"] = ToString(mask); + namedParams["face"] << std::hex << face; + namedParams["func"] << std::hex << func; + namedParams["ref"] << ref; + namedParams["mask"] << mask; mStencilFunctionTrace.PushCall("StencilFuncSeparate", out.str(), namedParams); } @@ -1050,7 +1211,7 @@ public: out << mask; TraceCallStack::NamedParams namedParams; - namedParams["mask"] = ToString(mask); + namedParams["mask"] << mask; mStencilFunctionTrace.PushCall("StencilMask", out.str(), namedParams); } @@ -1061,8 +1222,8 @@ public: out << face << ", " << mask; TraceCallStack::NamedParams namedParams; - namedParams["face"] = ToString(face); - namedParams["mask"] = ToString(mask); + namedParams["face"] << std::hex << face; + namedParams["mask"] << mask; mStencilFunctionTrace.PushCall("StencilMaskSeparate", out.str(), namedParams); } @@ -1073,9 +1234,9 @@ public: out << fail << ", " << zfail << ", " << zpass; TraceCallStack::NamedParams namedParams; - namedParams["fail"] = ToString(fail); - namedParams["zfail"] = ToString(zfail); - namedParams["zpass"] = ToString(zpass); + namedParams["fail"] << std::hex << fail; + namedParams["zfail"] << std::hex << zfail; + namedParams["zpass"] << std::hex << zpass; mStencilFunctionTrace.PushCall("StencilOp", out.str(), namedParams); } @@ -1086,10 +1247,10 @@ public: out << face << ", " << fail << ", " << zfail << "," << zpass; TraceCallStack::NamedParams namedParams; - namedParams["face"] = ToString(face); - namedParams["fail"] = ToString(fail); - namedParams["zfail"] = ToString(zfail); - namedParams["zpass"] = ToString(zpass); + namedParams["face"] << std::hex << face; + namedParams["fail"] << std::hex << fail; + namedParams["zfail"] << std::hex << zfail; + namedParams["zpass"] << std::hex << zpass; mStencilFunctionTrace.PushCall("StencilOpSeparate", out.str(), namedParams); } @@ -1100,14 +1261,14 @@ public: out << target << ", " << level << ", " << width << ", " << height; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["level"] = ToString(level); - namedParams["internalformat"] = ToString(internalformat); - namedParams["width"] = ToString(width); - namedParams["height"] = ToString(height); - namedParams["border"] = ToString(border); - namedParams["format"] = ToString(format); - namedParams["type"] = ToString(type); + namedParams["target"] << std::hex << target; + namedParams["level"] << level; + namedParams["internalformat"] << internalformat; + namedParams["width"] << width; + namedParams["height"] << height; + namedParams["border"] << border; + namedParams["format"] << std::hex << format; + namedParams["type"] << std::hex << type; mTextureTrace.PushCall("TexImage2D", out.str(), namedParams); } @@ -1118,11 +1279,11 @@ public: out << target << ", " << pname << ", " << param; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["pname"] = ToString(pname); - namedParams["param"] = ToString(param); + namedParams["target"] << std::hex << target; + namedParams["pname"] << std::hex << pname; + namedParams["param"] << param; - mTexParamaterTrace.PushCall("TexParameterf", out.str(), namedParams); + mTexParameterTrace.PushCall("TexParameterf", out.str(), namedParams); } inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params) override @@ -1131,22 +1292,24 @@ public: out << target << ", " << pname << ", " << params[0]; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["pname"] = ToString(pname); - namedParams["params[0]"] = ToString(params[0]); + namedParams["target"] << std::hex << target; + namedParams["pname"] << std::hex << pname; + namedParams["params[0]"] << params[0]; - mTexParamaterTrace.PushCall("TexParameterfv", out.str(), namedParams); + mTexParameterTrace.PushCall("TexParameterfv", out.str(), namedParams); } inline void TexParameteri(GLenum target, GLenum pname, GLint param) override { std::stringstream out; - out << target << ", " << pname << ", " << param; + out << std::hex << target << ", " << pname << ", " << param; + std::string params = out.str(); + TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["pname"] = ToString(pname); - namedParams["param"] = ToString(param); - mTexParamaterTrace.PushCall("TexParameteri", out.str(), namedParams); + namedParams["target"] << std::hex << target; + namedParams["pname"] << std::hex << pname; + namedParams["param"] << param; + mTexParameterTrace.PushCall("TexParameteri", params, namedParams); } inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params) override @@ -1154,10 +1317,10 @@ public: std::stringstream out; out << target << ", " << pname << ", " << params[0]; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["pname"] = ToString(pname); - namedParams["params[0]"] = ToString(params[0]); - mTexParamaterTrace.PushCall("TexParameteriv", out.str(), namedParams); + namedParams["target"] << std::hex << target; + namedParams["pname"] << std::hex << pname; + namedParams["params[0]"] << params[0]; + mTexParameterTrace.PushCall("TexParameteriv", out.str(), namedParams); } inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) override @@ -1166,18 +1329,18 @@ public: out << target << ", " << level << ", " << xoffset << ", " << yoffset << ", " << width << ", " << height; TraceCallStack::NamedParams namedParams; - namedParams["target"] = ToString(target); - namedParams["level"] = ToString(level); - namedParams["xoffset"] = ToString(xoffset); - namedParams["yoffset"] = ToString(yoffset); - namedParams["width"] = ToString(width); - namedParams["height"] = ToString(height); + namedParams["target"] << std::hex << target; + namedParams["level"] << level; + namedParams["xoffset"] << xoffset; + namedParams["yoffset"] << yoffset; + namedParams["width"] << width; + namedParams["height"] << height; mTextureTrace.PushCall("TexSubImage2D", out.str(), namedParams); } inline void Uniform1f(GLint location, GLfloat value) override { - std::string params = ToString(value); + std::string params = std::to_string(value); AddUniformCallToTraceStack(location, params); if(!mProgramUniforms1f.SetUniformValue(mCurrentProgram, location, value)) @@ -1191,7 +1354,7 @@ public: std::string params; for(int i = 0; i < count; ++i) { - params = params + ToString(v[i]) + ","; + params = params + std::to_string(v[i]) + ","; } AddUniformCallToTraceStack(location, params); @@ -1208,7 +1371,7 @@ public: inline void Uniform1i(GLint location, GLint x) override { - std::string params = ToString(x); + std::string params = std::to_string(x); AddUniformCallToTraceStack(location, params); @@ -1220,8 +1383,9 @@ public: inline void Uniform1iv(GLint location, GLsizei count, const GLint* v) override { - std::string params = ToString(v); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i]; + AddUniformCallToTraceStack(location, out.str()); for(int i = 0; i < count; ++i) { @@ -1237,7 +1401,7 @@ public: inline void Uniform2f(GLint location, GLfloat x, GLfloat y) override { - std::string params = ToString(x) + "," + ToString(y); + std::string params = std::to_string(x) + "," + std::to_string(y); AddUniformCallToTraceStack(location, params); if(!mProgramUniforms2f.SetUniformValue(mCurrentProgram, @@ -1250,8 +1414,9 @@ public: inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) override { - std::string params = ToString(v); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i]; + AddUniformCallToTraceStack(location, out.str()); for(int i = 0; i < count; ++i) { @@ -1267,19 +1432,20 @@ public: inline void Uniform2i(GLint location, GLint x, GLint y) override { - std::string params = ToString(x) + "," + ToString(y); + std::string params = std::to_string(x) + "," + std::to_string(y); AddUniformCallToTraceStack(location, params); } inline void Uniform2iv(GLint location, GLsizei count, const GLint* v) override { - std::string params = ToString(v); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i]; + AddUniformCallToTraceStack(location, out.str()); } inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) override { - std::string params = ToString(x) + "," + ToString(y) + "," + ToString(z); + std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z); AddUniformCallToTraceStack(location, params); if(!mProgramUniforms3f.SetUniformValue(mCurrentProgram, @@ -1292,8 +1458,9 @@ public: inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) override { - std::string params = ToString(v); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i]; + AddUniformCallToTraceStack(location, out.str()); for(int i = 0; i < count; ++i) { @@ -1310,19 +1477,20 @@ public: inline void Uniform3i(GLint location, GLint x, GLint y, GLint z) override { - std::string params = ToString(x) + "," + ToString(y) + "," + ToString(z); + std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z); AddUniformCallToTraceStack(location, params); } inline void Uniform3iv(GLint location, GLsizei count, const GLint* v) override { - std::string params = ToString(v); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i]; + AddUniformCallToTraceStack(location, out.str()); } inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) override { - std::string params = ToString(x) + "," + ToString(y) + "," + ToString(z) + "," + ToString(w); + std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z) + "," + std::to_string(w); AddUniformCallToTraceStack(location, params); if(!mProgramUniforms4f.SetUniformValue(mCurrentProgram, @@ -1335,8 +1503,9 @@ public: inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) override { - std::string params = ToString(v); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i]; + AddUniformCallToTraceStack(location, out.str()); for(int i = 0; i < count; ++i) { @@ -1353,26 +1522,29 @@ public: inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) override { - std::string params = ToString(x) + "," + ToString(y) + "," + ToString(z) + "," + ToString(w); + std::string params = std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z) + "," + std::to_string(w); AddUniformCallToTraceStack(location, params); } inline void Uniform4iv(GLint location, GLsizei count, const GLint* v) override { - std::string params = ToString(v); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << v[i]; + AddUniformCallToTraceStack(location, out.str()); } inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override { - std::string params = ToString(value); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i]; + AddUniformCallToTraceStack(location, out.str()); } inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override { - std::string params = ToString(value); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i]; + AddUniformCallToTraceStack(location, out.str()); for(int i = 0; i < count; ++i) { @@ -1389,8 +1561,9 @@ public: inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) override { - std::string params = ToString(value); - AddUniformCallToTraceStack(location, params); + std::ostringstream out; + for(GLsizei i = 0; i < count; ++i) out << (!i ? "" : ", ") << value[i]; + AddUniformCallToTraceStack(location, out.str()); for(int i = 0; i < count; ++i) { @@ -1446,8 +1619,29 @@ public: { } - inline void VertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) override + inline void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) override { + TraceCallStack::NamedParams namedParams; + namedParams["index"] << index; + namedParams["size"] << size; + namedParams["type"] << std::hex << type; + namedParams["normalized"] << (normalized ? "T" : "F"); + namedParams["stride"] << stride; + namedParams["offset"] << std::to_string(reinterpret_cast(ptr)); + + mBufferTrace.PushCall("VertexAttribPointer", namedParams.str(), namedParams); + } + + inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) override + { + TraceCallStack::NamedParams namedParams; + namedParams["index"] << index; + namedParams["size"] << size; + namedParams["type"] << std::hex << type; + namedParams["stride"] << stride; + namedParams["offset"] << std::to_string(reinterpret_cast(pointer)); + + mBufferTrace.PushCall("VertexAttribIPointer", namedParams.str(), namedParams); } inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) override @@ -1519,7 +1713,12 @@ public: inline GLboolean UnmapBuffer(GLenum target) override { - return false; + if(mMappedBuffer) + { + free(mMappedBuffer); + mMappedBuffer = nullptr; + } + return true; // false indicates corruption, nothing else. } inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params) override @@ -1562,13 +1761,20 @@ public: { } + inline void FramebufferTexture2DMultisample(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) override + { + // TODO : Check it if need + FramebufferTexture2D(target, attachment, textarget, texture, level); + } + inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) override { } inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) override { - return NULL; + mMappedBuffer = reinterpret_cast(malloc(offset + length)); + return mMappedBuffer; } inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) override @@ -1620,10 +1826,6 @@ public: { } - inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) override - { - } - inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params) override { } @@ -1720,6 +1922,44 @@ public: inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params) override { + for(int i = 0; i < uniformCount; ++i) + { + if(i < int(mActiveUniforms.size())) + { + switch(pname) + { + case GL_UNIFORM_TYPE: + { + params[i] = mActiveUniforms[i].type; + break; + } + case GL_UNIFORM_SIZE: + { + params[i] = mActiveUniforms[i].size; + break; + } + case GL_UNIFORM_NAME_LENGTH: + { + params[i] = mActiveUniforms[i].name.length(); + break; + } + case GL_UNIFORM_BLOCK_INDEX: + { + params[i] = -1; + break; + } + case GL_UNIFORM_OFFSET: + { + params[i] = mActiveUniforms[i].offset; + break; + } + case GL_UNIFORM_MATRIX_STRIDE: + { + break; + } + } + } + } } inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName) override @@ -1741,10 +1981,26 @@ public: inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount) override { + std::stringstream out; + out << mode << ", " << first << ", " << count << ", " << instanceCount; + TraceCallStack::NamedParams namedParams; + namedParams["mode"] << std::hex << mode; + namedParams["first"] << first; + namedParams["count"] << count; + namedParams["instanceCount"] << instanceCount; + mDrawTrace.PushCall("DrawArraysInstanced", out.str(), namedParams); } inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount) override { + std::stringstream out; + out << mode << ", " << count << ", " << type << ", " << instanceCount; + TraceCallStack::NamedParams namedParams; + namedParams["mode"] << std::hex << mode; + namedParams["count"] << count; + namedParams["type"] << std::hex << type; + namedParams["indexCount"] << instanceCount; + mDrawTrace.PushCall("DrawElementsInstanced", out.str(), namedParams); } inline GLsync FenceSync(GLenum condition, GLbitfield flags) override @@ -1829,6 +2085,12 @@ public: inline void VertexAttribDivisor(GLuint index, GLuint divisor) override { + std::stringstream out; + out << index << ", " << divisor; + TraceCallStack::NamedParams namedParams; + namedParams["index"] << index; + namedParams["divisor"] << divisor; + mBufferTrace.PushCall("VertexAttribDivisor", out.str(), namedParams); } inline void BindTransformFeedback(GLenum target, GLuint id) override @@ -1889,8 +2151,12 @@ public: { } + inline void BlendBarrier(void) + { + } + private: - inline void AddUniformCallToTraceStack(GLint location, std::string& value) + inline void AddUniformCallToTraceStack(GLint location, const std::string& value) { std::string name = ""; bool matched = false; @@ -1921,9 +2187,13 @@ public: // TEST FUNCTIONS { mLinkStatus = value; } - inline void SetGetAttribLocationResult(int result) + inline void SetAttribLocations(std::vector& locs) { - mGetAttribLocationResult = result; + mAttribLocs = locs; + } + inline void SetAttribTypes(std::vector& types) + { + mAttribTypes = types; } inline void SetGetErrorResult(GLenum result) { @@ -1977,7 +2247,10 @@ public: // TEST FUNCTIONS { mProgramBinaryLength = length; } - + inline void SetUniformBufferOffsetAlignment(GLint align) + { + mUniformBufferOffsetAlignment = align; + } inline bool GetVertexAttribArrayState(GLuint index) { if(index >= MAX_ATTRIBUTE_CACHE_SIZE) @@ -2055,15 +2328,15 @@ public: // TEST FUNCTIONS //Methods for Texture verification inline void EnableTexParameterCallTrace(bool enable) { - mTexParamaterTrace.Enable(enable); + mTexParameterTrace.Enable(enable); } inline void ResetTexParameterCallStack() { - mTexParamaterTrace.Reset(); + mTexParameterTrace.Reset(); } inline TraceCallStack& GetTexParameterTrace() { - return mTexParamaterTrace; + return mTexParameterTrace; } //Methods for Draw verification @@ -2149,6 +2422,10 @@ public: // TEST FUNCTIONS { return mViewportTrace; } + inline TraceCallStack& GetBufferTrace() + { + return mBufferTrace; + } template inline bool GetUniformValue(const char* name, T& value) const @@ -2198,7 +2475,7 @@ public: // TEST FUNCTIONS } } - fprintf(stderr, "Not found, printing possible values:\n"); + fprintf(stderr, "%s Not found, printing possible values:\n", name); for(ProgramUniformMap::const_iterator program_it = mUniforms.begin(); program_it != mUniforms.end(); ++program_it) @@ -2217,7 +2494,7 @@ public: // TEST FUNCTIONS if(mProgramUniforms.GetUniformValue(programId, uniformId, origValue)) { std::stringstream out; - out << uniform_it->first << ": " << origValue; + out << "Program: " << programId << ", " << uniform_it->first << ": " << origValue; fprintf(stderr, "%s\n", out.str().c_str()); } } @@ -2251,6 +2528,11 @@ public: // TEST FUNCTIONS return false; } + inline void SetCustomUniforms(std::vector& customUniformData) + { + mCustomUniformData = customUniformData; + } + inline GLuint GetLastShaderCompiled() const { return mLastShaderCompiled; @@ -2351,14 +2633,13 @@ public: // TEST FUNCTIONS mBufferSubDataCalls.clear(); } -private: +public: GLuint mCurrentProgram; GLuint mCompileStatus; BufferDataCalls mBufferDataCalls; BufferSubDataCalls mBufferSubDataCalls; + GLvoid* mMappedBuffer{nullptr}; GLuint mLinkStatus; - GLint mNumberOfActiveUniforms; - GLint mGetAttribLocationResult; GLenum mGetErrorResult; GLubyte* mGetStringResult; GLboolean mIsBufferResult; @@ -2373,16 +2654,23 @@ private: GLint mFramebufferStatus; GLenum mFramebufferDepthAttached; GLenum mFramebufferStencilAttached; + GLenum mFramebufferDepthStencilAttached; GLuint mFramebufferColorAttachmentCount; GLuint mFrameBufferColorStatus; + GLuint mFramebufferDepthAttachmentCount; + GLuint mFramebufferStencilAttachmentCount; + GLuint mFramebufferDepthStencilAttachmentCount; GLint mNumBinaryFormats; GLint mBinaryFormats; GLint mProgramBinaryLength; + GLint mUniformBufferOffsetAlignment{1}; bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE]; bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed bool mGetProgramBinaryCalled; typedef std::map ShaderSourceMap; ShaderSourceMap mShaderSources; + std::vector mAttribLocs; // should be bound to shader + std::vector mAttribTypes; // should be bound to shader GLuint mLastShaderCompiled; GLbitfield mLastClearBitMask; Vector4 mLastClearColor; @@ -2412,11 +2700,12 @@ private: ActiveTextureType mActiveTextures[MIN_TEXTURE_UNIT_LIMIT]; + TraceCallStack mBufferTrace; TraceCallStack mCullFaceTrace; TraceCallStack mEnableDisableTrace; TraceCallStack mShaderTrace; TraceCallStack mTextureTrace; - TraceCallStack mTexParamaterTrace; + TraceCallStack mTexParameterTrace; TraceCallStack mDrawTrace; TraceCallStack mDepthFunctionTrace; TraceCallStack mStencilFunctionTrace; @@ -2425,12 +2714,16 @@ private: TraceCallStack mViewportTrace; // Shaders & Uniforms + uint32_t mShaderLanguageVersion{320u}; + GLuint mLastShaderIdUsed; - GLuint mLastProgramIdUsed; + GLuint mLastProgramIdUsed{0u}; GLuint mLastUniformIdUsed; typedef std::map UniformIDMap; typedef std::map ProgramUniformMap; ProgramUniformMap mUniforms; + std::vector mActiveUniforms; + std::vector mCustomUniformData{}; template struct ProgramUniformValue : public std::map >