*/
// EXTERNAL INCLUDES
-#include <cstdio> // fprintf
#include <sstream>
#include <string>
-#include <cstring> // for strcpy, strncpy
+#include <cstring>
#include <map>
+#include <cstdio>
+#include <cstring> // for strcmp
// INTERNAL INCLUDES
#include <dali/public-api/dali-core.h>
void Initialize();
void PreRender();
- void PostRender(unsigned int timeDelta);
+ void PostRender();
/* OpenGL ES 2.0 */
inline void BindFramebuffer( GLenum target, GLuint framebuffer )
{
+ //Add 010 bit;
+ mFramebufferStatus |= 2;
}
inline void BindRenderbuffer( GLenum target, GLuint renderbuffer )
inline void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
{
+ mBufferDataCalls.push_back(size);
}
inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
{
+ mBufferSubDataCalls.push_back(size);
}
inline GLenum CheckFramebufferStatus(GLenum target)
{
+ //If it has the three last bits set to 1 - 111, then the three minimum functions to create a
+ //Framebuffer texture have been called
+ if( mFramebufferStatus == 7 )
+ {
+ return GL_FRAMEBUFFER_COMPLETE;
+ }
+
return mCheckFramebufferStatusResult;
}
+ inline GLenum CheckFramebufferColorAttachment()
+ {
+ return mFramebufferColorAttached;
+ }
+
+ inline GLenum CheckFramebufferDepthAttachment()
+ {
+ return mFramebufferDepthAttached;
+ }
+
+ inline GLenum CheckFramebufferStencilAttachment()
+ {
+ return mFramebufferStencilAttached;
+ }
+
inline void Clear(GLbitfield mask)
{
+ mClearCount++;
+ mLastClearBitMask = mask;
}
inline void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
inline void DeleteTextures(GLsizei n, const GLuint* textures)
{
std::stringstream out;
- out << n << ", " << textures << " = [" ;
+ out << n << ", " << textures << " = [";
for(GLsizei i=0; i<n; i++)
{
- out << textures[i] << ", " ;
+ out << textures[i] << ", ";
mDeletedTextureIds.push_back(textures[i]);
}
out << "]";
{
std::stringstream out;
out << cap;
- mCullFaceTrace.PushCall("Disable", out.str());
+ mEnableDisableTrace.PushCall("Disable", out.str());
}
inline void DisableVertexAttribArray(GLuint index)
{
std::stringstream out;
out << cap;
- mCullFaceTrace.PushCall("Enable", out.str());
+ mEnableDisableTrace.PushCall("Enable", out.str());
}
inline void EnableVertexAttribArray(GLuint index)
inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
+ if (attachment == GL_DEPTH_ATTACHMENT)
+ {
+ mFramebufferDepthAttached = true;
+ }
+ else if (attachment == GL_STENCIL_ATTACHMENT)
+ {
+ mFramebufferStencilAttached = true;
+ }
}
inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
+ //Add 100 bit;
+ mFramebufferStatus |= 4;
+
+ //We check 4 attachment colors
+ if ((attachment == GL_COLOR_ATTACHMENT0) || (attachment == GL_COLOR_ATTACHMENT1) || (attachment == GL_COLOR_ATTACHMENT2) || (attachment == GL_COLOR_ATTACHMENT4))
+ {
+ mFramebufferColorAttached = true;
+ }
}
inline void FrontFace(GLenum mode)
inline void GenFramebuffers(GLsizei n, GLuint* framebuffers)
{
+ for( int i = 0; i < n; i++ )
+ {
+ framebuffers[i] = i + 1;
+ }
+
+ //Add 001 bit, this function needs to be called the first one in the chain
+ mFramebufferStatus = 1;
}
inline void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
{
+ for( int i = 0; i < n; i++ )
+ {
+ renderbuffers[i] = i + 1;
+ }
}
/**
out << ", ";
}
}
- mTextureTrace.PushCall("GenTexture", out.str());
+ mTextureTrace.PushCall("GenTextures", out.str());
}
inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
{
+ switch(index)
+ {
+ 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;
+ default:
+ break;
+ }
}
inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
inline void GetProgramiv(GLuint program, GLenum pname, GLint* params)
{
- switch( pname ) {
+ switch( pname )
+ {
case GL_LINK_STATUS:
*params = mLinkStatus;
break;
case GL_PROGRAM_BINARY_LENGTH_OES:
*params = mProgramBinaryLength;
break;
+ case GL_ACTIVE_UNIFORMS:
+ *params = mNumberOfActiveUniforms;
+ break;
+ case GL_ACTIVE_UNIFORM_MAX_LENGTH:
+ *params = 100;
+ break;
}
}
{
}
-
inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
{
}
std::stringstream out;
out << program;
mShaderTrace.PushCall("LinkProgram", out.str());
+
+ mNumberOfActiveUniforms=2;
+ GetUniformLocation(program, "sTexture");
+ GetUniformLocation(program, "sEffect");
}
inline void PixelStorei(GLenum pname, GLint param)
inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
{
+ mGetProgramBinaryCalled = true;
}
inline void ProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
inline void ResetCullFaceCallStack() { mCullFaceTrace.Reset(); }
inline TraceCallStack& GetCullFaceTrace() { return mCullFaceTrace; }
+ //Methods for Enable/Disable call verification
+ inline void EnableEnableDisableCallTrace(bool enable) { mEnableDisableTrace.Enable(enable); }
+ inline void ResetEnableDisableCallStack() { mEnableDisableTrace.Reset(); }
+ inline TraceCallStack& GetEnableDisableTrace() { return mEnableDisableTrace; }
+
//Methods for Shader verification
inline void EnableShaderCallTrace(bool enable) { mShaderTrace.Enable(enable); }
inline void ResetShaderCallStack() { mShaderTrace.Reset(); }
inline TraceCallStack& GetDrawTrace() { return mDrawTrace; }
template <typename T>
+ inline bool GetUniformValue( const char* name, T& value ) const
+ {
+ for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
+ program_it != mUniforms.end();
+ ++program_it )
+ {
+ const UniformIDMap &uniformIDs = program_it->second;
+
+ UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
+ if( uniform_it != uniformIDs.end() )
+ {
+ // found one matching uniform name, lets check the value...
+ GLuint programId = program_it->first;
+ GLint uniformId = uniform_it->second;
+
+ const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
+ return mProgramUniforms.GetUniformValue( programId, uniformId, value );
+ }
+ }
+ return false;
+ }
+
+
+ template <typename T>
inline bool CheckUniformValue( const char* name, const T& value ) const
{
for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
}
}
- fprintf(stderr, "Not found, printing possible values:" );
+ fprintf(stderr, "Not found, printing possible values:\n" );
for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
program_it != mUniforms.end();
++program_it )
{
std::stringstream out;
out << uniform_it->first << ": " << origValue;
- fprintf(stderr, "%s", out.str().c_str() );
+ fprintf(stderr, "%s\n", out.str().c_str() );
}
}
}
return false;
}
-
-
inline GLuint GetLastShaderCompiled() const
{
return mLastShaderCompiled;
return mLastProgramIdUsed;
}
+ inline GLbitfield GetLastClearMask() const
+ {
+ return mLastClearBitMask;
+ }
+
enum AttribType
{
ATTRIB_UNKNOWN = -1,
// Methods to check scissor tests
inline const ScissorParams& GetScissorParams() const { return mScissorParams; }
+ inline bool GetProgramBinaryCalled() const { return mGetProgramBinaryCalled; }
+
+ inline unsigned int GetClearCountCalled() const { return mClearCount; }
+
+ typedef std::vector<size_t> BufferDataCalls;
+ inline const BufferDataCalls& GetBufferDataCalls() const { return mBufferDataCalls; }
+ inline void ResetBufferDataCalls() { mBufferDataCalls.clear(); }
+
+ typedef std::vector<size_t> BufferSubDataCalls;
+ inline const BufferSubDataCalls& GetBufferSubDataCalls() const { return mBufferSubDataCalls; }
+ inline void ResetBufferSubDataCalls() { mBufferSubDataCalls.clear(); }
+
private:
GLuint mCurrentProgram;
GLuint mCompileStatus;
+ BufferDataCalls mBufferDataCalls;
+ BufferSubDataCalls mBufferSubDataCalls;
GLuint mLinkStatus;
+ GLint mNumberOfActiveUniforms;
GLint mGetAttribLocationResult;
GLenum mGetErrorResult;
GLubyte* mGetStringResult;
GLboolean mIsTextureResult;
GLenum mActiveTextureUnit;
GLenum mCheckFramebufferStatusResult;
+ GLint mFramebufferStatus;
+ GLenum mFramebufferColorAttached;
+ GLenum mFramebufferDepthAttached;
+ GLenum mFramebufferStencilAttached;
GLint mNumBinaryFormats;
GLint mBinaryFormats;
GLint mProgramBinaryLength;
bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE];
bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed
+ bool mGetProgramBinaryCalled;
typedef std::map< GLuint, std::string> ShaderSourceMap;
ShaderSourceMap mShaderSources;
GLuint mLastShaderCompiled;
+ GLbitfield mLastClearBitMask;
+ unsigned int mClearCount;
Vector4 mLastBlendColor;
GLenum mLastBlendEquationRgb;
ActiveTextureType mActiveTextures[ MIN_TEXTURE_UNIT_LIMIT ];
TraceCallStack mCullFaceTrace;
+ TraceCallStack mEnableDisableTrace;
TraceCallStack mShaderTrace;
TraceCallStack mTextureTrace;
TraceCallStack mTexParamaterTrace;