/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
mCore = Dali::Integration::Core::New( mRenderController,
mPlatformAbstraction,
mGraphics,
- mGlAbstraction,
- mGlSyncAbstraction,
mGestureManager,
mDataRetentionPolicy,
false );
- mCore->ContextCreated();
mCore->SurfaceResized( mSurfaceWidth, mSurfaceHeight );
mCore->SetDpi( mDpi.x, mDpi.y );
return mRenderController;
}
-TestGlAbstraction& TestApplication::GetGlAbstraction()
-{
- return mGlAbstraction;
-}
-
-TestGlSyncAbstraction& TestApplication::GetGlSyncAbstraction()
-{
- return mGlSyncAbstraction;
-}
-
TestGestureManager& TestApplication::GetGestureManager()
{
return mGestureManager;
return mRenderStatus.NeedsUpdate();
}
-void TestApplication::ResetContext()
-{
- mCore->ContextDestroyed();
- mGlAbstraction.Initialize();
- mCore->ContextCreated();
-}
-
unsigned int TestApplication::Wait( unsigned int durationToWait )
{
int time = 0;
#define __DALI_TEST_APPLICATION_H__
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <test-platform-abstraction.h>
#include "test-gesture-manager.h"
-#include "test-gl-sync-abstraction.h"
-#include "test-gl-abstraction.h"
#include "test-render-controller.h"
#include <dali/public-api/common/dali-common.h>
-#include <dali/integration-api/resource-policies.h>
+#include <dali/public-api/signals/connection-tracker.h>
+#include <dali/integration-api/core.h>
#include <dali/integration-api/graphics/graphics.h>
+#include <dali/integration-api/resource-policies.h>
namespace Dali
{
Dali::Integration::Core& GetCore();
TestPlatformAbstraction& GetPlatform();
TestRenderController& GetRenderController();
- TestGlAbstraction& GetGlAbstraction();
- TestGlSyncAbstraction& GetGlSyncAbstraction();
TestGestureManager& GetGestureManager();
void ProcessEvent(const Integration::Event& event);
void SendNotification();
TestPlatformAbstraction mPlatformAbstraction;
Integration::Graphics::Graphics mGraphics;
TestRenderController mRenderController;
- TestGlAbstraction mGlAbstraction;
- TestGlSyncAbstraction mGlSyncAbstraction;
TestGestureManager mGestureManager;
Integration::UpdateStatus mStatus;
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "test-gl-abstraction.h"
-
-namespace Dali
-{
-
-TestGlAbstraction::TestGlAbstraction()
-{
- Initialize();
-}
-
-TestGlAbstraction::~TestGlAbstraction() {}
-
-void TestGlAbstraction::Initialize()
-{
- mCurrentProgram = 0;
- mCompileStatus = GL_TRUE;
- mLinkStatus = GL_TRUE;
- mNumberOfActiveUniforms = 0;
- mGetAttribLocationResult = 0;
- mGetErrorResult = 0;
- mGetStringResult = NULL;
- mIsBufferResult = 0;
- mIsEnabledResult = 0;
- mIsFramebufferResult = 0;
- mIsProgramResult = 0;
- mIsRenderbufferResult = 0;
- mIsShaderResult = 0;
- mIsTextureResult = 0;
- mActiveTextureUnit = 0;
- mCheckFramebufferStatusResult = 0;
- mFramebufferStatus = 0;
- mFramebufferColorAttached = 0;
- mFramebufferDepthAttached = 0;
- mFramebufferStencilAttached = 0;
- mNumBinaryFormats = 0;
- mBinaryFormats = 0;
- mProgramBinaryLength = 0;
-
- mVertexAttribArrayChanged = false;
- mGetProgramBinaryCalled = false;
-
- mLastShaderCompiled = 0;
- mLastClearBitMask = 0;
- mClearCount = 0;
-
- mLastBlendEquationRgb = 0;
- mLastBlendEquationAlpha = 0;
- mLastBlendFuncSrcRgb = 0;
- mLastBlendFuncDstRgb = 0;
- mLastBlendFuncSrcAlpha = 0;
- mLastBlendFuncDstAlpha = 0;
- mLastAutoTextureIdUsed = 0;
- mNumGeneratedTextures = 0;
- mLastShaderIdUsed = 0;
- mLastProgramIdUsed = 0;
- mLastUniformIdUsed = 0;
- mLastDepthMask = false;
-
- mUniforms.clear();
- mProgramUniforms1i.clear();
- mProgramUniforms1f.clear();
- mProgramUniforms2f.clear();
- mProgramUniforms3f.clear();
- mProgramUniforms4f.clear();
-
- mCullFaceTrace.Reset();
- mDepthFunctionTrace.Reset();
- mEnableDisableTrace.Reset();
- mShaderTrace.Reset();
- mStencilFunctionTrace.Reset();
- mScissorTrace.Reset();
- mTextureTrace.Reset();
- mTexParamaterTrace.Reset();
- mDrawTrace.Reset();
-
- for( unsigned int i=0; i<MAX_ATTRIBUTE_CACHE_SIZE; ++i )
- {
- mVertexAttribArrayState[i] = false;
- }
-}
-
-void TestGlAbstraction::PreRender()
-{
-}
-
-void TestGlAbstraction::PostRender()
-{
-}
-
-} // Namespace dali
-
-bool BlendEnabled(const Dali::TraceCallStack& callStack)
-{
- std::stringstream out;
- out << GL_BLEND;
- bool blendEnabled = callStack.FindMethodAndParams( "Enable", out.str() );
- return blendEnabled;
-}
-
-bool BlendDisabled(const Dali::TraceCallStack& callStack)
-{
- std::stringstream out;
- out << GL_BLEND;
- bool blendEnabled = callStack.FindMethodAndParams( "Disable", out.str() );
- return blendEnabled;
-}
+++ /dev/null
-#ifndef TEST_GL_ABSTRACTION_H
-#define TEST_GL_ABSTRACTION_H
-
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// EXTERNAL INCLUDES
-#include <sstream>
-#include <string>
-#include <cstring>
-#include <map>
-#include <cstdio>
-#include <cstring> // for strcmp
-#include <typeinfo>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/dali-core.h>
-#include <dali/integration-api/core.h>
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/integration-api/gl-defines.h>
-#include <test-trace-call-stack.h>
-#include <test-compare-types.h>
-
-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
-};
-
-class DALI_IMPORT_API TestGlAbstraction: public Dali::Integration::GlAbstraction
-{
-public:
- TestGlAbstraction();
- ~TestGlAbstraction();
- void Initialize();
-
- void PreRender();
- void PostRender();
-
- /* OpenGL ES 2.0 */
-
- inline void ActiveTexture( GLenum textureUnit )
- {
- mActiveTextureUnit = textureUnit - GL_TEXTURE0;
- }
-
- inline GLenum GetActiveTextureUnit() const
- {
- return mActiveTextureUnit + GL_TEXTURE0;
- }
-
- inline void AttachShader( GLuint program, GLuint shader )
- {
- std::stringstream out;
- out << program << ", " << shader;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["program"] = ToString(program);
- namedParams["shader"] = ToString(shader);
- mShaderTrace.PushCall("AttachShader", out.str(), namedParams);
- }
-
- inline void BindAttribLocation( GLuint program, GLuint index, const char* name )
- {
- }
-
- inline void BindBuffer( GLenum target, GLuint buffer )
- {
- }
-
- inline void BindFramebuffer( GLenum target, GLuint framebuffer )
- {
- //Add 010 bit;
- mFramebufferStatus |= 2;
- }
-
- inline void BindRenderbuffer( GLenum target, GLuint renderbuffer )
- {
- }
-
- /**
- * This method can be used by test cases, to query the texture IDs that have been bound by BindTexture.
- * @return A vector containing the IDs that were bound.
- */
- inline const std::vector<GLuint>& GetBoundTextures() const
- {
- return mBoundTextures;
- }
-
- /**
- * Query the texture IDs that have been bound with BindTexture, with a specific active texture unit.
- * @param[in] activeTextureUnit The specific active texture unit.
- * @return A vector containing the IDs that were bound.
- */
- inline const std::vector<GLuint>& GetBoundTextures( GLuint activeTextureUnit ) const
- {
- return mActiveTextures[ activeTextureUnit - GL_TEXTURE0 ].mBoundTextures;
- }
-
- /**
- * This method can be used by test cases, to clear the record of texture IDs that have been bound by BindTexture.
- */
- inline void ClearBoundTextures()
- {
- mBoundTextures.clear();
-
- for( unsigned int i=0; i<MIN_TEXTURE_UNIT_LIMIT; ++i )
- {
- mActiveTextures[ i ].mBoundTextures.clear();
- }
- }
-
- inline void BindTexture( GLenum target, GLuint texture )
- {
- // Record the bound textures for future checks
- if( texture )
- {
- mBoundTextures.push_back( texture );
-
- if( mActiveTextureUnit < MIN_TEXTURE_UNIT_LIMIT )
- {
- mActiveTextures[ mActiveTextureUnit ].mBoundTextures.push_back( texture );
- }
- }
-
- std::stringstream out;
- out << target << ", " << texture;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["target"] = ToString(target);
- namedParams["texture"] = ToString(texture);
-
- mTextureTrace.PushCall("BindTexture", out.str(), namedParams);
- }
-
- inline void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
- {
- mLastBlendColor.r = red;
- mLastBlendColor.g = green;
- mLastBlendColor.b = blue;
- mLastBlendColor.a = alpha;
- }
-
- inline const Vector4& GetLastBlendColor() const
- {
- return mLastBlendColor;
- }
-
- inline void BlendEquation( GLenum mode )
- {
- mLastBlendEquationRgb = mode;
- mLastBlendEquationAlpha = mode;
- }
-
- inline void BlendEquationSeparate( GLenum modeRgb, GLenum modeAlpha )
- {
- mLastBlendEquationRgb = modeRgb;
- mLastBlendEquationAlpha = modeAlpha;
- }
-
- inline GLenum GetLastBlendEquationRgb() const
- {
- return mLastBlendEquationRgb;
- }
-
- inline GLenum GetLastBlendEquationAlpha() const
- {
- return mLastBlendEquationAlpha;
- }
-
- inline void BlendFunc(GLenum sfactor, GLenum dfactor)
- {
- mLastBlendFuncSrcRgb = sfactor;
- mLastBlendFuncDstRgb = dfactor;
- mLastBlendFuncSrcAlpha = sfactor;
- mLastBlendFuncDstAlpha = dfactor;
- }
-
- inline void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
- {
- mLastBlendFuncSrcRgb = srcRGB;
- mLastBlendFuncDstRgb = dstRGB;
- mLastBlendFuncSrcAlpha = srcAlpha;
- mLastBlendFuncDstAlpha = dstAlpha;
- }
-
- inline GLenum GetLastBlendFuncSrcRgb() const
- {
- return mLastBlendFuncSrcRgb;
- }
-
- inline GLenum GetLastBlendFuncDstRgb() const
- {
- return mLastBlendFuncDstRgb;
- }
-
- inline GLenum GetLastBlendFuncSrcAlpha() const
- {
- return mLastBlendFuncSrcAlpha;
- }
-
- inline GLenum GetLastBlendFuncDstAlpha() const
- {
- return mLastBlendFuncDstAlpha;
- }
-
- 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 ClearDepthf(GLclampf depth)
- {
- }
-
- inline void ClearStencil(GLint s)
- {
- std::stringstream out;
- out << s;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["s"] = ToString( s );
-
- mStencilFunctionTrace.PushCall( "ClearStencil", out.str(), namedParams );
- }
-
- inline void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
- {
- mColorMaskParams.red = red;
- mColorMaskParams.green = green;
- mColorMaskParams.blue = blue;
- mColorMaskParams.alpha = alpha;
- }
-
- inline void CompileShader(GLuint shader)
- {
- std::stringstream out;
- out << shader;
- TraceCallStack::NamedParams namedParams;
- namedParams["shader"] = ToString(shader);
-
- mShaderTrace.PushCall("CompileShader", out.str(), namedParams);
- }
-
- inline void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
- {
- std::stringstream out;
- 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);
-
- mTextureTrace.PushCall("CompressedTexImage2D", out.str(), namedParams);
- }
-
- inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
- {
- std::stringstream out;
- 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);
- mTextureTrace.PushCall("CompressedTexSubImage2D", out.str(), namedParams);
- }
-
- inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
- {
- }
-
- inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
- {
- }
-
- inline GLuint CreateProgram(void)
- {
- mShaderTrace.PushCall("CreateProgram", "");
-
- ++mLastProgramIdUsed;
- mUniforms[mLastProgramIdUsed] = UniformIDMap();
- return mLastProgramIdUsed;
- }
-
- inline GLuint CreateShader(GLenum type)
- {
- std::stringstream out;
- out << type;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["type"] = ToString(type);
- mShaderTrace.PushCall("CreateShader", out.str(), namedParams);
-
- return ++mLastShaderIdUsed;
- }
-
- inline void CullFace(GLenum mode)
- {
- std::stringstream out;
- out << mode;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["program"] = ToString(mode);
-
- mCullFaceTrace.PushCall("CullFace", out.str(), namedParams);
- }
-
- inline void DeleteBuffers(GLsizei n, const GLuint* buffers)
- {
- }
-
- inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
- {
- }
-
- inline void DeleteProgram(GLuint program)
- {
- std::stringstream out;
- out << program;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["program"] = ToString(program);
-
- mShaderTrace.PushCall("DeleteProgram", out.str(), namedParams);
- }
-
- inline void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
- {
- }
-
- inline void DeleteShader(GLuint shader)
- {
- std::stringstream out;
- out << shader;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["shader"] = ToString(shader);
-
- mShaderTrace.PushCall("DeleteShader", out.str(), namedParams);
- }
-
- inline void DeleteTextures(GLsizei n, const GLuint* textures)
- {
- std::stringstream out;
- out << n << ", " << textures << " = [";
-
- TraceCallStack::NamedParams namedParams;
-
- for(GLsizei i=0; i<n; i++)
- {
- out << textures[i] << ", ";
- std::stringstream paramName;
- paramName<<"texture["<<i<<"]";
- namedParams[paramName.str()] = ToString(textures[i]);
- mDeletedTextureIds.push_back(textures[i]);
- mNumGeneratedTextures--;
- }
- out << "]";
-
- mTextureTrace.PushCall("DeleteTextures", out.str(), namedParams);
- }
-
- inline bool CheckNoTexturesDeleted()
- {
- return mDeletedTextureIds.size() == 0;
- }
-
- inline bool CheckTextureDeleted( GLuint textureId )
- {
- bool found = false;
-
- for(std::vector<GLuint>::iterator iter=mDeletedTextureIds.begin(); iter != mDeletedTextureIds.end(); ++iter)
- {
- if(*iter == textureId)
- {
- found = true;
- break;
- }
- }
- return found;
- }
-
- inline void ClearDeletedTextures()
- {
- mDeletedTextureIds.clear();
- }
-
- inline void DepthFunc(GLenum func)
- {
- std::stringstream out;
- out << func;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["func"] = ToString(func);
-
- mDepthFunctionTrace.PushCall("DepthFunc", out.str(), namedParams);
- }
-
- inline void DepthMask(GLboolean flag)
- {
- mLastDepthMask = flag;
- }
-
- inline bool GetLastDepthMask() const
- {
- return mLastDepthMask;
- }
-
- inline void DepthRangef(GLclampf zNear, GLclampf zFar)
- {
- }
-
- inline void DetachShader(GLuint program, GLuint shader)
- {
- std::stringstream out;
- out << program << ", " << shader;
- TraceCallStack::NamedParams namedParams;
- namedParams["program"] = ToString(program);
- namedParams["shader"] = ToString(shader);
- mShaderTrace.PushCall("DetachShader", out.str(), namedParams);
- }
-
- inline void Disable(GLenum cap)
- {
- std::stringstream out;
- out << cap;
- TraceCallStack::NamedParams namedParams;
- namedParams["cap"] = ToString(cap);
- mEnableDisableTrace.PushCall("Disable", out.str(), namedParams);
- }
-
- inline void DisableVertexAttribArray(GLuint index)
- {
- SetVertexAttribArray( index, false );
- }
-
- inline void DrawArrays(GLenum mode, GLint first, GLsizei count)
- {
- std::stringstream out;
- out << mode << ", " << first << ", " << count;
- TraceCallStack::NamedParams namedParams;
- namedParams["mode"] = ToString(mode);
- namedParams["first"] = ToString(first);
- namedParams["count"] = ToString(count);
- mDrawTrace.PushCall("DrawArrays", out.str(), namedParams);
- }
-
- inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
- {
- std::stringstream out;
- out << mode << ", " << count << ", " << type << ", indices";
-
- TraceCallStack::NamedParams namedParams;
- namedParams["mode"] = ToString(mode);
- namedParams["count"] = ToString(count);
- namedParams["type"] = ToString(type);
- // Skip void pointers - are they of any use?
- mDrawTrace.PushCall("DrawElements", out.str(), namedParams);
- }
-
- inline void Enable(GLenum cap)
- {
- std::stringstream out;
- out << cap;
- TraceCallStack::NamedParams namedParams;
- namedParams["cap"] = ToString(cap);
- mEnableDisableTrace.PushCall("Enable", out.str(), namedParams);
- }
-
- inline void EnableVertexAttribArray(GLuint index)
- {
- SetVertexAttribArray( index, true);
- }
-
- inline void Finish(void)
- {
- }
-
- inline void Flush(void)
- {
- }
-
- 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 GenBuffers(GLsizei n, GLuint* buffers)
- {
- // avoids an assert in GpuBuffers
- *buffers = 1u;
- }
-
- inline void GenerateMipmap(GLenum target)
- {
- std::stringstream out;
- out<<target;
- TraceCallStack::NamedParams namedParams;
- namedParams["target"] = ToString(target);
-
- mTextureTrace.PushCall("GenerateMipmap", out.str(), namedParams);
- }
-
- 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;
- }
- }
-
- /**
- * This method can be used by test cases, to manipulate the texture IDs generated by GenTextures.
- * @param[in] ids A vector containing the next IDs to be generated
- */
- inline void SetNextTextureIds( const std::vector<GLuint>& ids )
- {
- mNextTextureIds = ids;
- }
-
- inline const std::vector<GLuint>& GetNextTextureIds()
- {
- return mNextTextureIds;
- }
-
- inline void GenTextures(GLsizei count, GLuint* textures)
- {
- for( int i=0; i<count; ++i )
- {
- if( !mNextTextureIds.empty() )
- {
- *(textures+i) = mNextTextureIds[0];
- mNextTextureIds.erase( mNextTextureIds.begin() );
- }
- else
- {
- *(textures+i) = ++mLastAutoTextureIdUsed;
- }
- mNumGeneratedTextures++;
- }
-
- TraceCallStack::NamedParams namedParams;
- namedParams["count"] = ToString(count);
-
- std::stringstream out;
- for(int i=0; i<count; i++)
- {
- out << textures[i];
- if(i<count-1)
- {
- out << ", ";
- }
- std::ostringstream oss;
- oss<<"indices["<<i<<"]";
- namedParams[oss.str()] = ToString(textures[i]);
- }
-
- mTextureTrace.PushCall("GenTextures", out.str(), namedParams);
- }
-
- inline GLuint GetLastGenTextureId()
- {
- return mLastAutoTextureIdUsed;
- }
- inline GLuint GetNumGeneratedTextures()
- {
- return mNumGeneratedTextures;
- }
-
- 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;
- case 2:
- *length = snprintf(name, bufsize, "sGloss");
- *type = GL_SAMPLER_2D;
- *size = 1;
- break;
- default:
- break;
- }
- }
-
- inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
- {
- }
-
- inline int GetAttribLocation(GLuint program, const char* name)
- {
- 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;
- }
-
- inline void GetBooleanv(GLenum pname, GLboolean* params)
- {
- }
-
- inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
- {
- }
-
- inline GLenum GetError(void)
- {
- return mGetErrorResult;
- }
-
- inline void GetFloatv(GLenum pname, GLfloat* params)
- {
- }
-
- inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
- {
- }
-
- inline void GetIntegerv(GLenum pname, GLint* params)
- {
- switch( pname )
- {
- case GL_MAX_TEXTURE_SIZE:
- *params = 2048;
- break;
- case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
- *params = 8;
- break;
- case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
- *params = mNumBinaryFormats;
- break;
- case GL_PROGRAM_BINARY_FORMATS_OES:
- *params = mBinaryFormats;
- break;
- }
- }
-
- inline void GetProgramiv(GLuint program, GLenum pname, GLint* params)
- {
- 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 GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
- {
- }
-
- inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
- {
- }
-
- inline void GetShaderiv(GLuint shader, GLenum pname, GLint* params)
- {
- switch( pname ) {
- case GL_COMPILE_STATUS:
- *params = mCompileStatus;
- break;
- }
- }
-
- inline void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
- {
- }
-
- inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
- {
- }
-
- inline const GLubyte* GetString(GLenum name)
- {
- return mGetStringResult;
- }
-
- inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
- {
- }
-
- inline void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
- {
- }
-
- inline void GetUniformfv(GLuint program, GLint location, GLfloat* params)
- {
- }
-
- inline void GetUniformiv(GLuint program, GLint location, GLint* params)
- {
- }
-
- inline GLint GetUniformLocation(GLuint program, const char* name)
- {
- ProgramUniformMap::iterator it = mUniforms.find(program);
- if( it == mUniforms.end() )
- {
- // Not a valid program ID
- mGetErrorResult = GL_INVALID_OPERATION;
- return -1;
- }
-
- UniformIDMap& uniformIDs = it->second;
- UniformIDMap::iterator it2 = uniformIDs.find( name );
- if( it2 == uniformIDs.end() )
- {
- // Uniform not found, so add it...
- uniformIDs[name] = ++mLastUniformIdUsed;
- return mLastUniformIdUsed;
- }
-
- return it2->second;
- }
-
- inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
- {
- }
-
- inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
- {
- }
-
- inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
- {
- }
-
- inline void Hint(GLenum target, GLenum mode)
- {
- }
-
- inline GLboolean IsBuffer(GLuint buffer)
- {
- return mIsBufferResult;
- }
-
- inline GLboolean IsEnabled(GLenum cap)
- {
- return mIsEnabledResult;
- }
-
- inline GLboolean IsFramebuffer(GLuint framebuffer)
- {
- return mIsFramebufferResult;
- }
-
- inline GLboolean IsProgram(GLuint program)
- {
- return mIsProgramResult;
- }
-
- inline GLboolean IsRenderbuffer(GLuint renderbuffer)
- {
- return mIsRenderbufferResult;
- }
-
- inline GLboolean IsShader(GLuint shader)
- {
- return mIsShaderResult;
- }
-
- inline GLboolean IsTexture(GLuint texture)
- {
- return mIsTextureResult;
- }
-
- inline void LineWidth(GLfloat width)
- {
- }
-
- inline void LinkProgram(GLuint program)
- {
- std::stringstream out;
- out << program;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["program"] = ToString(program);
- mShaderTrace.PushCall("LinkProgram", out.str(), namedParams);
-
- mNumberOfActiveUniforms=3;
- GetUniformLocation(program, "sTexture");
- GetUniformLocation(program, "sEffect");
- GetUniformLocation(program, "sGloss");
- }
-
- inline void PixelStorei(GLenum pname, GLint param)
- {
- }
-
- inline void PolygonOffset(GLfloat factor, GLfloat units)
- {
- }
-
- inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
- {
- }
-
- inline void ReleaseShaderCompiler(void)
- {
- }
-
- inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
- {
- }
-
- inline void SampleCoverage(GLclampf value, GLboolean invert)
- {
- }
-
- inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
- {
- mScissorParams.x = x;
- mScissorParams.y = y;
- mScissorParams.width = width;
- mScissorParams.height = height;
-
- 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 );
- mScissorTrace.PushCall( "Scissor", out.str(), namedParams );
- }
-
- inline void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
- {
- }
-
- inline void ShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
- {
- std::string stringBuilder;
- for(int i = 0; i < count; ++i)
- {
- stringBuilder += string[i];
- }
- mShaderSources[shader] = stringBuilder;
- mLastShaderCompiled = shader;
- }
-
- inline void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
- {
- const std::string shaderSource = mShaderSources[shader];
- const int shaderSourceLength = static_cast<int>(shaderSource.length());
- if( shaderSourceLength < bufsize )
- {
- strncpy( source, shaderSource.c_str(), shaderSourceLength );
- *length = shaderSourceLength;
- }
- else
- {
- *length = bufsize -1;
- strncpy(source, shaderSource.c_str(), *length);
- source[*length] = 0x0;
- }
- }
-
- inline std::string GetShaderSource(GLuint shader)
- {
- return mShaderSources[shader];
- }
-
- inline void StencilFunc(GLenum func, GLint ref, GLuint mask)
- {
- std::stringstream out;
- out << func << ", " << ref << ", " << mask;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["func"] = ToString( func );
- namedParams["ref"] = ToString( ref );
- namedParams["mask"] = ToString( mask );
-
- mStencilFunctionTrace.PushCall( "StencilFunc", out.str(), namedParams );
- }
-
- inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
- {
- std::stringstream out;
- out << face << ", " << func << ", " << ref << ", " << mask;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["face"] = ToString( face );
- namedParams["func"] = ToString( func );
- namedParams["ref"] = ToString( ref );
- namedParams["mask"] = ToString( mask );
-
- mStencilFunctionTrace.PushCall( "StencilFuncSeparate", out.str(), namedParams );
- }
-
- inline void StencilMask(GLuint mask)
- {
- std::stringstream out;
- out << mask;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["mask"] = ToString( mask );
-
- mStencilFunctionTrace.PushCall( "StencilMask", out.str(), namedParams );
- }
-
- inline void StencilMaskSeparate(GLenum face, GLuint mask)
- {
- std::stringstream out;
- out << face << ", " << mask;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["face"] = ToString( face );
- namedParams["mask"] = ToString( mask );
-
- mStencilFunctionTrace.PushCall( "StencilMaskSeparate", out.str(), namedParams );
- }
-
- inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
- {
- std::stringstream out;
- out << fail << ", " << zfail << ", " << zpass;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["fail"] = ToString( fail );
- namedParams["zfail"] = ToString( zfail );
- namedParams["zpass"] = ToString( zpass );
-
- mStencilFunctionTrace.PushCall( "StencilOp", out.str(), namedParams );
- }
-
- inline void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
- {
- std::stringstream out;
- out << face << ", " << fail << ", " << zfail << "," << zpass;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["face"] = ToString( face );
- namedParams["fail"] = ToString( fail );
- namedParams["zfail"] = ToString( zfail );
- namedParams["zpass"] = ToString( zpass );
-
- mStencilFunctionTrace.PushCall( "StencilOpSeparate", out.str(), namedParams );
- }
-
- inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
- {
- std::stringstream out;
- 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);
-
- mTextureTrace.PushCall("TexImage2D", out.str(), namedParams);
- }
-
- inline void TexParameterf(GLenum target, GLenum pname, GLfloat param)
- {
- std::stringstream out;
- out << target << ", " << pname << ", " << param;
-
- TraceCallStack::NamedParams namedParams;
- namedParams["target"] = ToString(target);
- namedParams["pname"] = ToString(pname);
- namedParams["param"] = ToString(param);
-
- mTexParamaterTrace.PushCall("TexParameterf", out.str(), namedParams);
- }
-
- inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
- {
- 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("TexParameterfv", out.str(), namedParams);
- }
-
- inline void TexParameteri(GLenum target, GLenum pname, GLint param)
- {
- std::stringstream out;
- out << target << ", " << pname << ", " << param;
- TraceCallStack::NamedParams namedParams;
- namedParams["target"] = ToString(target);
- namedParams["pname"] = ToString(pname);
- namedParams["param"] = ToString(param);
- mTexParamaterTrace.PushCall("TexParameteri", out.str(), namedParams);
- }
-
- inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
- {
- 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);
- }
-
- inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
- {
- std::stringstream out;
- 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);
- mTextureTrace.PushCall("TexSubImage2D", out.str(), namedParams);
- }
-
- inline void Uniform1f(GLint location, GLfloat value )
- {
- std::string params = ToString( value );
- AddUniformCallToTraceStack( location, params );
-
- if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, value ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- }
- }
-
- inline void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
- {
- std::string params;
- for( int i = 0; i < count; ++i )
- {
- params = params + ToString( v[i] ) + ",";
- }
-
- AddUniformCallToTraceStack( location, params );
-
- for( int i = 0; i < count; ++i )
- {
- if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, v[i] ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- break;
- }
- }
- }
-
- inline void Uniform1i(GLint location, GLint x)
- {
- std::string params = ToString( x );
-
- AddUniformCallToTraceStack( location, params );
-
- if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram, location, x ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- }
- }
-
- inline void Uniform1iv(GLint location, GLsizei count, const GLint* v)
- {
- std::string params = ToString( v );
- AddUniformCallToTraceStack( location, params );
-
- for( int i = 0; i < count; ++i )
- {
- if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram,
- location,
- v[i] ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- break;
- }
- }
- }
-
- inline void Uniform2f(GLint location, GLfloat x, GLfloat y)
- {
- std::string params = ToString( x ) + "," + ToString( y );
- AddUniformCallToTraceStack( location, params );
-
- if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
- location,
- Vector2( x, y ) ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- }
- }
-
- inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
- {
- std::string params = ToString( v );
- AddUniformCallToTraceStack( location, params );
-
- for( int i = 0; i < count; ++i )
- {
- if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
- location,
- Vector2( v[2*i], v[2*i+1] ) ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- break;
- }
- }
- }
-
- inline void Uniform2i(GLint location, GLint x, GLint y)
- {
- std::string params = ToString( x ) + "," + ToString( y );
- AddUniformCallToTraceStack( location, params );
- }
-
- inline void Uniform2iv(GLint location, GLsizei count, const GLint* v)
- {
- std::string params = ToString( v );
- AddUniformCallToTraceStack( location, params );
- }
-
- inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
- {
- std::string params = ToString( x ) + "," + ToString( y ) + "," + ToString( z );
- AddUniformCallToTraceStack( location, params );
-
- if( ! mProgramUniforms3f.SetUniformValue( mCurrentProgram,
- location,
- Vector3( x, y, z ) ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- }
- }
-
- inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
- {
- std::string params = ToString( v );
- AddUniformCallToTraceStack( location, params );
-
- for( int i = 0; i < count; ++i )
- {
- if( ! mProgramUniforms3f.SetUniformValue(
- mCurrentProgram,
- location,
- Vector3( v[3*i], v[3*i+1], v[3*i+2] ) ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- break;
- }
- }
- }
-
- inline void Uniform3i(GLint location, GLint x, GLint y, GLint z)
- {
- std::string params = ToString( x ) + "," + ToString( y ) + "," + ToString( z );
- AddUniformCallToTraceStack( location, params );
- }
-
- inline void Uniform3iv(GLint location, GLsizei count, const GLint* v)
- {
- std::string params = ToString( v );
- AddUniformCallToTraceStack( location, params );
- }
-
- inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
- {
- std::string params = ToString( x ) + "," + ToString( y ) + "," + ToString( z ) + "," + ToString( w );
- AddUniformCallToTraceStack( location, params );
-
- if( ! mProgramUniforms4f.SetUniformValue( mCurrentProgram,
- location,
- Vector4( x, y, z, w ) ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- }
- }
-
- inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
- {
- std::string params = ToString( v );
- AddUniformCallToTraceStack( location, params );
-
- for( int i = 0; i < count; ++i )
- {
- if( ! mProgramUniforms4f.SetUniformValue(
- mCurrentProgram,
- location,
- Vector4( v[4*i], v[4*i+1], v[4*i+2], v[4*i+3] ) ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- break;
- }
- }
- }
-
- inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
- {
- std::string params = ToString( x ) + "," + ToString( y ) + "," + ToString( z ) + "," + ToString( w );
- AddUniformCallToTraceStack( location, params );
- }
-
- inline void Uniform4iv(GLint location, GLsizei count, const GLint* v)
- {
- std::string params = ToString( v );
- AddUniformCallToTraceStack( location, params );
- }
-
- inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- std::string params = ToString( value );
- AddUniformCallToTraceStack( location, params );
- }
-
- inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- std::string params = ToString( value );
- AddUniformCallToTraceStack( location, params );
-
- for( int i = 0; i < count; ++i )
- {
- if( ! mProgramUniformsMat3.SetUniformValue(
- mCurrentProgram,
- location,
- Matrix3( value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8] ) ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- break;
- }
- }
- }
-
- inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- std::string params = ToString( value );
- AddUniformCallToTraceStack( location, params );
-
- for( int i = 0; i < count; ++i )
- {
- if( ! mProgramUniformsMat4.SetUniformValue(
- mCurrentProgram,
- location,
- Matrix( value ) ) )
- {
- mGetErrorResult = GL_INVALID_OPERATION;
- break;
- }
- }
- }
-
- inline void UseProgram(GLuint program)
- {
- mCurrentProgram = program;
- }
-
- inline void ValidateProgram(GLuint program)
- {
- }
-
- inline void VertexAttrib1f(GLuint indx, GLfloat x)
- {
- }
-
- inline void VertexAttrib1fv(GLuint indx, const GLfloat* values)
- {
- }
-
- inline void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
- {
- }
-
- inline void VertexAttrib2fv(GLuint indx, const GLfloat* values)
- {
- }
-
- inline void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
- {
- }
-
- inline void VertexAttrib3fv(GLuint indx, const GLfloat* values)
- {
- }
-
- inline void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
- {
- }
-
- inline void VertexAttrib4fv(GLuint indx, const GLfloat* values)
- {
- }
-
- inline void VertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
- {
- }
-
- inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
- {
- }
-
- /* OpenGL ES 3.0 */
-
- inline void ReadBuffer(GLenum mode)
- {
- }
-
- inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
- {
- }
-
- inline void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
- {
- }
-
- 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)
- {
- }
-
- inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
- {
- }
-
- inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
- {
- }
-
- 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)
- {
- }
-
- inline void GenQueries(GLsizei n, GLuint* ids)
- {
- }
-
- inline void DeleteQueries(GLsizei n, const GLuint* ids)
- {
- }
-
- inline GLboolean IsQuery(GLuint id)
- {
- return false;
- }
-
- inline void BeginQuery(GLenum target, GLuint id)
- {
- }
-
- inline void EndQuery(GLenum target)
- {
- }
-
- inline void GetQueryiv(GLenum target, GLenum pname, GLint* params)
- {
- }
-
- inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
- {
- }
-
- inline GLboolean UnmapBuffer(GLenum target)
- {
- return false;
- }
-
- inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
- {
- }
-
- inline void DrawBuffers(GLsizei n, const GLenum* bufs)
- {
- }
-
- inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- }
-
- inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- }
-
- inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- }
-
- inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- }
-
- inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- }
-
- inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
- {
- }
-
- inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
- {
- }
-
- inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
- {
- }
-
- inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
- {
- }
-
- inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
- {
- return NULL;
- }
-
- inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
- {
- }
-
- inline void BindVertexArray(GLuint array)
- {
- }
-
- inline void DeleteVertexArrays(GLsizei n, const GLuint* arrays)
- {
- }
-
- inline void GenVertexArrays(GLsizei n, GLuint* arrays)
- {
- }
-
- inline GLboolean IsVertexArray(GLuint array)
- {
- return false;
- }
-
- inline void GetIntegeri_v(GLenum target, GLuint index, GLint* data)
- {
- }
-
- inline void BeginTransformFeedback(GLenum primitiveMode)
- {
- }
-
- inline void EndTransformFeedback(void)
- {
- }
-
- inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
- {
- }
-
- inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer)
- {
- }
-
- inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
- {
- }
-
- inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
- {
- }
-
- inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
- {
- }
-
- inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
- {
- }
-
- inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
- {
- }
-
- inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
- {
- }
-
- inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
- {
- }
-
- inline void VertexAttribI4iv(GLuint index, const GLint* v)
- {
- }
-
- inline void VertexAttribI4uiv(GLuint index, const GLuint* v)
- {
- }
-
- inline void GetUniformuiv(GLuint program, GLint location, GLuint* params)
- {
- }
-
- inline GLint GetFragDataLocation(GLuint program, const GLchar *name)
- {
- return -1;
- }
-
- inline void Uniform1ui(GLint location, GLuint v0)
- {
- }
-
- inline void Uniform2ui(GLint location, GLuint v0, GLuint v1)
- {
- }
-
- inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
- {
- }
-
- inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
- {
- }
-
- inline void Uniform1uiv(GLint location, GLsizei count, const GLuint* value)
- {
- }
-
- inline void Uniform2uiv(GLint location, GLsizei count, const GLuint* value)
- {
- }
-
- inline void Uniform3uiv(GLint location, GLsizei count, const GLuint* value)
- {
- }
-
- inline void Uniform4uiv(GLint location, GLsizei count, const GLuint* value)
- {
- }
-
- inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
- {
- }
-
- inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
- {
- }
-
- inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
- {
- }
-
- inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
- {
- }
-
- inline const GLubyte* GetStringi(GLenum name, GLuint index)
- {
- return NULL;
- }
-
- inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
- {
- }
-
- inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
- {
- }
-
- inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
- {
- }
-
- inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
- {
- return GL_INVALID_INDEX;
- }
-
- inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
- {
- }
-
- inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
- {
- }
-
- inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
- {
- }
-
- inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
- {
- }
-
- inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
- {
- }
-
- inline GLsync FenceSync(GLenum condition, GLbitfield flags)
- {
- return NULL;
- }
-
- inline GLboolean IsSync(GLsync sync)
- {
- return false;
- }
-
- inline void DeleteSync(GLsync sync)
- {
- }
-
- inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
- {
- return 0;
- }
-
- inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
- {
- }
-
- inline void GetInteger64v(GLenum pname, GLint64* params)
- {
- }
-
- inline void GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
- {
- }
-
- inline void GetInteger64i_v(GLenum target, GLuint index, GLint64* data)
- {
- }
-
- inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
- {
- }
-
- inline void GenSamplers(GLsizei count, GLuint* samplers)
- {
- }
-
- inline void DeleteSamplers(GLsizei count, const GLuint* samplers)
- {
- }
-
- inline GLboolean IsSampler(GLuint sampler)
- {
- return false;
- }
-
- inline void BindSampler(GLuint unit, GLuint sampler)
- {
- }
-
- inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
- {
- }
-
- inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
- {
- }
-
- inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
- {
- }
-
- inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
- {
- }
-
- inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
- {
- }
-
- inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
- {
- }
-
- inline void VertexAttribDivisor(GLuint index, GLuint divisor)
- {
- }
-
- inline void BindTransformFeedback(GLenum target, GLuint id)
- {
- }
-
- inline void DeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
- {
- }
-
- inline void GenTransformFeedbacks(GLsizei n, GLuint* ids)
- {
- }
-
- inline GLboolean IsTransformFeedback(GLuint id)
- {
- return false;
- }
-
- inline void PauseTransformFeedback(void)
- {
- }
-
- inline void ResumeTransformFeedback(void)
- {
- }
-
- 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 ProgramParameteri(GLuint program, GLenum pname, GLint value)
- {
- }
-
- inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
- {
- }
-
- inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
- {
- }
-
- inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
- {
- }
-
- inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
- {
- }
-
- inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
- {
- }
-
-private:
-
- inline void AddUniformCallToTraceStack( GLint location, std::string& value )
- {
- std::string name = "<not found>";
- bool matched = false;
-
- UniformIDMap& map = mUniforms[mCurrentProgram];
- for (UniformIDMap::iterator it=map.begin(); it!=map.end(); ++it)
- {
- if( it->second == location )
- {
- name = it->first;
- matched = true;
- break;
- }
- }
-
- if ( matched )
- {
- mSetUniformTrace.PushCall( name, value );
- }
- }
-
-
-public: // TEST FUNCTIONS
- inline void SetCompileStatus( GLuint value ) { mCompileStatus = value; }
- inline void SetLinkStatus( GLuint value ) { mLinkStatus = value; }
- inline void SetGetAttribLocationResult( int result) { mGetAttribLocationResult = result; }
- inline void SetGetErrorResult( GLenum result) { mGetErrorResult = result; }
- inline void SetGetStringResult( GLubyte* result) { mGetStringResult = result; }
- inline void SetIsBufferResult( GLboolean result) { mIsBufferResult = result; }
- inline void SetIsEnabledResult( GLboolean result) { mIsEnabledResult = result; }
- inline void SetIsFramebufferResult( GLboolean result) { mIsFramebufferResult = result; }
- inline void SetIsProgramResult( GLboolean result) { mIsProgramResult = result; }
- inline void SetIsRenderbufferResult( GLboolean result) { mIsRenderbufferResult = result; }
- inline void SetIsShaderResult( GLboolean result) { mIsShaderResult = result; }
- inline void SetIsTextureResult( GLboolean result) { mIsTextureResult = result; }
- inline void SetCheckFramebufferStatusResult( GLenum result) { mCheckFramebufferStatusResult = result; }
- inline void SetNumBinaryFormats( GLint numFormats ) { mNumBinaryFormats = numFormats; }
- inline void SetBinaryFormats( GLint binaryFormats ) { mBinaryFormats = binaryFormats; }
- inline void SetProgramBinaryLength( GLint length ) { mProgramBinaryLength = length; }
-
- inline bool GetVertexAttribArrayState(GLuint index)
- {
- if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
- {
- // out of range
- return false;
- }
- return mVertexAttribArrayState[ index ];
- }
- inline void ClearVertexAttribArrayChanged() { mVertexAttribArrayChanged = false; }
- inline bool GetVertexAttribArrayChanged() { return mVertexAttribArrayChanged; }
-
- //Methods for CullFace verification
- inline void EnableCullFaceCallTrace(bool enable) { mCullFaceTrace.Enable(enable); }
- 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& GetShaderTrace() { return mShaderTrace; }
-
- //Methods for Texture verification
- inline void EnableTextureCallTrace(bool enable) { mTextureTrace.Enable(enable); }
- inline void ResetTextureCallStack() { mTextureTrace.Reset(); }
- inline TraceCallStack& GetTextureTrace() { return mTextureTrace; }
-
- //Methods for Texture verification
- inline void EnableTexParameterCallTrace(bool enable) { mTexParamaterTrace.Enable(enable); }
- inline void ResetTexParameterCallStack() { mTexParamaterTrace.Reset(); }
- inline TraceCallStack& GetTexParameterTrace() { return mTexParamaterTrace; }
-
- //Methods for Draw verification
- inline void EnableDrawCallTrace(bool enable) { mDrawTrace.Enable(enable); }
- inline void ResetDrawCallStack() { mDrawTrace.Reset(); }
- inline TraceCallStack& GetDrawTrace() { return mDrawTrace; }
-
- //Methods for Depth function verification
- inline void EnableDepthFunctionCallTrace(bool enable) { mDepthFunctionTrace.Enable(enable); }
- inline void ResetDepthFunctionCallStack() { mDepthFunctionTrace.Reset(); }
- inline TraceCallStack& GetDepthFunctionTrace() { return mDepthFunctionTrace; }
-
- //Methods for Stencil function verification
- inline void EnableStencilFunctionCallTrace(bool enable) { mStencilFunctionTrace.Enable(enable); }
- inline void ResetStencilFunctionCallStack() { mStencilFunctionTrace.Reset(); }
- inline TraceCallStack& GetStencilFunctionTrace() { return mStencilFunctionTrace; }
-
- //Methods for Scissor verification
- inline void EnableScissorCallTrace(bool enable) { mScissorTrace.Enable(enable); }
- inline void ResetScissorCallStack() { mScissorTrace.Reset(); }
- inline TraceCallStack& GetScissorTrace() { return mScissorTrace; }
-
- //Methods for Uniform function verification
- inline void EnableSetUniformCallTrace(bool enable) { mSetUniformTrace.Enable(enable); }
- inline void ResetSetUniformCallStack() { mSetUniformTrace.Reset(); }
- inline TraceCallStack& GetSetUniformTrace() { return mSetUniformTrace; }
-
- 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();
- 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 );
- if( mProgramUniforms.CheckUniformValue( programId, uniformId, value ) )
- {
- // the value matches
- return true;
- }
- }
- }
-
- fprintf(stderr, "Not found, printing possible values:\n" );
- 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 );
- T origValue;
- if ( mProgramUniforms.GetUniformValue(programId, uniformId, origValue) )
- {
- std::stringstream out;
- out << uniform_it->first << ": " << origValue;
- fprintf(stderr, "%s\n", out.str().c_str() );
- }
- }
- }
- return false;
- }
-
- template <typename T>
- inline bool GetUniformValue( GLuint programId, GLuint uniformId, T& outValue) const
- {
- const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( outValue );
- return mProgramUniforms.GetUniformValue( programId, uniformId, outValue );
- }
-
- inline bool GetUniformIds( const char* name, GLuint& programId, GLuint& uniformId ) 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() )
- {
- programId = program_it->first;
- uniformId = uniform_it->second;
- return true;
- }
- }
- return false;
- }
-
- inline GLuint GetLastShaderCompiled() const
- {
- return mLastShaderCompiled;
- }
-
- inline GLuint GetLastProgramCreated() const
- {
- return mLastProgramIdUsed;
- }
-
- inline GLbitfield GetLastClearMask() const
- {
- return mLastClearBitMask;
- }
-
- enum AttribType
- {
- ATTRIB_UNKNOWN = -1,
- ATTRIB_POSITION,
- ATTRIB_NORMAL,
- ATTRIB_TEXCOORD,
- ATTRIB_COLOR,
- ATTRIB_BONE_WEIGHTS,
- ATTRIB_BONE_INDICES,
- ATTRIB_TYPE_LAST
- };
-
- struct ScissorParams
- {
- GLint x;
- GLint y;
- GLsizei width;
- GLsizei height;
-
- ScissorParams() : x( 0 ), y( 0 ), width( 0 ), height( 0 ) { }
- };
-
- // Methods to check scissor tests
- inline const ScissorParams& GetScissorParams() const { return mScissorParams; }
-
- struct ColorMaskParams
- {
- GLboolean red;
- GLboolean green;
- GLboolean blue;
- GLboolean alpha;
-
- ColorMaskParams() : red( true ), green( true ), blue( true ), alpha( true ) { }
- };
-
- inline bool GetProgramBinaryCalled() const { return mGetProgramBinaryCalled; }
-
- inline unsigned int GetClearCountCalled() const { return mClearCount; }
-
- inline const ColorMaskParams& GetColorMaskParams() const { return mColorMaskParams; }
-
- 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 mIsBufferResult;
- GLboolean mIsEnabledResult;
- GLboolean mIsFramebufferResult;
- GLboolean mIsProgramResult;
- GLboolean mIsRenderbufferResult;
- GLboolean mIsShaderResult;
- 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;
- GLenum mLastBlendEquationAlpha;
- GLenum mLastBlendFuncSrcRgb;
- GLenum mLastBlendFuncDstRgb;
- GLenum mLastBlendFuncSrcAlpha;
- GLenum mLastBlendFuncDstAlpha;
-
- GLboolean mLastDepthMask;
-
- // Data for manipulating the IDs returned by GenTextures
- GLuint mLastAutoTextureIdUsed;
- GLuint mNumGeneratedTextures;
- std::vector<GLuint> mNextTextureIds;
- std::vector<GLuint> mDeletedTextureIds;
- std::vector<GLuint> mBoundTextures;
-
- struct ActiveTextureType
- {
- std::vector<GLuint> mBoundTextures;
- };
-
- ActiveTextureType mActiveTextures[ MIN_TEXTURE_UNIT_LIMIT ];
-
- TraceCallStack mCullFaceTrace;
- TraceCallStack mEnableDisableTrace;
- TraceCallStack mShaderTrace;
- TraceCallStack mTextureTrace;
- TraceCallStack mTexParamaterTrace;
- TraceCallStack mDrawTrace;
- TraceCallStack mDepthFunctionTrace;
- TraceCallStack mStencilFunctionTrace;
- TraceCallStack mScissorTrace;
- TraceCallStack mSetUniformTrace;
-
- // Shaders & Uniforms
- GLuint mLastShaderIdUsed;
- GLuint mLastProgramIdUsed;
- GLuint mLastUniformIdUsed;
- typedef std::map< std::string, GLint > UniformIDMap;
- typedef std::map< GLuint, UniformIDMap > ProgramUniformMap;
- ProgramUniformMap mUniforms;
-
- template <typename T>
- struct ProgramUniformValue : public std::map< GLuint, std::map< GLint, T > >
- {
- public:
- typedef std::map< GLint, T > UniformValueMap;
- typedef std::map< GLuint, UniformValueMap > Map;
-
- bool SetUniformValue( GLuint program, GLuint uniform, const T& value )
- {
- if( program == 0 )
- {
- return false;
- }
-
- typename Map::iterator it = Map::find( program );
- if( it == Map::end() )
- {
- // if its the first uniform for this program add it
- std::pair< typename Map::iterator, bool > result =
- Map::insert( typename Map::value_type( program, UniformValueMap() ) );
- it = result.first;
- }
-
- UniformValueMap& uniforms = it->second;
- uniforms[uniform] = value;
-
- return true;
- }
-
- bool CheckUniformValue( GLuint program, GLuint uniform, const T& value ) const
- {
- T uniformValue;
- if ( GetUniformValue( program, uniform, uniformValue ) )
- {
- return CompareType<T>(value, uniformValue, Math::MACHINE_EPSILON_10);
- }
-
- return false;
- }
-
- bool GetUniformValue( GLuint program, GLuint uniform, T& value ) const
- {
- if( program == 0 )
- {
- return false;
- }
-
- typename Map::const_iterator it = Map::find( program );
- if( it == Map::end() )
- {
- // Uniform values always initialised as 0
- value = GetZero();
- return true;
- }
-
- const UniformValueMap& uniforms = it->second;
- typename UniformValueMap::const_iterator it2 = uniforms.find( uniform );
- if( it2 == uniforms.end() )
- {
- // Uniform values always initialised as 0
- value = GetZero();
- return true;
- }
- value = it2->second;
-
- return true;
- }
-
- T GetZero() const;
- };
- ProgramUniformValue<int> mProgramUniforms1i;
- ProgramUniformValue<float> mProgramUniforms1f;
- ProgramUniformValue<Vector2> mProgramUniforms2f;
- ProgramUniformValue<Vector3> mProgramUniforms3f;
- ProgramUniformValue<Vector4> mProgramUniforms4f;
- ProgramUniformValue<Matrix> mProgramUniformsMat4;
- ProgramUniformValue<Matrix3> mProgramUniformsMat3;
-
- inline const ProgramUniformValue<int>& GetProgramUniformsForType( const int ) const
- {
- return mProgramUniforms1i;
- }
- inline const ProgramUniformValue<float>& GetProgramUniformsForType( const float ) const
- {
- return mProgramUniforms1f;
- }
- inline const ProgramUniformValue<Vector2>& GetProgramUniformsForType( const Vector2& ) const
- {
- return mProgramUniforms2f;
- }
- inline const ProgramUniformValue<Vector3>& GetProgramUniformsForType( const Vector3& ) const
- {
- return mProgramUniforms3f;
- }
- inline const ProgramUniformValue<Vector4>& GetProgramUniformsForType( const Vector4& ) const
- {
- return mProgramUniforms4f;
- }
- inline const ProgramUniformValue<Matrix>& GetProgramUniformsForType( const Matrix& ) const
- {
- return mProgramUniformsMat4;
- }
- inline const ProgramUniformValue<Matrix3>& GetProgramUniformsForType( const Matrix3& ) const
- {
- return mProgramUniformsMat3;
- }
- inline void SetVertexAttribArray(GLuint index, bool state)
- {
- if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
- {
- // out of range
- return;
- }
- mVertexAttribArrayState[ index ] = state;
- mVertexAttribArrayChanged = true;
- }
-
- ScissorParams mScissorParams;
- ColorMaskParams mColorMaskParams;
-};
-
-template <>
-inline int TestGlAbstraction::ProgramUniformValue<int>::GetZero() const
-{
- return 0;
-}
-
-template <>
-inline float TestGlAbstraction::ProgramUniformValue<float>::GetZero() const
-{
- return 0.0f;
-}
-
-template <>
-inline Vector2 TestGlAbstraction::ProgramUniformValue<Vector2>::GetZero() const
-{
- return Vector2::ZERO;
-}
-
-template <>
-inline Vector3 TestGlAbstraction::ProgramUniformValue<Vector3>::GetZero() const
-{
- return Vector3::ZERO;
-}
-
-template <>
-inline Vector4 TestGlAbstraction::ProgramUniformValue<Vector4>::GetZero() const
-{
- return Vector4::ZERO;
-}
-
-template <>
-inline Matrix TestGlAbstraction::ProgramUniformValue<Matrix>::GetZero() const
-{
- return Matrix();
-}
-
-template <>
-inline Matrix3 TestGlAbstraction::ProgramUniformValue<Matrix3>::GetZero() const
-{
- return Matrix3( Matrix() );
-}
-
-} // namespace Dali
-
-bool BlendEnabled(const Dali::TraceCallStack& callStack);
-bool BlendDisabled(const Dali::TraceCallStack& callStack);
-
-
-#endif // TEST_GL_ABSTRACTION_H
+++ /dev/null
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "test-gl-sync-abstraction.h"
-
-namespace Dali
-{
-
-TestSyncObject::TestSyncObject(TraceCallStack& trace)
-: synced(false),
- mTrace(trace)
-{
-}
-
-TestSyncObject::~TestSyncObject()
-{
-}
-
-bool TestSyncObject::IsSynced()
-{
- mTrace.PushCall("SyncObject::IsSynced", ""); // Trace the method
- return synced;
-}
-
-
-
-TestGlSyncAbstraction::TestGlSyncAbstraction()
-{
- Initialize();
-}
-
-/**
- * Destructor
- */
-TestGlSyncAbstraction::~TestGlSyncAbstraction()
-{
- for( SyncIter iter=mSyncObjects.begin(), end=mSyncObjects.end(); iter != end; ++iter )
- {
- delete *iter;
- }
-}
-
-/**
- * Initialize the sync objects - clear down the map
- */
-void TestGlSyncAbstraction::Initialize()
-{
- mSyncObjects.clear();
-}
-
-/**
- * Create a sync object
- * @return the sync object
- */
-Integration::GlSyncAbstraction::SyncObject* TestGlSyncAbstraction::CreateSyncObject( )
-{
- mTrace.PushCall("CreateSyncObject", ""); // Trace the method
-
- TestSyncObject* syncObject = new TestSyncObject(mTrace);
- mSyncObjects.push_back( syncObject );
- return syncObject;
-}
-
-/**
- * Destroy a sync object
- * @param[in] syncObject The object to destroy
- */
-void TestGlSyncAbstraction::DestroySyncObject( Integration::GlSyncAbstraction::SyncObject* syncObject )
-{
- std::stringstream out;
- out << syncObject;
- mTrace.PushCall("DestroySyncObject", out.str()); // Trace the method
-
- for( SyncIter iter=mSyncObjects.begin(), end=mSyncObjects.end(); iter != end; ++iter )
- {
- if( *iter == syncObject )
- {
- delete *iter;
- mSyncObjects.erase(iter);
- break;
- }
- }
-}
-
-
-Integration::GlSyncAbstraction::SyncObject* TestGlSyncAbstraction::GetLastSyncObject( )
-{
- if( !mSyncObjects.empty() )
- {
- return mSyncObjects.back();
- }
- return NULL;
-}
-
-/**
- * Test method to trigger the object sync behaviour.
- * @param[in]
- * @param[in] sync The sync value to set
- */
-void TestGlSyncAbstraction::SetObjectSynced( Integration::GlSyncAbstraction::SyncObject* syncObject, bool sync )
-{
- TestSyncObject* testSyncObject = static_cast<TestSyncObject*>(syncObject);
- testSyncObject->synced = sync;
-}
-
-/**
- * Turn trace on
- */
-void TestGlSyncAbstraction::EnableTrace(bool enable) { mTrace.Enable(enable); }
-
-/**
- * Reset the trace callstack
- */
-void TestGlSyncAbstraction::ResetTrace() { mTrace.Reset(); }
-
-/**
- * Get the trace object (allows test case to find methods on it)
- */
-TraceCallStack& TestGlSyncAbstraction::GetTrace() { return mTrace; }
-
-int TestGlSyncAbstraction::GetNumberOfSyncObjects()
-{
- return mSyncObjects.size();
-}
-
-
-} // Dali
+++ /dev/null
-#ifndef __TEST_GL_SYNC_ABSTRACTION_H__
-#define __TEST_GL_SYNC_ABSTRACTION_H__
-
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// EXTERNAL INCLUDES
-#include <sstream>
-#include <string>
-#include <map>
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/core.h>
-#include <dali/integration-api/gl-sync-abstraction.h>
-#include "test-trace-call-stack.h"
-
-namespace Dali
-{
-
-class DALI_IMPORT_API TestSyncObject : public Integration::GlSyncAbstraction::SyncObject
-{
-public:
- TestSyncObject(TraceCallStack& trace);
- ~TestSyncObject();
- bool IsSynced();
- bool synced;
- TraceCallStack& mTrace;
-};
-
-/**
- * Class to emulate the GL sync functions with tracing
- */
-class DALI_IMPORT_API TestGlSyncAbstraction: public Integration::GlSyncAbstraction
-{
-public:
- /**
- * Constructor
- */
- TestGlSyncAbstraction();
-
- /**
- * Destructor
- */
- ~TestGlSyncAbstraction();
-
- /**
- * Initialize the sync objects - clear down the map
- */
- void Initialize();
-
- /**
- * Create a sync object
- * @return the sync object
- */
- virtual Integration::GlSyncAbstraction::SyncObject* CreateSyncObject( );
-
- /**
- * Destroy a sync object
- * @param[in] syncObject The object to destroy
- */
- virtual void DestroySyncObject( Integration::GlSyncAbstraction::SyncObject* syncObject );
-
-
-public: // TEST FUNCTIONS
- Integration::GlSyncAbstraction::SyncObject* GetLastSyncObject( );
-
- /**
- * Test method to trigger the object sync behaviour.
- * @param[in]
- * @param[in] sync The sync value to set
- */
- void SetObjectSynced( Integration::GlSyncAbstraction::SyncObject* syncObject, bool sync );
-
- /**
- * Turn trace on
- */
- void EnableTrace(bool enable);
-
- /**
- * Reset the trace callstack
- */
- void ResetTrace();
-
- /**
- * Get the trace object (allows test case to find methods on it)
- */
- TraceCallStack& GetTrace();
-
- /**
- * Get the number of sync objects
- *
- * @return the number of sync objects
- */
- int GetNumberOfSyncObjects();
-
-private:
-
- TestGlSyncAbstraction( const TestGlSyncAbstraction& ); ///< Undefined
- TestGlSyncAbstraction& operator=( const TestGlSyncAbstraction& ); ///< Undefined
-
- typedef std::vector<TestSyncObject*> SyncContainer;
- typedef SyncContainer::iterator SyncIter;
- SyncContainer mSyncObjects; ///< The sync objects
- TraceCallStack mTrace; ///< the trace call stack for testing
-};
-
-} // Dali
-
-#endif // __TEST_GL_SYNC_ABSTRACTION_H__
-# Copyright (c) 2017 Samsung Electronics Co., Ltd.
+# Copyright (c) 2018 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.
../../../automated-tests/src/dali/dali-test-suite-utils/test-application.cpp \
../../../automated-tests/src/dali/dali-test-suite-utils/test-platform-abstraction.cpp \
../../../automated-tests/src/dali/dali-test-suite-utils/test-render-controller.cpp \
- ../../../automated-tests/src/dali/dali-test-suite-utils/test-gl-abstraction.cpp \
../../../automated-tests/src/dali/dali-test-suite-utils/test-gesture-manager.cpp \
- ../../../automated-tests/src/dali/dali-test-suite-utils/test-gl-sync-abstraction.cpp \
../../../automated-tests/src/dali/dali-test-suite-utils/test-trace-call-stack.cpp
linker_test_CXXFLAGS = \
endif
endif
-
-# Copyright (c) 2017 Samsung Electronics Co., Ltd.
+# Copyright (c) 2018 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.
# -Wfloat-equal causes issues with vulkan.hpp, removed for now
cxx_more_warnings = -Wold-style-cast -Woverloaded-virtual -Wdouble-promotion -Wswitch-enum \
-Wshadow \
- -Wlarger-than=1024 \
-Wcast-qual -Wcast-align \
-Wconversion -Wsign-conversion
+#-Wlarger-than=1024 # Conflicts with --coverage
+
# the following warnings should not be enforced
cxx_warnings_to_remove = \
-Wno-c++98-compat \
-Wno-unused-parameter \
- -Wno-unknown-warning-option
+ -Wno-unknown-warning-option \
+ -Wno-switch \
+ -Wno-switch-enum \
+ -Wno-error=switch \
+ -Wno-error=switch-enum
#the following warnings should be added back when possible
cxx_warnings_to_preserve = \
$(dali_core_includes) \
$(DALI_CFLAGS) \
$(vulkan_flags)
-
-
namespace Vulkan
{
static const mat4 CLIP_MATRIX(
- 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 1.0f );
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.5f, 0.0f,
+ 0.0f, 0.0f, 0.5f, 1.0f );
struct Controller::Impl
{
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/event/common/thread-local-storage.h>
#include <dali/internal/event/images/bitmap-packed-pixel.h>
#include <dali/internal/event/images/bitmap-compressed.h>
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/integration-api/gl-defines.h>
namespace Dali
{
{
using namespace Dali::Pixel;
-void ConvertToGlFormat( Format pixelformat, unsigned& pixelDataType, unsigned& internalFormat )
-{
- // Compressed textures have no pixelDataType, so init to an invalid value:
- pixelDataType = -1;
-
- switch( pixelformat )
- {
- case A8:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- internalFormat= GL_ALPHA;
- break;
- }
-
- case L8:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- internalFormat= GL_LUMINANCE;
- break;
- }
-
- case LA88:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- internalFormat= GL_LUMINANCE_ALPHA;
- break;
- }
-
- case RGB565:
- {
- pixelDataType = GL_UNSIGNED_SHORT_5_6_5;
- internalFormat= GL_RGB;
- break;
- }
-
- case BGR565:
- {
- DALI_LOG_ERROR("Pixel format BGR565 is not supported by GLES.\n");
- pixelDataType = GL_UNSIGNED_SHORT_5_6_5;
-#ifdef _ARCH_ARM_
- internalFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- internalFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- case RGBA4444:
- {
- pixelDataType = GL_UNSIGNED_SHORT_4_4_4_4;
- internalFormat= GL_RGBA;
- break;
- }
-
- case BGRA4444:
- {
- DALI_LOG_ERROR("Pixel format BGRA4444 is not supported by GLES.\n");
- pixelDataType = GL_UNSIGNED_SHORT_4_4_4_4;
-#ifdef _ARCH_ARM_
- internalFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- internalFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- case RGBA5551:
- {
- pixelDataType = GL_UNSIGNED_SHORT_5_5_5_1;
- internalFormat= GL_RGBA;
- break;
- }
-
- case BGRA5551:
- {
- DALI_LOG_ERROR("Pixel format BGRA5551 is not supported by GLES.\n");
- pixelDataType = GL_UNSIGNED_SHORT_5_5_5_1;
-#ifdef _ARCH_ARM_
- internalFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- internalFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- case RGB888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- internalFormat= GL_RGB;
- break;
- }
-
- case RGB8888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- internalFormat= GL_RGBA; // alpha is reserved but not used
- break;
- }
-
- case BGR8888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
-#ifdef GL_BGRA_EXT
- internalFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- internalFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- case RGBA8888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- internalFormat= GL_RGBA;
- break;
- }
-
- case BGRA8888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
-#ifdef GL_BGRA_EXT
- internalFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- internalFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- // GLES 2 extension compressed formats:
- case COMPRESSED_RGB8_ETC1:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using non-standard GLES 2.0 extension compressed pixel format COMPRESSED_RGB8_ETC1.\n" );
- internalFormat = 0x8D64; ///! < Hardcoded so we can test before we move to GLES 3.0 or greater.
- break;
- }
- case COMPRESSED_RGB_PVRTC_4BPPV1:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using non-standard GLES 2.0 extension compressed pixel format COMPRESSED_RGB_PVRTC_4BPPV1.\n" );
- internalFormat = 0x8C00; ///! < Hardcoded so we can test before we move to GLES 3.0 or greater.
- break;
- }
-
- // GLES 3.0 standard compressed formats:
- case COMPRESSED_R11_EAC:
- {
- DALI_LOG_INFO(Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_R11_EAC.\n");
- internalFormat = GL_COMPRESSED_R11_EAC;
- break;
- }
- case COMPRESSED_SIGNED_R11_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SIGNED_R11_EAC.\n" );
- internalFormat = GL_COMPRESSED_SIGNED_R11_EAC;
- break;
- }
- case COMPRESSED_RG11_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_RG11_EAC.\n" );
- internalFormat = GL_COMPRESSED_RG11_EAC;
- break;
- }
- case COMPRESSED_SIGNED_RG11_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SIGNED_RG11_EAC.\n" );
- internalFormat = GL_COMPRESSED_SIGNED_RG11_EAC;
- break;
- }
- case COMPRESSED_RGB8_ETC2:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_RGB8_ETC2.\n" );
- internalFormat = GL_COMPRESSED_RGB8_ETC2;
- break;
- }
- case COMPRESSED_SRGB8_ETC2:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SRGB8_ETC2.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ETC2;
- break;
- }
- case COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2.\n" );
- internalFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
- break;
- }
- case COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
- break;
- }
- case COMPRESSED_RGBA8_ETC2_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_RGBA8_ETC2_EAC.\n" );
- internalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
- break;
- }
-
- // GLES 3.1 extension compressed formats:
- case COMPRESSED_RGBA_ASTC_4x4_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_4x4_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_5x4_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_5x4_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_5x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_5x5_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_6x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_6x5_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_6x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_6x6_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_8x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_8x5_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_8x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_8x6_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_8x8_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_8x8_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_10x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_10x5_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_10x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_10x6_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_10x8_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_10x8_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_10x10_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_10x10_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_12x10_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_12x10_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
- break;
- }
- case COMPRESSED_RGBA_ASTC_12x12_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_12x12_KHR.\n" );
- internalFormat = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
- break;
- }
- case COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR.\n" );
- internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
- break;
- }
-
- // GLES 3.0 floating point formats.
- case RGB16F:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 GLES 3.0 floating point format.\n" );
- pixelDataType = GL_HALF_FLOAT;
- internalFormat= GL_RGB;
- break;
- }
- case RGB32F:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 GLES 3.0 floating point format.\n" );
- pixelDataType = GL_FLOAT;
- internalFormat= GL_RGB;
- break;
- }
-
- case INVALID:
- {
- DALI_LOG_ERROR( "Invalid pixel format for bitmap\n" );
- internalFormat = 0;
- break;
- }
- }
-}
Bitmap* Bitmap::New( const Profile profile = BITMAP_2D_PACKED_PIXELS,
ResourcePolicy::Discardable discardable = ResourcePolicy::OWNED_DISCARD )
#define __DALI_INTEGRATION_BITMAP_H__
/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
namespace Integration
{
-/**
- * Returns GL data type and internal format for specified pixel format
- * @param[in] pixelformat pixel format (eg. Pixel::RGBA32)
- * @param[out] pixelDataType pixel data type (eg. GL_UNSIGNED_BYTE)
- * @param[out] internalFormat pixel internal format (eg. GL_RGBA)
- */
-DALI_IMPORT_API void ConvertToGlFormat(Pixel::Format pixelformat, unsigned& pixelDataType, unsigned& internalFormat);
-
class Bitmap;
typedef IntrusivePtr<Bitmap> BitmapPtr;
typedef unsigned char PixelBuffer; ///< Pixel data buffers are composed of these
+++ /dev/null
-#ifndef __DALI_INTEGRATION_CONTEXT_NOTIFIER_H__
-#define __DALI_INTEGRATION_CONTEXT_NOTIFIER_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-namespace Dali
-{
-namespace Integration
-{
-
-/**
- * Interface to inform dali core of context loss and regain
- */
-class ContextNotifierInterface
-{
-public:
- /**
- * Notify that the GL context has been lost, e.g. during ReplaceSurface
- * or Pause.
- *
- * Multi-threading note: this method should be called from the main thread
- */
- virtual void NotifyContextLost() = 0;
-
- /**
- * Notify that the GL context has been re-created, e.g. after ReplaceSurface
- * or Context loss.
- *
- * In the case of ReplaceSurface, both ContextDestroyed() and ContextCreated() will have
- * been called on the render thread before this is called on the event thread.
- *
- * Multi-threading note: this method should be called from the main thread
- */
- virtual void NotifyContextRegained() = 0;
-
-protected:
-
- /**
- * Virtual destructor, no deletion through this interface
- */
- virtual ~ContextNotifierInterface() {}
-
-};
-
-} // namespace Integration
-} // namespace Dali
-
-
-#endif // __DALI_INTEGRATION_CONTEXT_NOTIFICATION_H__
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/public-api/common/dali-common.h>
#include <dali/integration-api/events/event.h>
-#include <dali/integration-api/gl-sync-abstraction.h>
+#include <dali/integration-api/debug.h>
#include <dali/integration-api/graphics/graphics.h>
#include <dali/internal/common/core-impl.h>
Core* Core::New( RenderController& renderController,
PlatformAbstraction& platformAbstraction,
Graphics::Graphics& graphics,
- GlAbstraction& glAbstraction,
- GlSyncAbstraction& glSyncAbstraction,
GestureManager& gestureManager,
ResourcePolicy::DataRetention policy,
bool renderToFboEnabled )
instance->mImpl = new Internal::Core( renderController,
platformAbstraction,
graphics,
- glAbstraction,
- glSyncAbstraction,
gestureManager,
policy,
renderToFboEnabled );
delete mImpl;
}
-ContextNotifierInterface* Core::GetContextNotifier()
-{
- return mImpl->GetContextNotifier();
-}
-
-void Core::ContextCreated()
-{
- mImpl->ContextCreated();
-}
-
-void Core::ContextDestroyed()
-{
- mImpl->ContextDestroyed();
-}
-
-void Core::RecoverFromContextLoss()
-{
- mImpl->RecoverFromContextLoss();
-}
-
-void Core::SurfaceResized(unsigned int width, unsigned int height)
+void Core::SurfaceResized( unsigned int width, unsigned int height )
{
mImpl->SurfaceResized(width, height);
}
mImpl->SetTopMargin(margin);
}
-void Core::SetDpi(unsigned int dpiHorizontal, unsigned int dpiVertical)
+void Core::SetDpi( unsigned int dpiHorizontal, unsigned int dpiVertical )
{
mImpl->SetDpi(dpiHorizontal, dpiVertical);
}
mImpl->SceneCreated();
}
-void Core::QueueEvent(const Event& event)
+void Core::QueueEvent( const Event& event )
{
mImpl->QueueEvent(event);
}
return mImpl->GetMaximumUpdateCount();
}
- void Core::Update( float elapsedSeconds, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds, UpdateStatus& status, bool renderToFboEnabled, bool isRenderingToFbo )
+void Core::Update(
+ float elapsedSeconds,
+ unsigned int lastVSyncTimeMilliseconds,
+ unsigned int nextVSyncTimeMilliseconds,
+ UpdateStatus& status,
+ bool renderToFboEnabled,
+ bool isRenderingToFbo )
{
- mImpl->Update( elapsedSeconds, lastVSyncTimeMilliseconds, nextVSyncTimeMilliseconds, status, renderToFboEnabled, isRenderingToFbo );
+ mImpl->Update( elapsedSeconds, lastVSyncTimeMilliseconds, nextVSyncTimeMilliseconds, status,
+ renderToFboEnabled, isRenderingToFbo );
}
void Core::Render( RenderStatus& status )
{
- mImpl->Render( status );
+ DALI_LOG_ERROR("Core::Render() called in error");
}
SystemOverlay& Core::GetSystemOverlay()
#define DALI_INTEGRATION_CORE_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// EXTERNAL INCLUDES
#include <dali/public-api/common/dali-common.h>
#include <dali/public-api/common/view-mode.h>
-#include <dali/integration-api/context-notifier.h>
#include <dali/integration-api/resource-policies.h>
namespace Dali
class Core;
class GestureManager;
-class GlAbstraction;
-class GlSyncAbstraction;
class PlatformAbstraction;
class RenderController;
class SystemOverlay;
* Integration::Core is used for integration with the native windowing system.
* The following integration tasks must be completed:
*
- * 1) Handle GL context creation, and notify the Core when this occurs.
+ * 1) Handle Graphics API
*
* 2) Provide suspend/resume behaviour (see below for more details).
*
* 3) Run an event loop, for passing events to the Core e.g. multi-touch input events.
* Notification events should be sent after a frame is updated (see UpdateStatus).
*
- * 4) Run a rendering loop, instructing the Core to render each frame.
- * A separate rendering thread is recommended; see multi-threading options below.
+ * 4) Run an animation loop, instructing the Core to process scene graph, animation and constraints
+ * A separate update thread is recommended; see multi-threading options below.
*
* 5) Provide an implementation of the PlatformAbstraction interface, used to access platform specific services.
*
- * 6) Provide an implementation of the GlAbstraction interface, used to access OpenGL services.
- *
- * 7) Provide an implementation of the GestureManager interface, used to register gestures provided by the platform.
+ * 6) Provide an implementation of the GestureManager interface, used to register gestures provided by the platform.
*
* Multi-threading notes:
*
- * The Dali API methods are not reentrant. If you access the API from multiple threads simultaneously, then the results
- * are undefined. This means that your application might segfault, or behave unpredictably.
+ * The Dali API methods are not reentrant. If you access the API from multiple threads simultaneously, then
+ * the results are undefined. This means that your application might segfault, or behave unpredictably.
*
* Rendering strategies:
*
- * 1) Single-threaded. Call every Core method from the same thread. Event handling and rendering will occur in the same thread.
- * This is not recommended, since processing input (slowly) can affect the smooth flow of animations.
+ * 1) Single-threaded. Call every Core method from the same thread. Event handling and animation will occur in
+ * the same thread. This is not recommended, since processing input (slowly) can affect the smooth flow of
+ * animations.
*
- * 2) Multi-threaded. The Core update & render operations can be processed in separate threads.
- * See the method descriptions in Core to see which thread they should be called from.
+ * 2) Multi-threaded. The Core update operation can be processed in a separate thread.
+ * See the method description in Core to see which thread it should be called from.
* This is the recommended option, so that input processing will not affect the smoothness of animations.
- * Note that the rendering thread must be halted, before destroying the GL context.
*/
class DALI_IMPORT_API Core
{
* This object is used for integration with the native windowing system.
* @param[in] renderController The interface to an object which controls rendering.
* @param[in] platformAbstraction The interface providing platform specific services.
- * @param[in] glAbstraction The interface providing OpenGL services.
- * @param[in] glSyncAbstraction The interface providing OpenGL sync objects.
* @param[in] gestureManager The interface providing gesture manager services.
* @param[in] policy The data retention policy. This depends on application setting
* and platform support. Dali should honour this policy when deciding to discard
static Core* New( RenderController& renderController,
PlatformAbstraction& platformAbstraction,
Graphics::Graphics& graphics,
- GlAbstraction& glAbstraction,
- GlSyncAbstraction& glSyncAbstraction,
GestureManager& gestureManager,
ResourcePolicy::DataRetention policy,
bool renderToFboEnabled );
*/
~Core();
- // GL Context Lifecycle
-
- /**
- * Get the object that will notify the application/toolkit when context is lost/regained
- */
- ContextNotifierInterface* GetContextNotifier();
-
- /**
- * Notify the Core that the GL context has been created.
- * The context must be created before the Core can render.
- * Multi-threading note: this method should be called from the rendering thread only
- * @post The Core is aware of the GL context.
- */
- void ContextCreated();
-
/**
- * Notify the Core that that GL context is about to be destroyed.
- * The Core will free any previously allocated GL resources.
- * Multi-threading note: this method should be called from the rendering thread only
- * @post The Core is unaware of any GL context.
- */
- void ContextDestroyed();
-
- /**
- * Notify the Core that the GL context has been re-created, e.g. after ReplaceSurface
- * or Context loss.
- *
- * In the case of ReplaceSurface, both ContextToBeDestroyed() and ContextCreated() will have
- * been called on the render thread before this is called on the event thread.
- *
- * Multi-threading note: this method should be called from the main thread
- */
- void RecoverFromContextLoss();
-
- /**
- * Notify the Core that the GL surface has been resized.
- * This should be done at least once i.e. after the first call to ContextCreated().
- * The Core will use the surface size for camera calculations, and to set the GL viewport.
+ * Notify the Core that the render surface has been resized.
+ * The Core will use the surface size for camera calculations, and to set the viewport.
* Multi-threading note: this method should be called from the main thread
* @param[in] width The new surface width.
* @param[in] height The new surface height.
/**
* Queue an event with Core.
- * Pre-processing of events may be beneficial e.g. a series of motion events could be throttled, so that only the last event is queued.
- * Multi-threading note: this method should be called from the main thread.
+ * Pre-processing of events may be beneficial e.g. a series of motion events could be throttled, so that
+ * only the last event is queued. Multi-threading note: this method should be called from the main thread.
* @param[in] event The new event.
*/
void QueueEvent(const Event& event);
/**
* Render the next frame. This method should be preceded by a call up Update.
* Multi-threading note: this method should be called from a dedicated rendering thread.
- * @pre The GL context must have been created, and made current.
* @param[out] status showing whether update is required to run.
+ * @todo GRAPHICS - REMOVE
*/
void Render( RenderStatus& status );
platform_abstraction_header_files = \
$(platform_abstraction_src_dir)/core.h \
- $(platform_abstraction_src_dir)/context-notifier.h \
$(platform_abstraction_src_dir)/debug.h \
$(platform_abstraction_src_dir)/profiling.h \
$(platform_abstraction_src_dir)/input-options.h \
$(platform_abstraction_src_dir)/bitmap.h \
$(platform_abstraction_src_dir)/resource-policies.h \
$(platform_abstraction_src_dir)/resource-types.h \
- $(platform_abstraction_src_dir)/gl-abstraction.h \
- $(platform_abstraction_src_dir)/gl-defines.h \
- $(platform_abstraction_src_dir)/gl-sync-abstraction.h \
$(platform_abstraction_src_dir)/gesture-manager.h \
$(platform_abstraction_src_dir)/render-controller.h \
$(platform_abstraction_src_dir)/platform-abstraction.h \
graphics_vulkan_integration_header_files = \
$(platform_abstraction_src_dir)/graphics/vulkan/vk-surface-factory.h \
$(platform_abstraction_src_dir)/graphics/vulkan/vulkan-hpp-wrapper.h
-
+++ /dev/null
-#ifndef __DALI_INTEGRATION_GL_ABSTRACTION_H__
-#define __DALI_INTEGRATION_GL_ABSTRACTION_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <stdint.h>
-
-/*
- * This file is based on gl3.h, the following licence is included for conformance.
- */
-/*
-** Copyright (c) 2007-2012 The Khronos Group Inc.
-**
-** Permission is hereby granted, free of charge, to any person obtaining a
-** copy of this software and/or associated documentation files (the
-** "Materials"), to deal in the Materials without restriction, including
-** without limitation the rights to use, copy, modify, merge, publish,
-** distribute, sublicense, and/or sell copies of the Materials, and to
-** permit persons to whom the Materials are furnished to do so, subject to
-** the following conditions:
-**
-** The above copyright notice and this permission notice shall be included
-** in all copies or substantial portions of the Materials.
-**
-** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
-*/
-
-
-/* OpenGL ES 3.0 */
-struct __GLsync;
-
-namespace Dali
-{
-
-/**
- * These types are equivalent to those in the GLES2 API.
- * Dali objects should only access GL indirectly, through the Context API.
- */
-
-/* OpenGL ES 2.0 */
-
-typedef void GLvoid;
-typedef char GLchar;
-typedef unsigned int GLenum;
-typedef unsigned char GLboolean;
-typedef unsigned int GLbitfield;
-typedef int8_t GLbyte;
-typedef short GLshort;
-typedef int GLint;
-typedef int GLsizei;
-typedef uint8_t GLubyte;
-typedef unsigned short GLushort;
-typedef unsigned int GLuint;
-typedef float GLfloat;
-typedef float GLclampf;
-typedef int GLfixed;
-typedef signed long int GLintptr;
-typedef signed long int GLsizeiptr;
-
-/* OpenGL ES 3.0 */
-
-typedef unsigned short GLhalf;
-typedef int64_t GLint64;
-typedef uint64_t GLuint64;
-typedef __GLsync* GLsync;
-
-namespace Integration
-{
-
-/**
- * GlAbstraction is an abstract interface, used to access OpenGL services.
- * A concrete implementation must be created for each platform, and provided when creating the
- * Dali::Integration::Core object.
- */
-class GlAbstraction
-{
-protected:
-
- /**
- * Virtual protected destructor, no deletion through this interface
- */
- virtual ~GlAbstraction() {}
-
-public:
- /**
- * Invoked by Render thread before Core::Render.
- */
- virtual void PreRender() = 0;
-
- /**
- * Invoked by Render thread after Core::Render
- * Inform the gl implementation that the rendering in this frame has finished,
- * and how much time was spent.
- */
- virtual void PostRender() = 0;
-
- /**
- * The number of texture units an implementation supports is implementation dependent, but must be at least 8.
- */
- static const unsigned int MIN_TEXTURE_UNIT_LIMIT = 8;
-
- /* OpenGL ES 2.0 */
-
- virtual void ActiveTexture (GLenum texture) = 0;
- virtual void AttachShader (GLuint program, GLuint shader) = 0;
- virtual void BindAttribLocation (GLuint program, GLuint index, const char* name) = 0;
- virtual void BindBuffer (GLenum target, GLuint buffer) = 0;
- virtual void BindFramebuffer (GLenum target, GLuint framebuffer) = 0;
- virtual void BindRenderbuffer (GLenum target, GLuint renderbuffer) = 0;
- virtual void BindTexture (GLenum target, GLuint texture) = 0;
- virtual void BlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = 0;
- virtual void BlendEquation ( GLenum mode ) = 0;
- virtual void BlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha) = 0;
- virtual void BlendFunc (GLenum sfactor, GLenum dfactor) = 0;
- virtual void BlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = 0;
- virtual void BufferData (GLenum target, GLsizeiptr size, const void* data, GLenum usage) = 0;
- virtual void BufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void* data) = 0;
- virtual GLenum CheckFramebufferStatus (GLenum target) = 0;
- virtual void Clear (GLbitfield mask) = 0;
- virtual void ClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = 0;
- virtual void ClearDepthf (GLclampf depth) = 0;
- virtual void ClearStencil (GLint s) = 0;
- virtual void ColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = 0;
- virtual void CompileShader (GLuint shader) = 0;
- virtual void CompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) = 0;
- virtual void CompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) = 0;
- virtual void CopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) = 0;
- virtual void CopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) = 0;
- virtual GLuint CreateProgram (void) = 0;
- virtual GLuint CreateShader (GLenum type) = 0;
- virtual void CullFace (GLenum mode) = 0;
- virtual void DeleteBuffers (GLsizei n, const GLuint* buffers) = 0;
- virtual void DeleteFramebuffers (GLsizei n, const GLuint* framebuffers) = 0;
- virtual void DeleteProgram (GLuint program) = 0;
- virtual void DeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers) = 0;
- virtual void DeleteShader (GLuint shader) = 0;
- virtual void DeleteTextures (GLsizei n, const GLuint* textures) = 0;
- virtual void DepthFunc (GLenum func) = 0;
- virtual void DepthMask (GLboolean flag) = 0;
- virtual void DepthRangef (GLclampf zNear, GLclampf zFar) = 0;
- virtual void DetachShader (GLuint program, GLuint shader) = 0;
- virtual void Disable (GLenum cap) = 0;
- virtual void DisableVertexAttribArray (GLuint index) = 0;
- virtual void DrawArrays (GLenum mode, GLint first, GLsizei count) = 0;
- virtual void DrawElements (GLenum mode, GLsizei count, GLenum type, const void* indices) = 0;
- virtual void Enable (GLenum cap) = 0;
- virtual void EnableVertexAttribArray (GLuint index) = 0;
- virtual void Finish (void) = 0;
- virtual void Flush (void) = 0;
- virtual void FramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = 0;
- virtual void FramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = 0;
- virtual void FrontFace (GLenum mode) = 0;
- virtual void GenBuffers (GLsizei n, GLuint* buffers) = 0;
- virtual void GenerateMipmap (GLenum target) = 0;
- virtual void GenFramebuffers (GLsizei n, GLuint* framebuffers) = 0;
- virtual void GenRenderbuffers (GLsizei n, GLuint* renderbuffers) = 0;
- virtual void GenTextures (GLsizei n, GLuint* textures) = 0;
- virtual void GetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = 0;
- virtual void GetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = 0;
- virtual void GetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) = 0;
- virtual GLint GetAttribLocation (GLuint program, const char* name) = 0;
- virtual void GetBooleanv (GLenum pname, GLboolean* params) = 0;
- virtual void GetBufferParameteriv (GLenum target, GLenum pname, GLint* params) = 0;
- virtual GLenum GetError (void) = 0;
- virtual void GetFloatv (GLenum pname, GLfloat* params) = 0;
- virtual void GetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params) = 0;
- virtual void GetIntegerv (GLenum pname, GLint* params) = 0;
- virtual void GetProgramiv (GLuint program, GLenum pname, GLint* params) = 0;
- virtual void GetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) = 0;
- virtual void GetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params) = 0;
- virtual void GetShaderiv (GLuint shader, GLenum pname, GLint* params) = 0;
- virtual void GetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) = 0;
- virtual void GetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) = 0;
- virtual void GetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, char* source) = 0;
- virtual const GLubyte* GetString (GLenum name) = 0;
- virtual void GetTexParameterfv (GLenum target, GLenum pname, GLfloat* params) = 0;
- virtual void GetTexParameteriv (GLenum target, GLenum pname, GLint* params) = 0;
- virtual void GetUniformfv (GLuint program, GLint location, GLfloat* params) = 0;
- virtual void GetUniformiv (GLuint program, GLint location, GLint* params) = 0;
- virtual GLint GetUniformLocation (GLuint program, const char* name) = 0;
- virtual void GetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params) = 0;
- virtual void GetVertexAttribiv (GLuint index, GLenum pname, GLint* params) = 0;
- virtual void GetVertexAttribPointerv (GLuint index, GLenum pname, void** pointer) = 0;
- virtual void Hint (GLenum target, GLenum mode) = 0;
- virtual GLboolean IsBuffer (GLuint buffer) = 0;
- virtual GLboolean IsEnabled (GLenum cap) = 0;
- virtual GLboolean IsFramebuffer (GLuint framebuffer) = 0;
- virtual GLboolean IsProgram (GLuint program) = 0;
- virtual GLboolean IsRenderbuffer (GLuint renderbuffer) = 0;
- virtual GLboolean IsShader (GLuint shader) = 0;
- virtual GLboolean IsTexture (GLuint texture) = 0;
- virtual void LineWidth (GLfloat width) = 0;
- virtual void LinkProgram (GLuint program) = 0;
- virtual void PixelStorei (GLenum pname, GLint param) = 0;
- virtual void PolygonOffset (GLfloat factor, GLfloat units) = 0;
- virtual void ReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) = 0;
- virtual void ReleaseShaderCompiler (void) = 0;
- virtual void RenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = 0;
- virtual void SampleCoverage (GLclampf value, GLboolean invert) = 0;
- virtual void Scissor (GLint x, GLint y, GLsizei width, GLsizei height) = 0;
- virtual void ShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) = 0;
- virtual void ShaderSource (GLuint shader, GLsizei count, const char** string, const GLint* length) = 0;
- virtual void StencilFunc (GLenum func, GLint ref, GLuint mask) = 0;
- virtual void StencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask) = 0;
- virtual void StencilMask (GLuint mask) = 0;
- virtual void StencilMaskSeparate (GLenum face, GLuint mask) = 0;
- virtual void StencilOp (GLenum fail, GLenum zfail, GLenum zpass) = 0;
- virtual void StencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass) = 0;
- virtual void TexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) = 0;
- virtual void TexParameterf (GLenum target, GLenum pname, GLfloat param) = 0;
- virtual void TexParameterfv (GLenum target, GLenum pname, const GLfloat* params) = 0;
- virtual void TexParameteri (GLenum target, GLenum pname, GLint param) = 0;
- virtual void TexParameteriv (GLenum target, GLenum pname, const GLint* params) = 0;
- virtual void TexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) = 0;
- virtual void Uniform1f (GLint location, GLfloat x) = 0;
- virtual void Uniform1fv (GLint location, GLsizei count, const GLfloat* v) = 0;
- virtual void Uniform1i (GLint location, GLint x) = 0;
- virtual void Uniform1iv (GLint location, GLsizei count, const GLint* v) = 0;
- virtual void Uniform2f (GLint location, GLfloat x, GLfloat y) = 0;
- virtual void Uniform2fv (GLint location, GLsizei count, const GLfloat* v) = 0;
- virtual void Uniform2i (GLint location, GLint x, GLint y) = 0;
- virtual void Uniform2iv (GLint location, GLsizei count, const GLint* v) = 0;
- virtual void Uniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z) = 0;
- virtual void Uniform3fv (GLint location, GLsizei count, const GLfloat* v) = 0;
- virtual void Uniform3i (GLint location, GLint x, GLint y, GLint z) = 0;
- virtual void Uniform3iv (GLint location, GLsizei count, const GLint* v) = 0;
- virtual void Uniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0;
- virtual void Uniform4fv (GLint location, GLsizei count, const GLfloat* v) = 0;
- virtual void Uniform4i (GLint location, GLint x, GLint y, GLint z, GLint w) = 0;
- virtual void Uniform4iv (GLint location, GLsizei count, const GLint* v) = 0;
- virtual void UniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void UniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void UniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void UseProgram (GLuint program) = 0;
- virtual void ValidateProgram (GLuint program) = 0;
- virtual void VertexAttrib1f (GLuint indx, GLfloat x) = 0;
- virtual void VertexAttrib1fv (GLuint indx, const GLfloat* values) = 0;
- virtual void VertexAttrib2f (GLuint indx, GLfloat x, GLfloat y) = 0;
- virtual void VertexAttrib2fv (GLuint indx, const GLfloat* values) = 0;
- virtual void VertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z) = 0;
- virtual void VertexAttrib3fv (GLuint indx, const GLfloat* values) = 0;
- virtual void VertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0;
- virtual void VertexAttrib4fv (GLuint indx, const GLfloat* values) = 0;
- virtual void VertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) = 0;
- virtual void Viewport (GLint x, GLint y, GLsizei width, GLsizei height) = 0;
-
- /* OpenGL ES 3.0 */
-
- virtual void ReadBuffer (GLenum mode) = 0;
- virtual void DrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices) = 0;
- virtual void TexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels) = 0;
- virtual 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) = 0;
- virtual void CopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) = 0;
- virtual void CompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data) = 0;
- virtual 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) = 0;
- virtual void GenQueries (GLsizei n, GLuint* ids) = 0;
- virtual void DeleteQueries (GLsizei n, const GLuint* ids) = 0;
- virtual GLboolean IsQuery (GLuint id) = 0;
- virtual void BeginQuery (GLenum target, GLuint id) = 0;
- virtual void EndQuery (GLenum target) = 0;
- virtual void GetQueryiv (GLenum target, GLenum pname, GLint* params) = 0;
- virtual void GetQueryObjectuiv (GLuint id, GLenum pname, GLuint* params) = 0;
- virtual GLboolean UnmapBuffer (GLenum target) = 0;
- virtual void GetBufferPointerv (GLenum target, GLenum pname, GLvoid** params) = 0;
- virtual void DrawBuffers (GLsizei n, const GLenum* bufs) = 0;
- virtual void UniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void UniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void UniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void UniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void UniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void UniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = 0;
- virtual void BlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) = 0;
- virtual void RenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) = 0;
- virtual void FramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) = 0;
- virtual GLvoid* MapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) = 0;
- virtual void FlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length) = 0;
- virtual void BindVertexArray (GLuint array) = 0;
- virtual void DeleteVertexArrays (GLsizei n, const GLuint* arrays) = 0;
- virtual void GenVertexArrays (GLsizei n, GLuint* arrays) = 0;
- virtual GLboolean IsVertexArray (GLuint array) = 0;
- virtual void GetIntegeri_v (GLenum target, GLuint index, GLint* data) = 0;
- virtual void BeginTransformFeedback (GLenum primitiveMode) = 0;
- virtual void EndTransformFeedback (void) = 0;
- virtual void BindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) = 0;
- virtual void BindBufferBase (GLenum target, GLuint index, GLuint buffer) = 0;
- virtual void TransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode) = 0;
- virtual void GetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) = 0;
- virtual void VertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) = 0;
- virtual void GetVertexAttribIiv (GLuint index, GLenum pname, GLint* params) = 0;
- virtual void GetVertexAttribIuiv (GLuint index, GLenum pname, GLuint* params) = 0;
- virtual void VertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w) = 0;
- virtual void VertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) = 0;
- virtual void VertexAttribI4iv (GLuint index, const GLint* v) = 0;
- virtual void VertexAttribI4uiv (GLuint index, const GLuint* v) = 0;
- virtual void GetUniformuiv (GLuint program, GLint location, GLuint* params) = 0;
- virtual GLint GetFragDataLocation (GLuint program, const GLchar *name) = 0;
- virtual void Uniform1ui (GLint location, GLuint v0) = 0;
- virtual void Uniform2ui (GLint location, GLuint v0, GLuint v1) = 0;
- virtual void Uniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2) = 0;
- virtual void Uniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) = 0;
- virtual void Uniform1uiv (GLint location, GLsizei count, const GLuint* value) = 0;
- virtual void Uniform2uiv (GLint location, GLsizei count, const GLuint* value) = 0;
- virtual void Uniform3uiv (GLint location, GLsizei count, const GLuint* value) = 0;
- virtual void Uniform4uiv (GLint location, GLsizei count, const GLuint* value) = 0;
- virtual void ClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint* value) = 0;
- virtual void ClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint* value) = 0;
- virtual void ClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat* value) = 0;
- virtual void ClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) = 0;
- virtual const GLubyte* GetStringi (GLenum name, GLuint index) = 0;
- virtual void CopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) = 0;
- virtual void GetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices) = 0;
- virtual void GetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params) = 0;
- virtual GLuint GetUniformBlockIndex (GLuint program, const GLchar* uniformBlockName) = 0;
- virtual void GetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) = 0;
- virtual void GetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName) = 0;
- virtual void UniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) = 0;
- virtual void DrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount) = 0;
- virtual void DrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount) = 0;
- virtual GLsync FenceSync (GLenum condition, GLbitfield flags) = 0;
- virtual GLboolean IsSync (GLsync sync) = 0;
- virtual void DeleteSync (GLsync sync) = 0;
- virtual GLenum ClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout) = 0;
- virtual void WaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout) = 0;
- virtual void GetInteger64v (GLenum pname, GLint64* params) = 0;
- virtual void GetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) = 0;
- virtual void GetInteger64i_v (GLenum target, GLuint index, GLint64* data) = 0;
- virtual void GetBufferParameteri64v (GLenum target, GLenum pname, GLint64* params) = 0;
- virtual void GenSamplers (GLsizei count, GLuint* samplers) = 0;
- virtual void DeleteSamplers (GLsizei count, const GLuint* samplers) = 0;
- virtual GLboolean IsSampler (GLuint sampler) = 0;
- virtual void BindSampler (GLuint unit, GLuint sampler) = 0;
- virtual void SamplerParameteri (GLuint sampler, GLenum pname, GLint param) = 0;
- virtual void SamplerParameteriv (GLuint sampler, GLenum pname, const GLint* param) = 0;
- virtual void SamplerParameterf (GLuint sampler, GLenum pname, GLfloat param) = 0;
- virtual void SamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat* param) = 0;
- virtual void GetSamplerParameteriv (GLuint sampler, GLenum pname, GLint* params) = 0;
- virtual void GetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat* params) = 0;
- virtual void VertexAttribDivisor (GLuint index, GLuint divisor) = 0;
- virtual void BindTransformFeedback (GLenum target, GLuint id) = 0;
- virtual void DeleteTransformFeedbacks (GLsizei n, const GLuint* ids) = 0;
- virtual void GenTransformFeedbacks (GLsizei n, GLuint* ids) = 0;
- virtual GLboolean IsTransformFeedback (GLuint id) = 0;
- virtual void PauseTransformFeedback (void) = 0;
- virtual void ResumeTransformFeedback (void) = 0;
- virtual void GetProgramBinary (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary) = 0;
- virtual void ProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length) = 0;
- virtual void ProgramParameteri (GLuint program, GLenum pname, GLint value) = 0;
- virtual void InvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum* attachments) = 0;
- virtual void InvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height) = 0;
- virtual void TexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) = 0;
- virtual void TexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) = 0;
- virtual void GetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params) = 0;
-
-};
-
-} // namespace Integration
-
-} // namespace Dali
-
-#endif // __DALI_INTEGRATION_GL_ABSTRACTION_H__
+++ /dev/null
-#ifndef __DALI_INTERNAL_GL_DEFINES_H__
-#define __DALI_INTERNAL_GL_DEFINES_H__
-
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <stdint.h>
-
-/*
- * This file is based on gl3.h, the following licence is included for conformance.
- */
-/*
-** Copyright (c) 2007-2012 The Khronos Group Inc.
-**
-** Permission is hereby granted, free of charge, to any person obtaining a
-** copy of this software and/or associated documentation files (the
-** "Materials"), to deal in the Materials without restriction, including
-** without limitation the rights to use, copy, modify, merge, publish,
-** distribute, sublicense, and/or sell copies of the Materials, and to
-** permit persons to whom the Materials are furnished to do so, subject to
-** the following conditions:
-**
-** The above copyright notice and this permission notice shall be included
-** in all copies or substantial portions of the Materials.
-**
-** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
-*/
-
-/* OpenGL ES 2.0 */
-
-/* ClearBufferMask */
-#define GL_DEPTH_BUFFER_BIT 0x00000100
-#define GL_STENCIL_BUFFER_BIT 0x00000400
-#define GL_COLOR_BUFFER_BIT 0x00004000
-
-/* Boolean */
-#define GL_FALSE 0
-#define GL_TRUE 1
-
-/* BeginMode */
-#define GL_POINTS 0x0000
-#define GL_LINES 0x0001
-#define GL_LINE_LOOP 0x0002
-#define GL_LINE_STRIP 0x0003
-#define GL_TRIANGLES 0x0004
-#define GL_TRIANGLE_STRIP 0x0005
-#define GL_TRIANGLE_FAN 0x0006
-
-/* BlendingFactorDest */
-#define GL_ZERO 0
-#define GL_ONE 1
-#define GL_SRC_COLOR 0x0300
-#define GL_ONE_MINUS_SRC_COLOR 0x0301
-#define GL_SRC_ALPHA 0x0302
-#define GL_ONE_MINUS_SRC_ALPHA 0x0303
-#define GL_DST_ALPHA 0x0304
-#define GL_ONE_MINUS_DST_ALPHA 0x0305
-
-/* BlendingFactorSrc */
-/* GL_ZERO */
-/* GL_ONE */
-#define GL_DST_COLOR 0x0306
-#define GL_ONE_MINUS_DST_COLOR 0x0307
-#define GL_SRC_ALPHA_SATURATE 0x0308
-/* GL_SRC_ALPHA */
-/* GL_ONE_MINUS_SRC_ALPHA */
-/* GL_DST_ALPHA */
-/* GL_ONE_MINUS_DST_ALPHA */
-
-/* BlendEquationSeparate */
-#define GL_FUNC_ADD 0x8006
-#define GL_BLEND_EQUATION 0x8009
-#define GL_BLEND_EQUATION_RGB 0x8009 /* same as BLEND_EQUATION */
-#define GL_BLEND_EQUATION_ALPHA 0x883D
-
-/* BlendSubtract */
-#define GL_FUNC_SUBTRACT 0x800A
-#define GL_FUNC_REVERSE_SUBTRACT 0x800B
-
-/* Separate Blend Functions */
-#define GL_BLEND_DST_RGB 0x80C8
-#define GL_BLEND_SRC_RGB 0x80C9
-#define GL_BLEND_DST_ALPHA 0x80CA
-#define GL_BLEND_SRC_ALPHA 0x80CB
-#define GL_CONSTANT_COLOR 0x8001
-#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
-#define GL_CONSTANT_ALPHA 0x8003
-#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
-#define GL_BLEND_COLOR 0x8005
-
-/* Buffer Objects */
-#define GL_ARRAY_BUFFER 0x8892
-#define GL_ELEMENT_ARRAY_BUFFER 0x8893
-#define GL_ARRAY_BUFFER_BINDING 0x8894
-#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
-
-#define GL_STREAM_DRAW 0x88E0
-#define GL_STATIC_DRAW 0x88E4
-#define GL_DYNAMIC_DRAW 0x88E8
-
-#define GL_BUFFER_SIZE 0x8764
-#define GL_BUFFER_USAGE 0x8765
-
-#define GL_CURRENT_VERTEX_ATTRIB 0x8626
-
-/* CullFaceMode */
-#define GL_FRONT 0x0404
-#define GL_BACK 0x0405
-#define GL_FRONT_AND_BACK 0x0408
-
-/* DepthFunction */
-/* GL_NEVER */
-/* GL_LESS */
-/* GL_EQUAL */
-/* GL_LEQUAL */
-/* GL_GREATER */
-/* GL_NOTEQUAL */
-/* GL_GEQUAL */
-/* GL_ALWAYS */
-
-/* EnableCap */
-#define GL_TEXTURE_2D 0x0DE1
-#define GL_CULL_FACE 0x0B44
-#define GL_BLEND 0x0BE2
-#define GL_DITHER 0x0BD0
-#define GL_STENCIL_TEST 0x0B90
-#define GL_DEPTH_TEST 0x0B71
-#define GL_SCISSOR_TEST 0x0C11
-#define GL_POLYGON_OFFSET_FILL 0x8037
-#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
-#define GL_SAMPLE_COVERAGE 0x80A0
-
-/* ErrorCode */
-#define GL_NO_ERROR 0
-#define GL_INVALID_ENUM 0x0500
-#define GL_INVALID_VALUE 0x0501
-#define GL_INVALID_OPERATION 0x0502
-#define GL_OUT_OF_MEMORY 0x0505
-
-/* FrontFaceDirection */
-#define GL_CW 0x0900
-#define GL_CCW 0x0901
-
-/* GetPName */
-#define GL_LINE_WIDTH 0x0B21
-#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
-#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
-#define GL_CULL_FACE_MODE 0x0B45
-#define GL_FRONT_FACE 0x0B46
-#define GL_DEPTH_RANGE 0x0B70
-#define GL_DEPTH_WRITEMASK 0x0B72
-#define GL_DEPTH_CLEAR_VALUE 0x0B73
-#define GL_DEPTH_FUNC 0x0B74
-#define GL_STENCIL_CLEAR_VALUE 0x0B91
-#define GL_STENCIL_FUNC 0x0B92
-#define GL_STENCIL_FAIL 0x0B94
-#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
-#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
-#define GL_STENCIL_REF 0x0B97
-#define GL_STENCIL_VALUE_MASK 0x0B93
-#define GL_STENCIL_WRITEMASK 0x0B98
-#define GL_STENCIL_BACK_FUNC 0x8800
-#define GL_STENCIL_BACK_FAIL 0x8801
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
-#define GL_STENCIL_BACK_REF 0x8CA3
-#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
-#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
-#define GL_VIEWPORT 0x0BA2
-#define GL_SCISSOR_BOX 0x0C10
-/* GL_SCISSOR_TEST */
-#define GL_COLOR_CLEAR_VALUE 0x0C22
-#define GL_COLOR_WRITEMASK 0x0C23
-#define GL_UNPACK_ALIGNMENT 0x0CF5
-#define GL_PACK_ALIGNMENT 0x0D05
-#define GL_MAX_TEXTURE_SIZE 0x0D33
-#define GL_MAX_VIEWPORT_DIMS 0x0D3A
-#define GL_SUBPIXEL_BITS 0x0D50
-#define GL_RED_BITS 0x0D52
-#define GL_GREEN_BITS 0x0D53
-#define GL_BLUE_BITS 0x0D54
-#define GL_ALPHA_BITS 0x0D55
-#define GL_DEPTH_BITS 0x0D56
-#define GL_STENCIL_BITS 0x0D57
-#define GL_POLYGON_OFFSET_UNITS 0x2A00
-/* GL_POLYGON_OFFSET_FILL */
-#define GL_POLYGON_OFFSET_FACTOR 0x8038
-#define GL_TEXTURE_BINDING_2D 0x8069
-#define GL_SAMPLE_BUFFERS 0x80A8
-#define GL_SAMPLES 0x80A9
-#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
-#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
-
-/* GetTextureParameter */
-/* GL_TEXTURE_MAG_FILTER */
-/* GL_TEXTURE_MIN_FILTER */
-/* GL_TEXTURE_WRAP_S */
-/* GL_TEXTURE_WRAP_T */
-
-#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
-#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
-
-/* HintMode */
-#define GL_DONT_CARE 0x1100
-#define GL_FASTEST 0x1101
-#define GL_NICEST 0x1102
-
-/* HintTarget */
-#define GL_GENERATE_MIPMAP_HINT 0x8192
-
-/* DataType */
-#define GL_BYTE 0x1400
-#define GL_UNSIGNED_BYTE 0x1401
-#define GL_SHORT 0x1402
-#define GL_UNSIGNED_SHORT 0x1403
-#define GL_INT 0x1404
-#define GL_UNSIGNED_INT 0x1405
-#define GL_FLOAT 0x1406
-#define GL_FIXED 0x140C
-
-/* PixelFormat */
-#define GL_DEPTH_COMPONENT 0x1902
-#define GL_ALPHA 0x1906
-#define GL_RGB 0x1907
-#define GL_RGBA 0x1908
-#define GL_LUMINANCE 0x1909
-#define GL_LUMINANCE_ALPHA 0x190A
-
-/* PixelType */
-/* GL_UNSIGNED_BYTE */
-#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
-#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
-#define GL_UNSIGNED_SHORT_5_6_5 0x8363
-
-/* Shaders */
-#define GL_FRAGMENT_SHADER 0x8B30
-#define GL_VERTEX_SHADER 0x8B31
-#define GL_MAX_VERTEX_ATTRIBS 0x8869
-#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
-#define GL_MAX_VARYING_VECTORS 0x8DFC
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
-#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
-#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
-#define GL_SHADER_TYPE 0x8B4F
-#define GL_DELETE_STATUS 0x8B80
-#define GL_LINK_STATUS 0x8B82
-#define GL_VALIDATE_STATUS 0x8B83
-#define GL_ATTACHED_SHADERS 0x8B85
-#define GL_ACTIVE_UNIFORMS 0x8B86
-#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
-#define GL_ACTIVE_ATTRIBUTES 0x8B89
-#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
-#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
-#define GL_CURRENT_PROGRAM 0x8B8D
-
-/* StencilFunction */
-#define GL_NEVER 0x0200
-#define GL_LESS 0x0201
-#define GL_EQUAL 0x0202
-#define GL_LEQUAL 0x0203
-#define GL_GREATER 0x0204
-#define GL_NOTEQUAL 0x0205
-#define GL_GEQUAL 0x0206
-#define GL_ALWAYS 0x0207
-
-/* StencilOp */
-/* GL_ZERO */
-#define GL_KEEP 0x1E00
-#define GL_REPLACE 0x1E01
-#define GL_INCR 0x1E02
-#define GL_DECR 0x1E03
-#define GL_INVERT 0x150A
-#define GL_INCR_WRAP 0x8507
-#define GL_DECR_WRAP 0x8508
-
-/* StringName */
-#define GL_VENDOR 0x1F00
-#define GL_RENDERER 0x1F01
-#define GL_VERSION 0x1F02
-#define GL_EXTENSIONS 0x1F03
-
-/* TextureMagFilter */
-#define GL_NEAREST 0x2600
-#define GL_LINEAR 0x2601
-
-/* TextureMinFilter */
-/* GL_NEAREST */
-/* GL_LINEAR */
-#define GL_NEAREST_MIPMAP_NEAREST 0x2700
-#define GL_LINEAR_MIPMAP_NEAREST 0x2701
-#define GL_NEAREST_MIPMAP_LINEAR 0x2702
-#define GL_LINEAR_MIPMAP_LINEAR 0x2703
-
-/* TextureParameterName */
-#define GL_TEXTURE_MAG_FILTER 0x2800
-#define GL_TEXTURE_MIN_FILTER 0x2801
-#define GL_TEXTURE_WRAP_S 0x2802
-#define GL_TEXTURE_WRAP_T 0x2803
-
-/* TextureTarget */
-/* GL_TEXTURE_2D */
-#define GL_TEXTURE 0x1702
-
-#define GL_TEXTURE_CUBE_MAP 0x8513
-#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
-#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
-
-/* TextureUnit */
-#define GL_TEXTURE0 0x84C0
-#define GL_TEXTURE1 0x84C1
-#define GL_TEXTURE2 0x84C2
-#define GL_TEXTURE3 0x84C3
-#define GL_TEXTURE4 0x84C4
-#define GL_TEXTURE5 0x84C5
-#define GL_TEXTURE6 0x84C6
-#define GL_TEXTURE7 0x84C7
-#define GL_TEXTURE8 0x84C8
-#define GL_TEXTURE9 0x84C9
-#define GL_TEXTURE10 0x84CA
-#define GL_TEXTURE11 0x84CB
-#define GL_TEXTURE12 0x84CC
-#define GL_TEXTURE13 0x84CD
-#define GL_TEXTURE14 0x84CE
-#define GL_TEXTURE15 0x84CF
-#define GL_TEXTURE16 0x84D0
-#define GL_TEXTURE17 0x84D1
-#define GL_TEXTURE18 0x84D2
-#define GL_TEXTURE19 0x84D3
-#define GL_TEXTURE20 0x84D4
-#define GL_TEXTURE21 0x84D5
-#define GL_TEXTURE22 0x84D6
-#define GL_TEXTURE23 0x84D7
-#define GL_TEXTURE24 0x84D8
-#define GL_TEXTURE25 0x84D9
-#define GL_TEXTURE26 0x84DA
-#define GL_TEXTURE27 0x84DB
-#define GL_TEXTURE28 0x84DC
-#define GL_TEXTURE29 0x84DD
-#define GL_TEXTURE30 0x84DE
-#define GL_TEXTURE31 0x84DF
-#define GL_ACTIVE_TEXTURE 0x84E0
-
-/* TextureWrapMode */
-#define GL_REPEAT 0x2901
-#define GL_CLAMP_TO_EDGE 0x812F
-#define GL_MIRRORED_REPEAT 0x8370
-
-/* Uniform Types */
-#define GL_FLOAT_VEC2 0x8B50
-#define GL_FLOAT_VEC3 0x8B51
-#define GL_FLOAT_VEC4 0x8B52
-#define GL_INT_VEC2 0x8B53
-#define GL_INT_VEC3 0x8B54
-#define GL_INT_VEC4 0x8B55
-#define GL_BOOL 0x8B56
-#define GL_BOOL_VEC2 0x8B57
-#define GL_BOOL_VEC3 0x8B58
-#define GL_BOOL_VEC4 0x8B59
-#define GL_FLOAT_MAT2 0x8B5A
-#define GL_FLOAT_MAT3 0x8B5B
-#define GL_FLOAT_MAT4 0x8B5C
-#define GL_SAMPLER_2D 0x8B5E
-#define GL_SAMPLER_CUBE 0x8B60
-
-/* Vertex Arrays */
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
-#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
-
-/* Read Format */
-#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
-#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
-
-/* Shader Source */
-#define GL_COMPILE_STATUS 0x8B81
-#define GL_INFO_LOG_LENGTH 0x8B84
-#define GL_SHADER_SOURCE_LENGTH 0x8B88
-#define GL_SHADER_COMPILER 0x8DFA
-
-/* Shader Binary */
-#define GL_SHADER_BINARY_FORMATS 0x8DF8
-#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
-
-/* Shader Precision-Specified Types */
-#define GL_LOW_FLOAT 0x8DF0
-#define GL_MEDIUM_FLOAT 0x8DF1
-#define GL_HIGH_FLOAT 0x8DF2
-#define GL_LOW_INT 0x8DF3
-#define GL_MEDIUM_INT 0x8DF4
-#define GL_HIGH_INT 0x8DF5
-
-/* Framebuffer Object. */
-#define GL_FRAMEBUFFER 0x8D40
-#define GL_RENDERBUFFER 0x8D41
-
-#define GL_RGBA4 0x8056
-#define GL_RGB5_A1 0x8057
-#define GL_RGB565 0x8D62
-#define GL_DEPTH_COMPONENT16 0x81A5
-#define GL_STENCIL_INDEX8 0x8D48
-
-#define GL_RENDERBUFFER_WIDTH 0x8D42
-#define GL_RENDERBUFFER_HEIGHT 0x8D43
-#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
-#define GL_RENDERBUFFER_RED_SIZE 0x8D50
-#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
-#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
-#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
-#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
-#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
-
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
-
-#define GL_COLOR_ATTACHMENT0 0x8CE0
-#define GL_DEPTH_ATTACHMENT 0x8D00
-#define GL_STENCIL_ATTACHMENT 0x8D20
-
-#define GL_NONE 0
-
-#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
-#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
-#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
-
-#define GL_FRAMEBUFFER_BINDING 0x8CA6
-#define GL_RENDERBUFFER_BINDING 0x8CA7
-#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
-
-#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
-
-/* OpenGL ES 3.0 */
-
-#define GL_READ_BUFFER 0x0C02
-#define GL_UNPACK_ROW_LENGTH 0x0CF2
-#define GL_UNPACK_SKIP_ROWS 0x0CF3
-#define GL_UNPACK_SKIP_PIXELS 0x0CF4
-#define GL_PACK_ROW_LENGTH 0x0D02
-#define GL_PACK_SKIP_ROWS 0x0D03
-#define GL_PACK_SKIP_PIXELS 0x0D04
-#define GL_COLOR 0x1800
-#define GL_DEPTH 0x1801
-#define GL_STENCIL 0x1802
-#define GL_RED 0x1903
-#define GL_RGB8 0x8051
-#define GL_RGBA8 0x8058
-#define GL_RGB10_A2 0x8059
-#define GL_TEXTURE_BINDING_3D 0x806A
-#define GL_PACK_SKIP_IMAGES 0x806B
-#define GL_PACK_IMAGE_HEIGHT 0x806C
-#define GL_UNPACK_SKIP_IMAGES 0x806D
-#define GL_UNPACK_IMAGE_HEIGHT 0x806E
-#define GL_TEXTURE_3D 0x806F
-#define GL_TEXTURE_WRAP_R 0x8072
-#define GL_MAX_3D_TEXTURE_SIZE 0x8073
-#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
-#define GL_MAX_ELEMENTS_VERTICES 0x80E8
-#define GL_MAX_ELEMENTS_INDICES 0x80E9
-#define GL_TEXTURE_MIN_LOD 0x813A
-#define GL_TEXTURE_MAX_LOD 0x813B
-#define GL_TEXTURE_BASE_LEVEL 0x813C
-#define GL_TEXTURE_MAX_LEVEL 0x813D
-#define GL_MIN 0x8007
-#define GL_MAX 0x8008
-#define GL_DEPTH_COMPONENT24 0x81A6
-#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
-#define GL_TEXTURE_COMPARE_MODE 0x884C
-#define GL_TEXTURE_COMPARE_FUNC 0x884D
-#define GL_CURRENT_QUERY 0x8865
-#define GL_QUERY_RESULT 0x8866
-#define GL_QUERY_RESULT_AVAILABLE 0x8867
-#define GL_BUFFER_MAPPED 0x88BC
-#define GL_BUFFER_MAP_POINTER 0x88BD
-#define GL_STREAM_READ 0x88E1
-#define GL_STREAM_COPY 0x88E2
-#define GL_STATIC_READ 0x88E5
-#define GL_STATIC_COPY 0x88E6
-#define GL_DYNAMIC_READ 0x88E9
-#define GL_DYNAMIC_COPY 0x88EA
-#define GL_MAX_DRAW_BUFFERS 0x8824
-#define GL_DRAW_BUFFER0 0x8825
-#define GL_DRAW_BUFFER1 0x8826
-#define GL_DRAW_BUFFER2 0x8827
-#define GL_DRAW_BUFFER3 0x8828
-#define GL_DRAW_BUFFER4 0x8829
-#define GL_DRAW_BUFFER5 0x882A
-#define GL_DRAW_BUFFER6 0x882B
-#define GL_DRAW_BUFFER7 0x882C
-#define GL_DRAW_BUFFER8 0x882D
-#define GL_DRAW_BUFFER9 0x882E
-#define GL_DRAW_BUFFER10 0x882F
-#define GL_DRAW_BUFFER11 0x8830
-#define GL_DRAW_BUFFER12 0x8831
-#define GL_DRAW_BUFFER13 0x8832
-#define GL_DRAW_BUFFER14 0x8833
-#define GL_DRAW_BUFFER15 0x8834
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
-#define GL_SAMPLER_3D 0x8B5F
-#define GL_SAMPLER_2D_SHADOW 0x8B62
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
-#define GL_PIXEL_PACK_BUFFER 0x88EB
-#define GL_PIXEL_UNPACK_BUFFER 0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
-#define GL_FLOAT_MAT2x3 0x8B65
-#define GL_FLOAT_MAT2x4 0x8B66
-#define GL_FLOAT_MAT3x2 0x8B67
-#define GL_FLOAT_MAT3x4 0x8B68
-#define GL_FLOAT_MAT4x2 0x8B69
-#define GL_FLOAT_MAT4x3 0x8B6A
-#define GL_SRGB 0x8C40
-#define GL_SRGB8 0x8C41
-#define GL_SRGB8_ALPHA8 0x8C43
-#define GL_COMPARE_REF_TO_TEXTURE 0x884E
-#define GL_MAJOR_VERSION 0x821B
-#define GL_MINOR_VERSION 0x821C
-#define GL_NUM_EXTENSIONS 0x821D
-#define GL_RGBA32F 0x8814
-#define GL_RGB32F 0x8815
-#define GL_RGBA16F 0x881A
-#define GL_RGB16F 0x881B
-#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
-#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
-#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
-#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
-#define GL_MAX_VARYING_COMPONENTS 0x8B4B
-#define GL_TEXTURE_2D_ARRAY 0x8C1A
-#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
-#define GL_R11F_G11F_B10F 0x8C3A
-#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
-#define GL_RGB9_E5 0x8C3D
-#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
-#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
-#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
-#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
-#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
-#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
-#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
-#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
-#define GL_RASTERIZER_DISCARD 0x8C89
-#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
-#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
-#define GL_INTERLEAVED_ATTRIBS 0x8C8C
-#define GL_SEPARATE_ATTRIBS 0x8C8D
-#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
-#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
-#define GL_RGBA32UI 0x8D70
-#define GL_RGB32UI 0x8D71
-#define GL_RGBA16UI 0x8D76
-#define GL_RGB16UI 0x8D77
-#define GL_RGBA8UI 0x8D7C
-#define GL_RGB8UI 0x8D7D
-#define GL_RGBA32I 0x8D82
-#define GL_RGB32I 0x8D83
-#define GL_RGBA16I 0x8D88
-#define GL_RGB16I 0x8D89
-#define GL_RGBA8I 0x8D8E
-#define GL_RGB8I 0x8D8F
-#define GL_RED_INTEGER 0x8D94
-#define GL_RGB_INTEGER 0x8D98
-#define GL_RGBA_INTEGER 0x8D99
-#define GL_SAMPLER_2D_ARRAY 0x8DC1
-#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
-#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
-#define GL_UNSIGNED_INT_VEC2 0x8DC6
-#define GL_UNSIGNED_INT_VEC3 0x8DC7
-#define GL_UNSIGNED_INT_VEC4 0x8DC8
-#define GL_INT_SAMPLER_2D 0x8DCA
-#define GL_INT_SAMPLER_3D 0x8DCB
-#define GL_INT_SAMPLER_CUBE 0x8DCC
-#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
-#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
-#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
-#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
-#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
-#define GL_BUFFER_ACCESS_FLAGS 0x911F
-#define GL_BUFFER_MAP_LENGTH 0x9120
-#define GL_BUFFER_MAP_OFFSET 0x9121
-#define GL_DEPTH_COMPONENT32F 0x8CAC
-#define GL_DEPTH32F_STENCIL8 0x8CAD
-#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
-#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
-#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
-#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
-#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
-#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
-#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
-#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
-#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
-#define GL_FRAMEBUFFER_DEFAULT 0x8218
-#define GL_FRAMEBUFFER_UNDEFINED 0x8219
-#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
-#define GL_DEPTH_STENCIL 0x84F9
-#define GL_UNSIGNED_INT_24_8 0x84FA
-#define GL_DEPTH24_STENCIL8 0x88F0
-#define GL_UNSIGNED_NORMALIZED 0x8C17
-#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING
-#define GL_READ_FRAMEBUFFER 0x8CA8
-#define GL_DRAW_FRAMEBUFFER 0x8CA9
-#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
-#define GL_RENDERBUFFER_SAMPLES 0x8CAB
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
-#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
-#define GL_COLOR_ATTACHMENT1 0x8CE1
-#define GL_COLOR_ATTACHMENT2 0x8CE2
-#define GL_COLOR_ATTACHMENT3 0x8CE3
-#define GL_COLOR_ATTACHMENT4 0x8CE4
-#define GL_COLOR_ATTACHMENT5 0x8CE5
-#define GL_COLOR_ATTACHMENT6 0x8CE6
-#define GL_COLOR_ATTACHMENT7 0x8CE7
-#define GL_COLOR_ATTACHMENT8 0x8CE8
-#define GL_COLOR_ATTACHMENT9 0x8CE9
-#define GL_COLOR_ATTACHMENT10 0x8CEA
-#define GL_COLOR_ATTACHMENT11 0x8CEB
-#define GL_COLOR_ATTACHMENT12 0x8CEC
-#define GL_COLOR_ATTACHMENT13 0x8CED
-#define GL_COLOR_ATTACHMENT14 0x8CEE
-#define GL_COLOR_ATTACHMENT15 0x8CEF
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
-#define GL_MAX_SAMPLES 0x8D57
-#define GL_HALF_FLOAT 0x140B
-#define GL_MAP_READ_BIT 0x0001
-#define GL_MAP_WRITE_BIT 0x0002
-#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
-#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
-#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
-#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
-#define GL_RG 0x8227
-#define GL_RG_INTEGER 0x8228
-#define GL_R8 0x8229
-#define GL_RG8 0x822B
-#define GL_R16F 0x822D
-#define GL_R32F 0x822E
-#define GL_RG16F 0x822F
-#define GL_RG32F 0x8230
-#define GL_R8I 0x8231
-#define GL_R8UI 0x8232
-#define GL_R16I 0x8233
-#define GL_R16UI 0x8234
-#define GL_R32I 0x8235
-#define GL_R32UI 0x8236
-#define GL_RG8I 0x8237
-#define GL_RG8UI 0x8238
-#define GL_RG16I 0x8239
-#define GL_RG16UI 0x823A
-#define GL_RG32I 0x823B
-#define GL_RG32UI 0x823C
-#define GL_VERTEX_ARRAY_BINDING 0x85B5
-#define GL_R8_SNORM 0x8F94
-#define GL_RG8_SNORM 0x8F95
-#define GL_RGB8_SNORM 0x8F96
-#define GL_RGBA8_SNORM 0x8F97
-#define GL_SIGNED_NORMALIZED 0x8F9C
-#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
-#define GL_COPY_READ_BUFFER 0x8F36
-#define GL_COPY_WRITE_BUFFER 0x8F37
-#define GL_COPY_READ_BUFFER_BINDING GL_COPY_READ_BUFFER
-#define GL_COPY_WRITE_BUFFER_BINDING GL_COPY_WRITE_BUFFER
-#define GL_UNIFORM_BUFFER 0x8A11
-#define GL_UNIFORM_BUFFER_BINDING 0x8A28
-#define GL_UNIFORM_BUFFER_START 0x8A29
-#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
-#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
-#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
-#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
-#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
-#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
-#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
-#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
-#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
-#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
-#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
-#define GL_UNIFORM_TYPE 0x8A37
-#define GL_UNIFORM_SIZE 0x8A38
-#define GL_UNIFORM_NAME_LENGTH 0x8A39
-#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
-#define GL_UNIFORM_OFFSET 0x8A3B
-#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
-#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
-#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
-#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
-#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
-#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
-#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
-#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
-#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
-#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
-#define GL_INVALID_INDEX 0xFFFFFFFFu
-#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
-#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
-#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
-#define GL_OBJECT_TYPE 0x9112
-#define GL_SYNC_CONDITION 0x9113
-#define GL_SYNC_STATUS 0x9114
-#define GL_SYNC_FLAGS 0x9115
-#define GL_SYNC_FENCE 0x9116
-#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
-#define GL_UNSIGNALED 0x9118
-#define GL_SIGNALED 0x9119
-#define GL_ALREADY_SIGNALED 0x911A
-#define GL_TIMEOUT_EXPIRED 0x911B
-#define GL_CONDITION_SATISFIED 0x911C
-#define GL_WAIT_FAILED 0x911D
-#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
-#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
-#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
-#define GL_ANY_SAMPLES_PASSED 0x8C2F
-#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
-#define GL_SAMPLER_BINDING 0x8919
-#define GL_RGB10_A2UI 0x906F
-#define GL_TEXTURE_SWIZZLE_R 0x8E42
-#define GL_TEXTURE_SWIZZLE_G 0x8E43
-#define GL_TEXTURE_SWIZZLE_B 0x8E44
-#define GL_TEXTURE_SWIZZLE_A 0x8E45
-#define GL_GREEN 0x1904
-#define GL_BLUE 0x1905
-#define GL_INT_2_10_10_10_REV 0x8D9F
-#define GL_TRANSFORM_FEEDBACK 0x8E22
-#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
-#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
-#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
-#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
-#define GL_PROGRAM_BINARY_LENGTH 0x8741
-#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
-#define GL_PROGRAM_BINARY_FORMATS 0x87FF
-#define GL_COMPRESSED_R11_EAC 0x9270
-#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
-#define GL_COMPRESSED_RG11_EAC 0x9272
-#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
-#define GL_COMPRESSED_RGB8_ETC2 0x9274
-#define GL_COMPRESSED_SRGB8_ETC2 0x9275
-#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
-#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
-#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
-#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
-#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
-#define GL_MAX_ELEMENT_INDEX 0x8D6B
-#define GL_NUM_SAMPLE_COUNTS 0x9380
-#define GL_TEXTURE_IMMUTABLE_LEVELS 0x8D63
-
-// From AstcTextures.h / GLES 3.1
-#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
-#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1
-#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2
-#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3
-#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4
-#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5
-#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6
-#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7
-#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8
-#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9
-#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA
-#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB
-#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC
-#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD
-
-/*------------------------------------------------------------------------*
- * EXT extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_EXT_blend_minmax */
-#ifndef GL_EXT_blend_minmax
-#define GL_MIN_EXT 0x8007
-#define GL_MAX_EXT 0x8008
-#endif
-
-/* GL_EXT_discard_framebuffer */
-#ifndef GL_EXT_discard_framebuffer
-#define GL_COLOR_EXT 0x1800
-#define GL_DEPTH_EXT 0x1801
-#define GL_STENCIL_EXT 0x1802
-#endif
-
-/* GL_EXT_multi_draw_arrays */
-/* No new tokens introduced by this extension. */
-
-/* GL_EXT_read_format_bgra */
-#ifndef GL_EXT_read_format_bgra
-#define GL_BGRA_EXT 0x80E1
-#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365
-#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366
-#endif
-
-/* GL_EXT_texture_filter_anisotropic */
-#ifndef GL_EXT_texture_filter_anisotropic
-#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
-#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
-#endif
-
-/* GL_EXT_texture_format_BGRA8888 */
-#ifndef GL_EXT_texture_format_BGRA8888
-#define GL_BGRA_EXT 0x80E1
-#endif
-
-/* GL_EXT_texture_type_2_10_10_10_REV */
-#ifndef GL_EXT_texture_type_2_10_10_10_REV
-#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368
-#endif
-
-/* GL_OES_get_program_binary */
-#ifndef GL_PROGRAM_BINARY_LENGTH_OES
-#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741
-#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE
-#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF
-#endif
-
-
-/* GL_OES_EGL_image_external */
-#ifndef GL_TEXTURE_EXTERNAL_OES
-#define GL_TEXTURE_EXTERNAL_OES 0x8D65
-#endif
-
-/* GL_SAMPLER_EXTERNAL_OES */
-#ifndef GL_SAMPLER_EXTERNAL_OES
-#define GL_SAMPLER_EXTERNAL_OES 0x8D66
-#endif
-
-#endif // __DALI_INTERNAL_GL_DEFINES_H__
+++ /dev/null
-#ifndef __DALI_INTEGRATION_GL_SYNC_ABSTRACTION_H__
-#define __DALI_INTEGRATION_GL_SYNC_ABSTRACTION_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <dali/public-api/common/dali-common.h>
-
-namespace Dali
-{
-namespace Integration
-{
-
-/**
- * This abstraction defines an API for syncing CPU with GPU.
- * A typical use case is to determine when GL draw calls have finished drawing
- * to a framebuffer.
- */
-class GlSyncAbstraction
-{
-protected:
- /**
- * Virtual protected destructor, no deletion through this interface
- */
- virtual ~GlSyncAbstraction() {}
-
-public:
-
- class SyncObject
- {
- protected:
- /**
- * Virtual protected destructor, no deletion through this interface. This prevents
- * Core from deleting SyncObjects - only Adaptor implementation is able to delete
- * them.
- */
- virtual ~SyncObject() {}
-
- public:
-
- /**
- * Determine if the synchronisation object has been signalled.
- * @return false if the sync object has not been signalled, true if it has been signalled (and
- * can now be destroyed)
- */
- virtual bool IsSynced() = 0;
- };
-
- /**
- * Create a synchronisation object based on the resource id, typically that of
- * a framebuffer texture. It can then be polled using the same resource id.
- * @return A pointer to an opaque sync object
- */
- virtual SyncObject* CreateSyncObject() = 0;
-
- /**
- * Destroy the synchronisation object.
- * @param[in] syncObject The sync object to destroy
- */
- virtual void DestroySyncObject(SyncObject* syncObject) = 0;
-};
-
-} // namespace Integration
-} // namespace Dali
-
-#endif // __DALI_INTEGRATION_GL_SYNC_ABSTRACTION_H__
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
} // Namespace Graphics
} // Namespace Integration
-} // Namespace Dali
\ No newline at end of file
+} // Namespace Dali
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/update/nodes/scene-graph-layer.h>
#include <dali/internal/update/rendering/scene-graph-renderer.h>
-
-#include <dali/internal/render/renderers/render-geometry.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
-#include <dali/internal/render/renderers/render-renderer.h>
-#include <dali/internal/render/renderers/render-sampler.h>
+#include <dali/internal/update/rendering/scene-graph-geometry.h>
+#include <dali/internal/update/rendering/scene-graph-property-buffer.h>
+#include <dali/internal/update/rendering/scene-graph-sampler.h>
#include <dali/internal/update/render-tasks/scene-graph-camera.h>
using Dali::Internal::GestureEventProcessor;
sizeof( Integration::Bitmap ) );
const int RENDERER_MEMORY_SIZE(
sizeof( Internal::Renderer ) +
- sizeof( Internal::SceneGraph::Renderer ) +
- sizeof( Internal::Render::Renderer ) );
+ sizeof( Internal::SceneGraph::Renderer ) );
const int GEOMETRY_MEMORY_SIZE(
sizeof( Internal::Geometry ) +
- sizeof( Internal::Render::Geometry) );
+ sizeof( Internal::SceneGraph::Geometry) );
const int PROPERTY_BUFFER_MEMORY_SIZE(
sizeof( Internal::PropertyBuffer ) +
- sizeof( Internal::Render::PropertyBuffer ) );
+ sizeof( Internal::SceneGraph::PropertyBuffer ) );
const int TEXTURE_SET_MEMORY_SIZE(
sizeof( Internal::TextureSet ) +
sizeof( Internal::SceneGraph::TextureSet ) );
const int SAMPLER_MEMORY_SIZE(
sizeof( Internal::Sampler ) +
- sizeof( Internal::Render::Sampler ) );
+ sizeof( Internal::SceneGraph::Sampler ) );
const int SHADER_MEMORY_SIZE(
sizeof( Internal::Shader ) +
sizeof( Internal::SceneGraph::Shader ) );
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// CLASS HEADER
#include <dali/internal/common/core-impl.h>
-#include <dali/integration-api/graphics/graphics.h>
// INTERNAL INCLUDES
-#include <dali/integration-api/system-overlay.h>
+
#include <dali/integration-api/core.h>
#include <dali/integration-api/debug.h>
#include <dali/integration-api/events/event.h>
-#include <dali/integration-api/gl-sync-abstraction.h>
+#include <dali/integration-api/graphics/graphics.h>
#include <dali/integration-api/platform-abstraction.h>
#include <dali/integration-api/render-controller.h>
-#include <dali/integration-api/graphics/graphics.h>
+#include <dali/integration-api/system-overlay.h>
+
+#include <dali/internal/common/performance-monitor.h>
#include <dali/internal/event/actors/actor-impl.h>
#include <dali/internal/event/animation/animation-playlist.h>
#include <dali/internal/update/manager/update-manager.h>
#include <dali/internal/update/manager/render-task-processor.h>
-#include <dali/internal/render/common/performance-monitor.h>
-#include <dali/internal/render/common/render-manager.h>
-#include <dali/internal/render/gl-resources/context.h>
using Dali::Internal::SceneGraph::UpdateManager;
-using Dali::Internal::SceneGraph::RenderManager;
using Dali::Internal::SceneGraph::DiscardQueue;
-using Dali::Internal::SceneGraph::RenderQueue;
namespace
{
using Integration::RenderController;
using Integration::PlatformAbstraction;
-using Integration::GlSyncAbstraction;
using Integration::GestureManager;
-using Integration::GlAbstraction;
using Integration::Event;
using Integration::UpdateStatus;
using Integration::RenderStatus;
Core::Core( RenderController& renderController,
PlatformAbstraction& platform,
Graphics& graphics,
- GlAbstraction& glAbstraction,
- GlSyncAbstraction& glSyncAbstraction,
GestureManager& gestureManager,
ResourcePolicy::DataRetention dataRetentionPolicy,
bool renderToFboEnabled )
mRenderTaskProcessor = new SceneGraph::RenderTaskProcessor();
- mRenderManager = RenderManager::New( glAbstraction, glSyncAbstraction );
-
- RenderQueue& renderQueue = mRenderManager->GetRenderQueue();
-
- mDiscardQueue = new DiscardQueue( renderQueue );
+ mDiscardQueue = new DiscardQueue();
mUpdateManager = new UpdateManager( *mNotificationManager,
*mAnimationPlaylist,
*mPropertyNotificationManager,
*mDiscardQueue,
renderController,
- *mRenderManager,
- renderQueue,
*mRenderTaskProcessor,
graphics );
- mRenderManager->SetShaderSaver( *mUpdateManager );
mStage = IntrusivePtr<Stage>( Stage::New( *mAnimationPlaylist, *mPropertyNotificationManager, *mUpdateManager, *mNotificationManager, mRenderController ) );
mEventProcessor = new EventProcessor( *mStage, *mNotificationManager, *mGestureEventProcessor );
mShaderFactory = new ShaderFactory();
- mUpdateManager->SetShaderSaver( *mShaderFactory );
GetImplementation(Dali::TypeRegistry::Get()).CallInitFunctions();
}
void Core::ContextCreated()
{
- mRenderManager->ContextCreated();
+ // TODO:
+ DALI_LOG_ERROR("TODO: NOTIFY CONTEXT CREATED\n");
}
void Core::ContextDestroyed()
{
- mRenderManager->ContextDestroyed();
+ // TODO:
+ DALI_LOG_ERROR("TODO: NOTIFY CONTEXT DESTROYED\n");
}
void Core::SurfaceResized( unsigned int width, unsigned int height )
void Core::Render( RenderStatus& status )
{
- mRenderManager->Render( status );
+ DALI_LOG_ERROR("Render()!");
+ (void)status;
}
void Core::SceneCreated()
return *(mUpdateManager);
}
-RenderManager& Core::GetRenderManager()
-{
- return *(mRenderManager);
-}
NotificationManager& Core::GetNotificationManager()
{
#define DALI_INTERNAL_CORE_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*/
// INTERNAL INCLUDES
+#include <dali/public-api/common/view-mode.h>
#include <dali/public-api/object/ref-object.h>
#include <dali/integration-api/context-notifier.h>
+#include <dali/integration-api/resource-policies.h>
#include <dali/internal/common/owner-pointer.h>
#include <dali/internal/event/animation/animation-playlist-declarations.h>
#include <dali/internal/event/common/stage-def.h>
-#include <dali/public-api/common/view-mode.h>
-#include <dali/integration-api/resource-policies.h>
namespace Dali
{
class RenderController;
class PlatformAbstraction;
class GestureManager;
-class GlAbstraction;
-class GlSyncAbstraction;
+
class SystemOverlay;
class UpdateStatus;
class RenderStatus;
namespace SceneGraph
{
class UpdateManager;
-class RenderManager;
class DiscardQueue;
class RenderTaskProcessor;
}
Core( Integration::RenderController& renderController,
Integration::PlatformAbstraction& platform,
Integration::Graphics::Graphics& graphics,
- Integration::GlAbstraction& glAbstraction,
- Integration::GlSyncAbstraction& glSyncAbstraction,
Integration::GestureManager& gestureManager,
ResourcePolicy::DataRetention dataRetentionPolicy,
bool renderToFboEnabled );
*/
SceneGraph::UpdateManager& GetUpdateManager();
- /**
- * Returns the render manager.
- * @return A reference to the render manager.
- */
- SceneGraph::RenderManager& GetRenderManager();
/**
* Returns the notification manager.
bool mProcessingEvent : 1; ///< True during ProcessEvents()
OwnerPointer<SceneGraph::RenderTaskProcessor> mRenderTaskProcessor; ///< Handles the processing of render tasks
- OwnerPointer<SceneGraph::RenderManager> mRenderManager; ///< Render manager
OwnerPointer<SceneGraph::UpdateManager> mUpdateManager; ///< Update manager
OwnerPointer<SceneGraph::DiscardQueue> mDiscardQueue; ///< Used to cleanup nodes & resources when no longer in use.
OwnerPointer<ShaderFactory> mShaderFactory; ///< Shader resource factory
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <cmath>
// INTERNAL INCLUDES
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
#include <dali/public-api/common/constants.h>
#include <dali/public-api/math/vector2.h>
#include <dali/public-api/math/matrix.h>
{
return sqrtf(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
}
-
-
#define __DALI_INTERNAL_PERFORMANCE_MONITOR_H__
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
/**
* We want to discourage the use of property strings (minimize string comparisons),
* particularly for the default properties.
- * Name Type writable animatable constraint-input enum for index-checking
+ * Name Type writable animatable constraint-input enum for index-checking
*/
DALI_PROPERTY_TABLE_BEGIN
DALI_PROPERTY( "parentOrigin", VECTOR3, true, false, true, Dali::Actor::Property::PARENT_ORIGIN )
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
unsigned int bufferSize = mBufferFormatSize * mSize;
// create a new DALi vector to store the buffer data
- // the heap allocated vector will end up being owned by Render::PropertyBuffer
+ // the heap allocated vector will end up being owned by SceneGraph::PropertyBuffer
OwnerPointer< Vector<char> > bufferCopy = new Dali::Vector<char>();
bufferCopy->Resize( bufferSize );
std::copy( source, source + bufferSize, destination );
// Ownership of the bufferCopy is passed to the message ( uses an owner pointer )
- SceneGraph::SetPropertyBufferData( mEventThreadServices.GetUpdateManager(), *mRenderObject, bufferCopy, mSize );
+ SceneGraph::SetPropertyBufferDataMessage( mEventThreadServices, *mRenderObject, bufferCopy, mSize );
}
std::size_t PropertyBuffer::GetSize() const
return mSize;
}
-const Render::PropertyBuffer* PropertyBuffer::GetRenderObject() const
+const SceneGraph::PropertyBuffer* PropertyBuffer::GetRenderObject() const
{
return mRenderObject;
}
void PropertyBuffer::Initialize( Dali::Property::Map& formatMap )
{
- // Old
-
- mRenderObject = new Render::PropertyBuffer();
- OwnerPointer< Render::PropertyBuffer > transferOwnership( mRenderObject );
+ mRenderObject = new SceneGraph::PropertyBuffer();
+ OwnerPointer< SceneGraph::PropertyBuffer > transferOwnership( mRenderObject );
SceneGraph::AddPropertyBuffer( mEventThreadServices.GetUpdateManager(), transferOwnership );
size_t numComponents = formatMap.Count();
// Create the format
- OwnerPointer< Render::PropertyBuffer::Format> format = new Render::PropertyBuffer::Format();
+ OwnerPointer< SceneGraph::PropertyBuffer::Format> format = new SceneGraph::PropertyBuffer::Format();
format->components.resize( numComponents );
unsigned int currentAlignment = 0u;
mBufferFormatSize = format->size;
- SceneGraph::SetPropertyBufferFormat(mEventThreadServices.GetUpdateManager(), *mRenderObject, format );
+ // @todo Why isn't this in the initial render object New?!
+ SceneGraph::SetPropertyBufferFormatMessage( mEventThreadServices, *mRenderObject, format );
}
unsigned int GetPropertyImplementationSize( Property::Type& propertyType )
#define DALI_INTERNAL_PROPERTY_BUFFER_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/common/intrusive-ptr.h> // Dali::IntrusivePtr
#include <dali/public-api/object/base-object.h>
#include <dali/public-api/object/property-map.h> // Dali::Property::Map
+#include <dali/public-api/rendering/property-buffer.h> // Dali::Property::Map
#include <dali/internal/event/common/event-thread-services.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
+#include <dali/internal/update/rendering/scene-graph-property-buffer.h>
namespace Dali
{
*
* @return The render thread side of this PropertyBuffer
*/
- const Render::PropertyBuffer* GetRenderObject() const;
+ const SceneGraph::PropertyBuffer* GetRenderObject() const;
protected:
/**
private: // data
EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via update thread
- Render::PropertyBuffer* mRenderObject; ///<Render side object
+ SceneGraph::PropertyBuffer* mRenderObject; ///<Render side object
unsigned int mBufferFormatSize;
unsigned int mSize; ///< Number of elements in the buffer
};
} // namespace Internal
// Helpers for public-api forwarding methods
-inline Internal::PropertyBuffer& GetImplementation(Dali::PropertyBuffer& handle)
+inline Internal::PropertyBuffer& GetImplementation( Dali::PropertyBuffer& handle )
{
DALI_ASSERT_ALWAYS(handle && "PropertyBuffer handle is empty");
return static_cast<Internal::PropertyBuffer&>(object);
}
-inline const Internal::PropertyBuffer& GetImplementation(const Dali::PropertyBuffer& handle)
+inline const Internal::PropertyBuffer& GetImplementation( const Dali::PropertyBuffer& handle )
{
DALI_ASSERT_ALWAYS(handle && "PropertyBuffer handle is empty");
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
void RenderTask::SetFrameBuffer( FrameBufferPtr frameBuffer )
{
mFrameBuffer = frameBuffer;
- Render::FrameBuffer* renderFrameBufferPtr( NULL );
+ SceneGraph::FrameBuffer* renderFrameBufferPtr( NULL );
if( frameBuffer )
{
renderFrameBufferPtr = mFrameBuffer->GetRenderObject();
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/internal/update/manager/update-manager.h>
#include <dali/internal/event/common/stage-impl.h>
-#include <dali/internal/render/renderers/render-frame-buffer.h>
+#include <dali/internal/update/rendering/scene-graph-frame-buffer.h>
namespace Dali
{
}
-Render::FrameBuffer* FrameBuffer::GetRenderObject() const
+SceneGraph::FrameBuffer* FrameBuffer::GetRenderObject() const
{
return mRenderObject;
}
void FrameBuffer::Initialize()
{
- mRenderObject = new Render::FrameBuffer( mWidth, mHeight, mAttachments );
+ mRenderObject = new SceneGraph::FrameBuffer( mWidth, mHeight, mAttachments );
AddFrameBuffer( mEventThreadServices.GetUpdateManager(), *mRenderObject );
}
#define DALI_INTERNAL_FRAME_BUFFER_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
{
namespace Internal
{
-namespace Render
+namespace SceneGraph
{
class FrameBuffer;
}
*
* @return the FrameBuffer render object
*/
- Render::FrameBuffer* GetRenderObject() const;
+ SceneGraph::FrameBuffer* GetRenderObject() const;
/**
* @copydoc Dali::FrameBuffer::AttachColorTexture()
private: // data
- Internal::EventThreadServices& mEventThreadServices; ///< Used to send messages to the render thread via update thread
- Internal::Render::FrameBuffer* mRenderObject; ///< The Render::Texture associated to this texture
+ EventThreadServices& mEventThreadServices; ///< Used to send messages to the render thread via update thread
+ SceneGraph::FrameBuffer* mRenderObject; ///< The Render::Framebuffer associated with this framebuffer
TexturePtr mColor;
unsigned int mWidth;
unsigned int mHeight;
- unsigned int mAttachments; ///< Bit-mask of type FrameBuffer::Attachment::Mask
-
+ unsigned int mAttachments; ///< Bit-mask of type FrameBuffer::Attachment::Mask
};
} // namespace Internal
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
std::size_t Geometry::AddVertexBuffer( PropertyBuffer& vertexBuffer )
{
mVertexBuffers.push_back( &vertexBuffer );
- SceneGraph::AttachVertexBufferMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, *vertexBuffer.GetRenderObject() );
+ SceneGraph::AttachVertexBufferMessage( mEventThreadServices, *mRenderObject, *vertexBuffer.GetRenderObject() );
return mVertexBuffers.size() - 1u;
}
void Geometry::RemoveVertexBuffer( std::size_t index )
{
- const Render::PropertyBuffer& renderPropertyBuffer = static_cast<const Render::PropertyBuffer&>( *(mVertexBuffers[index]->GetRenderObject()) );
- SceneGraph::RemoveVertexBufferMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, renderPropertyBuffer );
+ const SceneGraph::PropertyBuffer& renderPropertyBuffer = static_cast<const SceneGraph::PropertyBuffer&>( *(mVertexBuffers[index]->GetRenderObject()) );
+ SceneGraph::RemoveVertexBufferMessage( mEventThreadServices, *mRenderObject, renderPropertyBuffer );
mVertexBuffers.erase( mVertexBuffers.begin() + index );
}
std::copy( indices, indices + count, indexData.Begin() );
}
- SceneGraph::SetIndexBufferMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, indexData );
+ SceneGraph::SetIndexBufferMessage( mEventThreadServices, *mRenderObject, indexData );
}
void Geometry::SetType( Dali::Geometry::Type geometryType )
{
if( geometryType != mType )
{
- SceneGraph::SetGeometryTypeMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, geometryType );
+ SceneGraph::SetGeometryTypeMessage(mEventThreadServices, *mRenderObject, geometryType );
mType = geometryType;
}
return mType;
}
-const Render::Geometry* Geometry::GetRenderObject() const
+const SceneGraph::Geometry* Geometry::GetRenderObject() const
{
return mRenderObject;
}
void Geometry::Initialize()
{
- mRenderObject = new Render::Geometry();
- OwnerPointer< Render::Geometry > transferOwnership( mRenderObject );
+ mRenderObject = new SceneGraph::Geometry();
+ OwnerPointer< SceneGraph::Geometry > transferOwnership( mRenderObject );
AddGeometry( mEventThreadServices.GetUpdateManager(), transferOwnership );
}
#define DALI_INTERNAL_GEOMETRY_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*/
// EXTERNAL INCLUDES
-#include <dali/public-api/common/vector-wrapper.h> // std::vector
+#include <dali/public-api/common/vector-wrapper.h>
// INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h> // DALI_ASSERT_ALWAYS
-#include <dali/public-api/common/intrusive-ptr.h> // Dali::IntrusivePtr
-#include <dali/public-api/rendering/geometry.h> // Dali::Geometry
-#include <dali/internal/event/common/connectable.h> // Dali::Internal::Connectable
-#include <dali/internal/event/common/object-connector.h> // Dali::Internal::ObjectConnector
-#include <dali/internal/event/common/object-impl.h> // Dali::Internal::Object
-#include <dali/internal/event/common/property-buffer-impl.h> // Dali::Internal::PropertyBuffer
-#include <dali/internal/render/renderers/render-geometry.h>
+#include <dali/public-api/common/dali-common.h>
+#include <dali/public-api/common/intrusive-ptr.h>
+#include <dali/public-api/rendering/geometry.h>
+#include <dali/internal/event/common/connectable.h>
+#include <dali/internal/event/common/object-connector.h>
+#include <dali/internal/event/common/object-impl.h>
+#include <dali/internal/event/common/property-buffer-impl.h>
+#include <dali/internal/update/rendering/scene-graph-geometry.h>
namespace Dali
{
*
* @return the geometry scene object
*/
- const Render::Geometry* GetRenderObject() const;
+ const SceneGraph::Geometry* GetRenderObject() const;
private: // implementation
private: // data
EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via update thread
- Render::Geometry* mRenderObject;
+ SceneGraph::Geometry* mRenderObject;
std::vector<PropertyBufferPtr> mVertexBuffers; ///< Vector of intrusive pointers to vertex buffers
Dali::Geometry::Type mType; ///< Geometry type (cached)
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/event/common/object-impl-helper.h> // Dali::Internal::ObjectHelper
#include <dali/internal/event/common/property-helper.h> // DALI_PROPERTY_TABLE_BEGIN, DALI_PROPERTY, DALI_PROPERTY_TABLE_END
#include <dali/internal/event/common/property-input-impl.h>
-#include <dali/internal/render/renderers/render-geometry.h>
+#include <dali/internal/update/rendering/scene-graph-geometry.h>
#include <dali/internal/update/manager/update-manager.h>
#include <dali/internal/update/rendering/scene-graph-renderer.h>
{
mGeometry = &geometry;
- const Render::Geometry* geometrySceneObject = geometry.GetRenderObject();
+ const SceneGraph::Geometry* geometrySceneObject = geometry.GetRenderObject();
SetGeometryMessage( GetEventThreadServices(), *mSceneObject, *geometrySceneObject );
}
#define DALI_INTERNAL_RENDERER_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*/
// INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h> // DALI_ASSERT_ALWAYS
-#include <dali/public-api/common/intrusive-ptr.h> // Dali::IntrusivePtr
-#include <dali/public-api/rendering/renderer.h> // Dali::Renderer
+#include <dali/public-api/common/dali-common.h>
+#include <dali/public-api/common/intrusive-ptr.h>
+#include <dali/public-api/rendering/renderer.h>
#include <dali/internal/common/blending-options.h>
-#include <dali/internal/event/common/object-connector.h> // Dali::Internal::ObjectConnector
-#include <dali/internal/event/common/object-impl.h> // Dali::Internal::Object
-#include <dali/internal/event/rendering/texture-set-impl.h> // Dali::Internal::TextureSet
-#include <dali/internal/event/rendering/geometry-impl.h> // Dali::Internal::Geometry
-#include <dali/internal/render/renderers/render-renderer.h> // Dali::Render::Renderer::StencilParameters
+#include <dali/internal/event/common/object-connector.h>
+#include <dali/internal/event/common/object-impl.h>
+#include <dali/internal/event/rendering/texture-set-impl.h>
+#include <dali/internal/event/rendering/geometry-impl.h>
+#include <dali/internal/update/rendering/stencil-parameters.h>
namespace Dali
{
size_t mIndexedDrawFirstElement; ///< Offset of first element to draw from bound index buffer
size_t mIndexedDrawElementCount; ///< Number of elements to draw
- Render::Renderer::StencilParameters mStencilParameters; ///< Struct containing all stencil related options
+ SceneGraph::StencilParameters mStencilParameters; ///< Struct containing all stencil related options
BlendingOptions mBlendingOptions; ///< Local copy of blending options bitmask
DepthFunction::Type mDepthFunction:3; ///< Local copy of the depth function
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/internal/event/common/stage-impl.h>
#include <dali/internal/update/manager/update-manager.h>
-#include <dali/internal/render/renderers/render-sampler.h>
+#include <dali/internal/update/rendering/scene-graph-sampler.h>
namespace Dali
{
{
if( NULL != mRenderObject )
{
- SetFilterModeMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, static_cast< unsigned int >( minFilter ), static_cast< unsigned int >( magFilter ) );
+ SetFilterModeMessage( mEventThreadServices, *mRenderObject, static_cast< unsigned int >( minFilter ), static_cast< unsigned int >( magFilter ) );
}
}
{
if( NULL != mRenderObject )
{
- SetWrapModeMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, static_cast< unsigned int >( rWrap ), static_cast< unsigned int >( sWrap ), static_cast< unsigned int >( tWrap ) );
+ SetWrapModeMessage( mEventThreadServices, *mRenderObject, static_cast< unsigned int >( rWrap ), static_cast< unsigned int >( sWrap ), static_cast< unsigned int >( tWrap ) );
}
}
-Render::Sampler* Sampler::GetSamplerRenderObject()
+SceneGraph::Sampler* Sampler::GetSamplerRenderObject()
{
return mRenderObject;
}
{
SceneGraph::UpdateManager& updateManager = mEventThreadServices.GetUpdateManager();
- mRenderObject = new Render::Sampler();
- OwnerPointer< Render::Sampler > transferOwnership( mRenderObject );
+ mRenderObject = new SceneGraph::Sampler();
+ OwnerPointer< SceneGraph::Sampler > transferOwnership( mRenderObject );
AddSamplerMessage( updateManager, transferOwnership );
}
#define DALI_INTERNAL_SAMPLER_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
{
namespace Internal
{
-namespace Render
+namespace SceneGraph
{
-struct Sampler;
+class Sampler;
}
class Sampler;
*
* @return The render thread sampler
*/
- Render::Sampler* GetSamplerRenderObject();
+ SceneGraph::Sampler* GetSamplerRenderObject();
private:
Sampler();
virtual ~Sampler();
private: // data
- EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via the update thread
- Render::Sampler* mRenderObject; ///<Render thread sampler for this sampler
-
+ EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via the update thread
+ SceneGraph::Sampler* mRenderObject; ///<Render thread sampler for this sampler
};
} // namespace Internal
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
mShaderData = shaderFactory.Load( vertexSource, fragmentSource, hints, shaderHash );
// Add shader program to scene-object using a message to the UpdateManager
- SetShaderProgramMessage( updateManager, *mSceneObject, mShaderData, (hints & Dali::Shader::Hint::MODIFIES_GEOMETRY) != 0x0 );
+ SetShaderProgramMessage( eventThreadServices, *mSceneObject, mShaderData, (hints & Dali::Shader::Hint::MODIFIES_GEOMETRY) != 0x0 );
+
eventThreadServices.RegisterObject( this );
}
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/internal/update/manager/update-manager.h>
+#include <dali/internal/update/manager/update-manager.h>
#include <dali/internal/event/common/stage-impl.h>
#include <dali/integration-api/render-controller.h>
return texture;
}
-Render::Texture* Texture::GetRenderObject() const
+SceneGraph::Texture* Texture::GetRenderObject() const
{
return mRenderObject;
}
{
if( mNativeImage )
{
- mRenderObject = new Render::Texture( mNativeImage );
+ mRenderObject = new SceneGraph::Texture( mNativeImage );
}
else
{
- mRenderObject = new Render::Texture( mType, mFormat, mSize );
+ mRenderObject = new SceneGraph::Texture( mType, mFormat, mSize );
}
- OwnerPointer< Render::Texture > transferOwnership( mRenderObject );
- AddTexture( mEventThreadServices.GetUpdateManager(), transferOwnership );
+ OwnerPointer< SceneGraph::Texture > transferOwnership( mRenderObject );
+ AddTextureMessage( mEventThreadServices.GetUpdateManager(), transferOwnership );
}
}
{
if( EventThreadServices::IsCoreRunning() && mRenderObject )
{
- RemoveTexture( mEventThreadServices.GetUpdateManager(), *mRenderObject );
+ RemoveTextureMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject );
}
}
static_cast< uint16_t >( yOffset ),
static_cast< uint16_t >( width ),
static_cast< uint16_t >( height ) };
- //UploadTextureMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, pixelData, params );
- UploadTextureMessageV2( mEventThreadServices.GetUpdateManager(), *mRenderObject, pixelData, params );
+
+ UploadTextureMessage( mEventThreadServices, *mRenderObject, pixelData, params );
// Request event processing and update forcely
mEventThreadServices.GetRenderController().RequestProcessEventsOnIdle( true );
{
if( EventThreadServices::IsCoreRunning() && mRenderObject )
{
- GenerateMipmapsMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject );
+ GenerateMipmapsMessage( mEventThreadServices, *mRenderObject );
}
}
#define DALI_INTERNAL_NEW_TEXTURE_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/object/base-object.h>
#include <dali/public-api/images/pixel.h>
#include <dali/public-api/images/image-operations.h> // Dali::ImageDimensions
-#include <dali/public-api/rendering/texture.h> // Dali::Internal::Render::Texture
+#include <dali/public-api/rendering/texture.h> // Dali::Internal::SceneGraph::Texture
#include <dali/internal/event/common/event-thread-services.h>
#include <dali/internal/event/images/pixel-data-impl.h>
{
namespace Internal
{
-namespace Render
+namespace SceneGraph
{
class Texture;
}
*
* @return the texture render object
*/
- Render::Texture* GetRenderObject() const;
+ SceneGraph::Texture* GetRenderObject() const;
/**
* @copydoc Dali::Texture::Upload()
private: // data
- Internal::EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via update thread
- Internal::Render::Texture* mRenderObject; ///<The Render::Texture associated to this texture
-
+ EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via update thread
+ SceneGraph::Texture* mRenderObject; ///<The SceneGraph::Texture associated to this texture
NativeImageInterfacePtr mNativeImage; ///< Pointer to native image
ImageDimensions mSize; ///< Size of the texture
Dali::TextureType::Type mType; ///< Texture type (cached)
Pixel::Format mFormat; ///< Pixel format
-
};
} // namespace Internal
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
mTextures[index]= texture;
- Render::Texture* renderTexture(0);
+ SceneGraph::Texture* renderTexture(0);
if( texture )
{
renderTexture = texture->GetRenderObject();
mSamplers[index] = sampler;
- Render::Sampler* renderSampler(0);
+ SceneGraph::Sampler* renderSampler(0);
if( sampler )
{
renderSampler = sampler->GetSamplerRenderObject();
$(internal_src_dir)/event/size-negotiation/memory-pool-relayout-container.cpp \
$(internal_src_dir)/event/size-negotiation/relayout-controller-impl.cpp \
\
- $(internal_src_dir)/render/common/render-algorithms.cpp \
- $(internal_src_dir)/render/common/render-debug.cpp \
- $(internal_src_dir)/render/common/render-instruction.cpp \
- $(internal_src_dir)/render/common/render-instruction-container.cpp \
- $(internal_src_dir)/render/common/render-item.cpp \
- $(internal_src_dir)/render/common/render-tracker.cpp \
- $(internal_src_dir)/render/common/render-manager.cpp \
- $(internal_src_dir)/render/data-providers/render-data-provider.cpp \
- $(internal_src_dir)/render/gl-resources/context.cpp \
- $(internal_src_dir)/render/gl-resources/frame-buffer-state-cache.cpp \
- $(internal_src_dir)/render/gl-resources/gl-call-debug.cpp \
- $(internal_src_dir)/render/gl-resources/gpu-buffer.cpp \
- $(internal_src_dir)/render/queue/render-queue.cpp \
- $(internal_src_dir)/render/renderers/render-frame-buffer.cpp \
- $(internal_src_dir)/render/renderers/render-geometry.cpp \
- $(internal_src_dir)/render/renderers/render-property-buffer.cpp \
- $(internal_src_dir)/render/renderers/render-renderer.cpp \
- $(internal_src_dir)/render/renderers/render-texture.cpp \
- $(internal_src_dir)/render/shaders/program.cpp \
- $(internal_src_dir)/render/shaders/program-controller.cpp \
- $(internal_src_dir)/render/shaders/scene-graph-shader.cpp \
- \
$(internal_src_dir)/update/animation/scene-graph-animation.cpp \
$(internal_src_dir)/update/animation/scene-graph-constraint-base.cpp \
$(internal_src_dir)/update/common/discard-queue.cpp \
$(internal_src_dir)/update/common/scene-graph-connection-change-propagator.cpp \
$(internal_src_dir)/update/common/scene-graph-property-notification.cpp \
$(internal_src_dir)/update/common/uniform-map.cpp \
- $(internal_src_dir)/update/controllers/render-message-dispatcher.cpp \
$(internal_src_dir)/update/controllers/scene-controller-impl.cpp \
$(internal_src_dir)/update/gestures/pan-gesture-profiling.cpp \
$(internal_src_dir)/update/gestures/scene-graph-pan-gesture.cpp \
$(internal_src_dir)/update/manager/update-algorithms.cpp \
$(internal_src_dir)/update/manager/update-manager.cpp \
$(internal_src_dir)/update/manager/update-manager-debug.cpp \
- $(internal_src_dir)/update/render-tasks/scene-graph-camera.cpp \
$(internal_src_dir)/update/nodes/node.cpp \
$(internal_src_dir)/update/nodes/node-messages.cpp \
$(internal_src_dir)/update/nodes/scene-graph-layer.cpp \
+ $(internal_src_dir)/update/render-tasks/scene-graph-camera.cpp \
$(internal_src_dir)/update/render-tasks/scene-graph-render-task.cpp \
$(internal_src_dir)/update/render-tasks/scene-graph-render-task-list.cpp \
+ $(internal_src_dir)/update/rendering/data-providers/render-data-provider.cpp \
+ $(internal_src_dir)/update/rendering/render-instruction-container.cpp \
+ $(internal_src_dir)/update/rendering/render-instruction.cpp \
+ $(internal_src_dir)/update/rendering/render-item.cpp \
+ $(internal_src_dir)/update/rendering/scene-graph-frame-buffer.cpp \
+ $(internal_src_dir)/update/rendering/scene-graph-geometry.cpp \
+ $(internal_src_dir)/update/rendering/scene-graph-property-buffer.cpp \
+ $(internal_src_dir)/update/rendering/scene-graph-texture.cpp \
+ $(internal_src_dir)/update/rendering/scene-graph-shader.cpp \
$(internal_src_dir)/update/rendering/scene-graph-texture-set.cpp \
- $(internal_src_dir)/update/rendering/scene-graph-renderer.cpp
+ $(internal_src_dir)/update/rendering/scene-graph-renderer.cpp \
+ $(internal_src_dir)/update/rendering/shader-cache.cpp
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/common/render-algorithms.h>
-
-// INTERNAL INCLUDES
-#include <dali/internal/render/common/render-debug.h>
-#include <dali/internal/render/common/render-list.h>
-#include <dali/internal/render/common/render-instruction.h>
-#include <dali/internal/render/gl-resources/context.h>
-#include <dali/internal/render/renderers/render-renderer.h>
-#include <dali/internal/update/nodes/scene-graph-layer.h>
-
-using Dali::Internal::SceneGraph::RenderItem;
-using Dali::Internal::SceneGraph::RenderList;
-using Dali::Internal::SceneGraph::RenderListContainer;
-using Dali::Internal::SceneGraph::RenderInstruction;
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace Render
-{
-
-namespace
-{
-
-// Table for fast look-up of Dali::DepthFunction enum to a GL depth function.
-// Note: These MUST be in the same order as Dali::DepthFunction enum.
-const int DaliDepthToGLDepthTable[] = { GL_NEVER, GL_ALWAYS, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_LEQUAL, GL_GEQUAL };
-
-// Table for fast look-up of Dali::StencilFunction enum to a GL stencil function.
-// Note: These MUST be in the same order as Dali::StencilFunction enum.
-const int DaliStencilFunctionToGL[] = { GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS };
-
-// Table for fast look-up of Dali::StencilOperation enum to a GL stencil operation.
-// Note: These MUST be in the same order as Dali::StencilOperation enum.
-const int DaliStencilOperationToGL[] = { GL_ZERO, GL_KEEP, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP };
-
-/**
- * @brief Find the intersection of two AABB rectangles.
- * This is a logical AND operation. IE. The intersection is the area overlapped by both rectangles.
- * @param[in] aabbA Rectangle A
- * @param[in] aabbB Rectangle B
- * @return The intersection of rectangle A & B (result is a rectangle)
- */
-inline ClippingBox IntersectAABB( const ClippingBox& aabbA, const ClippingBox& aabbB )
-{
- ClippingBox intersectionBox;
-
- // First calculate the largest starting positions in X and Y.
- intersectionBox.x = std::max( aabbA.x, aabbB.x );
- intersectionBox.y = std::max( aabbA.y, aabbB.y );
-
- // Now calculate the smallest ending positions, and take the largest starting
- // positions from the result, to get the width and height respectively.
- // If the two boxes do not intersect at all, then we need a 0 width and height clipping area.
- // We use max here to clamp both width and height to >= 0 for this use-case.
- intersectionBox.width = std::max( std::min( aabbA.x + aabbA.width, aabbB.x + aabbB.width ) - intersectionBox.x, 0 );
- intersectionBox.height = std::max( std::min( aabbA.y + aabbA.height, aabbB.y + aabbB.height ) - intersectionBox.y, 0 );
-
- return intersectionBox;
-}
-
-/**
- * @brief Set up the stencil and color buffer for automatic clipping (StencilMode::AUTO).
- * @param[in] item The current RenderItem about to be rendered
- * @param[in] context The context
- * @param[in/out] lastClippingDepth The stencil depth of the last renderer drawn.
- * @param[in/out] lastClippingId The clipping ID of the last renderer drawn.
- */
-inline void SetupStencilClipping( const RenderItem& item, Context& context, uint32_t& lastClippingDepth, uint32_t& lastClippingId )
-{
- const Dali::Internal::SceneGraph::Node* node = item.mNode;
- const uint32_t clippingId = node->GetClippingId();
- // If there is no clipping Id, then either we haven't reached a clipping Node yet, or there aren't any.
- // Either way we can skip clipping setup for this renderer.
- if( clippingId == 0u )
- {
- // Exit immediately if there are no clipping actions to perform (EG. we have not yet hit a clipping node).
- context.EnableStencilBuffer( false );
- return;
- }
-
- context.EnableStencilBuffer( true );
-
- const uint32_t clippingDepth = node->GetClippingDepth();
-
- // Pre-calculate a mask which has all bits set up to and including the current clipping depth.
- // EG. If depth is 3, the mask would be "111" in binary.
- const uint32_t currentDepthMask = ( 1u << clippingDepth ) - 1u;
-
- // Are we are writing to the stencil buffer?
- if( item.mNode->GetClippingMode() == Dali::ClippingMode::CLIP_CHILDREN )
- {
- // We are writing to the stencil buffer.
- // If clipping Id is 1, this is the first clipping renderer within this render-list.
- if( clippingId == 1u )
- {
- // We are enabling the stencil-buffer for the first time within this render list.
- // Clear the buffer at this point.
- context.StencilMask( 0xff );
- context.Clear( GL_STENCIL_BUFFER_BIT, Context::CHECK_CACHED_VALUES );
- }
- else if( ( clippingDepth < lastClippingDepth ) ||
- ( ( clippingDepth == lastClippingDepth ) && ( clippingId > lastClippingId ) ) )
- {
- // The above if() statement tests if we need to clear some (not all) stencil bit-planes.
- // We need to do this if either of the following are true:
- // 1) We traverse up the scene-graph to a previous stencil depth
- // 2) We are at the same stencil depth but the clipping Id has increased.
- //
- // This calculation takes the new depth to move to, and creates an inverse-mask of that number of consecutive bits.
- // This has the effect of clearing everything except the bit-planes up to (and including) our current depth.
- const uint32_t stencilClearMask = ( currentDepthMask >> 1u ) ^ 0xff;
-
- context.StencilMask( stencilClearMask );
- context.Clear( GL_STENCIL_BUFFER_BIT, Context::CHECK_CACHED_VALUES );
- }
-
- // We keep track of the last clipping Id and depth so we can determine when we are
- // moving back up the scene graph and require some of the stencil bit-planes to be deleted.
- lastClippingDepth = clippingDepth;
- lastClippingId = clippingId;
-
- // We only ever write to bit-planes up to the current depth as we may need
- // to erase individual bit-planes and revert to a previous clipping area.
- // Our reference value for testing (in StencilFunc) is written to to the buffer, but we actually
- // want to test a different value. IE. All the bit-planes up to but not including the current depth.
- // So we use the Mask parameter of StencilFunc to mask off the top bit-plane when testing.
- // Here we create our test mask to innore the top bit of the reference test value.
- // As the mask is made up of contiguous "1" values, we can do this quickly with a bit-shift.
- const uint32_t testMask = currentDepthMask >> 1u;
-
- context.StencilFunc( GL_EQUAL, currentDepthMask, testMask ); // Test against existing stencil bit-planes. All must match up to (but not including) this depth.
- context.StencilMask( currentDepthMask ); // Write to the new stencil bit-plane (the other previous bit-planes are also written to).
- context.StencilOp( GL_KEEP, GL_REPLACE, GL_REPLACE );
- }
- else
- {
- // We are reading from the stencil buffer. Set up the stencil accordingly
- // This calculation sets all the bits up to the current depth bit.
- // This has the effect of testing that the pixel being written to exists in every bit-plane up to the current depth.
- context.StencilFunc( GL_EQUAL, currentDepthMask, 0xff );
- context.StencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
- }
-}
-
-/**
- * @brief Sets up the depth buffer for reading and writing based on the current render item.
- * The items read and write mode are used if specified.
- * - If AUTO is selected for reading, the decision will be based on the Layer Behavior.
- * - If AUTO is selected for writing, the decision will be based on the items opacity.
- * @param[in] item The RenderItem to set up the depth buffer for.
- * @param[in] context The context used to execute GL commands.
- * @param[in] depthTestEnabled True if depth testing has been enabled.
- * @param[in/out] firstDepthBufferUse Initialize to true on the first call, this method will set it to false afterwards.
- */
-inline void SetupDepthBuffer( const RenderItem& item, Context& context, bool depthTestEnabled, bool& firstDepthBufferUse )
-{
- // Set up whether or not to write to the depth buffer.
- const DepthWriteMode::Type depthWriteMode = item.mRenderer->GetDepthWriteMode();
- // Most common mode (AUTO) is tested first.
- const bool enableDepthWrite = ( ( depthWriteMode == DepthWriteMode::AUTO ) && depthTestEnabled && item.mIsOpaque ) ||
- ( depthWriteMode == DepthWriteMode::ON );
-
- // Set up whether or not to read from (test) the depth buffer.
- const DepthTestMode::Type depthTestMode = item.mRenderer->GetDepthTestMode();
- // Most common mode (AUTO) is tested first.
- const bool enableDepthTest = ( ( depthTestMode == DepthTestMode::AUTO ) && depthTestEnabled ) ||
- ( depthTestMode == DepthTestMode::ON );
-
- // Is the depth buffer in use?
- if( enableDepthWrite || enableDepthTest )
- {
- // The depth buffer must be enabled if either reading or writing.
- context.EnableDepthBuffer( true );
-
- // Set up the depth mask based on our depth write setting.
- context.DepthMask( enableDepthWrite );
-
- // Look-up the GL depth function from the Dali::DepthFunction enum, and set it.
- context.DepthFunc( DaliDepthToGLDepthTable[ item.mRenderer->GetDepthFunction() ] );
-
- // If this is the first use of the depth buffer this RenderTask, perform a clear.
- // Note: We could do this at the beginning of the RenderTask and rely on the
- // context cache to ignore the clear if not required, but, we would have to enable
- // the depth buffer to do so, which could be a redundant enable.
- if( DALI_UNLIKELY( firstDepthBufferUse ) )
- {
- // This is the first time the depth buffer is being written to or read.
- firstDepthBufferUse = false;
-
- // Note: The buffer will only be cleared if written to since a previous clear.
- context.Clear( GL_DEPTH_BUFFER_BIT, Context::CHECK_CACHED_VALUES );
- }
- }
- else
- {
- // The depth buffer is not being used by this renderer, so we must disable it to stop it being tested.
- context.EnableDepthBuffer( false );
- }
-}
-
-} // Unnamed namespace
-
-
-/**
- * @brief This method is responsible for making decisions on when to apply and unapply scissor clipping, and what rectangular dimensions should be used.
- * A stack of scissor clips at each depth of clipping is maintained, so it can be applied and unapplied.
- * As the clips are hierarchical, this RenderItems AABB is clipped against the current "active" scissor bounds via an intersection operation.
- * @param[in] item The current RenderItem about to be rendered
- * @param[in] context The context
- */
-inline void RenderAlgorithms::SetupScissorClipping( const RenderItem& item, Context& context )
-{
- // Get the number of child scissors in the stack (do not include layer or root box).
- size_t childStackDepth = mScissorStack.size() - 1u;
- const uint32_t scissorDepth = item.mNode->GetScissorDepth();
- const bool clippingNode = item.mNode->GetClippingMode() == Dali::ClippingMode::CLIP_TO_BOUNDING_BOX;
- bool traversedUpTree = false;
-
- // If we are using scissor clipping and we are at the same depth (or less), we need to undo previous clips.
- // We do this by traversing up the scissor clip stack and then apply the appropriate clip for the current render item.
- // To know this, we use clippingDepth. This value is set on *every* node, but only increased as clipping nodes are hit depth-wise.
- // So we know if we are at depth 4 and the stackDepth is 5, that we have gone up.
- // If the depth is the same then we are effectively part of a different sub-tree from the parent, we must also remove the current clip.
- // Note: Stack depth must always be at least 1, as we will have the layer or stage size as the root value.
- if( ( childStackDepth > 0u ) && ( scissorDepth < childStackDepth ) )
- {
- while( scissorDepth < childStackDepth )
- {
- mScissorStack.pop_back();
- --childStackDepth;
- }
-
- // We traversed up the tree, we need to apply a new scissor rectangle (unless we are at the root).
- traversedUpTree = true;
- }
- else if( clippingNode && childStackDepth > 0u && childStackDepth == scissorDepth ) // case of sibling clip area
- {
- mScissorStack.pop_back();
- --childStackDepth;
- }
-
- // If we are on a clipping node, or we have traveled up the tree and gone back past a clipping node, may need to apply a new scissor clip.
- if( clippingNode || traversedUpTree )
- {
- // First, check if we are a clipping node.
- if( clippingNode )
- {
- // This is a clipping node. We generate the AABB for this node and intersect it with the previous intersection further up the tree.
-
- // Get the AABB bounding box for the current render item.
- const ClippingBox scissorBox( item.CalculateViewportSpaceAABB( mViewportRectangle.width, mViewportRectangle.height ) );
-
- // Get the AABB for the parent item that we must intersect with.
- const ClippingBox& parentBox( mScissorStack.back() );
-
- // We must reduce the clipping area based on the parents area to allow nested clips. This is a set intersection function.
- // We add the new scissor box to the stack so we can return to it if needed.
- mScissorStack.emplace_back( IntersectAABB( parentBox, scissorBox ) );
- }
-
- // The scissor test is enabled if we have any children on the stack, OR, if there are none but it is a user specified layer scissor box.
- // IE. It is not enabled if we are at the top of the stack and the layer does not have a specified clipping box.
- const bool scissorEnabled = ( mScissorStack.size() > 0u ) || mHasLayerScissor;
-
- // Enable the scissor test based on the above calculation
- context.SetScissorTest( scissorEnabled );
-
- // If scissor is enabled, we use the calculated screen-space coordinates (now in the stack).
- if( scissorEnabled )
- {
- ClippingBox useScissorBox( mScissorStack.back() );
- context.Scissor( useScissorBox.x, useScissorBox.y, useScissorBox.width, useScissorBox.height );
- }
- }
-}
-
-inline void RenderAlgorithms::SetupClipping( const RenderItem& item, Context& context, bool& usedStencilBuffer, uint32_t& lastClippingDepth, uint32_t& lastClippingId )
-{
- RenderMode::Type renderMode = RenderMode::AUTO;
- const Renderer *renderer = item.mRenderer;
- if( renderer )
- {
- renderMode = renderer->GetRenderMode();
- }
-
- // Setup the stencil using either the automatic clipping feature, or, the manual per-renderer stencil API.
- // Note: This switch is in order of most likely value first.
- switch( renderMode )
- {
- case RenderMode::AUTO:
- {
- // Turn the color buffer on as we always want to render this renderer, regardless of clipping hierarchy.
- context.ColorMask( true );
-
- // The automatic clipping feature will manage the scissor and stencil functions.
- // As both scissor and stencil clips can be nested, we may be simultaneously traversing up the scissor tree, requiring a scissor to be un-done. Whilst simultaneously adding a new stencil clip.
- // We process both based on our current and old clipping depths for each mode.
- // Both methods with return rapidly if there is nothing to be done for that type of clipping.
- SetupScissorClipping( item, context );
- SetupStencilClipping( item, context, lastClippingDepth, lastClippingId );
- break;
- }
-
- case RenderMode::NONE:
- case RenderMode::COLOR:
- {
- // No clipping is performed for these modes.
- // Note: We do not turn off scissor clipping as it may be used for the whole layer.
- // The stencil buffer will not be used at all.
- context.EnableStencilBuffer( false );
-
- // Setup the color buffer based on the RenderMode.
- context.ColorMask( renderMode == RenderMode::COLOR );
- break;
- }
-
- case RenderMode::STENCIL:
- case RenderMode::COLOR_STENCIL:
- {
- // We are using the low-level Renderer Stencil API.
- // The stencil buffer must be enabled for every renderer with stencil mode on, as renderers in between can disable it.
- // Note: As the command state is cached, it is only sent when needed.
- context.EnableStencilBuffer( true );
-
- // Setup the color buffer based on the RenderMode.
- context.ColorMask( renderMode == RenderMode::COLOR_STENCIL );
-
- // If this is the first use of the stencil buffer within this RenderList, clear it (this avoids unnecessary clears).
- if( !usedStencilBuffer )
- {
- context.Clear( GL_STENCIL_BUFFER_BIT, Context::CHECK_CACHED_VALUES );
- usedStencilBuffer = true;
- }
-
- // Setup the stencil buffer based on the renderers properties.
- context.StencilFunc( DaliStencilFunctionToGL[ renderer->GetStencilFunction() ],
- renderer->GetStencilFunctionReference(),
- renderer->GetStencilFunctionMask() );
- context.StencilOp( DaliStencilOperationToGL[ renderer->GetStencilOperationOnFail() ],
- DaliStencilOperationToGL[ renderer->GetStencilOperationOnZFail() ],
- DaliStencilOperationToGL[ renderer->GetStencilOperationOnZPass() ] );
- context.StencilMask( renderer->GetStencilMask() );
- break;
- }
- }
-}
-
-inline void RenderAlgorithms::ProcessRenderList( const RenderList& renderList,
- Context& context,
- BufferIndex bufferIndex,
- const Matrix& viewMatrix,
- const Matrix& projectionMatrix )
-{
- DALI_PRINT_RENDER_LIST( renderList );
-
- // Note: The depth buffer is enabled or disabled on a per-renderer basis.
- // Here we pre-calculate the value to use if these modes are set to AUTO.
- const bool autoDepthTestMode( !( renderList.GetSourceLayer()->IsDepthTestDisabled() ) && renderList.HasColorRenderItems() );
- const std::size_t count = renderList.Count();
- uint32_t lastClippingDepth( 0u );
- uint32_t lastClippingId( 0u );
- bool usedStencilBuffer( false );
- bool firstDepthBufferUse( true );
- mViewportRectangle = context.GetViewport();
- mHasLayerScissor = false;
-
- // Setup Scissor testing (for both viewport and per-node scissor)
- mScissorStack.clear();
- if( renderList.IsClipping() )
- {
- context.SetScissorTest( true );
- const ClippingBox& layerScissorBox = renderList.GetClippingBox();
- context.Scissor( layerScissorBox.x, layerScissorBox.y, layerScissorBox.width, layerScissorBox.height );
- mScissorStack.push_back( layerScissorBox );
- mHasLayerScissor = true;
- }
- else
- {
- // We are not performing a layer clip. Add the viewport as the root scissor rectangle.
- context.SetScissorTest( false );
- mScissorStack.push_back( mViewportRectangle );
- }
-
- // Loop through all RenderList in the RenderList, set up any prerequisites to render them, then perform the render.
- for( size_t index( 0u ); index < count; ++index )
- {
- const RenderItem& item = renderList.GetItem( index );
- DALI_PRINT_RENDER_ITEM( item );
-
- // Set up clipping based on both the Renderer and Actor APIs.
- // The Renderer API will be used if specified. If AUTO, the Actors automatic clipping feature will be used.
- SetupClipping( item, context, usedStencilBuffer, lastClippingDepth, lastClippingId );
-
- if( DALI_LIKELY( item.mRenderer ) )
- {
- // Set up the depth buffer based on per-renderer flags.
- // If the per renderer flags are set to "ON" or "OFF", they will always override any Layer depth mode or
- // draw-mode state, such as Overlays.
- // If the flags are set to "AUTO", the behavior then depends on the type of renderer. Overlay Renderers will always
- // disable depth testing and writing. Color Renderers will enable them if the Layer does.
- SetupDepthBuffer( item, context, autoDepthTestMode, firstDepthBufferUse );
-
- // Render the item.
- item.mRenderer->Render( context, bufferIndex, *item.mNode, item.mModelMatrix, item.mModelViewMatrix,
- viewMatrix, projectionMatrix, item.mSize, !item.mIsOpaque );
- }
- }
-}
-
-RenderAlgorithms::RenderAlgorithms()
- : mViewportRectangle(),
- mHasLayerScissor( false )
-{
-}
-
-void RenderAlgorithms::ProcessRenderInstruction( const RenderInstruction& instruction, Context& context, BufferIndex bufferIndex )
-{
- DALI_PRINT_RENDER_INSTRUCTION( instruction, bufferIndex );
-
- const Matrix* viewMatrix = instruction.GetViewMatrix( bufferIndex );
- const Matrix* projectionMatrix = instruction.GetProjectionMatrix( bufferIndex );
-
- DALI_ASSERT_DEBUG( viewMatrix );
- DALI_ASSERT_DEBUG( projectionMatrix );
-
- if( viewMatrix && projectionMatrix )
- {
- const RenderListContainer::SizeType count = instruction.RenderListCount();
-
- // Iterate through each render list in order. If a pair of render lists
- // are marked as interleaved, then process them together.
- for( RenderListContainer::SizeType index = 0; index < count; ++index )
- {
- const RenderList* renderList = instruction.GetRenderList( index );
-
- if( renderList && !renderList->IsEmpty() )
- {
- ProcessRenderList( *renderList, context, bufferIndex, *viewMatrix, *projectionMatrix );
- }
- }
- }
-}
-
-
-} // namespace Render
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef DALI_INTERNAL_RENDER_ALGORITHMS_H
-#define DALI_INTERNAL_RENDER_ALGORITHMS_H
-
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/internal/common/buffer-index.h>
-#include <dali/internal/render/common/render-list.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-class Context;
-
-namespace SceneGraph
-{
-class RenderInstruction;
-struct RenderItem;
-}
-
-namespace Render
-{
-
-/**
- * @brief The responsibility of the RenderAlgorithms object is to action renders required by a RenderInstruction.
- */
-class RenderAlgorithms
-{
- public:
-
- /**
- * Constructor.
- */
- RenderAlgorithms();
-
- /**
- * Process a render-instruction.
- * @param[in] instruction The render-instruction to process.
- * @param[in] context The GL context.
- * @param[in] bufferIndex The current render buffer index (previous update buffer)
- */
- void ProcessRenderInstruction( const SceneGraph::RenderInstruction& instruction, Context& context, BufferIndex bufferIndex );
-
- private:
-
- /**
- * @brief Calculate a 2D AABB (axis aligned bounding box) in screen space.
- * The RenderItems dimensions are translated and a Z value of 0 is assumed for this purpose.
- * No projection is performed, but rotation on Z is supported.
- * @param[in] item The RenderItem to generate an AABB for
- * @return The generated AABB in screen space
- */
- inline Dali::ClippingBox CalculateScreenSpaceAABB( const Dali::Internal::SceneGraph::RenderItem& item );
-
- /**
- * @brief Perform any scissor clipping related operations based on the current RenderItem.
- * This includes:
- * - Determining if any action is to be taken (so the method can be exited early if not).
- * - If the node is a clipping node, apply the nodes clip intersected with the current/parent scissor clip.
- * - If we have gone up the scissor hierarchy, and need to un-apply a scissor clip.
- * - Disable scissor clipping completely if it is not needed
- * @param[in] item The current RenderItem (about to be rendered)
- * @param[in] context The current Context
- */
- inline void SetupScissorClipping( const Dali::Internal::SceneGraph::RenderItem& item, Context& context );
-
- /**
- * @brief Set up the clipping based on the specified clipping settings.
- * @param[in] item The current RenderItem (about to be rendered)
- * @param[in] context The context
- * @param[in/out] usedStencilBuffer True if the stencil buffer has been used so far within this RenderList. Used by StencilMode::ON.
- * @param[in/out] lastClippingDepth The stencil depth of the last renderer drawn. Used by the clipping feature.
- * @param[in/out] lastClippingId The clipping ID of the last renderer drawn. Used by the clipping feature.
- */
- inline void SetupClipping( const Dali::Internal::SceneGraph::RenderItem& item, Context& context, bool& usedStencilBuffer, uint32_t& lastClippingDepth, uint32_t& lastClippingId );
-
- /**
- * @brief Process a render-list.
- * @param[in] renderList The render-list to process.
- * @param[in] context The GL context.
- * @param[in] buffer The current render buffer index (previous update buffer)
- * @param[in] viewMatrix The view matrix from the appropriate camera.
- * @param[in] projectionMatrix The projection matrix from the appropriate camera.
- */
- inline void ProcessRenderList( const Dali::Internal::SceneGraph::RenderList& renderList, Context& context, BufferIndex bufferIndex, const Matrix& viewMatrix, const Matrix& projectionMatrix );
-
- // Prevent copying:
- RenderAlgorithms( RenderAlgorithms& rhs );
- RenderAlgorithms& operator=( const RenderAlgorithms& rhs );
-
-
- // Member variables:
-
- using ScissorStackType = std::vector<Dali::ClippingBox>; ///< The container type used to maintain the applied scissor hierarchy
-
- ScissorStackType mScissorStack; ///< Contains the currently applied scissor hierarchy (so we can undo clips)
- Dali::ClippingBox mViewportRectangle; ///< The viewport dimensions, used to translate AABBs to scissor coordinates
- bool mHasLayerScissor:1; ///< Marks if the currently process render instruction has a layer-based clipping region
-};
-
-} // namespace Render
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // DALI_INTERNAL_RENDER_ALGORITHMS_H
+++ /dev/null
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/common/render-debug.h>
-
-// EXTERNAL INCLUDES
-#include <sstream>
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/debug.h>
-#include <dali/internal/render/common/render-item.h>
-#include <dali/internal/render/common/render-list.h>
-#include <dali/internal/render/common/render-instruction.h>
-#include <dali/internal/update/nodes/node.h>
-
-using Dali::Internal::SceneGraph::Node;
-using Dali::Internal::SceneGraph::RenderList;
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace Render
-{
-
-// These functions should only be defined if they are being used by the #define in the header.
-// Otherwise they will contribute negatively to code coverage.
-#ifdef DALI_PRINT_RENDER_INFO
-
-void PrintFrameStart( BufferIndex bufferIndex )
-{
- DALI_LOG_RENDER_INFO( "RENDER START - bufferIndex: %d\n", bufferIndex );
-}
-
-void PrintFrameEnd()
-{
- DALI_LOG_RENDER_INFO( "RENDER END\n\n" );
-}
-
-void PrintRenderInstruction( const SceneGraph::RenderInstruction& instruction, BufferIndex index )
-{
- const char* target = (nullptr != instruction.mFrameBuffer) ? "FrameBuffer" : "Screen";
-
- std::stringstream debugStream;
- debugStream << "Rendering to " << target << ", View: " << *(instruction.GetViewMatrix(index)) << " Projection: " << *(instruction.GetProjectionMatrix(index));
-
- if( instruction.mIsViewportSet )
- {
- debugStream << " Viewport: " << instruction.mViewport.x << "," << instruction.mViewport.y << " " << instruction.mViewport.width << "x" << instruction.mViewport.height;
- }
-
- if( instruction.mIsClearColorSet )
- {
- debugStream << " ClearColor: " << instruction.mClearColor;
- }
-
- std::string debugString( debugStream.str() );
- DALI_LOG_RENDER_INFO( " %s\n", debugString.c_str() );
-}
-
-void PrintRenderList( const RenderList& list )
-{
- std::stringstream debugStream;
- debugStream << "Rendering items";
-
- if( list.IsClipping() )
- {
- debugStream << ", ClippingBox: " << list.GetClippingBox().x << "," << list.GetClippingBox().y << " " << list.GetClippingBox().width << "x" << list.GetClippingBox().height;
- }
-
- std::string debugString( debugStream.str() );
- DALI_LOG_RENDER_INFO( " %s\n", debugString.c_str() );
-}
-
-void PrintRenderItem( const SceneGraph::RenderItem& item )
-{
- std::stringstream debugStream;
- debugStream << "Rendering item, ModelView: " << item.mModelViewMatrix;
-
- std::string debugString( debugStream.str() );
- DALI_LOG_RENDER_INFO( " %s\n", debugString.c_str() );
-}
-
-void PrintRendererCount( unsigned int frameCount, unsigned int rendererCount )
-{
- if( frameCount % 120 == 30 ) // Print every 2 seconds reg
- {
- Debug::LogMessage( Debug::DebugInfo, "Renderer Total # renderers: %u\n", rendererCount );
- }
-}
-
-#endif
-
-} // Render
-
-} // Internal
-
-} // Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_RENDER_DEBUG_H__
-#define __DALI_INTERNAL_RENDER_DEBUG_H__
-
-/*
- * Copyright (c) 2015 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/internal/common/buffer-index.h>
-
-// define this to print information about the items rendered each frame
-#undef DALI_PRINT_RENDER_INFO
-
-#ifdef DALI_PRINT_RENDER_INFO
-
-#define DALI_PRINT_RENDER_START(x) Render::PrintFrameStart(x);
-#define DALI_PRINT_RENDER_END() Render::PrintFrameEnd();
-#define DALI_PRINT_RENDER_INSTRUCTION(x,index) Render::PrintRenderInstruction(x,index);
-#define DALI_PRINT_RENDER_LIST(x) Render::PrintRenderList(x);
-#define DALI_PRINT_RENDER_ITEM(x) Render::PrintRenderItem(x);
-
-#else // DALI_PRINT_RENDER_INFO
-
-#define DALI_PRINT_RENDER_START(x)
-#define DALI_PRINT_RENDER_END()
-#define DALI_PRINT_RENDER_INSTRUCTION(x,index)
-#define DALI_PRINT_RENDER_LIST(x)
-#define DALI_PRINT_RENDER_ITEM(x)
-
-#endif // DALI_PRINT_RENDER_INFO
-
-#undef DALI_PRINT_RENDERERS
-
-// Turn this on to see a snapshot of # renderers every 2 seconds
-//#define DALI_PRINT_RENDERERS 1
-
-#ifdef DALI_PRINT_RENDERERS
-#define DALI_PRINT_RENDERER_COUNT(x, y) Render::PrintRendererCount(x, y)
-#else // DALI_PRINT_RENDERERS
-#define DALI_PRINT_RENDERER_COUNT(x, y)
-#endif // DALI_PRINT_RENDERERS
-
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-class PropertyInputImpl;
-
-namespace SceneGraph
-{
-class Node;
-class RenderInstruction;
-struct RenderList;
-struct RenderItem;
-}
-
-namespace Render
-{
-
-/**
- * Print a debug message at the start of the render-thread.
- * @param[in] buffer The current render buffer index (previous update buffer)
- */
-void PrintFrameStart( BufferIndex bufferIndex );
-
-/**
- * Print a debug message at the end of the render-thread.
- */
-void PrintFrameEnd();
-
-/**
- * Print some information about a render-instruction.
- * @param[in] instruction The render-instruction.
- * @param[in] index to use
- */
-void PrintRenderInstruction( const SceneGraph::RenderInstruction& instruction, BufferIndex index );
-
-/**
- * Print some information about a render-list.
- * @param[in] instruction The render-list.
- */
-void PrintRenderList( const SceneGraph::RenderList& list );
-
-/**
- * Print some information about a render-item.
- * @param[in] instruction The render-item.
- */
-void PrintRenderItem( const SceneGraph::RenderItem& item );
-
-/**
- * Print the number of image renderers
- * @param[in] frameCount The frame counter
- * @param[in] rendererCount The number of image renderers
- */
-void PrintRendererCount( unsigned int frameCount, unsigned int rendererCount );
-
-/**
- * Recursively dumps a Node tree.
- * @param[in] node The starting node to dump from
- * @param[in] indent Optional. Leave unset for default indent (used internally while recursing)
- */
-void DumpNode( const SceneGraph::Node* node, unsigned int indent = 0 );
-
-} // Render
-
-} // Internal
-
-} // Dali
-
-#endif // __DALI_INTERNAL_RENDER_DEBUG_H__
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/common/render-manager.h>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/actors/sampling.h>
-#include <dali/public-api/common/dali-common.h>
-#include <dali/public-api/common/stage.h>
-#include <dali/public-api/render-tasks/render-task.h>
-#include <dali/integration-api/debug.h>
-#include <dali/integration-api/core.h>
-#include <dali/internal/common/owner-pointer.h>
-#include <dali/internal/render/common/render-algorithms.h>
-#include <dali/internal/render/common/render-debug.h>
-#include <dali/internal/render/common/render-tracker.h>
-#include <dali/internal/render/common/render-instruction-container.h>
-#include <dali/internal/render/common/render-instruction.h>
-#include <dali/internal/render/gl-resources/context.h>
-#include <dali/internal/render/queue/render-queue.h>
-#include <dali/internal/render/renderers/render-frame-buffer.h>
-#include <dali/internal/render/renderers/render-geometry.h>
-#include <dali/internal/render/renderers/render-renderer.h>
-#include <dali/internal/render/renderers/render-sampler.h>
-#include <dali/internal/render/shaders/program-controller.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace SceneGraph
-{
-
-/**
- * Structure to contain internal data
- */
-struct RenderManager::Impl
-{
- Impl( Integration::GlAbstraction& glAbstraction,
- Integration::GlSyncAbstraction& glSyncAbstraction )
- : context( glAbstraction ),
- glSyncAbstraction( glSyncAbstraction ),
- renderQueue(),
- instructions(),
- renderAlgorithms(),
- backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ),
- frameCount( 0u ),
- renderBufferIndex( SceneGraphBuffers::INITIAL_UPDATE_BUFFER_INDEX ),
- defaultSurfaceRect(),
- rendererContainer(),
- samplerContainer(),
- textureContainer(),
- frameBufferContainer(),
- lastFrameWasRendered( false ),
- programController( glAbstraction )
- {
- }
-
- ~Impl()
- {
- }
-
- void AddRenderTracker( Render::RenderTracker* renderTracker )
- {
- DALI_ASSERT_DEBUG( renderTracker != NULL );
- mRenderTrackers.PushBack( renderTracker );
- }
-
- void RemoveRenderTracker( Render::RenderTracker* renderTracker )
- {
- mRenderTrackers.EraseObject( renderTracker );
- }
-
- void UpdateTrackers()
- {
- for( auto&& iter : mRenderTrackers )
- {
- iter->PollSyncObject();
- }
- }
-
- // the order is important for destruction,
- // programs are owned by context at the moment.
- Context context; ///< holds the GL state
- Integration::GlSyncAbstraction& glSyncAbstraction; ///< GL sync abstraction
- RenderQueue renderQueue; ///< A message queue for receiving messages from the update-thread.
-
- // Render instructions describe what should be rendered during RenderManager::Render()
- // Owned by RenderManager. Update manager updates instructions for the next frame while we render the current one
- RenderInstructionContainer instructions;
- Render::RenderAlgorithms renderAlgorithms; ///< The RenderAlgorithms object is used to action the renders required by a RenderInstruction
-
- Vector4 backgroundColor; ///< The glClear color used at the beginning of each frame.
-
- unsigned int frameCount; ///< The current frame count
- BufferIndex renderBufferIndex; ///< The index of the buffer to read from; this is opposite of the "update" buffer
-
- Rect<int> defaultSurfaceRect; ///< Rectangle for the default surface we are rendering to
-
- OwnerContainer< Render::Renderer* > rendererContainer; ///< List of owned renderers
- OwnerContainer< Render::Sampler* > samplerContainer; ///< List of owned samplers
- OwnerContainer< Render::Texture* > textureContainer; ///< List of owned textures
- OwnerContainer< Render::FrameBuffer* > frameBufferContainer; ///< List of owned framebuffers
- OwnerContainer< Render::PropertyBuffer* > propertyBufferContainer; ///< List of owned property buffers
- OwnerContainer< Render::Geometry* > geometryContainer; ///< List of owned Geometries
-
- bool lastFrameWasRendered; ///< Keeps track of the last frame being rendered due to having render instructions
-
- OwnerContainer< Render::RenderTracker* > mRenderTrackers; ///< List of render trackers
-
- ProgramController programController; ///< Owner of the GL programs
-
-};
-
-RenderManager* RenderManager::New( Integration::GlAbstraction& glAbstraction,
- Integration::GlSyncAbstraction& glSyncAbstraction )
-{
- RenderManager* manager = new RenderManager;
- manager->mImpl = new Impl( glAbstraction,
- glSyncAbstraction );
- return manager;
-}
-
-RenderManager::RenderManager()
-: mImpl(NULL)
-{
-}
-
-RenderManager::~RenderManager()
-{
- delete mImpl;
-}
-
-RenderQueue& RenderManager::GetRenderQueue()
-{
- return mImpl->renderQueue;
-}
-
-void RenderManager::ContextCreated()
-{
- mImpl->context.GlContextCreated();
- mImpl->programController.GlContextCreated();
-
- // renderers, textures and gpu buffers cannot reinitialize themselves
- // so they rely on someone reloading the data for them
-}
-
-void RenderManager::ContextDestroyed()
-{
- mImpl->context.GlContextDestroyed();
- mImpl->programController.GlContextDestroyed();
-
- //Inform textures
- for( auto&& texture : mImpl->textureContainer )
- {
- texture->GlContextDestroyed();
- }
-
- //Inform framebuffers
- for( auto&& framebuffer : mImpl->frameBufferContainer )
- {
- framebuffer->GlContextDestroyed();
- }
-
- // inform renderers
- for( auto&& renderer : mImpl->rendererContainer )
- {
- renderer->GlContextDestroyed();
- }
-}
-
-void RenderManager::SetShaderSaver( ShaderSaver& upstream )
-{
- mImpl->programController.SetShaderSaver( upstream );
-}
-
-RenderInstructionContainer& RenderManager::GetRenderInstructionContainer()
-{
- return mImpl->instructions;
-}
-
-void RenderManager::SetBackgroundColor( const Vector4& color )
-{
- mImpl->backgroundColor = color;
-}
-
-void RenderManager::SetDefaultSurfaceRect(const Rect<int>& rect)
-{
- mImpl->defaultSurfaceRect = rect;
-}
-
-void RenderManager::AddRenderer( OwnerPointer< Render::Renderer >& renderer )
-{
- // Initialize the renderer as we are now in render thread
- renderer->Initialize( mImpl->context );
-
- mImpl->rendererContainer.PushBack( renderer.Release() );
-}
-
-void RenderManager::RemoveRenderer( Render::Renderer* renderer )
-{
- mImpl->rendererContainer.EraseObject( renderer );
-}
-
-void RenderManager::AddSampler( OwnerPointer< Render::Sampler >& sampler )
-{
- mImpl->samplerContainer.PushBack( sampler.Release() );
-}
-
-void RenderManager::RemoveSampler( Render::Sampler* sampler )
-{
- mImpl->samplerContainer.EraseObject( sampler );
-}
-
-void RenderManager::AddTexture( OwnerPointer< Render::Texture >& texture )
-{
- texture->Initialize( mImpl->context );
- mImpl->textureContainer.PushBack( texture.Release() );
-}
-
-void RenderManager::RemoveTexture( Render::Texture* texture )
-{
- DALI_ASSERT_DEBUG( NULL != texture );
-
- // Find the texture, use reference to pointer so we can do the erase safely
- for ( auto&& iter : mImpl->textureContainer )
- {
- if ( iter == texture )
- {
- texture->Destroy( mImpl->context );
- mImpl->textureContainer.Erase( &iter ); // Texture found; now destroy it
- return;
- }
- }
-}
-
-void RenderManager::UploadTexture( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params )
-{
- texture->Upload( mImpl->context, pixelData, params );
-}
-
-void RenderManager::GenerateMipmaps( Render::Texture* texture )
-{
- texture->GenerateMipmaps( mImpl->context );
-}
-
-void RenderManager::SetFilterMode( Render::Sampler* sampler, unsigned int minFilterMode, unsigned int magFilterMode )
-{
- sampler->mMinificationFilter = static_cast<Dali::FilterMode::Type>(minFilterMode);
- sampler->mMagnificationFilter = static_cast<Dali::FilterMode::Type>(magFilterMode );
-}
-
-void RenderManager::SetWrapMode( Render::Sampler* sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode )
-{
- sampler->mRWrapMode = static_cast<Dali::WrapMode::Type>(rWrapMode);
- sampler->mSWrapMode = static_cast<Dali::WrapMode::Type>(sWrapMode);
- sampler->mTWrapMode = static_cast<Dali::WrapMode::Type>(tWrapMode);
-}
-
-void RenderManager::AddFrameBuffer( Render::FrameBuffer* frameBuffer )
-{
- mImpl->frameBufferContainer.PushBack( frameBuffer );
- frameBuffer->Initialize(mImpl->context);
-}
-
-void RenderManager::RemoveFrameBuffer( Render::FrameBuffer* frameBuffer )
-{
- DALI_ASSERT_DEBUG( NULL != frameBuffer );
-
- // Find the sampler, use reference so we can safely do the erase
- for ( auto&& iter : mImpl->frameBufferContainer )
- {
- if ( iter == frameBuffer )
- {
- frameBuffer->Destroy( mImpl->context );
- mImpl->frameBufferContainer.Erase( &iter ); // frameBuffer found; now destroy it
- break;
- }
- }
-}
-
-void RenderManager::AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, unsigned int mipmapLevel, unsigned int layer )
-{
- frameBuffer->AttachColorTexture( mImpl->context, texture, mipmapLevel, layer );
-}
-
-void RenderManager::AddPropertyBuffer( OwnerPointer< Render::PropertyBuffer >& propertyBuffer )
-{
- mImpl->propertyBufferContainer.PushBack( propertyBuffer.Release() );
-}
-
-void RenderManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer )
-{
- mImpl->propertyBufferContainer.EraseObject( propertyBuffer );
-}
-
-void RenderManager::SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Render::PropertyBuffer::Format>& format )
-{
- propertyBuffer->SetFormat( format.Release() );
-}
-
-void RenderManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector<char> >& data, size_t size )
-{
- propertyBuffer->SetData( data.Release(), size );
-}
-
-void RenderManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector<unsigned short>& indices )
-{
- geometry->SetIndexBuffer( indices );
-}
-
-void RenderManager::AddGeometry( OwnerPointer< Render::Geometry >& geometry )
-{
- mImpl->geometryContainer.PushBack( geometry.Release() );
-}
-
-void RenderManager::RemoveGeometry( Render::Geometry* geometry )
-{
- mImpl->geometryContainer.EraseObject( geometry );
-}
-
-void RenderManager::AttachVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer )
-{
- DALI_ASSERT_DEBUG( NULL != geometry );
-
- // Find the geometry
- for ( auto&& iter : mImpl->geometryContainer )
- {
- if ( iter == geometry )
- {
- iter->AddPropertyBuffer( propertyBuffer );
- break;
- }
- }
-}
-
-void RenderManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer )
-{
- DALI_ASSERT_DEBUG( NULL != geometry );
-
- // Find the geometry
- for ( auto&& iter : mImpl->geometryContainer )
- {
- if ( iter == geometry )
- {
- iter->RemovePropertyBuffer( propertyBuffer );
- break;
- }
- }
-}
-
-void RenderManager::SetGeometryType( Render::Geometry* geometry, unsigned int geometryType )
-{
- geometry->SetType( Render::Geometry::Type(geometryType) );
-}
-
-void RenderManager::AddRenderTracker( Render::RenderTracker* renderTracker )
-{
- mImpl->AddRenderTracker(renderTracker);
-}
-
-void RenderManager::RemoveRenderTracker( Render::RenderTracker* renderTracker )
-{
- mImpl->RemoveRenderTracker(renderTracker);
-}
-
-ProgramCache* RenderManager::GetProgramCache()
-{
- return &(mImpl->programController);
-}
-
-void RenderManager::Render( Integration::RenderStatus& status )
-{
- DALI_PRINT_RENDER_START( mImpl->renderBufferIndex );
-
- // Core::Render documents that GL context must be current before calling Render
- DALI_ASSERT_DEBUG( mImpl->context.IsGlContextCreated() );
-
- // Increment the frame count at the beginning of each frame
- ++mImpl->frameCount;
-
- // Process messages queued during previous update
- mImpl->renderQueue.ProcessMessages( mImpl->renderBufferIndex );
-
- const size_t count = mImpl->instructions.Count( mImpl->renderBufferIndex );
- const bool haveInstructions = count > 0u;
-
- // Only render if we have instructions to render, or the last frame was rendered (and therefore a clear is required).
- if( haveInstructions || mImpl->lastFrameWasRendered )
- {
- // Mark that we will require a post-render step to be performed (includes swap-buffers).
- status.SetNeedsPostRender( true );
-
- // switch rendering to adaptor provided (default) buffer
- mImpl->context.BindFramebuffer( GL_FRAMEBUFFER, 0u );
-
- mImpl->context.Viewport( mImpl->defaultSurfaceRect.x,
- mImpl->defaultSurfaceRect.y,
- mImpl->defaultSurfaceRect.width,
- mImpl->defaultSurfaceRect.height );
-
- mImpl->context.ClearColor( mImpl->backgroundColor.r,
- mImpl->backgroundColor.g,
- mImpl->backgroundColor.b,
- mImpl->backgroundColor.a );
-
- mImpl->context.ClearStencil( 0 );
-
- // Clear the entire color, depth and stencil buffers for the default framebuffer.
- // It is important to clear all 3 buffers, for performance on deferred renderers like Mali
- // e.g. previously when the depth & stencil buffers were NOT cleared, it caused the DDK to exceed a "vertex count limit",
- // and then stall. That problem is only noticeable when rendering a large number of vertices per frame.
- mImpl->context.SetScissorTest( false );
- mImpl->context.ColorMask( true );
- mImpl->context.DepthMask( true );
- mImpl->context.StencilMask( 0xFF ); // 8 bit stencil mask, all 1's
- mImpl->context.Clear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, Context::FORCE_CLEAR );
-
- // reset the program matrices for all programs once per frame
- // this ensures we will set view and projection matrix once per program per camera
- mImpl->programController.ResetProgramMatrices();
-
- for( size_t i = 0; i < count; ++i )
- {
- RenderInstruction& instruction = mImpl->instructions.At( mImpl->renderBufferIndex, i );
-
- DoRender( instruction );
- }
-
- GLenum attachments[] = { GL_DEPTH, GL_STENCIL };
- mImpl->context.InvalidateFramebuffer(GL_FRAMEBUFFER, 2, attachments);
-
- mImpl->UpdateTrackers();
-
- //Notify RenderGeometries that rendering has finished
- for ( auto&& iter : mImpl->geometryContainer )
- {
- iter->OnRenderFinished();
- }
- }
-
- // If this frame was rendered due to instructions existing, we mark this so we know to clear the next frame.
- mImpl->lastFrameWasRendered = haveInstructions;
-
- /**
- * The rendering has finished; swap to the next buffer.
- * Ideally the update has just finished using this buffer; otherwise the render thread
- * should block until the update has finished.
- */
- mImpl->renderBufferIndex = (0 != mImpl->renderBufferIndex) ? 0 : 1;
-
- DALI_PRINT_RENDER_END();
-}
-
-void RenderManager::DoRender( RenderInstruction& instruction )
-{
- Rect<int> viewportRect;
- Vector4 clearColor;
-
- if ( instruction.mIsClearColorSet )
- {
- clearColor = instruction.mClearColor;
- }
- else
- {
- clearColor = Dali::RenderTask::DEFAULT_CLEAR_COLOR;
- }
-
- if( !instruction.mIgnoreRenderToFbo && ( instruction.mFrameBuffer != 0 ) )
- {
- instruction.mFrameBuffer->Bind( mImpl->context );
- if ( instruction.mIsViewportSet )
- {
- // For glViewport the lower-left corner is (0,0)
- const int y = ( instruction.mFrameBuffer->GetHeight() - instruction.mViewport.height ) - instruction.mViewport.y;
- viewportRect.Set( instruction.mViewport.x, y, instruction.mViewport.width, instruction.mViewport.height );
- }
- else
- {
- viewportRect.Set( 0, 0, instruction.mFrameBuffer->GetWidth(), instruction.mFrameBuffer->GetHeight() );
- }
- }
- else // !(instruction.mOffscreenTexture)
- {
- // switch rendering to adaptor provided (default) buffer
- mImpl->context.BindFramebuffer( GL_FRAMEBUFFER, 0 );
-
- // Check whether a viewport is specified, otherwise the full surface size is used
- if ( instruction.mIsViewportSet )
- {
- // For glViewport the lower-left corner is (0,0)
- const int y = ( mImpl->defaultSurfaceRect.height - instruction.mViewport.height ) - instruction.mViewport.y;
- viewportRect.Set( instruction.mViewport.x, y, instruction.mViewport.width, instruction.mViewport.height );
- }
- else
- {
- viewportRect = mImpl->defaultSurfaceRect;
- }
- }
-
- mImpl->context.Viewport(viewportRect.x, viewportRect.y, viewportRect.width, viewportRect.height);
-
- if ( instruction.mIsClearColorSet )
- {
- mImpl->context.ClearColor( clearColor.r,
- clearColor.g,
- clearColor.b,
- clearColor.a );
-
- // Clear the viewport area only
- mImpl->context.SetScissorTest( true );
- mImpl->context.Scissor( viewportRect.x, viewportRect.y, viewportRect.width, viewportRect.height );
- mImpl->context.ColorMask( true );
- mImpl->context.Clear( GL_COLOR_BUFFER_BIT , Context::CHECK_CACHED_VALUES );
- mImpl->context.SetScissorTest( false );
- }
-
- mImpl->renderAlgorithms.ProcessRenderInstruction( instruction, mImpl->context, mImpl->renderBufferIndex );
-
- if( instruction.mRenderTracker && ( instruction.mFrameBuffer != NULL ) )
- {
- // This will create a sync object every frame this render tracker
- // is alive (though it should be now be created only for
- // render-once render tasks)
- instruction.mRenderTracker->CreateSyncObject( mImpl->glSyncAbstraction );
- instruction.mRenderTracker = NULL; // Only create once.
- }
-}
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_SCENE_GRAPH_RENDER_MANAGER_H__
-#define __DALI_INTERNAL_SCENE_GRAPH_RENDER_MANAGER_H__
-
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/public-api/math/rect.h>
-#include <dali/internal/common/shader-saver.h>
-#include <dali/internal/render/gl-resources/gpu-buffer.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
-#include <dali/internal/event/rendering/texture-impl.h>
-
-namespace Dali
-{
-
-namespace Integration
-{
-class GlAbstraction;
-class GlSyncAbstraction;
-class RenderStatus;
-}
-
-struct Vector4;
-
-namespace Internal
-{
-class Context;
-class ProgramCache;
-class ShaderSaver;
-
-namespace Render
-{
-class FrameBuffer;
-class Renderer;
-struct Sampler;
-class RenderTracker;
-class Geometry;
-class Texture;
-}
-
-namespace SceneGraph
-{
-class RenderQueue;
-class RenderInstruction;
-class RenderInstructionContainer;
-class Shader;
-class PropertyBufferDataProvider;
-
-/**
- * RenderManager is responsible for rendering the result of the previous "update", which
- * is provided in a RenderCommand during UpdateManager::Update().
- */
-class RenderManager
-{
-public:
-
- /**
- * Construct a new RenderManager.
- * @param[in] glAbstraction The GL abstraction used for rendering.
- * @param[in] glSyncAbstraction The GL sync abstraction used fence sync creation/deletion.
- * @param[out] resourcePostProcessQueue A queue for sending rendered texture ids to the update-thread.*
- */
- static RenderManager* New( Integration::GlAbstraction& glAbstraction,
- Integration::GlSyncAbstraction& glSyncAbstraction );
-
- /**
- * Non-virtual destructor; not intended as a base class
- */
- ~RenderManager();
-
- /**
- * Retrieve the RenderQueue. Messages should only be added to this from the update-thread.
- * @return The render queue.
- */
- RenderQueue& GetRenderQueue();
-
- /**
- * @copydoc Dali::Integration::Core::ContextCreated()
- */
- void ContextCreated();
-
- /**
- * @copydoc Dali::Integration::Core::ContextToBeDestroyed()
- */
- void ContextDestroyed();
-
- /**
- * Set the upstream interface for compiled shader binaries to be sent back to for eventual
- * caching and saving.
- * @param[in] upstream The abstract interface to send any received ShaderDatas onwards to..
- * @note This should be called during core initialisation if shader binaries are to be used.
- */
- void SetShaderSaver( ShaderSaver& upstream );
-
- /**
- * Retrieve the render instructions; these should be set during each "update" traversal.
- * @return The render instruction container.
- */
- RenderInstructionContainer& GetRenderInstructionContainer();
-
- // The following methods should be called via RenderQueue messages
-
- /**
- * Set the background color i.e. the glClear color used at the beginning of each frame.
- * @param[in] color The new background color.
- */
- void SetBackgroundColor( const Vector4& color );
-
- /*
- * Set the frame time delta (time elapsed since the last frame.
- * @param[in] deltaTime the delta time
- */
- void SetFrameDeltaTime( float deltaTime );
-
- /**
- * Returns the rectangle for the default surface (probably the application window).
- * @return Rectangle for the surface.
- */
- void SetDefaultSurfaceRect( const Rect<int>& rect );
-
- /**
- * Add a Renderer to the render manager.
- * @param[in] renderer The renderer to add.
- * @post renderer is owned by RenderManager
- */
- void AddRenderer( OwnerPointer< Render::Renderer >& renderer );
-
- /**
- * Remove a Renderer from the render manager.
- * @param[in] renderer The renderer to remove.
- * @post renderer is destroyed.
- */
- void RemoveRenderer( Render::Renderer* renderer );
-
- /**
- * Add a sampler to the render manager.
- * @param[in] sampler The sampler to add.
- * @post sampler is owned by RenderManager
- */
- void AddSampler( OwnerPointer< Render::Sampler >& sampler );
-
- /**
- * Remove a sampler from the render manager.
- * @param[in] sampler The sampler to remove.
- * @post sampler is destroyed.
- */
- void RemoveSampler( Render::Sampler* sampler );
-
- /**
- * Set minification and magnification filter modes for a sampler
- * @param[in] minFilterMode Filter mode to use when the texture is minificated
- * @param[in] magFilterMode Filter mode to use when the texture is magnified
- */
- void SetFilterMode( Render::Sampler* sampler, unsigned int minFilterMode, unsigned int magFilterMode );
-
- /**
- * Set wrapping mode for a sampler
- * @param[in] rWrapMode Wrap mode in the z direction
- * @param[in] uWrapMode Wrap mode in the x direction
- * @param[in] vWrapMode Wrap mode in the y direction
- */
- void SetWrapMode( Render::Sampler* sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode );
-
- /**
- * Add a property buffer to the render manager.
- * @param[in] propertyBuffer The property buffer to add.
- * @post propertBuffer is owned by RenderManager
- */
- void AddPropertyBuffer( OwnerPointer< Render::PropertyBuffer >& propertyBuffer );
-
- /**
- * Remove a property buffer from the render manager.
- * @param[in] propertyBuffer The property buffer to remove.
- * @post propertyBuffer is destroyed.
- */
- void RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer );
-
- /**
- * Add a geometry to the render manager.
- * @param[in] geometry The geometry to add.
- * @post geometry is owned by RenderManager
- */
- void AddGeometry( OwnerPointer< Render::Geometry >& geometry );
-
- /**
- * Remove a geometry from the render manager.
- * @param[in] geometry The geometry to remove.
- * @post geometry is destroyed.
- */
- void RemoveGeometry( Render::Geometry* geometry );
-
- /**
- * Adds a property buffer to a geometry from the render manager.
- * @param[in] geometry The geometry
- * @param[in] propertyBuffer The property buffer to remove.
- */
- void AttachVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer );
-
- /**
- * Remove a property buffer from a Render::Geometry from the render manager.
- * @param[in] geometry The geometry
- * @param[in] propertyBuffer The property buffer to remove.
- * @post property buffer is destroyed.
- */
- void RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer );
-
- /**
- * Sets the format of an existing property buffer
- * @param[in] propertyBuffer The property buffer.
- * @param[in] format The new format of the buffer
- */
- void SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Render::PropertyBuffer::Format>& format );
-
- /**
- * Sets the data of an existing property buffer
- * @param[in] propertyBuffer The property buffer.
- * @param[in] data The new data of the buffer
- * @param[in] size The new size of the buffer
- */
- void SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector<char> >& data, size_t size );
-
- /**
- * Sets the data for the index buffer of an existing geometry
- * @param[in] geometry The geometry
- * @param[in] data A vector containing the indices
- */
- void SetIndexBuffer( Render::Geometry* geometry, Dali::Vector<unsigned short>& data );
-
- /**
- * Set the geometry type of an existing render geometry
- * @param[in] geometry The render geometry
- * @param[in] geometryType The new geometry type
- */
- void SetGeometryType( Render::Geometry* geometry, unsigned int geometryType );
-
- /**
- * Adds a texture to the render manager
- * @param[in] texture The texture to add
- */
- void AddTexture( OwnerPointer< Render::Texture >& texture );
-
- /**
- * Removes a texture from the render manager
- * @param[in] texture The texture to remove
- */
- void RemoveTexture( Render::Texture* texture );
-
- /**
- * Uploads data to an existing texture
- * @param[in] texture The texture
- * @param[in] pixelData The pixel data object
- * @param[in] params The parameters for the upload
- */
- void UploadTexture( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params );
-
- /**
- * Generates mipmaps for a given texture
- * @param[in] texture The texture
- */
- void GenerateMipmaps( Render::Texture* texture );
-
- /**
- * Adds a framebuffer to the render manager
- * @param[in] frameBuffer The framebuffer to add
- */
- void AddFrameBuffer( Render::FrameBuffer* frameBuffer );
-
- /**
- * Removes a framebuffer from the render manager
- * @param[in] frameBuffer The framebuffer to remove
- */
- void RemoveFrameBuffer( Render::FrameBuffer* frameBuffer );
-
- /**
- * Attach a texture as color output to an existing FrameBuffer
- * @param[in] frameBuffer The FrameBuffer
- * @param[in] texture The texture that will be used as output when rendering
- * @param[in] mipmapLevel The mipmap of the texture to be attached
- * @param[in] layer Indicates which layer of a cube map or array texture to attach. Unused for 2D textures
- */
- void AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, unsigned int mipmapLevel, unsigned int layer );
-
- /**
- * Adds a render tracker to the RenderManager. RenderManager takes ownership of the
- * tracker. The lifetime of the tracker is related to the lifetime of the tracked
- * object, usually an offscreen render task.
- * @param[in] renderTracker The render tracker
- */
- void AddRenderTracker( Render::RenderTracker* renderTracker );
-
- /**
- * Removes a render tracker from the RenderManager.
- * @param[in] renderTracker The render tracker to remove.
- */
- void RemoveRenderTracker( Render::RenderTracker* renderTracker );
-
- /**
- * returns the Program controller for sending program messages
- * @return the ProgramController
- */
- ProgramCache* GetProgramCache();
-
- // This method should be called from Core::Render()
-
- /**
- * Renders the results of the previous "update" traversal.
- * @param[out] status contains the rendering flags.
- */
- void Render( Integration::RenderStatus& status );
-
-private:
-
- /**
- * Helper to process a single RenderInstruction.
- * @param[in] instruction A description of the rendering operation.
- */
- void DoRender( RenderInstruction& instruction );
-
-private:
-
- /**
- * Construct a new RenderManager.
- */
- RenderManager();
-
- // Undefined
- RenderManager( const RenderManager& );
-
- // Undefined
- RenderManager& operator=( const RenderManager& rhs );
-
-private:
-
- struct Impl;
- Impl* mImpl;
-
-};
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_SCENE_GRAPH_RENDER_MANAGER_H__
+++ /dev/null
-#ifndef __DALI_INTERNAL_SCENE_GRAPH_RENDER_TRACKER_DEBUG_H__
-#define __DALI_INTERNAL_SCENE_GRAPH_RENDER_TRACKER_DEBUG_H__
-
-/*
- * Copyright (c) 2015 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <dali/integration-api/debug.h>
-
-namespace Dali
-{
-namespace Internal
-{
-namespace Render
-{
-
-#if defined(DEBUG_ENABLED)
-
-Debug::Filter* gRenderTrackerLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_RENDER_TRACKER");
-
-#define TRACKER_LOG(level) \
- DALI_LOG_INFO(gRenderTrackerLogFilter, level, "RenderTracker::%s: this:%p\n", __FUNCTION__, this)
-
-#define TRACKER_LOG_FMT(level, format, args...) \
- DALI_LOG_INFO(gRenderTrackerLogFilter, level, "RenderTracker::%s: this:%p " format, __FUNCTION__, this, ## args)
-#else
-#define TRACKER_LOG(level)
-#define TRACKER_LOG_FMT(level, format, args...)
-#endif
-
-} // Render
-
-} // Internal
-
-} // Dali
-
-#endif // __DALI_INTERNAL_SCENE_GRAPH_RENDER_TRACKER_DEBUG_H__
+++ /dev/null
-/*
- * Copyright (c) 2015 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/common/render-tracker.h>
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/gl-sync-abstraction.h>
-#include <dali/internal/render/common/render-tracker-debug.h>
-
-// EXTERNAL INCLUDES
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace Render
-{
-
-RenderTracker::RenderTracker()
-: mGlSyncAbstraction( NULL ),
- mSyncObject( NULL ),
- mSyncTrigger( 0 )
-{
- TRACKER_LOG(Debug::Verbose);
-}
-
-RenderTracker::~RenderTracker()
-{
- TRACKER_LOG(Debug::Verbose);
- if( mSyncObject )
- {
- mGlSyncAbstraction->DestroySyncObject( mSyncObject );
- mSyncObject = NULL;
- }
-}
-
-void RenderTracker::CreateSyncObject( Integration::GlSyncAbstraction& glSyncAbstraction )
-{
- mGlSyncAbstraction = &glSyncAbstraction;
- TRACKER_LOG(Debug::General);
-
- // Destroy any previous sync object
- if( mSyncObject )
- {
- mGlSyncAbstraction->DestroySyncObject( mSyncObject );
- mSyncObject = NULL;
- }
- ResetSyncFlag();
- mSyncObject = mGlSyncAbstraction->CreateSyncObject();
-}
-
-void RenderTracker::PollSyncObject()
-{
- if( mSyncObject && mSyncObject->IsSynced() )
- {
- SetSyncFlag();
- mGlSyncAbstraction->DestroySyncObject( mSyncObject );
- mSyncObject = NULL;
-
- TRACKER_LOG_FMT(Debug::General, " Synced\n");
- return;
- }
- TRACKER_LOG_FMT(Debug::General, " Not Synced\n");
-}
-
-bool RenderTracker::IsSynced()
-{
- int x = __sync_val_compare_and_swap(&mSyncTrigger, 0xFF, 0x0);
-
- TRACKER_LOG_FMT(Debug::General, " = %s\n", x!=0?"T":"F");
- return x != 0;
-}
-
-void RenderTracker::ResetSyncFlag()
-{
- TRACKER_LOG(Debug::General);
- (void)__sync_lock_test_and_set(&mSyncTrigger, 0x0);
-}
-
-void RenderTracker::SetSyncFlag()
-{
- (void)__sync_lock_test_and_set(&mSyncTrigger, 0xFF);
-}
-
-} // Render
-
-} // Internal
-
-} // Dali
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/gl-resources/context.h>
-
-// EXTERNAL INCLUDES
-#include <algorithm>
-#include <cstring>
-#include <type_traits>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/common/constants.h>
-#include <dali/public-api/rendering/texture-set.h>
-#include <dali/integration-api/platform-abstraction.h>
-#include <dali/integration-api/debug.h>
-#include <dali/internal/render/common/render-manager.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace // unnamed namespace
-{
-
-static_assert( TEXTURE_UNIT_LAST <= Context::MAX_TEXTURE_UNITS, "TEXTURE_UNIT_LAST is greater than Context::MAX_TEXTURE_UNITS" );
-
-/**
- * GL error strings
- */
-struct errorStrings
-{
- const GLenum errorCode;
- const char* errorString;
-};
-errorStrings errors[] =
-{
- { GL_NO_ERROR, "GL_NO_ERROR" },
- { GL_INVALID_ENUM, "GL_INVALID_ENUM" },
- { GL_INVALID_VALUE, "GL_INVALID_VALUE" },
- { GL_INVALID_OPERATION, "GL_INVALID_OPERATION" },
- { GL_OUT_OF_MEMORY, "GL_OUT_OF_MEMORY" }
-};
-
-} // unnamed namespace
-
-#ifdef DEBUG_ENABLED
-Debug::Filter* gContextLogFilter = Debug::Filter::New(Debug::Concise, false, "LOG_CONTEXT_STATE");
-#endif
-
-Context::Context(Integration::GlAbstraction& glAbstraction)
-: mGlAbstraction(glAbstraction),
- mGlContextCreated(false),
- mColorMask(true),
- mStencilMask(0xFF),
- mBlendEnabled(false),
- mDepthBufferEnabled(false),
- mDepthMaskEnabled(false),
- mDitherEnabled(true), // This the only GL capability which defaults to true
- mPolygonOffsetFillEnabled(false),
- mSampleAlphaToCoverageEnabled(false),
- mSampleCoverageEnabled(false),
- mScissorTestEnabled(false),
- mStencilBufferEnabled(false),
- mClearColorSet(false),
- mUsingDefaultBlendColor(true),
- mBoundArrayBufferId(0),
- mBoundElementArrayBufferId(0),
- mBoundTransformFeedbackBufferId(0),
- mActiveTextureUnit( TEXTURE_UNIT_LAST ),
- mBlendColor(Color::TRANSPARENT),
- mBlendFuncSeparateSrcRGB(GL_ONE),
- mBlendFuncSeparateDstRGB(GL_ZERO),
- mBlendFuncSeparateSrcAlpha(GL_ONE),
- mBlendFuncSeparateDstAlpha(GL_ZERO),
- mBlendEquationSeparateModeRGB( GL_FUNC_ADD ),
- mBlendEquationSeparateModeAlpha( GL_FUNC_ADD ),
- mStencilFunc( GL_ALWAYS ),
- mStencilFuncRef( 0 ),
- mStencilFuncMask( 0xFFFFFFFF ),
- mStencilOpFail( GL_KEEP ),
- mStencilOpDepthFail( GL_KEEP ),
- mStencilOpDepthPass( GL_KEEP ),
- mDepthFunction( GL_LESS ),
- mMaxTextureSize(0),
- mClearColor(Color::WHITE), // initial color, never used until it's been set by the user
- mCullFaceMode( FaceCullingMode::NONE ),
- mViewPort( 0, 0, 0, 0 )
-{
-}
-
-Context::~Context()
-{
-}
-
-void Context::GlContextCreated()
-{
- DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::GlContextCreated()\n");
-
- DALI_ASSERT_DEBUG(!mGlContextCreated);
-
- mGlContextCreated = true;
-
- // Set the initial GL state, and check it.
- InitializeGlState();
-
-#ifdef DEBUG_ENABLED
- PrintCurrentState();
-#endif
-}
-
-void Context::GlContextDestroyed()
-{
- DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::GlContextDestroyed()\n");
- mGlContextCreated = false;
-}
-
-const char* Context::ErrorToString( GLenum errorCode )
-{
- for( unsigned int i = 0; i < sizeof(errors) / sizeof(errors[0]); ++i)
- {
- if (errorCode == errors[i].errorCode)
- {
- return errors[i].errorString;
- }
- }
- return "Unknown Open GLES error";
-}
-
-const Rect< int >& Context::GetViewport()
-{
- return mViewPort;
-}
-
-void Context::FlushVertexAttributeLocations()
-{
- for( unsigned int i = 0; i < MAX_ATTRIBUTE_CACHE_SIZE; ++i )
- {
- // see if our cached state is different to the actual state
- if (mVertexAttributeCurrentState[ i ] != mVertexAttributeCachedState[ i ] )
- {
- // it's different so make the change to the driver
- // and update the cached state
- mVertexAttributeCurrentState[ i ] = mVertexAttributeCachedState[ i ];
-
- if (mVertexAttributeCurrentState[ i ] )
- {
- LOG_GL("EnableVertexAttribArray %d\n", i);
- CHECK_GL( mGlAbstraction, mGlAbstraction.EnableVertexAttribArray( i ) );
- }
- else
- {
- LOG_GL("DisableVertexAttribArray %d\n", i);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( i ) );
- }
- }
- }
-
-}
-
-void Context::SetVertexAttributeLocation(unsigned int location, bool state)
-{
-
- if( location >= MAX_ATTRIBUTE_CACHE_SIZE )
- {
- // not cached, make the gl call through context
- if ( state )
- {
- LOG_GL("EnableVertexAttribArray %d\n", location);
- CHECK_GL( mGlAbstraction, mGlAbstraction.EnableVertexAttribArray( location ) );
- }
- else
- {
- LOG_GL("DisableVertexAttribArray %d\n", location);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( location ) );
- }
- }
- else
- {
- // set the cached state, it will be set at the next draw call
- // if it's different from the current driver state
- mVertexAttributeCachedState[ location ] = state;
- }
-}
-
-void Context::InitializeGlState()
-{
- DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::InitializeGlState()\n");
- DALI_ASSERT_DEBUG(mGlContextCreated);
-
- mClearColorSet = false;
- mColorMask = true;
- mStencilMask = 0xFF;
- mBlendEnabled = false;
- mDepthBufferEnabled = false;
- mDepthMaskEnabled = false;
- mPolygonOffsetFillEnabled = false;
- mSampleAlphaToCoverageEnabled = false;
- mSampleCoverageEnabled = false;
- mScissorTestEnabled = false;
- mStencilBufferEnabled = false;
- mDitherEnabled = false; // This and GL_MULTISAMPLE are the only GL capability which defaults to true
- mGlAbstraction.Disable(GL_DITHER);
-
- mBoundArrayBufferId = 0;
- mBoundElementArrayBufferId = 0;
- mBoundTransformFeedbackBufferId = 0;
- mActiveTextureUnit = TEXTURE_UNIT_IMAGE;
-
- mUsingDefaultBlendColor = true; //Default blend color is (0,0,0,0)
-
- mBlendFuncSeparateSrcRGB = GL_ONE;
- mBlendFuncSeparateDstRGB = GL_ZERO;
- mBlendFuncSeparateSrcAlpha = GL_ONE;
- mBlendFuncSeparateDstAlpha = GL_ZERO;
-
- // initial state is GL_FUNC_ADD for both RGB and Alpha blend modes
- mBlendEquationSeparateModeRGB = GL_FUNC_ADD;
- mBlendEquationSeparateModeAlpha = GL_FUNC_ADD;
-
- mCullFaceMode = FaceCullingMode::NONE; //By default cullface is disabled, front face is set to CCW and cull face is set to back
-
- // get maximum texture size
- mGlAbstraction.GetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
-
- // reset viewport, this will be set to something useful when rendering
- mViewPort.x = mViewPort.y = mViewPort.width = mViewPort.height = 0;
-
- //Initialze vertex attribute cache
- memset( &mVertexAttributeCachedState, 0, sizeof(mVertexAttributeCachedState) );
- memset( &mVertexAttributeCurrentState, 0, sizeof(mVertexAttributeCurrentState) );
-
- //Initialize bound 2d texture cache
- memset( &mBoundTextureId, 0, sizeof(mBoundTextureId) );
-
- mFrameBufferStateCache.Reset();
-}
-
-#ifdef DEBUG_ENABLED
-
-void Context::PrintCurrentState()
-{
- const char* cullFaceModes[] = { "CullNone", "CullFront", "CullBack", "CullFrontAndBack" };
- DALI_LOG_INFO( gContextLogFilter, Debug::General,
- "\n----------------- Context State BEGIN -----------------\n"
- "Blend = %s\n"
- "Cull Face = %s\n"
- "Depth Test = %s\n"
- "Depth Mask = %s\n"
- "Dither = %s\n"
- "Polygon Offset Fill = %s\n"
- "Sample Alpha To Coverage = %s\n"
- "Sample Coverage = %s\n"
- "Scissor Test = %s\n"
- "Stencil Test = %s\n"
- "----------------- Context State END -----------------\n",
- mBlendEnabled ? "Enabled" : "Disabled",
- cullFaceModes[ mCullFaceMode ],
- mDepthBufferEnabled ? "Enabled" : "Disabled",
- mDepthMaskEnabled ? "Enabled" : "Disabled",
- mDitherEnabled ? "Enabled" : "Disabled",
- mPolygonOffsetFillEnabled ? "Enabled" : "Disabled",
- mSampleAlphaToCoverageEnabled ? "Enabled" : "Disabled",
- mSampleCoverageEnabled ? "Enabled" : "Disabled",
- mScissorTestEnabled ? "Enabled" : "Disabled",
- mStencilBufferEnabled ? "Enabled" : "Disabled");
-}
-
-#endif // DALI_CONTEXT_LOGGING
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_CONTEXT_H__
-#define __DALI_INTERNAL_CONTEXT_H__
-
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/public-api/common/dali-vector.h>
-#include <dali/public-api/common/dali-common.h>
-#include <dali/public-api/math/rect.h>
-#include <dali/public-api/math/vector4.h>
-#include <dali/public-api/rendering/renderer.h>
-#include <dali/integration-api/debug.h>
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/integration-api/gl-defines.h>
-#include <dali/internal/render/common/performance-monitor.h>
-#include <dali/internal/render/gl-resources/texture-units.h>
-#include <dali/internal/render/gl-resources/frame-buffer-state-cache.h>
-#include <dali/internal/render/gl-resources/gl-call-debug.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-/**
- * Context records the current GL state, and provides access to the OpenGL ES 2.0 API.
- * Context avoids duplicate GL calls, if the same setting etc. is requested repeatedly.
- */
-class Context
-{
-public:
-
- /**
- * FrameBuffer Clear mode
- */
- enum ClearMode
- {
- FORCE_CLEAR, ///< always perform the glClear regardless of current state
- CHECK_CACHED_VALUES ///< check the Frame buffers cached state to see if a clear is required
- };
-
- /**
- * Size of the VertexAttributeArray enables
- * GLES specification states that there's minimum of 8
- */
- static const unsigned int MAX_ATTRIBUTE_CACHE_SIZE = 8;
-
- static const unsigned int MAX_TEXTURE_UNITS = 8; // for GLES 2.0 8 is guaranteed, which is more than DALi uses anyways
-
- /**
- * Creates the Dali Context object.
- * This method does not create an OpenGL context i.e. that is done from outside dali-core.
- * @pre Context has not been created.
- * @exception Context already created.
- * @param glAbstraction the gl abstraction.
- */
- Context( Integration::GlAbstraction& glAbstraction );
-
- /**
- * Destructor
- */
- ~Context();
-
- /**
- * Called when the GL context has been created.
- */
- void GlContextCreated();
-
- /**
- * Called when the GL context has been destroyed.
- */
- void GlContextDestroyed();
-
- /**
- * Query whether the OpenGL context has been created.
- * @return True if the OpenGL context has been created.
- */
- bool IsGlContextCreated() { return mGlContextCreated; }
-
- /**
- * @return the GLAbstraction
- */
- Integration::GlAbstraction& GetAbstraction() { return mGlAbstraction; }
-
-#ifdef DEBUG_ENABLED
-
- /**
- * Debug helper which prints the currently cached GL state.
- */
- void PrintCurrentState();
-
-#endif
-
- /**
- * Helper to convert GL error code to string
- * @param errorCode to convert
- * @return C string
- */
- const char* ErrorToString( GLenum errorCode );
-
- /**
- * Helper to print GL string to debug log
- */
- void PrintGlString(const char* stringName, GLenum stringId)
- {
- DALI_LOG_INFO(Debug::Filter::gRender, Debug::General, "GL %s = %s\n", stringName, reinterpret_cast< const char * >( GetString( stringId ) ) );
- }
-
- /****************************************************************************************
- * The following methods are forwarded to Dali::Integration::GlAbstraction.
- * In some cases the GL state is recorded, to avoid duplicate calls with the same state.
- * All Shader, Program, Uniform and Attribute related calls are not here, Program class
- * handles them and optimizes any program related state changes
- ****************************************************************************************/
-
- /**
- * Wrapper for OpenGL ES 2.0 glActiveTexture()
- */
- void ActiveTexture( TextureUnit textureUnit )
- {
- if ( textureUnit != mActiveTextureUnit )
- {
- mActiveTextureUnit = textureUnit;
- LOG_GL("ActiveTexture %x\n", textureUnit);
- CHECK_GL( mGlAbstraction, mGlAbstraction.ActiveTexture(TextureUnitAsGLenum(textureUnit)) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glBeginQuery()
- */
- void BeginQuery(GLenum target, GLuint id)
- {
- LOG_GL("BeginQuery %d %d\n", target, id);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BeginQuery(target, id) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glBeginTransformFeedback()
- */
- void BeginTransformFeedback(GLenum primitiveMode)
- {
- LOG_GL("BeginTransformFeedback %x\n", primitiveMode);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BeginTransformFeedback(primitiveMode) );
- }
-
- /**
- * The wrapper for OpenGL ES 2.0 glBindBuffer() has been replaced by BindArrayBuffer & BindElementArrayBuffer & BindTransformFeedbackBuffer.
- */
-
- /**
- * Wrapper for OpenGL ES 2.0 glBindBuffer(GL_ARRAY_BUFFER, ...)
- */
- void BindArrayBuffer(GLuint buffer)
- {
- // Avoid unecessary calls to BindBuffer
- if (mBoundArrayBufferId != buffer)
- {
- mBoundArrayBufferId = buffer;
-
- LOG_GL("BindBuffer GL_ARRAY_BUFFER %d\n", buffer);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_ARRAY_BUFFER, buffer) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...)
- */
- void BindElementArrayBuffer(GLuint buffer)
- {
- // Avoid unecessary calls to BindBuffer
- if (mBoundElementArrayBufferId!= buffer)
- {
- mBoundElementArrayBufferId = buffer;
-
- LOG_GL("BindBuffer GL_ELEMENT_ARRAY_BUFFER %d\n", buffer);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, ...)
- */
- void BindTransformFeedbackBuffer(GLuint buffer)
- {
- // Avoid unecessary calls to BindBuffer
- if (mBoundTransformFeedbackBufferId != buffer)
- {
- mBoundTransformFeedbackBufferId = buffer;
-
- LOG_GL("BindBuffer GL_TRANSFORM_FEEDBACK_BUFFER %d\n", buffer);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER , buffer) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, ...)
- */
- void BindTransformFeedbackBufferBase(GLuint index, GLuint buffer)
- {
- // Avoid unecessary calls to BindBufferBase
- if (mBoundTransformFeedbackBufferId != buffer)
- {
- mBoundTransformFeedbackBufferId = buffer;
-
- LOG_GL("BindBufferBase GL_TRANSFORM_FEEDBACK_BUFFER %d %d\n", index, buffer);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, index, buffer) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBindFramebuffer()
- */
- void BindFramebuffer(GLenum target, GLuint framebuffer)
- {
- mFrameBufferStateCache.SetCurrentFrameBuffer( framebuffer );
-
- LOG_GL("BindFramebuffer %d %d\n", target, framebuffer);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BindFramebuffer(target, framebuffer) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBindRenderbuffer()
- */
- void BindRenderbuffer(GLenum target, GLuint renderbuffer)
- {
- LOG_GL("BindRenderbuffer %d %d\n", target, renderbuffer);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BindRenderbuffer(target, renderbuffer) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glBindTransformFeedback()
- */
- void BindTransformFeedback(GLenum target, GLuint id)
- {
- LOG_GL("BindTransformFeedback %d %d\n", target, id);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BindTransformFeedback(target, id) );
- }
-
- /**
- * Helper to bind texture for rendering. If given texture is
- * already bound in the given textureunit, this method does nothing.
- * Otherwise changes the active texture unit and binds the texture.
- * Note! after this call active texture unit may not necessarily be the one
- * passed in as argument so you cannot change texture unit state!!
- * @param textureunit to bind to
- * @param texture to bind
- */
- void BindTextureForUnit( TextureUnit textureunit, int target, GLuint texture )
- {
- if( mBoundTextureId[ textureunit ] != texture )
- {
- ActiveTexture( textureunit );
- BindTexture( target, texture );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBindTexture( target )
- */
- void BindTexture( int target, GLuint texture )
- {
- if (mBoundTextureId[ mActiveTextureUnit ] != texture)
- {
- mBoundTextureId[ mActiveTextureUnit ] = texture;
-
- LOG_GL("BindTexture target(%d) %d\n", target, texture);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BindTexture(target, texture) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBlendColor()
- */
- void SetDefaultBlendColor()
- {
- if( ! mUsingDefaultBlendColor )
- {
- SetCustomBlendColor( Color::TRANSPARENT );
- mUsingDefaultBlendColor = true;
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBlendColor()
- */
- void SetCustomBlendColor( const Vector4& color )
- {
- if( mUsingDefaultBlendColor || mBlendColor != color )
- {
- LOG_GL( "BlendColor %f %f %f %f\n", color.r, color.g, color.b, color.a );
- CHECK_GL( mGlAbstraction, mGlAbstraction.BlendColor( color.r, color.g, color.b, color.a ) );
- mUsingDefaultBlendColor = false;
- mBlendColor = color;
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBlendEquation()
- */
- void BlendEquation(GLenum mode)
- {
- // use BlendEquationSeparate to set the rgb and alpha modes the same
- BlendEquationSeparate( mode, mode );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBlendEquationSeparate()
- */
- void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
- {
- if( ( modeRGB != mBlendEquationSeparateModeRGB ) ||
- ( modeAlpha != mBlendEquationSeparateModeAlpha ) )
- {
- mBlendEquationSeparateModeRGB = modeRGB;
- mBlendEquationSeparateModeAlpha = modeAlpha;
- LOG_GL("BlendEquationSeparate %d %d\n", modeRGB, modeAlpha);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BlendEquationSeparate(modeRGB, modeAlpha) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBlendFunc()
- */
- void BlendFunc(GLenum sfactor, GLenum dfactor)
- {
- // reuse the BlendFuncSeparate as thats what the DDK does anyways
- BlendFuncSeparate( sfactor, dfactor, sfactor, dfactor );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBlendFuncSeparate()
- */
- void BlendFuncSeparate( GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha )
- {
- if( ( mBlendFuncSeparateSrcRGB != srcRGB )||( mBlendFuncSeparateDstRGB != dstRGB )||
- ( mBlendFuncSeparateSrcAlpha != srcAlpha )||( mBlendFuncSeparateDstAlpha != dstAlpha ) )
- {
- mBlendFuncSeparateSrcRGB = srcRGB;
- mBlendFuncSeparateDstRGB = dstRGB;
- mBlendFuncSeparateSrcAlpha = srcAlpha;
- mBlendFuncSeparateDstAlpha = dstAlpha;
-
- LOG_GL( "BlendFuncSeparate %d %d %d %d\n", srcRGB, dstRGB, srcAlpha, dstAlpha );
- CHECK_GL( mGlAbstraction, mGlAbstraction.BlendFuncSeparate( srcRGB, dstRGB, srcAlpha, dstAlpha ) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glBlitFramebuffer()
- */
- void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
- {
- LOG_GL( "BlitFramebuffer %d %d %d %d %d %d %d %d %x %d\n", srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter );
- CHECK_GL( mGlAbstraction, mGlAbstraction.BlitFramebuffer( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter ) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBufferData()
- */
- void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
- {
- LOG_GL("BufferData %d %d %p %d\n", target, size, data, usage);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BufferData(target, size, data, usage) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glBufferSubData()
- */
- void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
- {
- LOG_GL("BufferSubData %d %d %d %p\n", target, offset, size, data);
- CHECK_GL( mGlAbstraction, mGlAbstraction.BufferSubData(target, offset, size, data) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glCheckFramebufferStatus()
- */
- GLenum CheckFramebufferStatus(GLenum target)
- {
- LOG_GL("CheckFramebufferStatus %d\n", target);
- GLenum value = CHECK_GL( mGlAbstraction, mGlAbstraction.CheckFramebufferStatus(target) );
- return value;
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glClear()
- */
- void Clear(GLbitfield mask, ClearMode mode )
- {
- bool forceClear = (mode == FORCE_CLEAR );
- mask = mFrameBufferStateCache.GetClearMask( mask, forceClear , mScissorTestEnabled );
-
- if( mask > 0 )
- {
- LOG_GL("Clear %d\n", mask);
- CHECK_GL( mGlAbstraction, mGlAbstraction.Clear( mask ) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glClearColor()
- */
- void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
- {
- Vector4 newCol(red,green,blue,alpha);
-
- if (!mClearColorSet || mClearColor !=newCol )
- {
- LOG_GL("ClearColor %f %f %f %f\n", red, green, blue, alpha);
- CHECK_GL( mGlAbstraction, mGlAbstraction.ClearColor(red, green, blue, alpha) );
-
- mClearColorSet = true;
- mClearColor = newCol;
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glClearDepthf()
- */
- void ClearDepthf(GLclampf depth)
- {
- LOG_GL("ClearDepthf %f\n", depth);
- CHECK_GL( mGlAbstraction, mGlAbstraction.ClearDepthf(depth) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glClearStencil()
- */
- void ClearStencil(GLint s)
- {
- LOG_GL("ClearStencil %d\n", s);
- CHECK_GL( mGlAbstraction, mGlAbstraction.ClearStencil(s) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glColorMask()
- * @note This has been optimized to a single boolean value (masking individual channels is not required)
- */
- void ColorMask( bool flag )
- {
- // only change state if needed
- if( flag != mColorMask )
- {
- mColorMask = flag;
- LOG_GL("ColorMask %s %s %s %s\n", flag ? "True" : "False", flag ? "True" : "False", flag ? "True" : "False", flag ? "True" : "False");
- CHECK_GL( mGlAbstraction, mGlAbstraction.ColorMask(flag, flag, flag, flag) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glCompressedTexImage2D()
- */
- void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
- GLint border, GLsizei imageSize, const void* data)
- {
- LOG_GL("CompressedTexImage2D %d %d %x %d %d %d %d %p\n", target, level, internalformat, width, height, border, imageSize, data);
- CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glCompressedTexImage3D()
- */
- void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
- GLint border, GLsizei imageSize, const void* data)
- {
- LOG_GL("CompressedTexImage3D %d %d %x %d %d %d %d %d %p\n", target, level, internalformat, width, height, depth, border, imageSize, data);
- CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glCompressedTexSubImage2D()
- */
- void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
- GLenum format, GLsizei imageSize, const void* data)
- {
- LOG_GL("CompressedTexSubImage2D %x %d %d %d %d %d %x %d %p\n", target, level, xoffset, yoffset, width, height, format, imageSize, data);
- CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glCompressedTexSubImage3D()
- */
- void CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth,
- GLenum format, GLsizei imageSize, const void* data)
- {
- LOG_GL("CompressedTexSubImage3D %x %d %d %d %d %d %d %d %x %d %p\n", target, level, xoffset, yoffset, xoffset, width, height, depth, format, imageSize, data);
- CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glCopyTexImage2D()
- */
- void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
- {
- LOG_GL("CopyTexImage2D %x %d %x %d %d %d %d %d\n", target, level, internalformat, x, y, width, height, border);
- CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexImage2D(target, level, internalformat, x, y, width, height, border) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glCopyTexSubImage2D()
- */
- void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
- {
- LOG_GL("CopyTexSubImage2D %x %d %d %d %d %d %d %d\n", target, level, xoffset, yoffset, x, y, width, height);
- CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glCopyTexSubImage3D()
- */
- void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
- {
- LOG_GL("CopyTexSubImage3D %x %d %d %d %d %d %d %d %d\n", target, level, xoffset, yoffset, zoffset, x, y, width, height);
- CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glCullFace()
- * enables GL_CULL_FACE if in any of the face culling modes
- * otherwise disables GL_CULL_FACE
- */
- void CullFace( Dali::FaceCullingMode::Type mode )
- {
- // Avoid unnecessary calls to gl
- if(mCullFaceMode != mode)
- {
- mCullFaceMode = mode;
- switch(mode)
- {
- case Dali::FaceCullingMode::NONE:
- {
- LOG_GL("Disable GL_CULL_FACE\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_CULL_FACE) );
- break;
- }
-
- case Dali::FaceCullingMode::FRONT:
- {
- LOG_GL("Enable GL_CULL_FACE\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
- LOG_GL("Enable GL_FRONT\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_FRONT) );
- break;
- }
-
- case Dali::FaceCullingMode::BACK:
- {
- LOG_GL("Enable GL_CULL_FACE\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
- LOG_GL("Enable GL_BACK\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_BACK) );
- break;
- }
-
- case Dali::FaceCullingMode::FRONT_AND_BACK:
- {
- LOG_GL("Enable GL_CULL_FACE\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
- LOG_GL("Enable GL_FRONT_AND_BACK\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_FRONT_AND_BACK) );
- break;
- }
-
- default:
- break;
- }
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glDeleteBuffers()
- */
- void DeleteBuffers(GLsizei n, const GLuint* buffers)
- {
- // @todo: this is to prevent mesh destructor from doing GL calls when DALi core is being deleted
- // can be taken out once render manages either knows about meshes or gpubuffers and can tell them directly that context is lost
- if( this->IsGlContextCreated() )
- {
- LOG_GL("DeleteBuffers %d %p\n", n, buffers);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteBuffers(n, buffers) );
- }
- // reset the cached buffer id's
- // fixes problem where some drivers will a generate a buffer with the
- // same id, as the last deleted buffer id.
- mBoundArrayBufferId = 0;
- mBoundElementArrayBufferId = 0;
- mBoundTransformFeedbackBufferId = 0;
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glDeleteFramebuffers()
- */
- void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
- {
- mFrameBufferStateCache.FrameBuffersDeleted( n, framebuffers );
-
- LOG_GL("DeleteFramebuffers %d %p\n", n, framebuffers);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteFramebuffers(n, framebuffers) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glDeleteQueries()
- */
- void DeleteQueries(GLsizei n, GLuint* ids)
- {
- LOG_GL("DeleteQueries %d %p\n", n, ids);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteQueries(n, ids) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glDeleteRenderbuffers()
- */
- void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
- {
- LOG_GL("DeleteRenderbuffers %d %p\n", n, renderbuffers);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteRenderbuffers(n, renderbuffers) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glDeleteTextures()
- */
- void DeleteTextures(GLsizei n, const GLuint* textures)
- {
- LOG_GL("DeleteTextures %d %p\n", n, textures);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteTextures(n, textures) );
-
- // reset the cached texture id's incase the driver re-uses them
- // when creating new textures
- for( unsigned int i=0; i < MAX_TEXTURE_UNITS; ++i )
- {
- mBoundTextureId[ i ] = 0;
- }
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glDeleteTransformFeedbacks()
- */
- void DeleteTransformFeedbacks(GLsizei n, GLuint* ids)
- {
- LOG_GL("DeleteTransformFeedbacks %d %p\n", n, ids);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteTransformFeedbacks(n, ids) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glDepthFunc()
- */
- void DepthFunc(GLenum func)
- {
- if( func != mDepthFunction )
- {
- mDepthFunction = func;
- LOG_GL("DepthFunc %x\n", func);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DepthFunc(func) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glDepthMask()
- */
- void DepthMask(GLboolean flag)
- {
- bool booleanFlag = flag != GL_FALSE;
- // only change state if needed
- if( booleanFlag != mDepthMaskEnabled )
- {
- mDepthMaskEnabled = booleanFlag;
- LOG_GL("DepthMask %s\n", booleanFlag ? "True" : "False");
- CHECK_GL( mGlAbstraction, mGlAbstraction.DepthMask( mDepthMaskEnabled ) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glDepthRangef()
- */
- void DepthRangef(GLclampf zNear, GLclampf zFar)
- {
- LOG_GL("DepthRangef %f %f\n", zNear, zFar);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DepthRangef(zNear, zFar) );
- }
-
- /**
- * The wrapper for OpenGL ES 2.0 glDisable() has been replaced by SetBlend, SetCullFace, SetDepthTest,
- * SetDither, SetPolygonOffsetFill, SetSampleAlphaToCoverage, SetSampleCoverage, SetScissorTest & SetStencilTest.
- */
-
- /**
- * Wrapper for OpenGL ES 2.0 glDrawArrays()
- */
- void DrawArrays(GLenum mode, GLint first, GLsizei count)
- {
- mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
- FlushVertexAttributeLocations();
-
- LOG_GL("DrawArrays %x %d %d\n", mode, first, count);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DrawArrays(mode, first, count) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glDrawArraysInstanced()
- */
- void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
- {
- mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
- FlushVertexAttributeLocations();
-
- LOG_GL("DrawArraysInstanced %x %d %d %d\n", mode, first, count, instanceCount);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DrawArraysInstanced(mode, first, count,instanceCount) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glDrawBuffers()
- */
- void DrawBuffers(GLsizei n, const GLenum* bufs)
- {
- mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
- LOG_GL("DrawBuffers %d %p\n", n, bufs);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DrawBuffers(n, bufs) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glDrawElements()
- */
- void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
- {
- mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
-
- FlushVertexAttributeLocations();
-
- LOG_GL("DrawElements %x %d %d %p\n", mode, count, type, indices);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DrawElements(mode, count, type, indices) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glDrawElementsInstanced()
- */
- void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instanceCount)
- {
- mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
-
- FlushVertexAttributeLocations();
-
- LOG_GL("DrawElementsInstanced %x %d %d %p %d\n", mode, count, type, indices, instanceCount);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DrawElementsInstanced(mode, count, type, indices, instanceCount) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glDrawRangeElements()
- */
- void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices)
- {
- mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
- FlushVertexAttributeLocations();
-
- LOG_GL("DrawRangeElements %x %u %u %d %d %p\n", mode, start, end, count, type, indices);
- CHECK_GL( mGlAbstraction, mGlAbstraction.DrawRangeElements(mode, start, end, count, type, indices) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glGenQuerieS()
- */
- void GenQueries(GLsizei n, GLuint* ids)
- {
- LOG_GL("GenQueries %d %p\n", n, ids);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GenQueries(n, ids) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glGenTransformFeedbacks()
- */
- void GenTransformFeedbacks(GLsizei n, GLuint* ids)
- {
- LOG_GL("GenTransformFeedbacks %d %p\n", n, ids);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GenTransformFeedbacks(n, ids) );
- }
-
- /**
- * @return the current buffer bound for a given target
- */
- GLuint GetCurrentBoundArrayBuffer(GLenum target)
- {
- GLuint result(0);
- switch(target)
- {
- case GL_ARRAY_BUFFER:
- {
- result = mBoundArrayBufferId;
- break;
- }
- case GL_ELEMENT_ARRAY_BUFFER:
- {
- result = mBoundElementArrayBufferId;
- break;
- }
- case GL_TRANSFORM_FEEDBACK_BUFFER:
- {
- result = mBoundTransformFeedbackBufferId;
- break;
- }
- default:
- {
- DALI_ASSERT_DEBUG(0 && "target buffer type not supported");
- }
- }
- return result;
- }
-
- void EnableVertexAttributeArray( GLuint location )
- {
- SetVertexAttributeLocation( location, true);
- }
-
- void DisableVertexAttributeArray( GLuint location )
- {
- SetVertexAttributeLocation( location, false);
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glVertexAttribDivisor()
- */
- void VertexAttribDivisor ( GLuint index, GLuint divisor )
- {
- LOG_GL("VertexAttribDivisor(%d, %d)\n", index, divisor );
- CHECK_GL( mGlAbstraction, mGlAbstraction.VertexAttribDivisor( index, divisor ) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glVertexAttribPointer()
- */
- void VertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr )
- {
- LOG_GL("VertexAttribPointer(%d, %d, %d, %d, %d, %x)\n", index, size, type, normalized, stride, ptr );
- CHECK_GL( mGlAbstraction, mGlAbstraction.VertexAttribPointer( index, size, type, normalized, stride, ptr ) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glInvalidateFramebuffer()
- */
- void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
- {
- LOG_GL("InvalidateFramebuffer\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.InvalidateFramebuffer(target, numAttachments, attachments) );
- }
-
- /**
- * The wrapper for OpenGL ES 2.0 glEnable() has been replaced by SetBlend, SetCullFace, SetDepthTest,
- * SetDither, SetPolygonOffsetFill, SetSampleAlphaToCoverage, SetSampleCoverage, SetScissorTest & SetStencilTest.
- */
-
- /**
- * This method replaces glEnable(GL_BLEND) and glDisable(GL_BLEND).
- * @param[in] enable True if GL_BLEND should be enabled.
- */
- void SetBlend(bool enable)
- {
- // Avoid unecessary calls to glEnable/glDisable
- if (enable != mBlendEnabled)
- {
- mBlendEnabled = enable;
-
- if (enable)
- {
- LOG_GL("Enable GL_BLEND\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_BLEND) );
- }
- else
- {
- LOG_GL("Disable GL_BLEND\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_BLEND) );
- }
- }
- }
-
- /**
- * This method replaces glEnable(GL_DEPTH_TEST) and glDisable(GL_DEPTH_TEST).
- * Note GL_DEPTH_TEST means enable the depth buffer for writing and or testing.
- * glDepthMask is used to enable / disable writing to depth buffer.
- * glDepthFunc us used to control if testing is enabled and how it is performed ( default GL_LESS)
- *
- * @param[in] enable True if GL_DEPTH_TEST should be enabled.
- */
- void EnableDepthBuffer( bool enable )
- {
- // Avoid unecessary calls to glEnable/glDisable
- if( enable != mDepthBufferEnabled )
- {
- mDepthBufferEnabled = enable;
-
- if (enable)
- {
- LOG_GL("Enable GL_DEPTH_TEST\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_DEPTH_TEST) );
- }
- else
- {
- LOG_GL("Disable GL_DEPTH_TEST\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_DEPTH_TEST) );
- }
- }
- }
-
- /**
- * This method replaces glEnable(GL_DITHER) and glDisable(GL_DITHER).
- * @param[in] enable True if GL_DITHER should be enabled.
- */
- void SetDither(bool enable)
- {
- // Avoid unecessary calls to glEnable/glDisable
- if (enable != mDitherEnabled)
- {
- mDitherEnabled = enable;
-
- if (enable)
- {
- LOG_GL("Enable GL_DITHER\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_DITHER) );
- }
- else
- {
- LOG_GL("Disable GL_DITHER\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_DITHER) );
- }
- }
- }
-
- /**
- * This method replaces glEnable(GL_POLYGON_OFFSET_FILL) and glDisable(GL_POLYGON_OFFSET_FILL).
- * @param[in] enable True if GL_POLYGON_OFFSET_FILL should be enabled.
- */
- void SetPolygonOffsetFill(bool enable)
- {
- // Avoid unecessary calls to glEnable/glDisable
- if (enable != mPolygonOffsetFillEnabled)
- {
- mPolygonOffsetFillEnabled = enable;
-
- if (enable)
- {
- LOG_GL("Enable GL_POLYGON_OFFSET_FILL\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_POLYGON_OFFSET_FILL) );
- }
- else
- {
- LOG_GL("Disable GL_POLYGON_OFFSET_FILL\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_POLYGON_OFFSET_FILL) );
- }
- }
- }
-
- /**
- * This method replaces glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE) and glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE).
- * @param[in] enable True if GL_SAMPLE_ALPHA_TO_COVERAGE should be enabled.
- */
- void SetSampleAlphaToCoverage(bool enable)
- {
- // Avoid unecessary calls to glEnable/glDisable
- if (enable != mSampleAlphaToCoverageEnabled)
- {
- mSampleAlphaToCoverageEnabled = enable;
-
- if (enable)
- {
- LOG_GL("Enable GL_SAMPLE_ALPHA_TO_COVERAGE\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SAMPLE_ALPHA_TO_COVERAGE) );
- }
- else
- {
- LOG_GL("Disable GL_SAMPLE_ALPHA_TO_COVERAGE\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SAMPLE_ALPHA_TO_COVERAGE) );
- }
- }
- }
-
- /**
- * This method replaces glEnable(GL_SAMPLE_COVERAGE) and glDisable(GL_SAMPLE_COVERAGE).
- * @param[in] enable True if GL_SAMPLE_COVERAGE should be enabled.
- */
- void SetSampleCoverage(bool enable)
- {
- // Avoid unecessary calls to glEnable/glDisable
- if (enable != mSampleCoverageEnabled)
- {
- mSampleCoverageEnabled = enable;
-
- if (enable)
- {
- LOG_GL("Enable GL_SAMPLE_COVERAGE\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SAMPLE_COVERAGE) );
- }
- else
- {
- LOG_GL("Disable GL_SAMPLE_COVERAGE\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SAMPLE_COVERAGE) );
- }
- }
- }
-
- /**
- * This method replaces glEnable(GL_SCISSOR_TEST) and glDisable(GL_SCISSOR_TEST).
- * @param[in] enable True if GL_SCISSOR_TEST should be enabled.
- */
- void SetScissorTest(bool enable)
- {
- // Avoid unecessary calls to glEnable/glDisable
- if (enable != mScissorTestEnabled)
- {
- mScissorTestEnabled = enable;
-
- if (enable)
- {
- LOG_GL("Enable GL_SCISSOR_TEST\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SCISSOR_TEST) );
- }
- else
- {
- LOG_GL("Disable GL_SCISSOR_TEST\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SCISSOR_TEST) );
- }
- }
- }
-
- /**
- * This method replaces glEnable(GL_STENCIL_TEST) and glDisable(GL_STENCIL_TEST).
- * Note GL_STENCIL_TEST means enable the stencil buffer for writing and or testing.
- * glStencilMask is used to control how bits are written to the stencil buffer.
- * glStencilFunc is used to control if testing is enabled and how it is performed ( default GL_ALWAYS )
- * @param[in] enable True if GL_STENCIL_TEST should be enabled.
- */
- void EnableStencilBuffer(bool enable)
- {
- // Avoid unecessary calls to glEnable/glDisable
- if( enable != mStencilBufferEnabled )
- {
- mStencilBufferEnabled = enable;
-
- if (enable)
- {
- LOG_GL("Enable GL_STENCIL_TEST\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_STENCIL_TEST) );
- }
- else
- {
- LOG_GL("Disable GL_STENCIL_TEST\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_STENCIL_TEST) );
- }
- }
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glEndQuery()
- */
- void EndQuery(GLenum target)
- {
- LOG_GL("EndQuery %d\n", target);
- CHECK_GL( mGlAbstraction, mGlAbstraction.EndQuery(target) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glEndTransformFeedback()
- */
- void EndTransformFeedback()
- {
- LOG_GL("EndTransformFeedback\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.EndTransformFeedback() );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glFinish()
- */
- void Finish(void)
- {
- LOG_GL("Finish\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Finish() );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glFlush()
- */
- void Flush(void)
- {
- LOG_GL("Flush\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.Flush() );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glFramebufferRenderbuffer()
- */
- void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
- {
- LOG_GL("FramebufferRenderbuffer %x %x %x %d\n", target, attachment, renderbuffertarget, renderbuffer);
- CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glFramebufferTexture2D()
- */
- void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
- {
- LOG_GL("FramebufferTexture2D %x %x %x %d %d\n", target, attachment, textarget, texture, level);
- CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferTexture2D(target, attachment, textarget, texture, level) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glFramebufferTextureLayer()
- */
- void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
- {
- LOG_GL("FramebufferTextureLayer %x %x %d %d %d\n", target, attachment, texture, level, layer);
- CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferTextureLayer(target, attachment, texture, level, layer) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glFrontFace()
- */
- void FrontFace(GLenum mode)
- {
- LOG_GL("FrontFace %x\n", mode);
- CHECK_GL( mGlAbstraction, mGlAbstraction.FrontFace(mode) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGenBuffers()
- */
- void GenBuffers(GLsizei n, GLuint* buffers)
- {
- LOG_GL("GenBuffers %d\n", n, buffers);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GenBuffers(n, buffers) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGenerateMipmap()
- */
- void GenerateMipmap(GLenum target)
- {
- LOG_GL("GenerateMipmap %x\n", target);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GenerateMipmap(target) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGenFramebuffers()
- */
- void GenFramebuffers(GLsizei n, GLuint* framebuffers)
- {
- LOG_GL("GenFramebuffers %d %p\n", n, framebuffers);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GenFramebuffers(n, framebuffers) );
-
- mFrameBufferStateCache.FrameBuffersCreated( n, framebuffers );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGenRenderbuffers()
- */
- void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
- {
- LOG_GL("GenRenderbuffers %d %p\n", n, renderbuffers);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GenRenderbuffers(n, renderbuffers) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGenTextures()
- */
- void GenTextures(GLsizei n, GLuint* textures)
- {
- LOG_GL("GenTextures %d %p\n", n, textures);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GenTextures(n, textures) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetBooleanv()
- */
- void GetBooleanv(GLenum pname, GLboolean* params)
- {
- LOG_GL("GetBooleanv %x\n", pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetBooleanv(pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetBufferParameteriv()
- */
- void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
- {
- LOG_GL("GetBufferParameteriv %x %x %p\n", target, pname, params);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetBufferParameteriv(target, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glGetBufferPointer()
- */
- void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
- {
- LOG_GL("GetBufferPointerv %x %x %p\n", target, pname, params);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetBufferPointerv(target, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetError()
- */
- GLenum GetError(void)
- {
- // Not worth logging here
- return mGlAbstraction.GetError();
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetFloatv()
- */
- void GetFloatv(GLenum pname, GLfloat* params)
- {
- LOG_GL("GetFloatv %x\n", pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetFloatv(pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetFramebufferAttachmentParameteriv()
- */
- void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
- {
- LOG_GL("GetFramebufferAttachmentParameteriv %x %x %x\n", target, attachment, pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetFramebufferAttachmentParameteriv(target, attachment, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetIntegerv()
- */
- void GetIntegerv(GLenum pname, GLint* params)
- {
- LOG_GL("GetIntegerv %x\n", pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetIntegerv(pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glGetQueryiv()
- */
- void GetQueryiv(GLenum target, GLenum pname, GLint* params)
- {
- LOG_GL("GetQueryiv %x %x\n", target, pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetQueryiv(target, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glGetQueryObjectuiv()
- */
- void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
- {
- LOG_GL("GetQueryObjectuiv %u %x %p\n", id, pname, params);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetQueryObjectuiv(id, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetRenderbufferParameteriv()
- */
- void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
- {
- LOG_GL("GetRenderbufferParameteriv %x %x\n", target, pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetRenderbufferParameteriv(target, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetString()
- */
- const GLubyte* GetString(GLenum name)
- {
- LOG_GL("GetString %x\n", name);
- const GLubyte* str = CHECK_GL( mGlAbstraction, mGlAbstraction.GetString(name) );
- return str;
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetTexParameterfv()
- */
- void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
- {
- LOG_GL("GetTexParameterfv %x %x\n", target, pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetTexParameterfv(target, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glGetTexParameteriv()
- */
- void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
- {
- LOG_GL("GetTexParameteriv %x %x\n", target, pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetTexParameteriv(target, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glHint()
- */
- void Hint(GLenum target, GLenum mode)
- {
- LOG_GL("Hint %x %x\n", target, mode);
- CHECK_GL( mGlAbstraction, mGlAbstraction.Hint(target, mode) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glIsBuffer()
- */
- GLboolean IsBuffer(GLuint buffer)
- {
- LOG_GL("IsBuffer %d\n", buffer);
- GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsBuffer(buffer) );
- return val;
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glIsEnabled()
- */
- GLboolean IsEnabled(GLenum cap)
- {
- LOG_GL("IsEnabled %x\n", cap);
- GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsEnabled(cap) );
- return val;
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glIsFramebuffer()
- */
- GLboolean IsFramebuffer(GLuint framebuffer)
- {
- LOG_GL("IsFramebuffer %d\n", framebuffer);
- GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsFramebuffer(framebuffer) );
- return val;
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glIsQuery()
- */
- GLboolean IsQuery(GLuint id)
- {
- LOG_GL("IsQuery %u\n", id);
- GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsQuery(id) );
- return val;
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glIsRenderbuffer()
- */
- GLboolean IsRenderbuffer(GLuint renderbuffer)
- {
- LOG_GL("IsRenderbuffer %d\n", renderbuffer);
- GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsRenderbuffer(renderbuffer) );
- return val;
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glIsTexture()
- */
- GLboolean IsTexture(GLuint texture)
- {
- LOG_GL("IsTexture %d\n", texture);
- GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsTexture(texture) );
- return val;
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glIsTransformFeedback()
- */
- GLboolean IsTransformFeedback(GLuint id)
- {
- LOG_GL("IsTransformFeedback %u\n", id);
- GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsTransformFeedback(id) );
- return val;
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glLineWidth()
- */
- void LineWidth(GLfloat width)
- {
- LOG_GL("LineWidth %f\n", width);
- CHECK_GL( mGlAbstraction, mGlAbstraction.LineWidth(width) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glPauseTransformFeedback()
- */
- void PauseTransformFeedback()
- {
- LOG_GL("PauseTransformFeedback\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.PauseTransformFeedback() );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glPixelStorei()
- */
- void PixelStorei(GLenum pname, GLint param)
- {
- LOG_GL("PixelStorei %x %d\n", pname, param);
- CHECK_GL( mGlAbstraction, mGlAbstraction.PixelStorei(pname, param) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glPolygonOffset()
- */
- void PolygonOffset(GLfloat factor, GLfloat units)
- {
- LOG_GL("PolygonOffset %f %f\n", factor, units);
- CHECK_GL( mGlAbstraction, mGlAbstraction.PolygonOffset(factor, units) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glReadPixels()
- */
- void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
- {
- LOG_GL("ReadPixels %d %d %d %d %x %x\n", x, y, width, height, format, type);
- CHECK_GL( mGlAbstraction, mGlAbstraction.ReadPixels(x, y, width, height, format, type, pixels) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glRenderbufferStorage()
- */
- void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
- {
- LOG_GL("RenderbufferStorage %x %x %d %d\n", target, internalformat, width, height);
- CHECK_GL( mGlAbstraction, mGlAbstraction.RenderbufferStorage(target, internalformat, width, height) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glRenderbufferStorageMultisample()
- */
- void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
- {
- LOG_GL("RenderbufferStorageMultisample %x %u %x %d %d\n", target, samples, internalformat, width, height);
- CHECK_GL( mGlAbstraction, mGlAbstraction.RenderbufferStorageMultisample(target, samples, internalformat, width, height) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glResumeTransformFeedback()
- */
- void ResumeTransformFeedback()
- {
- LOG_GL("ResumeTransformFeedback\n");
- CHECK_GL( mGlAbstraction, mGlAbstraction.ResumeTransformFeedback() );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glSampleCoverage()
- */
- void SampleCoverage(GLclampf value, GLboolean invert)
- {
- LOG_GL("SampleCoverage %f %s\n", value, invert ? "True" : "False");
- CHECK_GL( mGlAbstraction, mGlAbstraction.SampleCoverage(value, invert) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glScissor()
- */
- void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
- {
- LOG_GL("Scissor %d %d %d %d\n", x, y, width, height);
- CHECK_GL( mGlAbstraction, mGlAbstraction.Scissor(x, y, width, height) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glStencilFunc()
- */
- void StencilFunc(GLenum func, GLint ref, GLuint mask)
- {
- if( ( func != mStencilFunc ) || ( ref != mStencilFuncRef ) || ( mask != mStencilFuncMask ) )
- {
- mStencilFunc = func;
- mStencilFuncRef = ref;
- mStencilFuncMask = mask;
-
- LOG_GL("StencilFunc %x %d %d\n", func, ref, mask);
- CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFunc(func, ref, mask) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glStencilFuncSeparate()
- */
- void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
- {
- LOG_GL("StencilFuncSeparate %x %x %d %d\n", face, func, ref, mask);
- CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFuncSeparate(face, func, ref, mask) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glStencilMask()
- */
- void StencilMask(GLuint mask)
- {
- if( mask != mStencilMask )
- {
- mStencilMask = mask;
-
- LOG_GL("StencilMask %d\n", mask);
- CHECK_GL( mGlAbstraction, mGlAbstraction.StencilMask(mask) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glStencilMaskSeparate()
- */
- void StencilMaskSeparate(GLenum face, GLuint mask)
- {
- LOG_GL("StencilMaskSeparate %x %d\n", face, mask);
- CHECK_GL( mGlAbstraction, mGlAbstraction.StencilMaskSeparate(face, mask) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glStencilOp()
- */
- void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
- {
- if( ( fail != mStencilOpFail ) || ( zfail != mStencilOpDepthFail ) || ( zpass != mStencilOpDepthPass ) )
- {
- mStencilOpFail = fail;
- mStencilOpDepthFail = zfail;
- mStencilOpDepthPass = zpass;
-
- LOG_GL("StencilOp %x %x %x\n", fail, zfail, zpass);
- CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOp(fail, zfail, zpass) );
- }
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glStencilOpSeparate()
- */
- void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
- {
- LOG_GL("StencilOpSeparate %x %x %x %x\n", face, fail, zfail, zpass);
- CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOpSeparate(face, fail, zfail, zpass) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glTexImage2D()
- */
- void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
- GLint border, GLenum format, GLenum type, const void* pixels)
- {
- LOG_GL("TexImage2D %x %d %d %dx%d %d %x %x %p\n", target, level, internalformat, width, height, border, format, type, pixels);
- CHECK_GL( mGlAbstraction, mGlAbstraction.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glTexImage3D()
- */
- void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth,
- GLint border, GLenum format, GLenum type, const void* pixels)
- {
- LOG_GL("TexImage3D %x %d %d %dx%dx%d %d %x %x %p\n", target, level, internalformat, width, height, depth, border, format, type, pixels);
- CHECK_GL( mGlAbstraction, mGlAbstraction.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glTexParameterf()
- */
- void TexParameterf(GLenum target, GLenum pname, GLfloat param)
- {
- LOG_GL("TexParameterf %x %x %f\n", target, pname, param);
- CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameterf(target, pname, param) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glTexParameterfv()
- */
- void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
- {
- LOG_GL("TexParameterfv %x %x\n", target, pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameterfv(target, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glTexParameteri()
- */
- void TexParameteri(GLenum target, GLenum pname, GLint param)
- {
- LOG_GL("TexParameteri %x %x %d\n", target, pname, param);
- CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameteri(target, pname, param) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glTexParameteriv()
- */
- void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
- {
- LOG_GL("TexParameteriv %x %x\n", target, pname);
- CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameteriv(target, pname, params) );
- }
-
- /**
- * Wrapper for OpenGL ES 2.0 glTexSubImage2D()
- */
- void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
- GLenum format, GLenum type, const void* pixels)
- {
- LOG_GL("TexSubImage2D %x %d %d %d %d %d %x %x %p\n", target, level, xoffset, yoffset, width, height, format, type, pixels);
- CHECK_GL( mGlAbstraction, mGlAbstraction.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glTexSubImage3D()
- */
- void TexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth,
- GLenum format, GLenum type, const void* pixels)
- {
- LOG_GL("TexSubImage3D %x %d %d %d %d %d %d %d %x %x %p\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
- CHECK_GL( mGlAbstraction, mGlAbstraction.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels) );
- }
-
- /**
- * Wrapper for OpenGL ES 3.0 glUnmapBubffer()
- */
- GLboolean UnmapBuffer(GLenum target)
- {
- LOG_GL("UnmapBuffer %x \n", target);
- GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.UnmapBuffer(target) );
- return val;
- }
- /**
- * Wrapper for OpenGL ES 2.0 glViewport()
- */
- void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
- {
- // check if its same as already set
- Rect<int> newViewport( x, y, width, height );
- if( mViewPort != newViewport )
- {
- // set new one
- LOG_GL("Viewport %d %d %d %d\n", x, y, width, height);
- CHECK_GL( mGlAbstraction, mGlAbstraction.Viewport(x, y, width, height) );
- mViewPort = newViewport; // remember new one
- }
- }
-
- /**
- * Get the implementation defined MAX_TEXTURE_SIZE. This values is cached when the context is created
- * @return The implementation defined MAX_TEXTURE_SIZE
- */
- GLint CachedMaxTextureSize() const
- {
- return mMaxTextureSize;
- }
-
- /**
- * Get the current viewport.
- * @return Viewport rectangle.
- */
- const Rect< int >& GetViewport();
-
-private: // Implementation
-
- /**
- * @return true if next draw operation will write to depth buffer
- */
- bool DepthBufferWriteEnabled() const
- {
- return mDepthBufferEnabled && mDepthMaskEnabled;
- }
-
- /**
- * @return true if next draw operation will write to stencil buffer
- */
- bool StencilBufferWriteEnabled() const
- {
- return mStencilBufferEnabled && ( mStencilMask > 0 );
- }
-
- /**
- * Flushes vertex attribute location changes to the driver
- */
- void FlushVertexAttributeLocations();
-
- /**
- * Either enables or disables a vertex attribute location in the cache
- * The cahnges won't take affect until FlushVertexAttributeLocations is called
- * @param location attribute location
- * @param state attribute state
- */
- void SetVertexAttributeLocation(unsigned int location, bool state);
-
- /**
- * Sets the initial GL state.
- */
- void InitializeGlState();
-
-private: // Data
-
- Integration::GlAbstraction& mGlAbstraction;
-
- bool mGlContextCreated; ///< True if the OpenGL context has been created
-
- // glEnable/glDisable states
- bool mColorMask;
- GLuint mStencilMask;
- bool mBlendEnabled;
- bool mDepthBufferEnabled;
- bool mDepthMaskEnabled;
- bool mDitherEnabled;
- bool mPolygonOffsetFillEnabled;
- bool mSampleAlphaToCoverageEnabled;
- bool mSampleCoverageEnabled;
- bool mScissorTestEnabled;
- bool mStencilBufferEnabled;
- bool mClearColorSet;
- bool mUsingDefaultBlendColor;
-
- // glBindBuffer() state
- GLuint mBoundArrayBufferId; ///< The ID passed to glBindBuffer(GL_ARRAY_BUFFER)
- GLuint mBoundElementArrayBufferId; ///< The ID passed to glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)
- GLuint mBoundTransformFeedbackBufferId; ///< The ID passed to glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER)
-
- // glBindTexture() state
- TextureUnit mActiveTextureUnit;
- GLuint mBoundTextureId[ MAX_TEXTURE_UNITS ]; ///< The ID passed to glBindTexture()
-
- // glBlendColor() state
- Vector4 mBlendColor; ///< Blend color
-
- // glBlendFuncSeparate() state
- GLenum mBlendFuncSeparateSrcRGB; ///< The srcRGB parameter passed to glBlendFuncSeparate()
- GLenum mBlendFuncSeparateDstRGB; ///< The dstRGB parameter passed to glBlendFuncSeparate()
- GLenum mBlendFuncSeparateSrcAlpha; ///< The srcAlpha parameter passed to glBlendFuncSeparate()
- GLenum mBlendFuncSeparateDstAlpha; ///< The dstAlpha parameter passed to glBlendFuncSeparate()
-
- // glBlendEquationSeparate state
- GLenum mBlendEquationSeparateModeRGB; ///< Controls RGB blend mode
- GLenum mBlendEquationSeparateModeAlpha; ///< Controls Alpha blend mode
-
- // glStencilFunc() and glStencilOp() state.
- GLenum mStencilFunc;
- GLint mStencilFuncRef;
- GLuint mStencilFuncMask;
- GLenum mStencilOpFail;
- GLenum mStencilOpDepthFail;
- GLenum mStencilOpDepthPass;
-
- GLenum mDepthFunction; ///The depth function
-
- GLint mMaxTextureSize; ///< return value from GetIntegerv(GL_MAX_TEXTURE_SIZE)
- Vector4 mClearColor; ///< clear color
-
- // Face culling mode
- Dali::FaceCullingMode::Type mCullFaceMode;
-
- // cached viewport size
- Rect< int > mViewPort;
-
- // Vertex Attribute Buffer enable caching
- bool mVertexAttributeCachedState[ MAX_ATTRIBUTE_CACHE_SIZE ]; ///< Value cache for Enable Vertex Attribute
- bool mVertexAttributeCurrentState[ MAX_ATTRIBUTE_CACHE_SIZE ]; ///< Current state on the driver for Enable Vertex Attribute
-
- FrameBufferStateCache mFrameBufferStateCache; ///< frame buffer state cache
-};
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_CONTEXT_H__
+++ /dev/null
-/*
- * Copyright (c) 2015 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include "frame-buffer-state-cache.h"
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/debug.h>
-#include <dali/integration-api/gl-defines.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-FrameBufferStateCache::FrameBufferStateCache()
-:mCurrentFrameBufferId(0)
-{
-}
-
-FrameBufferStateCache::~FrameBufferStateCache()
-{
-}
-
-GLbitfield FrameBufferStateCache::GetClearMask( GLbitfield mask, bool forceClear, bool scissorTestEnabled )
-{
- if( scissorTestEnabled )
- {
- // don't do anything if scissor test is enabled, in the future we could
- // potentially keep track of frame buffer size vs scissor test size to see if the entire
- // buffer is cleared or not.
- return mask;
- }
- FrameBufferState* state = GetFrameBufferState( mCurrentFrameBufferId );
- if( !state )
- {
- DALI_LOG_ERROR("FrameBuffer not found %d \n", mCurrentFrameBufferId);
- return mask;
- }
-
- // if we are forcing the clear operation, then just update the internal cached values
- if( forceClear )
- {
- SetClearState( state, mask );
- return mask;
- }
-
- // use the cached values
- if( mask & GL_COLOR_BUFFER_BIT)
- {
- // check if color buffer is currently clean
- if( state->mState & COLOR_BUFFER_CLEAN )
- {
- // remove clear color buffer flag from bitmask, no need to clear twice
- mask&= ~GL_COLOR_BUFFER_BIT;
- }
- }
- if( mask & GL_DEPTH_BUFFER_BIT)
- {
- // check if depth buffer is currently clean
- if( state->mState & DEPTH_BUFFER_CLEAN )
- {
- // remove clear depth buffer flag from bitmask, no need to clear twice
- mask&= ~GL_DEPTH_BUFFER_BIT;
- }
- }
- if( mask & GL_STENCIL_BUFFER_BIT)
- {
- // check if stencil buffer is currently clean
- if( state->mState & STENCIL_BUFFER_CLEAN )
- {
- // remove clear stencil buffer flag from bitmask, no need to clear twice
-
- mask&= ~GL_STENCIL_BUFFER_BIT;
- }
- }
-
- // set the clear state based, what's about to be cleared
- SetClearState( state, mask );
-
- return mask;
-}
-
-void FrameBufferStateCache::SetCurrentFrameBuffer( GLuint frameBufferId )
-{
- mCurrentFrameBufferId = frameBufferId;
-}
-
-void FrameBufferStateCache::FrameBuffersDeleted( GLsizei count, const GLuint* const frameBuffers )
-{
- for( GLsizei i = 0; i < count; ++i )
- {
- DeleteFrameBuffer( frameBuffers[i] );
- }
-}
-void FrameBufferStateCache::FrameBuffersCreated( GLsizei count, const GLuint* const frameBuffers )
-{
- for( GLsizei i = 0; i < count; ++i )
- {
- // check the frame buffer doesn't exist already
- GLuint id = frameBuffers[i];
-
- FrameBufferState* state = GetFrameBufferState( id );
- if( state )
- {
- DALI_LOG_ERROR("FrameBuffer already exists%d \n", id );
- // reset its state
- state->mState = GetInitialFrameBufferState();
- continue;
- }
-
- FrameBufferState newFrameBuffer( frameBuffers[i], GetInitialFrameBufferState() );
- mFrameBufferStates.PushBack( newFrameBuffer );
- }
-}
-
-void FrameBufferStateCache::DrawOperation( bool colorBuffer, bool depthBuffer, bool stencilBuffer )
-{
- FrameBufferState* state = GetFrameBufferState( mCurrentFrameBufferId );
- if( !state )
- {
- // an error will have already been logged by the clear operation
- return;
- }
-
- if( colorBuffer )
- {
- // un-set the clean bit
- state->mState &= ~COLOR_BUFFER_CLEAN;
- }
- if( depthBuffer )
- {
- // un-set the clean bit
- state->mState &= ~DEPTH_BUFFER_CLEAN;
- }
- if( stencilBuffer )
- {
- // un-set the clean bit
- state->mState &= ~STENCIL_BUFFER_CLEAN;
- }
-
-}
-
-void FrameBufferStateCache::Reset()
-{
- mFrameBufferStates.Clear();
-
- // create the default frame buffer
- GLuint id = 0; // 0 == default frame buffer id
- FrameBuffersCreated( 1, &id );
-}
-
-void FrameBufferStateCache::SetClearState( FrameBufferState* state, GLbitfield mask )
-{
- if( mask & GL_COLOR_BUFFER_BIT)
- {
- // set the color buffer to clean
- state->mState |= COLOR_BUFFER_CLEAN;
- }
- if( mask & GL_DEPTH_BUFFER_BIT)
- {
- // set the depth buffer to clean
- state->mState |= DEPTH_BUFFER_CLEAN;
- }
- if( mask & GL_STENCIL_BUFFER_BIT)
- {
- // set the stencil buffer to clean
- state->mState |= STENCIL_BUFFER_CLEAN;
- }
-}
-
-FrameBufferStateCache::FrameBufferState* FrameBufferStateCache::GetFrameBufferState( GLuint frameBufferId )
-{
- for( FrameBufferStateVector::SizeType i = 0; i < mFrameBufferStates.Count(); ++i )
- {
- FrameBufferState& state = mFrameBufferStates[i];
- if( state.mId == frameBufferId )
- {
- return &state;
- }
- }
- return NULL;
-}
-
-void FrameBufferStateCache::DeleteFrameBuffer( GLuint frameBufferId )
-{
- FrameBufferStateVector::Iterator iter = mFrameBufferStates.Begin();
- FrameBufferStateVector::Iterator endIter = mFrameBufferStates.End();
-
- for( ; iter != endIter ; ++iter )
- {
- if( (*iter).mId == frameBufferId )
- {
- mFrameBufferStates.Erase( iter);
- return;
- }
- }
- DALI_LOG_ERROR("FrameBuffer not found %d \n", frameBufferId);
-}
-
-unsigned int FrameBufferStateCache::GetInitialFrameBufferState()
-{
- return COLOR_BUFFER_CLEAN | DEPTH_BUFFER_CLEAN | STENCIL_BUFFER_CLEAN;
-}
-
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_CONTEXT_FRAME_BUFFER_STATE_CACHE_H__
-#define __DALI_INTERNAL_CONTEXT_FRAME_BUFFER_STATE_CACHE_H__
-
-/*
- * Copyright (c) 2015 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/public-api/common/dali-vector.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-/**
- * @brief Keeps track of color, depth and stencil buffer state within each frame buffer.
- * Used to avoid redundant glClear calls.
- *
- */
-class FrameBufferStateCache
-{
-public:
-
-
- /**
- * @brief Constructor
- */
- FrameBufferStateCache();
-
- /**
- * @brief non-virtual destructor
- */
- ~FrameBufferStateCache();
-
- /**
- * @brief Get the bitmask to pass to glClear based on the mask requested
- * and the current state of the frame buffer
- * @param[in] mask glClear bit mask
- * @param[in] forceClear whether to force the clear ( ignore cached state)
- * @param[in] scissorTestEnabled whether scissor test is enabled
- * @return new bitmask to pass to glClear
- */
- GLbitfield GetClearMask( GLbitfield mask, bool forceClear, bool scissorTestEnabled );
-
- /**
- * @brief Set the current bound frame buffer
- * @param[in] frameBufferId frame buffer id
- */
- void SetCurrentFrameBuffer( GLuint frameBufferId );
-
- /**
- * @brief Called when frame buffers are deleted
- * @param[in] count number of frame buffers
- * @param[in] framebuffers array of frame buffer ids
- */
- void FrameBuffersDeleted( GLsizei count, const GLuint* const frameBuffers );
-
- /**
- * @brief Called when frame buffers are created
- * @param[in] count number of frame buffers
- * @param[in] framebuffers array of frame buffer ids
- */
- void FrameBuffersCreated( GLsizei count, const GLuint* const frameBuffers );
-
- /**
- * @brief Draw operation performed on the current frame buffer
- * @param[in] colorBufferUsed whether the color buffer is being written to (glColorMask )
- * @param[in] depthBufferUsed whether the depth buffer is being written to (glDepthMask )
- * @param[in] stencilBufferUsed whether the stencil buffer is being written to (glStencilMask )
- */
- void DrawOperation( bool colorBufferUsed, bool depthBufferUsed, bool stencilBufferUsed );
-
- /**
- * Reset the cache
- */
- void Reset();
-
-private:
-
- /**
- * Current status of the frame buffer
- */
- enum FrameBufferStatus
- {
- COLOR_BUFFER_CLEAN = 1 << 0, ///< color buffer clean
- DEPTH_BUFFER_CLEAN = 1 << 1, ///< depth buffer clean
- STENCIL_BUFFER_CLEAN = 1 << 2, ///< stencil buffer clean
- };
-
- /**
- * POD to store the status of frame buffer regarding color,depth and stencil buffers
- */
- struct FrameBufferState
- {
- /**
- * Constructor
- */
- FrameBufferState( GLuint id, unsigned int state)
- :mId( id ),
- mState( state )
- {
- }
- GLuint mId; ///< Frame buffer id
- unsigned int mState; ///< State, bitmask of FrameBufferStatus flags
- };
-
- typedef Dali::Vector< FrameBufferState > FrameBufferStateVector;
-
- /**
- * @brief Set the clear state
- * @param[in] pointer to frame buffer state object
- * @param[in] mask clear mask
- */
- void SetClearState( FrameBufferState* state, GLbitfield mask );
-
- /**
- * @brief Helper
- * @param[in] frameBufferId frame buffer id
- * @return pointer to frame buffer state object ( NULL if it doesn't exist)
- */
- FrameBufferState* GetFrameBufferState( GLuint frameBufferId );
-
- /**
- * @brief Helper to delete a frame buffer state object
- * @param[in] frameBufferId frame buffer id
- */
- void DeleteFrameBuffer( GLuint frameBufferId );
-
- /**
- * @brief Get the default state of a frame buffer, before it's used
- * @return initial state
- */
- unsigned int GetInitialFrameBufferState();
-
- FrameBufferStateCache( const FrameBufferStateCache& ); ///< undefined copy constructor
-
- FrameBufferStateCache& operator=( const FrameBufferStateCache& ); ///< undefined assignment operator
-
-private: // data
-
- FrameBufferStateVector mFrameBufferStates; ///< state of the frame buffers
- GLuint mCurrentFrameBufferId; ///< currently bound frame buffer
-};
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_CONTEXT_FRAME_BUFFER_STATE_CACHE_H__
+++ /dev/null
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// HEADER
-#include <dali/internal/render/gl-resources/gl-call-debug.h>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h>
-#include <dali/integration-api/debug.h>
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/integration-api/gl-defines.h>
-
-namespace
-{
-/**
- * GL error strings
- */
-struct errorStrings
-{
- const Dali::GLenum errorCode;
- const char* errorString;
-};
-errorStrings errors[] =
-{
- { GL_NO_ERROR, "GL_NO_ERROR" },
- { GL_INVALID_ENUM, "GL_INVALID_ENUM" },
- { GL_INVALID_VALUE, "GL_INVALID_VALUE" },
- { GL_INVALID_OPERATION, "GL_INVALID_OPERATION" },
- { GL_OUT_OF_MEMORY, "GL_OUT_OF_MEMORY" }
-};
-
-const char* ErrorToString( Dali::GLenum errorCode )
-{
- for( unsigned int i = 0; i < sizeof(errors) / sizeof(errors[0]); ++i)
- {
- if (errorCode == errors[i].errorCode)
- {
- return errors[i].errorString;
- }
- }
- return "Unknown Open GLES error";
-}
-
-}
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-#ifdef DEBUG_ENABLED
-/// Switch debug level to Concise to disable, General to enable. Note, enabling snapshot logging will do this on the fly.
-Debug::Filter* gGlLogFilter = Debug::Filter::New(Debug::Concise, false, "LOG_CONTEXT");
-#endif // DEBUG_ENABLED
-
-void CheckGlError( Integration::GlAbstraction& glAbstraction, const char* operation )
-{
- bool foundError = false;
- while( GLint error = glAbstraction.GetError() )
- {
- DALI_LOG_ERROR( "glError (0x%x) %s - after %s\n", error, ErrorToString( error ), operation );
- foundError = true;
- }
- DALI_ASSERT_ALWAYS( !foundError && "GL ERROR" ); // if errors are being checked we should assert
-}
-
-}
-
-}
+++ /dev/null
-#ifndef __DALI_INTERNAL_GL_CALL_DEBUG_H__
-#define __DALI_INTERNAL_GL_CALL_DEBUG_H__
-
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/debug.h>
-
-namespace Dali
-{
-namespace Integration
-{
-class GlAbstraction;
-}
-
-namespace Internal
-{
-/**
- * Helper to check GL errors
- * @param glAbstraction to use for error check
- * @param operation to be logged
- */
-void CheckGlError( Integration::GlAbstraction& glAbstraction, const char* operation );
-
-// wrap gl calls with CHECK_GL e.g. "CHECK_GL( mGlAbstraction, mGlAbstraction.UseProgram(mProgramId) );"
-// will LOG any glErrors eg "glError (0x0501) GL_INVALID_VALUE - glBindTexture(textureId)"
-// only enable if specifically enabled as it can slow down GL a lot!
-#ifdef DALI_GL_ERROR_CHECK
-#define CHECK_GL(c,a) (a); CheckGlError(c,#a)
-#else
-#define CHECK_GL(c,a) (a)
-#endif
-
-#ifdef DEBUG_ENABLED
-/// Switch debug level to Concise to disable, General to enable. Note, enabling snapshot logging will do this on the fly.
-extern Debug::Filter* gGlLogFilter;
-#endif // DEBUG_ENABLED
-
-// Don't put guards around here (LOG_INFO has it's own guards)
-#define LOG_GL(format, args...) \
- DALI_LOG_INFO(gGlLogFilter, Debug::General, format, ## args)
-
-}
-
-}
-
-#endif // __DALI_INTERNAL_GL_CALL_DEBUG_H__
-
+++ /dev/null
-#ifndef __DALI_INTERNAL_GL_RESOURCE_OWNER_H__
-#define __DALI_INTERNAL_GL_RESOURCE_OWNER_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-/**
- * Abstract interface for objects which own GL resources.
- * These objects must release their GL resources in the render-thread.
- */
-class GlResourceOwner
-{
-public:
-
- /**
- * Virtual destructor.
- */
- virtual ~GlResourceOwner()
- { }
-
- /**
- * Reset all GL resources.
- * This method is called when context is or has been deleted.
- * Context cannot be called from this method.
- * @pre This method can only be called from the render-thread.
- */
- virtual void GlContextDestroyed() = 0;
-
- /**
- * Release all GL resources.
- * This means releasing buffer objects, textures. etc
- * Context can be used, unless GlContextDestroyed has been called
- * @pre This method can only be called from the render-thread.
- */
- virtual void GlCleanup() = 0;
-
-};
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_GL_RESOURCE_OWNER_H__
+++ /dev/null
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/gl-resources/gpu-buffer.h>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace
-{
-
-/**
- * Helper to get our drawmode enum as GL enum
- * @param type to convert
- * @return the corresponding GL enum or -1
- */
-inline GLenum ModeAsGlEnum( GpuBuffer::Usage type )
-{
- GLenum retval( -1 );
- switch( type )
- {
- case GpuBuffer::STREAM_DRAW :
- {
- retval = GL_STREAM_DRAW;
- break;
- }
- case GpuBuffer::STATIC_DRAW :
- {
- retval = GL_STATIC_DRAW;
- break;
- }
- case GpuBuffer::DYNAMIC_DRAW :
- {
- retval = GL_DYNAMIC_DRAW;
- break;
- }
- }
- return retval;
-}
-
-}
-
-GpuBuffer::GpuBuffer( Context& context )
-: mContext( context ),
- mCapacity( 0 ),
- mSize( 0 ),
- mBufferId( 0 ),
- mBufferCreated( false )
-{
-}
-
-GpuBuffer::~GpuBuffer()
-{
- // If we have a buffer then delete it.
- if (mBufferId)
- {
- // If a buffer object that is currently bound is deleted, the binding reverts to 0
- // (the absence of any buffer object, which reverts to client memory usage)
- mContext.DeleteBuffers(1,&mBufferId);
- }
-}
-
-/*
- * Creates or updates the buffer data depending on whether it
- * already exists or not.
- */
-void GpuBuffer::UpdateDataBuffer(GLsizeiptr size, const GLvoid *data, Usage usage, Target target)
-{
- DALI_ASSERT_DEBUG( size > 0 );
- mSize = size;
- // make sure we have a buffer name/id before uploading
- if (mBufferId == 0)
- {
- mContext.GenBuffers(1,&mBufferId);
- DALI_ASSERT_DEBUG(mBufferId);
- }
-
- GLenum glTargetEnum = GL_ARRAY_BUFFER;
-
- // make sure the buffer is bound, don't perform any checks because size may be zero
- if(ARRAY_BUFFER == target)
- {
- mContext.BindArrayBuffer( mBufferId );
- }
- else if(ELEMENT_ARRAY_BUFFER == target)
- {
- glTargetEnum = GL_ELEMENT_ARRAY_BUFFER;
- mContext.BindElementArrayBuffer( mBufferId );
- }
- else if(TRANSFORM_FEEDBACK_BUFFER == target)
- {
- glTargetEnum = GL_TRANSFORM_FEEDBACK_BUFFER;
- mContext.BindTransformFeedbackBuffer( mBufferId );
- }
-
- // if the buffer has already been created, just update the data providing it fits
- if (mBufferCreated )
- {
- // if the data will fit in the existing buffer, just update it
- if (size <= mCapacity )
- {
- mContext.BufferSubData( glTargetEnum, 0, size, data );
- }
- else
- {
- // create a new buffer of the larger size,
- // gl should automatically deallocate the old buffer
- mContext.BufferData( glTargetEnum, size, data, ModeAsGlEnum( usage ) );
- mCapacity = size;
- }
- }
- else
- {
- // create the buffer
- mContext.BufferData( glTargetEnum, size, data, ModeAsGlEnum( usage ) );
- mBufferCreated = true;
- mCapacity = size;
- }
-
- if(ARRAY_BUFFER == target)
- {
- mContext.BindArrayBuffer( 0 );
- }
- else if(ELEMENT_ARRAY_BUFFER == target)
- {
- mContext.BindElementArrayBuffer( 0 );
- }
- else if(TRANSFORM_FEEDBACK_BUFFER == target)
- {
- mContext.BindTransformFeedbackBuffer( 0 );
- }
-}
-
-void GpuBuffer::Bind(Target target) const
-{
- DALI_ASSERT_DEBUG(mCapacity);
-
- if (target == ARRAY_BUFFER)
- {
- mContext.BindArrayBuffer(mBufferId);
- }
- else if (target == ELEMENT_ARRAY_BUFFER)
- {
- mContext.BindElementArrayBuffer(mBufferId);
- }
- else if (target == TRANSFORM_FEEDBACK_BUFFER)
- {
- mContext.BindTransformFeedbackBuffer(mBufferId);
- }
-}
-
-bool GpuBuffer::BufferIsValid() const
-{
- return mBufferCreated && (0 != mCapacity );
-}
-
-void GpuBuffer::GlContextDestroyed()
-{
- // If the context is destroyed, GL would have released the buffer.
- mCapacity = 0;
- mSize = 0;
- mBufferId = 0;
- mBufferCreated = false;
-}
-
-} // namespace Internal
-
-} //namespace Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_GPU_BUFFER_H__
-#define __DALI_INTERNAL_GPU_BUFFER_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/internal/render/gl-resources/context.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-/**
- * Used to create and update a GPU memory buffer.
- *
- * The buffer can be used for storing vertex data, index arrays (indices)
- * or pixel data (PBO).
- *
- * The buffer allows data to be stored in high-performance
- * graphics memory on the server side and
- * promotes efficient data transfer.
- */
-class GpuBuffer
-{
-public:
-
- /**
- * Enum to encapsulate the GL buffer type. This is to avoid having to store a whole int for type
- */
- enum Target
- {
- ARRAY_BUFFER, ///< GL_ARRAY_BUFFER
- ELEMENT_ARRAY_BUFFER, ///< GL_ELEMENT_ARRAY_BUFFER
- TRANSFORM_FEEDBACK_BUFFER ///< GL_TRANSFORM_FEEDBACK_BUFFER
- };
-
- /**
- * Enum to encapsulate the GL draw mode. This is to avoid having to store a whole int for mode
- */
- enum Usage
- {
- STREAM_DRAW, ///< GL_STREAM_DRAW
- STATIC_DRAW, ///< GL_STATIC_DRAW
- DYNAMIC_DRAW, ///< GL_DYNAMIC_DRAW
- };
-
-public:
-
- /**
- * constructor
- * @param context drawing context
- */
- GpuBuffer( Context& context );
-
- /**
- * Destructor, non virtual as no virtual methods or inheritance
- */
- ~GpuBuffer();
-
- /**
- *
- * Creates or updates a buffer object and binds it to the target.
- * @param size Specifies the size in bytes of the buffer object's new data store.
- * @param data pointer to the data to load
- * @param usage How the buffer will be used
- * @param target The target buffer to update
- */
- void UpdateDataBuffer(GLsizeiptr size, const GLvoid *data, Usage usage, Target target);
-
- /**
- * Bind the buffer object to the target
- * Will assert if the buffer size is zero
- */
- void Bind(Target target) const;
-
- /**
- * @return true if the GPU buffer is valid, i.e. its created and not empty
- */
- bool BufferIsValid() const;
-
- /**
- * Get the size of the buffer
- * @return size
- */
- GLsizeiptr GetBufferSize() const
- {
- return mSize;
- }
-
- /**
- * Needs to be called when GL context is destroyed
- */
- void GlContextDestroyed();
-
-private:
-
- /**
- * Perfoms a bind without checking the size of the buffer
- * @param bufferId to bind
- */
- void BindNoChecks(GLuint bufferId) const;
-
-private: // Data
-
- Context& mContext; ///< dali drawing context
- GLsizeiptr mCapacity; ///< buffer capacity
- GLsizeiptr mSize; ///< buffer size
- GLuint mBufferId; ///< buffer object name(id)
-
- bool mBufferCreated:1; ///< whether buffer has been created
-
-};
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_GPU_BUFFER_H__
+++ /dev/null
-#ifndef __DALI_INTERNAL_TEXTURE_UNITS_H__
-#define __DALI_INTERNAL_TEXTURE_UNITS_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/gl-defines.h>
-
-namespace Dali
-{
-namespace Internal
-{
-
-enum TextureUnit
-{
- TEXTURE_UNIT_IMAGE = 0,
- TEXTURE_UNIT_TEXT,
- TEXTURE_UNIT_MATERIAL_DIFFUSE,
- TEXTURE_UNIT_MATERIAL_OPACITY,
- TEXTURE_UNIT_MATERIAL_NORMAL_MAP,
- TEXTURE_UNIT_SHADER,
- TEXTURE_UNIT_UPLOAD,
- TEXTURE_UNIT_FRAMEBUFFER,
- TEXTURE_UNIT_LAST
-};
-
-inline unsigned int TextureUnitAsGLenum( TextureUnit unit )
-{
- // GL texture units are #defines in growing order to converting that to index
- return GL_TEXTURE0 + static_cast<unsigned int>( unit );
-}
-
-}//Internal
-
-}//Dali
-
-#endif // __DALI_INTERNAL_TEXTURE_UNITS_H__
+++ /dev/null
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/queue/render-queue.h>
-
-// INTERNAL INCLUDES
-#include <dali/internal/common/message.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace // unnamed namespace
-{
-
-static const std::size_t INITIAL_BUFFER_SIZE = 32768;
-static const std::size_t MAX_BUFFER_SIZE = 32768;
-
-} // unnamed namespace
-
-namespace SceneGraph
-{
-
-RenderQueue::RenderQueue()
-: container0( NULL ),
- container1( NULL )
-{
- container0 = new MessageBuffer( INITIAL_BUFFER_SIZE );
- container1 = new MessageBuffer( INITIAL_BUFFER_SIZE );
-}
-
-RenderQueue::~RenderQueue()
-{
- if( container0 )
- {
- for( MessageBuffer::Iterator iter = container0->Begin(); iter.IsValid(); iter.Next() )
- {
- MessageBase* message = reinterpret_cast< MessageBase* >( iter.Get() );
-
- // Call virtual destructor explictly; since delete will not be called after placement new
- message->~MessageBase();
- }
-
- delete container0;
- }
-
- if( container1 )
- {
- for( MessageBuffer::Iterator iter = container1->Begin(); iter.IsValid(); iter.Next() )
- {
- MessageBase* message = reinterpret_cast< MessageBase* >( iter.Get() );
-
- // Call virtual destructor explictly; since delete will not be called after placement new
- message->~MessageBase();
- }
-
- delete container1;
- }
-}
-
-unsigned int* RenderQueue::ReserveMessageSlot( BufferIndex updateBufferIndex, std::size_t size )
-{
- MessageBuffer* container = GetCurrentContainer( updateBufferIndex );
-
- return container->ReserveMessageSlot( size );
-}
-
-void RenderQueue::ProcessMessages( BufferIndex bufferIndex )
-{
- MessageBuffer* container = GetCurrentContainer( bufferIndex );
-
- for( MessageBuffer::Iterator iter = container->Begin(); iter.IsValid(); iter.Next() )
- {
- MessageBase* message = reinterpret_cast< MessageBase* >( iter.Get() );
-
- message->Process( bufferIndex );
-
- // Call virtual destructor explictly; since delete will not be called after placement new
- message->~MessageBase();
- }
-
- container->Reset();
-
- LimitBufferCapacity( bufferIndex );
-}
-
-MessageBuffer* RenderQueue::GetCurrentContainer( BufferIndex bufferIndex )
-{
- MessageBuffer* container( NULL );
-
- /**
- * The update-thread queues messages with one container,
- * whilst the render-thread is processing the other.
- */
- if ( !bufferIndex )
- {
- container = container0;
- }
- else
- {
- container = container1;
- }
-
- return container;
-}
-
-void RenderQueue::LimitBufferCapacity( BufferIndex bufferIndex )
-{
- if ( !bufferIndex )
- {
- if( MAX_BUFFER_SIZE < container0->GetCapacity() )
- {
- delete container0;
- container0 = NULL;
- container0 = new MessageBuffer( INITIAL_BUFFER_SIZE );
- }
- }
- else
- {
- if( MAX_BUFFER_SIZE < container1->GetCapacity() )
- {
- delete container1;
- container1 = NULL;
- container1 = new MessageBuffer( INITIAL_BUFFER_SIZE );
- }
- }
-}
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_SCENE_GRAPH_RENDER_QUEUE_H__
-#define __DALI_INTERNAL_SCENE_GRAPH_RENDER_QUEUE_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/internal/common/buffer-index.h>
-#include <dali/internal/common/message-buffer.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-class MessageBase;
-
-namespace SceneGraph
-{
-
-/**
- * Allows messages to be queued for RenderManager, during the scene-graph Update.
- */
-class RenderQueue
-{
-public:
-
- /**
- * Create a new RenderQueue.
- */
- RenderQueue();
-
- /**
- * Non-virtual destructor; RenderQueue is not suitable as a base class.
- */
- ~RenderQueue();
-
- /**
- * Reserve space for another message in the queue; this must then be initialized by the caller.
- * The message will be read from the next render-thread tick.
- * @post Calling this method may invalidate any previously returned slots.
- * @param[in] updateBufferIndex The current update buffer index.
- * @param[in] size The message size with respect to the size of type "char".
- * @return A pointer to the first char allocated for the message.
- */
- unsigned int* ReserveMessageSlot( BufferIndex updateBufferIndex, std::size_t size );
-
- /**
- * Process the batch of messages, which were queued in the previous update.
- * @pre This message should only be called by RenderManager from within the render-thread.
- * @param[in] bufferIndex The previous update buffer index.
- */
- void ProcessMessages( BufferIndex bufferIndex );
-
-private:
-
- /**
- * Helper to retrieve the current container.
- * The update-thread queues messages with one container, whilst the render-thread is processing the other.
- * @param[in] bufferIndex The current buffer index.
- * @return The container.
- */
- MessageBuffer* GetCurrentContainer( BufferIndex bufferIndex );
-
- /**
- * Helper to limit the buffer capacity i.e. after a frame when an extreme number of messages have been sent.
- * @param[in] bufferIndex The current buffer index.
- */
- void LimitBufferCapacity( BufferIndex bufferIndex );
-
- // Undefined
- RenderQueue( const RenderQueue& );
-
- // Undefined
- RenderQueue& operator=( const RenderQueue& rhs );
-
-private:
-
- MessageBuffer* container0; ///< Messages are queued here when the update buffer index == 0
- MessageBuffer* container1; ///< Messages are queued here when the update buffer index == 1
-};
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_SCENE_GRAPH_RENDER_QUEUE_H__
+++ /dev/null
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// CLASS HEADER
-#include <dali/internal/render/renderers/render-frame-buffer.h>
-
-// INTERNAL INCLUDES
-#include <dali/internal/render/renderers/render-texture.h>
-
-namespace Dali
-{
-namespace Internal
-{
-namespace Render
-{
-
-FrameBuffer::FrameBuffer( unsigned int width, unsigned int height, unsigned int attachments )
-:mId( 0u ),
- mDepthBuffer( attachments & Dali::FrameBuffer::Attachment::DEPTH ),
- mStencilBuffer( attachments & Dali::FrameBuffer::Attachment::STENCIL ),
- mWidth( width ),
- mHeight( height )
-{
-}
-
-FrameBuffer::~FrameBuffer()
-{}
-
-void FrameBuffer::Destroy( Context& context )
-{
- if( mId )
- {
- context.DeleteFramebuffers( 1, &mId );
- }
-}
-
-void FrameBuffer::GlContextDestroyed()
-{
- mId = 0u;
-}
-
-void FrameBuffer::Initialize(Context& context)
-{
- context.GenFramebuffers( 1, &mId );
- context.BindFramebuffer( GL_FRAMEBUFFER, mId );
-
- if( mDepthBuffer )
- {
- // Create a depth render target.
- context.GenRenderbuffers( 1, &mDepthBuffer );
- context.BindRenderbuffer( GL_RENDERBUFFER, mDepthBuffer );
- context.RenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, mWidth, mHeight );
- context.FramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepthBuffer );
- }
-
- if( mStencilBuffer )
- {
- // Create a stencil render target.
- context.GenRenderbuffers( 1, &mStencilBuffer );
- context.BindRenderbuffer( GL_RENDERBUFFER, mStencilBuffer );
- context.RenderbufferStorage( GL_RENDERBUFFER, GL_STENCIL_INDEX8, mWidth, mHeight );
- context.FramebufferRenderbuffer( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mStencilBuffer );
- }
-
- context.BindFramebuffer( GL_FRAMEBUFFER, 0 );
-}
-
-void FrameBuffer::AttachColorTexture( Context& context, Render::Texture* texture, unsigned int mipmapLevel, unsigned int layer )
-{
- context.BindFramebuffer( GL_FRAMEBUFFER, mId );
-
- // Create a color attachment.
- if( texture->GetType() == TextureType::TEXTURE_2D )
- {
- if( !texture->IsNativeImage() )
- {
- context.FramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture->GetId(), mipmapLevel );
- }
- else
- {
- // If it's a native image we need to use GL_TEXTURE_EXTERNAL_OES as the texture target parameter
- context.FramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, texture->GetId(), mipmapLevel );
- }
- }
- else
- {
- context.FramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + layer, texture->GetId(), mipmapLevel );
- }
-
- context.BindFramebuffer( GL_FRAMEBUFFER, 0 );
-}
-
-void FrameBuffer::Bind( Context& context )
-{
- context.BindFramebuffer( GL_FRAMEBUFFER, mId );
-}
-
-unsigned int FrameBuffer::GetWidth() const
-{
- return mWidth;
-}
-
-unsigned int FrameBuffer::GetHeight() const
-{
- return mHeight;
-}
-
-
-} //Render
-
-} //Internal
-
-} //Dali
+++ /dev/null
-/*
- * Copyright (c) 2015 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dali/internal/render/renderers/render-geometry.h>
-#include <dali/internal/common/buffer-index.h>
-#include <dali/internal/render/gl-resources/context.h>
-#include <dali/internal/render/gl-resources/gpu-buffer.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
-#include <dali/internal/render/shaders/program.h>
-
-namespace Dali
-{
-namespace Internal
-{
-namespace Render
-{
-
-Geometry::Geometry()
-: mIndices(),
- mIndexBuffer(NULL),
- mGeometryType( Dali::Geometry::TRIANGLES ),
- mIndicesChanged(false),
- mHasBeenUpdated(false),
- mAttributesChanged(true)
-{
-}
-
-Geometry::~Geometry()
-{
-}
-
-void Geometry::AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer )
-{
- mVertexBuffers.PushBack( propertyBuffer );
- mAttributesChanged = true;
-}
-
-void Geometry::SetIndexBuffer( Dali::Vector<unsigned short>& indices )
-{
- mIndices.Swap( indices );
- mIndicesChanged = true;
-}
-
-void Geometry::RemovePropertyBuffer( const Render::PropertyBuffer* propertyBuffer )
-{
- size_t bufferCount = mVertexBuffers.Size();
- for( size_t i(0); i<bufferCount; ++i )
- {
- if( propertyBuffer == mVertexBuffers[i] )
- {
- //This will delete the gpu buffer associated to the RenderPropertyBuffer if there is one
- mVertexBuffers.Remove( mVertexBuffers.Begin()+i );
- mAttributesChanged = true;
- break;
- }
- }
-}
-
-
-
-void Geometry::GetAttributeLocationFromProgram( Vector<GLint>& attributeLocation, Program& program, BufferIndex bufferIndex ) const
-{
- attributeLocation.Clear();
-
- for( size_t i(0); i< mVertexBuffers.Size(); ++i )
- {
- unsigned int attributeCount = mVertexBuffers[i]->GetAttributeCount();
- for( unsigned int j = 0; j < attributeCount; ++j )
- {
- const std::string& attributeName = mVertexBuffers[i]->GetAttributeName( j );
- unsigned int index = program.RegisterCustomAttribute( attributeName );
- GLint location = program.GetCustomAttributeLocation( index );
-
- if( -1 == location )
- {
- DALI_LOG_WARNING( "Attribute not found in the shader: %s\n", attributeName.c_str() );
- }
-
- attributeLocation.PushBack( location );
- }
- }
-}
-
-void Geometry::OnRenderFinished()
-{
- mHasBeenUpdated = false;
- mAttributesChanged = false;
-}
-
-void Geometry::UploadAndDraw(
- Graphics::API::Controller& controller,
- BufferIndex bufferIndex,
- Vector<GLint>& attributeLocation,
- size_t elementBufferOffset,
- size_t elementBufferCount )
-{
-#if 0
- if( !mHasBeenUpdated )
- {
- // Update buffers
- if( mIndicesChanged )
- {
- if( mIndices.Empty() )
- {
- mIndexBuffer = NULL;
- }
- else
- {
- if ( mIndexBuffer == NULL )
- {
- mIndexBuffer = new GpuBuffer( context );
- }
-
- std::size_t bufferSize = sizeof( unsigned short ) * mIndices.Size();
- mIndexBuffer->UpdateDataBuffer( bufferSize, &mIndices[0], GpuBuffer::STATIC_DRAW, GpuBuffer::ELEMENT_ARRAY_BUFFER );
- }
-
- mIndicesChanged = false;
- }
-
- size_t count = mVertexBuffers.Count();
- for( unsigned int i = 0; i < count; ++i )
- {
-
- if( !mVertexBuffers[i]->Update( ) )
- {
- //Vertex buffer is not ready ( Size, data or format has not been specified yet )
- return;
- }
- }
-
- mHasBeenUpdated = true;
- }
-
- //Bind buffers to attribute locations
- unsigned int base = 0u;
- size_t vertexBufferCount(mVertexBuffers.Count());
- for( unsigned int i = 0; i < vertexBufferCount; ++i )
- {
- mVertexBuffers[i]->BindBuffer( GpuBuffer::ARRAY_BUFFER );
- base += mVertexBuffers[i]->EnableVertexAttributes( context, attributeLocation, base );
- }
-
- size_t numIndices(0u);
- intptr_t firstIndexOffset(0u);
- if( mIndexBuffer )
- {
- numIndices = mIndices.Size();
-
- if( elementBufferOffset != 0u )
- {
- elementBufferOffset = elementBufferOffset >= numIndices ? numIndices - 1 : elementBufferOffset;
- firstIndexOffset = elementBufferOffset * sizeof(GLushort);
- numIndices -= elementBufferOffset;
- }
-
- if( elementBufferCount != 0u )
- {
- numIndices = std::min( elementBufferCount, numIndices );
- }
- }
-
- GLenum geometryGLType(GL_NONE);
- switch(mGeometryType)
- {
- case Dali::Geometry::TRIANGLES:
- {
- geometryGLType = GL_TRIANGLES;
- break;
- }
- case Dali::Geometry::LINES:
- {
- geometryGLType = GL_LINES;
- break;
- }
- case Dali::Geometry::POINTS:
- {
- geometryGLType = GL_POINTS;
- break;
- }
- case Dali::Geometry::TRIANGLE_STRIP:
- {
- geometryGLType = GL_TRIANGLE_STRIP;
- break;
- }
- case Dali::Geometry::TRIANGLE_FAN:
- {
- geometryGLType = GL_TRIANGLE_FAN;
- break;
- }
- case Dali::Geometry::LINE_LOOP:
- {
- geometryGLType = GL_LINE_LOOP;
- break;
- }
- case Dali::Geometry::LINE_STRIP:
- {
- geometryGLType = GL_LINE_STRIP;
- break;
- }
- }
-
- //Draw call
- if( mIndexBuffer && geometryGLType != GL_POINTS )
- {
- //Indexed draw call
- mIndexBuffer->Bind( GpuBuffer::ELEMENT_ARRAY_BUFFER );
- context.DrawElements(geometryGLType, numIndices, GL_UNSIGNED_SHORT, reinterpret_cast<void*>(firstIndexOffset));
- }
- else
- {
- //Unindex draw call
- unsigned int numVertices(0u);
- if( vertexBufferCount > 0 )
- {
- numVertices = mVertexBuffers[0]->GetElementCount();
- }
-
- context.DrawArrays( geometryGLType, 0, numVertices );
- }
-
- //Disable attributes
- for( unsigned int i = 0; i < attributeLocation.Count(); ++i )
- {
- if( attributeLocation[i] != -1 )
- {
- context.DisableVertexAttributeArray( attributeLocation[i] );
- }
- }
-#endif
-}
-
-} // namespace SceneGraph
-} // namespace Internal
-} // namespace Dali
+++ /dev/null
-#ifndef DALI_INTERNAL_RENDER_GEOMETRY_H
-#define DALI_INTERNAL_RENDER_GEOMETRY_H
-
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dali/public-api/common/dali-vector.h>
-#include <dali/public-api/rendering/geometry.h>
-#include <dali/devel-api/common/owner-container.h>
-#include <dali/internal/common/owner-pointer.h>
-#include <dali/internal/common/buffer-index.h>
-#include <dali/internal/common/owner-pointer.h>
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/integration-api/gl-defines.h>
-#include <dali/graphics-api/graphics-api-controller.h>
-
-
-namespace Dali
-{
-namespace Internal
-{
-class Context;
-class Program;
-class GpuBuffer;
-
-namespace Render
-{
-class PropertyBuffer;
-
-/**
- * This class encapsulates the GPU buffers. It is used to upload vertex data
- * to it's GPU buffers, to bind all the buffers and to setup/teardown vertex attribute
- * bindings
- */
-class Geometry
-{
-public:
- typedef Dali::Geometry::Type Type;
-
- Geometry();
-
- /**
- * Destructor
- */
- ~Geometry();
-
-
- /**
- * Adds a property buffer to the geometry
- * @param[in] dataProvider The PropertyBuffer data provider
- */
- void AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer );
-
- /**
- * Set the data for the index buffer to be used by the geometry
- * @param[in] indices A vector containing the indices
- */
- void SetIndexBuffer( Dali::Vector<unsigned short>& indices );
-
- /**
- * Removes a PropertyBuffer from the geometry
- * @param[in] propertyBuffer The property buffer to be removed
- */
- void RemovePropertyBuffer( const Render::PropertyBuffer* propertyBuffer );
-
- /**
- * Gets the attribute locations on the shader for the attributes defined in the geometry RenderBuffers
- * @param[out] attributeLocation The vector where the attributes locations will be stored
- * @param[in] program The program
- * @param[in] bufferIndex The current buffer index
- */
- void GetAttributeLocationFromProgram( Vector<GLint>& attributeLocation, Program& program, BufferIndex bufferIndex ) const;
-
- /**
- * Called from RenderManager to notify the geometry that current rendering pass has finished.
- */
- void OnRenderFinished();
-
- /**
- * Chack if the attributes for the geometry have changed
- * @return True if vertex buffers have been added or removed since last frame, false otherwise
- */
- bool AttributesChanged() const
- {
- return mAttributesChanged;
- }
-
- /**
- * Sets the geometry type
- * @param[in] type The new geometry type
- */
- void SetType( Type type )
- {
- mGeometryType = type;
- }
-
- /**
- * Upload the geometry if it has changed, set up the attributes and perform
- * the Draw call corresponding to the geometry type
- * @param[in] context The GL context
- * @param[in] bufferIndex The current buffer index
- * @param[in] attributeLocation The location for the attributes in the shader
- * @param[in] elementBufferOffset The index of first element to draw if index buffer bound
- * @param[in] elementBufferCount Number of elements to draw if index buffer bound, uses whole buffer when 0
- */
- void UploadAndDraw(Graphics::API::Controller& controller,
- BufferIndex bufferIndex,
- Vector<GLint>& attributeLocation,
- size_t elementBufferOffset,
- size_t elementBufferCount );
-
- /**
- *
- * @return
- */
- const Vector< Render::PropertyBuffer* >& GetVertexBuffers() const
- {
- return mVertexBuffers;
- }
-
- const Dali::Vector< unsigned short>& GetIndices() const
- {
- return mIndices;
- }
-
-private:
-
- // PropertyBuffers
- Vector< Render::PropertyBuffer* > mVertexBuffers;
-
- Dali::Vector< unsigned short> mIndices;
- OwnerPointer< GpuBuffer > mIndexBuffer;
- Type mGeometryType;
-
- // Booleans
- bool mIndicesChanged : 1;
- bool mHasBeenUpdated : 1;
- bool mAttributesChanged : 1;
-};
-
-} // namespace Render
-} // namespace Internal
-} // namespace Dali
-
-#endif // DALI_INTERNAL_RENDER_GEOMETRY_H
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <dali/internal/render/renderers/render-property-buffer.h>
-#include <dali/internal/event/common/property-buffer-impl.h> // Dali::Internal::PropertyBuffer
-#include <dali/graphics-api/graphics-api-controller.h>
-#include <dali/graphics-api/graphics-api-buffer.h>
-namespace
-{
-
-using namespace Dali;
-using Dali::Property;
-using Dali::Internal::PropertyImplementationType;
-
-Dali::GLenum GetPropertyImplementationGlType( Property::Type propertyType )
-{
- Dali::GLenum type = GL_BYTE;
-
- switch( propertyType )
- {
- case Property::NONE:
- case Property::STRING:
- case Property::ARRAY:
- case Property::MAP:
- case Property::EXTENTS:
- case Property::RECTANGLE:
- case Property::ROTATION:
- {
- // types not supported by gl
- break;
- }
- case Property::BOOLEAN:
- {
- type = GL_BYTE;
- break;
- }
- case Property::INTEGER:
- {
- type = GL_SHORT;
- break;
- }
- case Property::FLOAT:
- case Property::VECTOR2:
- case Property::VECTOR3:
- case Property::VECTOR4:
- case Property::MATRIX3:
- case Property::MATRIX:
- {
- type = GL_FLOAT;
- break;
- }
- }
-
- return type;
-}
-
-size_t GetPropertyImplementationGlSize( Property::Type propertyType )
-{
- size_t size = 1u;
-
- switch( propertyType )
- {
- case Property::NONE:
- case Property::STRING:
- case Property::ARRAY:
- case Property::MAP:
- case Property::EXTENTS:
- case Property::RECTANGLE:
- case Property::ROTATION:
- {
- // types not supported by gl
- break;
- }
- case Property::BOOLEAN:
- {
- size = 1u;
- break;
- }
- case Property::INTEGER:
- {
- size = 2u;
- break;
- }
- case Property::FLOAT:
- case Property::VECTOR2:
- case Property::VECTOR3:
- case Property::VECTOR4:
- case Property::MATRIX3:
- case Property::MATRIX:
- {
- size = 4u;
- break;
- }
- }
-
- return size;
-}
-} //Unnamed namespace
-
-namespace Dali
-{
-namespace Internal
-{
-namespace Render
-{
-
-PropertyBuffer::PropertyBuffer()
-:mFormat(NULL),
- mData(NULL),
- mGpuBuffer(NULL),
- mSize(0),
- mDataChanged(true),
- mGfxBuffer{ nullptr },
- mGfxBufferUsage{ Graphics::API::Buffer::UsageHint::ATTRIBUTES }
-{
-}
-
-PropertyBuffer::~PropertyBuffer()
-{
-}
-
-void PropertyBuffer::SetUsage( Graphics::API::Buffer::UsageHint usage )
-{
- mGfxBufferUsage = usage;
-}
-
-void PropertyBuffer::SetFormat( PropertyBuffer::Format* format )
-{
- mFormat = format;
- mDataChanged = true;
-}
-
-void PropertyBuffer::SetData( Dali::Vector<char>* data, size_t size )
-{
- mData = data;
- mSize = size;
- mDataChanged = true;
-}
-
-bool PropertyBuffer::Update( Dali::Graphics::API::Controller& controller )
-{
- if( !mData || !mFormat || !mSize )
- {
- return false;
- }
-
- if( mDataChanged || !mGfxBuffer )
- {
- if( !mGfxBuffer )
- {
- mGfxBuffer = controller.CreateBuffer( controller.GetBufferFactory()
- .SetUsage( mGfxBufferUsage )
- .SetSize( GetDataSize() ) );
- }
-
- // schedule deferred write
- mGfxBuffer.Get().Write( mData.Get()->begin(), GetDataSize(), 0u );
-
- mDataChanged = false;
- }
-
- return true;
-}
-
-#if 0
-bool PropertyBuffer::Update( Context& context )
-{
- if( !mData || !mFormat || !mSize )
- {
- return false;
- }
-
- if( !mGpuBuffer || mDataChanged )
- {
- if ( ! mGpuBuffer )
- {
- mGpuBuffer = new GpuBuffer( context );
- }
-
- // Update the GpuBuffer
- if ( mGpuBuffer )
- {
- DALI_ASSERT_DEBUG( mSize && "No data in the property buffer!" );
- mGpuBuffer->UpdateDataBuffer( GetDataSize(), &((*mData)[0]), GpuBuffer::STATIC_DRAW, GpuBuffer::ARRAY_BUFFER );
- }
-
- mDataChanged = false;
- }
-
- return true;
-}
-#endif
-
-void PropertyBuffer::BindBuffer(GpuBuffer::Target target)
-{
- if(mGpuBuffer)
- {
- mGpuBuffer->Bind(target);
- }
-}
-
-unsigned int PropertyBuffer::EnableVertexAttributes( Context& context, Vector<GLint>& vAttributeLocation, unsigned int locationBase )
-{
-
- unsigned int attributeCount = mFormat->components.size();
-
- GLsizei elementSize = mFormat->size;
-
- for( unsigned int i = 0; i < attributeCount; ++i )
- {
- GLint attributeLocation = vAttributeLocation[i+locationBase];
- if( attributeLocation != -1 )
- {
- context.EnableVertexAttributeArray( attributeLocation );
-
- const GLint attributeSize = mFormat->components[i].size;
- size_t attributeOffset = mFormat->components[i].offset;
- const Property::Type attributeType = mFormat->components[i].type;
-
- context.VertexAttribPointer( attributeLocation,
- attributeSize / GetPropertyImplementationGlSize(attributeType),
- GetPropertyImplementationGlType(attributeType),
- GL_FALSE, // Not normalized
- elementSize,
- reinterpret_cast< void* >( attributeOffset ) );
- }
- }
-
- return attributeCount;
-
-}
-
-} //Render
-} //Internal
-} //Dali
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/renderers/render-renderer.h>
-
-// INTERNAL INCLUDES
-#include <dali/internal/common/image-sampler.h>
-#include <dali/internal/render/gl-resources/context.h>
-#include <dali/internal/render/renderers/render-sampler.h>
-#include <dali/internal/render/shaders/scene-graph-shader.h>
-#include <dali/internal/render/shaders/program.h>
-#include <dali/internal/render/data-providers/node-data-provider.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace
-{
-
-static Matrix gModelViewProjectionMatrix( false ); ///< a shared matrix to calculate the MVP matrix, dont want to store it in object to reduce storage overhead
-static Matrix3 gNormalMatrix; ///< a shared matrix to calculate normal matrix, dont want to store it in object to reduce storage overhead
-
-/**
- * Helper to set view and projection matrices once per program
- * @param program to set the matrices to
- * @param modelMatrix to set
- * @param viewMatrix to set
- * @param projectionMatrix to set
- * @param modelViewMatrix to set
- * @param modelViewProjectionMatrix to set
- */
-inline void SetMatrices( Program& program,
- const Matrix& modelMatrix,
- const Matrix& viewMatrix,
- const Matrix& projectionMatrix,
- const Matrix& modelViewMatrix )
-{
- GLint loc = program.GetUniformLocation( Program::UNIFORM_MODEL_MATRIX );
- if( Program::UNIFORM_UNKNOWN != loc )
- {
- program.SetUniformMatrix4fv( loc, 1, modelMatrix.AsFloat() );
- }
- loc = program.GetUniformLocation( Program::UNIFORM_VIEW_MATRIX );
- if( Program::UNIFORM_UNKNOWN != loc )
- {
- if( program.GetViewMatrix() != &viewMatrix )
- {
- program.SetViewMatrix( &viewMatrix );
- program.SetUniformMatrix4fv( loc, 1, viewMatrix.AsFloat() );
- }
- }
- // set projection matrix if program has not yet received it this frame or if it is dirty
- loc = program.GetUniformLocation( Program::UNIFORM_PROJECTION_MATRIX );
- if( Program::UNIFORM_UNKNOWN != loc )
- {
- if( program.GetProjectionMatrix() != &projectionMatrix )
- {
- program.SetProjectionMatrix( &projectionMatrix );
- program.SetUniformMatrix4fv( loc, 1, projectionMatrix.AsFloat() );
- }
- }
- loc = program.GetUniformLocation(Program::UNIFORM_MODELVIEW_MATRIX);
- if( Program::UNIFORM_UNKNOWN != loc )
- {
- program.SetUniformMatrix4fv( loc, 1, modelViewMatrix.AsFloat() );
- }
-
- loc = program.GetUniformLocation( Program::UNIFORM_MVP_MATRIX );
- if( Program::UNIFORM_UNKNOWN != loc )
- {
- Matrix::Multiply( gModelViewProjectionMatrix, modelViewMatrix, projectionMatrix );
- program.SetUniformMatrix4fv( loc, 1, gModelViewProjectionMatrix.AsFloat() );
- }
-
- loc = program.GetUniformLocation( Program::UNIFORM_NORMAL_MATRIX );
- if( Program::UNIFORM_UNKNOWN != loc )
- {
- gNormalMatrix = modelViewMatrix;
- gNormalMatrix.Invert();
- gNormalMatrix.Transpose();
- program.SetUniformMatrix3fv( loc, 1, gNormalMatrix.AsFloat() );
- }
-}
-
-}
-
-namespace Render
-{
-
-Renderer* Renderer::New( SceneGraph::RenderDataProvider* dataProvider,
- Render::Geometry* geometry,
- unsigned int blendingBitmask,
- const Vector4& blendColor,
- FaceCullingMode::Type faceCullingMode,
- bool preMultipliedAlphaEnabled,
- DepthWriteMode::Type depthWriteMode,
- DepthTestMode::Type depthTestMode,
- DepthFunction::Type depthFunction,
- StencilParameters& stencilParameters )
-{
- return new Renderer( dataProvider, geometry, blendingBitmask, blendColor,
- faceCullingMode, preMultipliedAlphaEnabled, depthWriteMode, depthTestMode,
- depthFunction, stencilParameters );
-}
-
-Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider,
- Render::Geometry* geometry,
- unsigned int blendingBitmask,
- const Vector4& blendColor,
- FaceCullingMode::Type faceCullingMode,
- bool preMultipliedAlphaEnabled,
- DepthWriteMode::Type depthWriteMode,
- DepthTestMode::Type depthTestMode,
- DepthFunction::Type depthFunction,
- StencilParameters& stencilParameters )
-: mRenderDataProvider( dataProvider ),
- mContext( NULL),
- mGeometry( geometry ),
- mUniformIndexMap(),
- mAttributesLocation(),
- mStencilParameters( stencilParameters ),
- mBlendingOptions(),
- mIndexedDrawFirstElement( 0 ),
- mIndexedDrawElementsCount( 0 ),
- mDepthFunction( depthFunction ),
- mFaceCullingMode( faceCullingMode ),
- mDepthWriteMode( depthWriteMode ),
- mDepthTestMode( depthTestMode ),
- mUpdateAttributesLocation( true ),
- mPremultipledAlphaEnabled( preMultipliedAlphaEnabled )
-{
- if( blendingBitmask != 0u )
- {
- mBlendingOptions.SetBitmask( blendingBitmask );
- }
-
- mBlendingOptions.SetBlendColor( blendColor );
-}
-
-void Renderer::Initialize( Context& context )
-{
- mContext = &context;
-}
-
-Renderer::~Renderer()
-{
-}
-
-void Renderer::SetRenderDataProvider( OwnerPointer<SceneGraph::RenderDataProvider>& dataProvider )
-{
- mRenderDataProvider = dataProvider;
- mUpdateAttributesLocation = true;
-
- // Check that the number of textures match the number of samplers in the shader
- size_t textureCount = mRenderDataProvider->GetTextures().size();
- Program* program = mRenderDataProvider->GetShader().GetProgram();
- if( program && program->GetActiveSamplerCount() != textureCount )
- {
- DALI_LOG_WARNING("The number of active samplers in the shader(%lu) does not match the number of textures in the TextureSet(%lu)\n",
- program->GetActiveSamplerCount(),
- textureCount );
- }
-}
-
-void Renderer::SetGeometry( Render::Geometry* geometry )
-{
- mGeometry = geometry;
- mUpdateAttributesLocation = true;
-}
-
-void Renderer::SetBlending( Context& context, bool blend )
-{
- context.SetBlend( blend );
- if( blend )
- {
- // Blend color is optional and rarely used
- const Vector4* blendColor = mBlendingOptions.GetBlendColor();
- if( blendColor )
- {
- context.SetCustomBlendColor( *blendColor );
- }
- else
- {
- context.SetDefaultBlendColor();
- }
-
- // Set blend source & destination factors
- context.BlendFuncSeparate( mBlendingOptions.GetBlendSrcFactorRgb(),
- mBlendingOptions.GetBlendDestFactorRgb(),
- mBlendingOptions.GetBlendSrcFactorAlpha(),
- mBlendingOptions.GetBlendDestFactorAlpha() );
-
- // Set blend equations
- context.BlendEquationSeparate( mBlendingOptions.GetBlendEquationRgb(),
- mBlendingOptions.GetBlendEquationAlpha() );
- }
-}
-
-void Renderer::GlContextDestroyed()
-{
-}
-
-void Renderer::GlCleanup()
-{
-}
-
-void Renderer::SetUniforms( BufferIndex bufferIndex, const SceneGraph::NodeDataProvider& node, const Vector3& size, Program& program )
-{
- // Check if the map has changed
-
-
-
-#if 0
- DALI_ASSERT_DEBUG( mRenderDataProvider && "No Uniform map data provider available" );
-
-
- const SceneGraph::UniformMapDataProvider& uniformMapDataProvider = mRenderDataProvider->GetUniformMap();
-
- if( uniformMapDataProvider.GetUniformMapChanged( bufferIndex ) ||
- node.GetUniformMapChanged(bufferIndex))
- {
- const SceneGraph::CollectedUniformMap& uniformMap = uniformMapDataProvider.GetUniformMap( bufferIndex );
- const SceneGraph::CollectedUniformMap& uniformMapNode = node.GetUniformMap( bufferIndex );
-
- unsigned int maxMaps = uniformMap.Count() + uniformMapNode.Count();
- mUniformIndexMap.Clear(); // Clear contents, but keep memory if we don't change size
- mUniformIndexMap.Resize( maxMaps );
-
- unsigned int mapIndex(0);
- for(; mapIndex < uniformMap.Count() ; ++mapIndex )
- {
- mUniformIndexMap[mapIndex].propertyValue = uniformMap[mapIndex]->propertyPtr;
- mUniformIndexMap[mapIndex].uniformIndex = program.RegisterUniform( uniformMap[mapIndex]->uniformName );
- }
-
- for( unsigned int nodeMapIndex = 0; nodeMapIndex < uniformMapNode.Count() ; ++nodeMapIndex )
- {
- unsigned int uniformIndex = program.RegisterUniform( uniformMapNode[nodeMapIndex]->uniformName );
- bool found(false);
- for( unsigned int i(0); i<uniformMap.Count(); ++i )
- {
- if( mUniformIndexMap[i].uniformIndex == uniformIndex )
- {
- mUniformIndexMap[i].propertyValue = uniformMapNode[nodeMapIndex]->propertyPtr;
- found = true;
- break;
- }
- }
-
- if( !found )
- {
- mUniformIndexMap[mapIndex].propertyValue = uniformMapNode[nodeMapIndex]->propertyPtr;
- mUniformIndexMap[mapIndex].uniformIndex = uniformIndex;
- ++mapIndex;
- }
- }
-
- mUniformIndexMap.Resize( mapIndex );
- }
-
- // Set uniforms in local map
- for( UniformIndexMappings::Iterator iter = mUniformIndexMap.Begin(),
- end = mUniformIndexMap.End() ;
- iter != end ;
- ++iter )
- {
- SetUniformFromProperty( bufferIndex, program, *iter );
- }
-
- GLint sizeLoc = program.GetUniformLocation( Program::UNIFORM_SIZE );
- if( -1 != sizeLoc )
- {
- program.SetSizeUniform3f( sizeLoc, size.x, size.y, size.z );
- }
-#endif
-
-}
-
-void Renderer::SetUniformFromProperty( BufferIndex bufferIndex, Program& program, UniformIndexMap& map )
-{
- GLint location = program.GetUniformLocation(map.uniformIndex);
- if( Program::UNIFORM_UNKNOWN != location )
- {
- // switch based on property type to use correct GL uniform setter
- switch ( map.propertyValue->GetType() )
- {
- case Property::INTEGER:
- {
- program.SetUniform1i( location, map.propertyValue->GetInteger( bufferIndex ) );
- break;
- }
- case Property::FLOAT:
- {
- program.SetUniform1f( location, map.propertyValue->GetFloat( bufferIndex ) );
- break;
- }
- case Property::VECTOR2:
- {
- Vector2 value( map.propertyValue->GetVector2( bufferIndex ) );
- program.SetUniform2f( location, value.x, value.y );
- break;
- }
-
- case Property::VECTOR3:
- {
- Vector3 value( map.propertyValue->GetVector3( bufferIndex ) );
- program.SetUniform3f( location, value.x, value.y, value.z );
- break;
- }
-
- case Property::VECTOR4:
- {
- Vector4 value( map.propertyValue->GetVector4( bufferIndex ) );
- program.SetUniform4f( location, value.x, value.y, value.z, value.w );
- break;
- }
-
- case Property::ROTATION:
- {
- Quaternion value( map.propertyValue->GetQuaternion( bufferIndex ) );
- program.SetUniform4f( location, value.mVector.x, value.mVector.y, value.mVector.z, value.mVector.w );
- break;
- }
-
- case Property::MATRIX:
- {
- const Matrix& value = map.propertyValue->GetMatrix(bufferIndex);
- program.SetUniformMatrix4fv(location, 1, value.AsFloat() );
- break;
- }
-
- case Property::MATRIX3:
- {
- const Matrix3& value = map.propertyValue->GetMatrix3(bufferIndex);
- program.SetUniformMatrix3fv(location, 1, value.AsFloat() );
- break;
- }
-
- default:
- {
- // Other property types are ignored
- break;
- }
- }
- }
-}
-
-bool Renderer::BindTextures( Context& context, Program& program )
-{
- unsigned int textureUnit = 0;
- bool result = true;
-
- GLint uniformLocation(-1);
- std::vector<Render::Sampler*>& samplers( mRenderDataProvider->GetSamplers() );
- std::vector<Render::Texture*>& textures( mRenderDataProvider->GetTextures() );
- for( size_t i(0); i<textures.size() && result; ++i )
- {
- if( textures[i] )
- {
- result = textures[i]->Bind(context, textureUnit, samplers[i] );
- if( result && program.GetSamplerUniformLocation( i, uniformLocation ) )
- {
- program.SetUniform1i( uniformLocation, textureUnit );
- ++textureUnit;
- }
- }
- }
-
- return result;
-}
-
-void Renderer::SetFaceCullingMode( FaceCullingMode::Type mode )
-{
- mFaceCullingMode = mode;
-}
-
-void Renderer::SetBlendingBitMask( unsigned int bitmask )
-{
- mBlendingOptions.SetBitmask( bitmask );
-}
-
-void Renderer::SetBlendColor( const Vector4& color )
-{
- mBlendingOptions.SetBlendColor( color );
-}
-
-void Renderer::SetIndexedDrawFirstElement( size_t firstElement )
-{
- mIndexedDrawFirstElement = firstElement;
-}
-
-void Renderer::SetIndexedDrawElementsCount( size_t elementsCount )
-{
- mIndexedDrawElementsCount = elementsCount;
-}
-
-void Renderer::EnablePreMultipliedAlpha( bool enable )
-{
- mPremultipledAlphaEnabled = enable;
-}
-
-void Renderer::SetDepthWriteMode( DepthWriteMode::Type depthWriteMode )
-{
- mDepthWriteMode = depthWriteMode;
-}
-
-void Renderer::SetDepthTestMode( DepthTestMode::Type depthTestMode )
-{
- mDepthTestMode = depthTestMode;
-}
-
-DepthWriteMode::Type Renderer::GetDepthWriteMode() const
-{
- return mDepthWriteMode;
-}
-
-DepthTestMode::Type Renderer::GetDepthTestMode() const
-{
- return mDepthTestMode;
-}
-
-void Renderer::SetDepthFunction( DepthFunction::Type depthFunction )
-{
- mDepthFunction = depthFunction;
-}
-
-DepthFunction::Type Renderer::GetDepthFunction() const
-{
- return mDepthFunction;
-}
-
-void Renderer::SetRenderMode( RenderMode::Type renderMode )
-{
- mStencilParameters.renderMode = renderMode;
-}
-
-RenderMode::Type Renderer::GetRenderMode() const
-{
- return mStencilParameters.renderMode;
-}
-
-void Renderer::SetStencilFunction( StencilFunction::Type stencilFunction )
-{
- mStencilParameters.stencilFunction = stencilFunction;
-}
-
-StencilFunction::Type Renderer::GetStencilFunction() const
-{
- return mStencilParameters.stencilFunction;
-}
-
-void Renderer::SetStencilFunctionMask( int stencilFunctionMask )
-{
- mStencilParameters.stencilFunctionMask = stencilFunctionMask;
-}
-
-int Renderer::GetStencilFunctionMask() const
-{
- return mStencilParameters.stencilFunctionMask;
-}
-
-void Renderer::SetStencilFunctionReference( int stencilFunctionReference )
-{
- mStencilParameters.stencilFunctionReference = stencilFunctionReference;
-}
-
-int Renderer::GetStencilFunctionReference() const
-{
- return mStencilParameters.stencilFunctionReference;
-}
-
-void Renderer::SetStencilMask( int stencilMask )
-{
- mStencilParameters.stencilMask = stencilMask;
-}
-
-int Renderer::GetStencilMask() const
-{
- return mStencilParameters.stencilMask;
-}
-
-void Renderer::SetStencilOperationOnFail( StencilOperation::Type stencilOperationOnFail )
-{
- mStencilParameters.stencilOperationOnFail = stencilOperationOnFail;
-}
-
-StencilOperation::Type Renderer::GetStencilOperationOnFail() const
-{
- return mStencilParameters.stencilOperationOnFail;
-}
-
-void Renderer::SetStencilOperationOnZFail( StencilOperation::Type stencilOperationOnZFail )
-{
- mStencilParameters.stencilOperationOnZFail = stencilOperationOnZFail;
-}
-
-StencilOperation::Type Renderer::GetStencilOperationOnZFail() const
-{
- return mStencilParameters.stencilOperationOnZFail;
-}
-
-void Renderer::SetStencilOperationOnZPass( StencilOperation::Type stencilOperationOnZPass )
-{
- mStencilParameters.stencilOperationOnZPass = stencilOperationOnZPass;
-}
-
-StencilOperation::Type Renderer::GetStencilOperationOnZPass() const
-{
- return mStencilParameters.stencilOperationOnZPass;
-}
-
-void Renderer::Render( Context& context,
- BufferIndex bufferIndex,
- const SceneGraph::NodeDataProvider& node,
- const Matrix& modelMatrix,
- const Matrix& modelViewMatrix,
- const Matrix& viewMatrix,
- const Matrix& projectionMatrix,
- const Vector3& size,
- bool blend )
-{
- // TODO: AB: no callig any GL now, to avoid asserts whole function commented out
- return;
-#if 0
- // Get the program to use:
- Program* program = mRenderDataProvider->GetShader().GetProgram();
- if( !program )
- {
- return;
- }
-
- //Set cull face mode
- context.CullFace( mFaceCullingMode );
-
- //Set blending mode
- SetBlending( context, blend );
-
- // Take the program into use so we can send uniforms to it
- program->Use();
-
- if( DALI_LIKELY( BindTextures( context, *program ) ) )
- {
- // Only set up and draw if we have textures and they are all valid
-
- // set projection and view matrix if program has not yet received them yet this frame
- SetMatrices( *program, modelMatrix, viewMatrix, projectionMatrix, modelViewMatrix );
-
- // set color uniform
- GLint loc = program->GetUniformLocation( Program::UNIFORM_COLOR );
- if( Program::UNIFORM_UNKNOWN != loc )
- {
- const Vector4& color = node.GetRenderColor( bufferIndex );
- if( mPremultipledAlphaEnabled )
- {
- program->SetUniform4f( loc, color.r*color.a, color.g*color.a, color.b*color.a, color.a );
- }
- else
- {
- program->SetUniform4f( loc, color.r, color.g, color.b, color.a );
- }
- }
-
- SetUniforms( bufferIndex, node, size, *program );
-
- if( mUpdateAttributesLocation || mGeometry->AttributesChanged() )
- {
- mGeometry->GetAttributeLocationFromProgram( mAttributesLocation, *program, bufferIndex );
- mUpdateAttributesLocation = false;
- }
-
- mGeometry->UploadAndDraw( context,
- bufferIndex,
- mAttributesLocation,
- mIndexedDrawFirstElement,
- mIndexedDrawElementsCount );
- }
-#endif
-}
-
-void Renderer::SetSortAttributes( BufferIndex bufferIndex,
- SceneGraph::RenderInstructionProcessor::SortAttributes& sortAttributes ) const
-{
- sortAttributes.shader = &( mRenderDataProvider->GetShader() );
- sortAttributes.geometry = mGeometry;
-}
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef DALI_INTERNAL_RENDER_RENDERER_H
-#define DALI_INTERNAL_RENDER_RENDERER_H
-
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/public-api/math/matrix.h>
-#include <dali/public-api/math/vector4.h>
-#include <dali/public-api/rendering/texture-set.h>
-#include <dali/internal/common/blending-options.h>
-#include <dali/internal/common/message.h>
-#include <dali/internal/common/type-abstraction-enums.h>
-#include <dali/internal/event/common/property-input-impl.h>
-#include <dali/internal/render/data-providers/render-data-provider.h>
-#include <dali/internal/render/gl-resources/gl-resource-owner.h>
-#include <dali/internal/render/renderers/render-geometry.h>
-#include <dali/internal/update/manager/render-instruction-processor.h>
-#include <dali/integration-api/debug.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-class Context;
-class Texture;
-class Program;
-
-namespace SceneGraph
-{
-class SceneController;
-class Shader;
-class NodeDataProvider;
-}
-
-namespace Render
-{
-
-/**
- * Renderers are used to render meshes
- * These objects are used during RenderManager::Render(), so properties modified during
- * the Update must either be double-buffered, or set via a message added to the RenderQueue.
- */
-class Renderer : public GlResourceOwner
-{
-public:
-
- /**
- * @brief Struct to encapsulate stencil parameters required for control of the stencil buffer.
- */
- struct StencilParameters
- {
- StencilParameters( RenderMode::Type renderMode, StencilFunction::Type stencilFunction, int stencilFunctionMask,
- int stencilFunctionReference, int stencilMask, StencilOperation::Type stencilOperationOnFail,
- StencilOperation::Type stencilOperationOnZFail, StencilOperation::Type stencilOperationOnZPass )
- : stencilFunctionMask ( stencilFunctionMask ),
- stencilFunctionReference ( stencilFunctionReference ),
- stencilMask ( stencilMask ),
- renderMode ( renderMode ),
- stencilFunction ( stencilFunction ),
- stencilOperationOnFail ( stencilOperationOnFail ),
- stencilOperationOnZFail ( stencilOperationOnZFail ),
- stencilOperationOnZPass ( stencilOperationOnZPass )
- {
- }
-
- int stencilFunctionMask; ///< The stencil function mask
- int stencilFunctionReference; ///< The stencil function reference
- int stencilMask; ///< The stencil mask
- RenderMode::Type renderMode:3; ///< The render mode
- StencilFunction::Type stencilFunction:3; ///< The stencil function
- StencilOperation::Type stencilOperationOnFail:3; ///< The stencil operation for stencil test fail
- StencilOperation::Type stencilOperationOnZFail:3; ///< The stencil operation for depth test fail
- StencilOperation::Type stencilOperationOnZPass:3; ///< The stencil operation for depth test pass
- };
-
- /**
- * @copydoc Dali::Internal::GlResourceOwner::GlContextDestroyed()
- */
- void GlContextDestroyed();
-
- /**
- * @copydoc Dali::Internal::GlResourceOwner::GlCleanup()
- */
- void GlCleanup();
-
- /**
- * Create a new renderer instance
- * @param[in] dataProviders The data providers for the renderer
- * @param[in] geometry The geometry for the renderer
- * @param[in] blendingBitmask A bitmask of blending options.
- * @param[in] blendColor The blend color to pass to GL
- * @param[in] faceCullingMode The face-culling mode.
- * @param[in] preMultipliedAlphaEnabled whether alpha is pre-multiplied.
- * @param[in] depthWriteMode Depth buffer write mode
- * @param[in] depthTestMode Depth buffer test mode
- * @param[in] depthFunction Depth function
- * @param[in] stencilParameters Struct containing all stencil related options
- */
- static Renderer* New( SceneGraph::RenderDataProvider* dataProviders,
- Render::Geometry* geometry,
- unsigned int blendingBitmask,
- const Vector4& blendColor,
- FaceCullingMode::Type faceCullingMode,
- bool preMultipliedAlphaEnabled,
- DepthWriteMode::Type depthWriteMode,
- DepthTestMode::Type depthTestMode,
- DepthFunction::Type depthFunction,
- StencilParameters& stencilParameters );
-
- /**
- * Constructor.
- * @param[in] dataProviders The data providers for the renderer
- * @param[in] geometry The geometry for the renderer
- * @param[in] blendingBitmask A bitmask of blending options.
- * @param[in] blendColor The blend color to pass to GL
- * @param[in] faceCullingMode The face-culling mode.
- * @param[in] preMultipliedAlphaEnabled whether alpha is pre-multiplied.
- * @param[in] depthWriteMode Depth buffer write mode
- * @param[in] depthTestMode Depth buffer test mode
- * @param[in] depthFunction Depth function
- * @param[in] stencilParameters Struct containing all stencil related options
- */
- Renderer( SceneGraph::RenderDataProvider* dataProviders,
- Render::Geometry* geometry,
- unsigned int blendingBitmask,
- const Vector4& blendColor,
- FaceCullingMode::Type faceCullingMode,
- bool preMultipliedAlphaEnabled,
- DepthWriteMode::Type depthWriteMode,
- DepthTestMode::Type depthTestMode,
- DepthFunction::Type depthFunction,
- StencilParameters& stencilParameters );
-
- /**
- * Change the data providers of the renderer
- * @param[in] dataProviders The data providers
- */
- void SetRenderDataProvider( OwnerPointer<SceneGraph::RenderDataProvider>& dataProviders );
-
- /**
- * Change the geometry used by the renderer
- * @param[in] geometry The new geometry
- */
- void SetGeometry( Render::Geometry* geometry );
-
- /**
- * Second-phase construction.
- * This is called when the renderer is inside render thread
- * @param[in] context Context used by the renderer
- */
- void Initialize( Context& context );
-
- /**
- * Destructor
- */
- ~Renderer();
-
- /**
- * Set the face-culling mode.
- * @param[in] mode The face-culling mode.
- */
- void SetFaceCullingMode( FaceCullingMode::Type mode );
-
- /**
- * Set the bitmask for blending options
- * @param[in] bitmask A bitmask of blending options.
- */
- void SetBlendingBitMask( unsigned int bitmask );
-
- /**
- * Set the blend color for blending options
- * @param[in] blendColor The blend color to pass to GL
- */
- void SetBlendColor( const Vector4& color );
-
- /**
- * Set the first element index to draw by the indexed draw
- * @param[in] firstElement index of first element to draw
- */
- void SetIndexedDrawFirstElement( size_t firstElement );
-
- /**
- * Set the number of elements to draw by the indexed draw
- * @param[in] elementsCount number of elements to draw
- */
- void SetIndexedDrawElementsCount( size_t elementsCount );
-
- /**
- * @brief Set whether the Pre-multiplied Alpha Blending is required
- *
- * @param[in] preMultipled whether alpha is pre-multiplied.
- */
- void EnablePreMultipliedAlpha( bool preMultipled );
-
- /**
- * Sets the depth write mode
- * @param[in] depthWriteMode The depth write mode
- */
- void SetDepthWriteMode( DepthWriteMode::Type depthWriteMode );
-
- /**
- * Query the Renderer's depth write mode
- * @return The renderer depth write mode
- */
- DepthWriteMode::Type GetDepthWriteMode() const;
-
- /**
- * Sets the depth test mode
- * @param[in] depthTestMode The depth test mode
- */
- void SetDepthTestMode( DepthTestMode::Type depthTestMode );
-
- /**
- * Query the Renderer's depth test mode
- * @return The renderer depth test mode
- */
- DepthTestMode::Type GetDepthTestMode() const;
-
- /**
- * Sets the depth function
- * @param[in] depthFunction The depth function
- */
- void SetDepthFunction( DepthFunction::Type depthFunction );
-
- /**
- * Query the Renderer's depth function
- * @return The renderer depth function
- */
- DepthFunction::Type GetDepthFunction() const;
-
- /**
- * Sets the render mode
- * @param[in] renderMode The render mode
- */
- void SetRenderMode( RenderMode::Type mode );
-
- /**
- * Gets the render mode
- * @return The render mode
- */
- RenderMode::Type GetRenderMode() const;
-
- /**
- * Sets the stencil function
- * @param[in] stencilFunction The stencil function
- */
- void SetStencilFunction( StencilFunction::Type stencilFunction );
-
- /**
- * Gets the stencil function
- * @return The stencil function
- */
- StencilFunction::Type GetStencilFunction() const;
-
- /**
- * Sets the stencil function mask
- * @param[in] stencilFunctionMask The stencil function mask
- */
- void SetStencilFunctionMask( int stencilFunctionMask );
-
- /**
- * Gets the stencil function mask
- * @return The stencil function mask
- */
- int GetStencilFunctionMask() const;
-
- /**
- * Sets the stencil function reference
- * @param[in] stencilFunctionReference The stencil function reference
- */
- void SetStencilFunctionReference( int stencilFunctionReference );
-
- /**
- * Gets the stencil function reference
- * @return The stencil function reference
- */
- int GetStencilFunctionReference() const;
-
- /**
- * Sets the stencil mask
- * @param[in] stencilMask The stencil mask
- */
- void SetStencilMask( int stencilMask );
-
- /**
- * Gets the stencil mask
- * @return The stencil mask
- */
- int GetStencilMask() const;
-
- /**
- * Sets the stencil operation for when the stencil test fails
- * @param[in] stencilOperationOnFail The stencil operation
- */
- void SetStencilOperationOnFail( StencilOperation::Type stencilOperationOnFail );
-
- /**
- * Gets the stencil operation for when the stencil test fails
- * @return The stencil operation
- */
- StencilOperation::Type GetStencilOperationOnFail() const;
-
- /**
- * Sets the stencil operation for when the depth test fails
- * @param[in] stencilOperationOnZFail The stencil operation
- */
- void SetStencilOperationOnZFail( StencilOperation::Type stencilOperationOnZFail );
-
- /**
- * Gets the stencil operation for when the depth test fails
- * @return The stencil operation
- */
- StencilOperation::Type GetStencilOperationOnZFail() const;
-
- /**
- * Sets the stencil operation for when the depth test passes
- * @param[in] stencilOperationOnZPass The stencil operation
- */
- void SetStencilOperationOnZPass( StencilOperation::Type stencilOperationOnZPass );
-
- /**
- * Gets the stencil operation for when the depth test passes
- * @return The stencil operation
- */
- StencilOperation::Type GetStencilOperationOnZPass() const;
-
- /**
- * Called to render during RenderManager::Render().
- * @param[in] context The context used for rendering
- * @param[in] bufferIndex The index of the previous update buffer.
- * @param[in] node The node using this renderer
- * @param[in] modelViewMatrix The model-view matrix.
- * @param[in] viewMatrix The view matrix.
- * @param[in] projectionMatrix The projection matrix.
- * @param[in] size Size of the render item
- * @param[in] blend If true, blending is enabled
- */
- void Render( Context& context,
- BufferIndex bufferIndex,
- const SceneGraph::NodeDataProvider& node,
- const Matrix& modelMatrix,
- const Matrix& modelViewMatrix,
- const Matrix& viewMatrix,
- const Matrix& projectionMatrix,
- const Vector3& size,
- bool blend );
-
- /**
- * Write the renderer's sort attributes to the passed in reference
- *
- * @param[in] bufferIndex The current update buffer index.
- * @param[out] sortAttributes
- */
- void SetSortAttributes( BufferIndex bufferIndex, SceneGraph::RenderInstructionProcessor::SortAttributes& sortAttributes ) const;
-
- inline const SceneGraph::RenderDataProvider& GetRenderDataProvider() const
- {
- return *mRenderDataProvider.Get();
- };
-
- inline const Geometry* GetRenderGeometry() const
- {
- return mGeometry;
- };
-
-private:
-
- struct UniformIndexMap;
-
- // Undefined
- Renderer( const Renderer& );
-
- // Undefined
- Renderer& operator=( const Renderer& rhs );
-
- /**
- * Sets blending options
- * @param context to use
- * @param blend Wheter blending should be enabled or not
- */
- void SetBlending( Context& context, bool blend );
-
- /**
- * Set the uniforms from properties according to the uniform map
- * @param[in] bufferIndex The index of the previous update buffer.
- * @param[in] node The node using the renderer
- * @param[in] size The size of the renderer
- * @param[in] program The shader program on which to set the uniforms.
- */
- void SetUniforms( BufferIndex bufferIndex, const SceneGraph::NodeDataProvider& node, const Vector3& size, Program& program );
-
- /**
- * Set the program uniform in the map from the mapped property
- * @param[in] bufferIndex The index of the previous update buffer.
- * @param[in] program The shader program
- * @param[in] map The uniform
- */
- void SetUniformFromProperty( BufferIndex bufferIndex, Program& program, UniformIndexMap& map );
-
- /**
- * Bind the textures and setup the samplers
- * @param[in] context The GL context
- * @param[in] program The shader program
- * @return False if create or bind failed, true if success.
- */
- bool BindTextures( Context& context, Program& program );
-
-private:
-
- OwnerPointer< SceneGraph::RenderDataProvider > mRenderDataProvider;
-
- Context* mContext;
- Render::Geometry* mGeometry;
-
- struct UniformIndexMap
- {
- unsigned int uniformIndex; ///< The index of the cached location in the Program
- const PropertyInputImpl* propertyValue;
- };
-
- typedef Dali::Vector< UniformIndexMap > UniformIndexMappings;
-
- UniformIndexMappings mUniformIndexMap;
- Vector<GLint> mAttributesLocation;
-
- StencilParameters mStencilParameters; ///< Struct containing all stencil related options
- BlendingOptions mBlendingOptions; ///< Blending options including blend color, blend func and blend equation
-
- size_t mIndexedDrawFirstElement; ///< Offset of first element to draw
- size_t mIndexedDrawElementsCount; ///< Number of elements to draw
-
- DepthFunction::Type mDepthFunction:3; ///< The depth function
- FaceCullingMode::Type mFaceCullingMode:2; ///< The mode of face culling
- DepthWriteMode::Type mDepthWriteMode:2; ///< The depth write mode
- DepthTestMode::Type mDepthTestMode:2; ///< The depth test mode
- bool mUpdateAttributesLocation:1; ///< Indicates attribute locations have changed
- bool mPremultipledAlphaEnabled:1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
-
-};
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // DALI_INTERNAL_RENDER_RENDERER_H
+++ /dev/null
-#ifndef DALI_INTERNAL_RENDER_SAMPLER_H
-#define DALI_INTERNAL_RENDER_SAMPLER_H
-
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dali/public-api/actors/sampling.h>
-#include <dali/public-api/rendering/sampler.h>
-
-namespace Dali
-{
-namespace Internal
-{
-namespace Render
-{
-
-struct Sampler
-{
-
- typedef Dali::FilterMode::Type FilterMode;
- typedef Dali::WrapMode::Type WrapMode;
-
- /**
- * Constructor
- */
- Sampler()
- :mMinificationFilter(FilterMode::DEFAULT),
- mMagnificationFilter(FilterMode::DEFAULT),
- mSWrapMode(WrapMode::DEFAULT),
- mTWrapMode(WrapMode::DEFAULT),
- mRWrapMode(WrapMode::DEFAULT)
- {}
-
- /**
- * Destructor
- */
- ~Sampler()
- {}
-
- bool operator==(const Sampler& rhs) const
- {
- return ( ( mMinificationFilter == rhs.mMinificationFilter ) &&
- ( mMagnificationFilter == rhs.mMagnificationFilter ) &&
- ( mSWrapMode == rhs.mSWrapMode ) &&
- ( mTWrapMode == rhs.mTWrapMode ) &&
- ( mRWrapMode == rhs.mRWrapMode ) );
- }
-
- bool operator!=(const Sampler& rhs) const
- {
- return !(*this == rhs);
- }
-
- FilterMode mMinificationFilter : 4; ///< The minify filter
- FilterMode mMagnificationFilter : 4; ///< The magnify filter
- WrapMode mSWrapMode : 4; ///< The horizontal wrap mode
- WrapMode mTWrapMode : 4; ///< The vertical wrap mode
- WrapMode mRWrapMode : 4; ///< The vertical wrap mode
-};
-
-} // namespace Render
-
-} // namespace Internal
-
-} // namespace Dali
-
-
-#endif // DALI_INTERNAL_RENDER_SAMPLER_H
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// CLASS HEADER
-#include <dali/internal/render/renderers/render-texture.h>
-
-// EXTERNAL INCLUDES
-#include <math.h> //floor, log2
-
-// INTERNAL INCLUDES
-#include <dali/devel-api/images/native-image-interface-extension.h>
-
-namespace Dali
-{
-namespace Internal
-{
-namespace Render
-{
-
-namespace
-{
-
-// These match the GL specification
-const GLint GL_MINIFY_DEFAULT = GL_NEAREST_MIPMAP_LINEAR;
-const GLint GL_MAGNIFY_DEFAULT = GL_LINEAR;
-const GLint GL_WRAP_DEFAULT = GL_CLAMP_TO_EDGE;
-
-// These are the Dali defaults
-const GLint DALI_MINIFY_DEFAULT = GL_LINEAR;
-const GLint DALI_MAGNIFY_DEFAULT = GL_LINEAR;
-
-/**
- * @brief Convert a FilterMode to its corresponding GL type.
- *
- * @param[in] filterMode The FilterMode type.
- * @param[in] daliDefault The filter mode to use if filterMode is DEFAULT.
- * @param[in] glDefault The filter mode to use if filterMode is NONE.
- * @return the equivalent GL filter mode.
- */
-GLint FilterModeToGL( FilterMode::Type filterMode, GLint daliDefault, GLint glDefault )
-{
- switch( filterMode )
- {
- case FilterMode::NEAREST:
- {
- return GL_NEAREST;
- }
- case FilterMode::LINEAR:
- {
- return GL_LINEAR;
- }
- case FilterMode::NONE:
- {
- return glDefault;
- }
- case FilterMode::NEAREST_MIPMAP_NEAREST:
- {
- return GL_NEAREST_MIPMAP_NEAREST;
- }
- case FilterMode::LINEAR_MIPMAP_NEAREST:
- {
- return GL_LINEAR_MIPMAP_NEAREST;
- }
- case FilterMode::NEAREST_MIPMAP_LINEAR:
- {
- return GL_NEAREST_MIPMAP_LINEAR;
- }
- case FilterMode::LINEAR_MIPMAP_LINEAR:
- {
- return GL_LINEAR_MIPMAP_LINEAR;
- }
- case FilterMode::DEFAULT:
- {
- return daliDefault;
- }
- }
-
- return daliDefault;
-}
-
-/**
- * @brief Convert from a WrapMode to its corresponding GL enumeration
- * @param[in] wrapMode The wrap mode
- * @param[in] defaultWrapMode The mode to use if WrapMode is Default
- * @return The equivalent GL wrap mode
- */
-GLint WrapModeToGL( WrapMode::Type wrapMode, GLint defaultWrapMode )
-{
- switch( wrapMode )
- {
- case WrapMode::CLAMP_TO_EDGE:
- {
- return GL_CLAMP_TO_EDGE;
- }
- case WrapMode::REPEAT:
- {
- return GL_REPEAT;
- }
- case WrapMode::MIRRORED_REPEAT:
- {
- return GL_MIRRORED_REPEAT;
- }
- case WrapMode::DEFAULT:
- {
- return defaultWrapMode;
- }
- }
-
- return defaultWrapMode;
-}
-
-/**
- * @brief Retrives the GL format, GL internal format and pixel data type from a Pixel::Format
- * @param[in] pixelFormat The pixel format.
- * @param[out] glFormat The gl format.
- * @param[out] glInternalFormat The gl internal format.
- * @param[out] pixelDataType The data type of the pixel data.
- */
-void PixelFormatToGl( Pixel::Format pixelFormat, GLenum& glFormat, GLint& glInternalFormat, GLenum& pixelDataType )
-{
- // Compressed textures have no pixelDataType, so init to an invalid value:
- pixelDataType = -1;
-
- switch( pixelFormat )
- {
- case Pixel::A8:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- glFormat= GL_ALPHA;
- break;
- }
-
- case Pixel::L8:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- glFormat= GL_LUMINANCE;
- break;
- }
-
- case Pixel::LA88:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- glFormat= GL_LUMINANCE_ALPHA;
- break;
- }
-
- case Pixel::RGB565:
- {
- pixelDataType = GL_UNSIGNED_SHORT_5_6_5;
- glFormat= GL_RGB;
- break;
- }
-
- case Pixel::BGR565:
- {
- DALI_LOG_ERROR("Pixel format BGR565 is not supported by GLES.\n");
- pixelDataType = GL_UNSIGNED_SHORT_5_6_5;
-#ifdef _ARCH_ARM_
- glFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- glFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- case Pixel::RGBA4444:
- {
- pixelDataType = GL_UNSIGNED_SHORT_4_4_4_4;
- glFormat= GL_RGBA;
- break;
- }
-
- case Pixel::BGRA4444:
- {
- DALI_LOG_ERROR("Pixel format BGRA4444 is not supported by GLES.\n");
- pixelDataType = GL_UNSIGNED_SHORT_4_4_4_4;
-#ifdef _ARCH_ARM_
- glFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- glFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- case Pixel::RGBA5551:
- {
- pixelDataType = GL_UNSIGNED_SHORT_5_5_5_1;
- glFormat= GL_RGBA;
- break;
- }
-
- case Pixel::BGRA5551:
- {
- DALI_LOG_ERROR("Pixel format BGRA5551 is not supported by GLES.\n");
- pixelDataType = GL_UNSIGNED_SHORT_5_5_5_1;
-#ifdef _ARCH_ARM_
- glFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- glFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- case Pixel::RGB888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- glFormat= GL_RGB;
- break;
- }
-
- case Pixel::RGB8888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- glFormat= GL_RGBA; // alpha is reserved but not used
- break;
- }
-
- case Pixel::BGR8888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
-#ifdef GL_BGRA_EXT
- glFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- glFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- case Pixel::RGBA8888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
- glFormat= GL_RGBA;
- break;
- }
-
- case Pixel::BGRA8888:
- {
- pixelDataType = GL_UNSIGNED_BYTE;
-#ifdef GL_BGRA_EXT
- glFormat= GL_BGRA_EXT; // alpha is reserved but not used
-#else
- glFormat= GL_RGBA; // alpha is reserved but not used
-#endif
- break;
- }
-
- // GLES 2 extension compressed formats:
- case Pixel::COMPRESSED_RGB8_ETC1:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using non-standard GLES 2.0 extension compressed pixel format COMPRESSED_RGB8_ETC1.\n" );
- glFormat = 0x8D64; ///! < Hardcoded so we can test before we move to GLES 3.0 or greater.
- break;
- }
- case Pixel::COMPRESSED_RGB_PVRTC_4BPPV1:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using non-standard GLES 2.0 extension compressed pixel format COMPRESSED_RGB_PVRTC_4BPPV1.\n" );
- glFormat = 0x8C00; ///! < Hardcoded so we can test before we move to GLES 3.0 or greater.
- break;
- }
-
- // GLES 3.0 standard compressed formats:
- case Pixel::COMPRESSED_R11_EAC:
- {
- DALI_LOG_INFO(Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_R11_EAC.\n");
- glFormat = GL_COMPRESSED_R11_EAC;
- break;
- }
- case Pixel::COMPRESSED_SIGNED_R11_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SIGNED_R11_EAC.\n" );
- glFormat = GL_COMPRESSED_SIGNED_R11_EAC;
- break;
- }
- case Pixel::COMPRESSED_RG11_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_RG11_EAC.\n" );
- glFormat = GL_COMPRESSED_RG11_EAC;
- break;
- }
- case Pixel::COMPRESSED_SIGNED_RG11_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SIGNED_RG11_EAC.\n" );
- glFormat = GL_COMPRESSED_SIGNED_RG11_EAC;
- break;
- }
- case Pixel::COMPRESSED_RGB8_ETC2:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_RGB8_ETC2.\n" );
- glFormat = GL_COMPRESSED_RGB8_ETC2;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ETC2:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SRGB8_ETC2.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ETC2;
- break;
- }
- case Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2.\n" );
- glFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2.\n" );
- glFormat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
- break;
- }
- case Pixel::COMPRESSED_RGBA8_ETC2_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_RGBA8_ETC2_EAC.\n" );
- glFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.0 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
- break;
- }
-
- // GLES 3.1 extension compressed formats:
- case Pixel::COMPRESSED_RGBA_ASTC_4x4_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_4x4_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_5x4_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_5x4_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_5x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_5x5_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_6x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_6x5_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_6x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_6x6_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_8x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_8x5_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_8x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_8x6_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_8x8_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_8x8_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_10x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_10x5_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_10x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_10x6_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_10x8_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_10x8_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_10x10_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_10x10_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_12x10_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_12x10_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
- break;
- }
- case Pixel::COMPRESSED_RGBA_ASTC_12x12_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_RGBA_ASTC_12x12_KHR.\n" );
- glFormat = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
- break;
- }
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
- {
- DALI_LOG_INFO( Debug::Filter::gImage, Debug::Verbose, "Using GLES 3.1 standard compressed pixel format COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR.\n" );
- glFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
- break;
- }
-
- // GLES 3.0 floating point formats.
- case Pixel::RGB16F:
- {
- glFormat = GL_RGB;
- pixelDataType = GL_HALF_FLOAT;
- break;
- }
- case Pixel::RGB32F:
- {
- glFormat = GL_RGB;
- pixelDataType = GL_FLOAT;
- break;
- }
-
- case Pixel::INVALID:
- {
- DALI_LOG_ERROR( "Invalid pixel format for bitmap\n" );
- glFormat = 0;
- break;
- }
- }
-
- switch( pixelFormat )
- {
- case Pixel::RGB16F:
- case Pixel::RGB32F: // FALL THROUGH
- {
- glInternalFormat = GL_R11F_G11F_B10F;
- break;
- }
- default:
- {
- glInternalFormat = glFormat;
- }
- }
-
-}
-
-
-/**
- * @brief Whether specified pixel format is compressed.
- *
- * @param [in] pixelformat Pixel format
- * @return true if format is compressed, false otherwise
- */
-bool IsCompressedFormat(Pixel::Format pixelFormat)
-{
- switch (pixelFormat)
- {
- case Pixel::L8:
- case Pixel::A8:
- case Pixel::LA88:
- case Pixel::RGB565:
- case Pixel::RGBA4444:
- case Pixel::RGBA5551:
- case Pixel::BGR565:
- case Pixel::BGRA4444:
- case Pixel::BGRA5551:
- case Pixel::RGB888:
- case Pixel::RGB8888:
- case Pixel::BGR8888:
- case Pixel::RGBA8888:
- case Pixel::BGRA8888:
- case Pixel::RGB16F:
- case Pixel::RGB32F:
- case Pixel::INVALID:
- {
- return false;
- }
-
- case Pixel::COMPRESSED_R11_EAC:
- case Pixel::COMPRESSED_SIGNED_R11_EAC:
- case Pixel::COMPRESSED_RG11_EAC:
- case Pixel::COMPRESSED_SIGNED_RG11_EAC:
- case Pixel::COMPRESSED_RGB8_ETC2:
- case Pixel::COMPRESSED_SRGB8_ETC2:
- case Pixel::COMPRESSED_RGB8_ETC1:
- case Pixel::COMPRESSED_RGB_PVRTC_4BPPV1:
- case Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- case Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- case Pixel::COMPRESSED_RGBA8_ETC2_EAC:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
- case Pixel::COMPRESSED_RGBA_ASTC_4x4_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_5x4_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_5x5_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_6x5_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_6x6_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_8x5_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_8x6_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_8x8_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_10x5_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_10x6_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_10x8_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_10x10_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_12x10_KHR:
- case Pixel::COMPRESSED_RGBA_ASTC_12x12_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
- case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
- {
- return true;
- }
- }
-
- return false;
-}
-
-} //Unnamed namespace
-
-
-Texture::Texture( Type type, Pixel::Format format, ImageDimensions size )
-: mNativeImage(),
- mSampler(),
- mId( 0 ),
- mTarget( ( type == TextureType::TEXTURE_2D ) ? GL_TEXTURE_2D : GL_TEXTURE_CUBE_MAP ),
- mGlInternalFormat( GL_RGB ),
- mGlFormat( GL_RGB ),
- mPixelDataType( GL_UNSIGNED_BYTE ),
- mWidth( size.GetWidth() ),
- mHeight( size.GetHeight() ),
- mMaxMipMapLevel( 0 ),
- mType( type ),
- mHasAlpha( HasAlpha( format ) ),
- mIsCompressed( IsCompressedFormat( format ) ),
- mGfxTexture( nullptr )
-{
- PixelFormatToGl( format,
- mGlFormat,
- mGlInternalFormat,
- mPixelDataType );
-}
-
-Texture::Texture( NativeImageInterfacePtr nativeImageInterface )
-: mNativeImage( nativeImageInterface ),
- mSampler(),
- mId( 0 ),
- mTarget( GL_TEXTURE_2D ),
- mGlInternalFormat( GL_RGB ),
- mGlFormat( GL_RGB ),
- mPixelDataType( GL_UNSIGNED_BYTE ),
- mWidth( nativeImageInterface->GetWidth() ),
- mHeight( nativeImageInterface->GetHeight() ),
- mMaxMipMapLevel( 0 ),
- mType( TextureType::TEXTURE_2D ),
- mHasAlpha( nativeImageInterface->RequiresBlending() ),
- mIsCompressed( false ),
- mGfxTexture( nullptr )
-{
-}
-
-Texture::~Texture()
-{}
-
-void Texture::Destroy( Context& context )
-{
- if( mId )
- {
- context.DeleteTextures( 1, &mId );
-
- if( mNativeImage )
- {
- mNativeImage->GlExtensionDestroy();
- }
- }
-}
-
-void Texture::GlContextDestroyed()
-{
- mId = 0u;
-}
-
-void Texture::Initialize(Context& context)
-{
- if( mNativeImage )
- {
- if( mNativeImage->GlExtensionCreate() )
- {
- NativeImageInterface::Extension* extension = mNativeImage->GetExtension();
- if( extension )
- {
- mTarget = extension->GetEglImageTextureTarget();
- }
-
- context.GenTextures( 1, &mId );
- context.BindTexture( mTarget, mId );
- context.PixelStorei( GL_UNPACK_ALIGNMENT, 1 ); // We always use tightly packed data
-
- //Apply default sampling parameters
- context.TexParameteri( mTarget, GL_TEXTURE_MIN_FILTER, DALI_MINIFY_DEFAULT );
- context.TexParameteri( mTarget, GL_TEXTURE_MAG_FILTER, DALI_MAGNIFY_DEFAULT );
- context.TexParameteri( mTarget, GL_TEXTURE_WRAP_S, GL_WRAP_DEFAULT );
- context.TexParameteri( mTarget, GL_TEXTURE_WRAP_T, GL_WRAP_DEFAULT );
-
- // platform specific implementation decides on what GL extension to use
- if( mNativeImage->TargetTexture() != 0u )
- {
- context.DeleteTextures( 1, &mId );
- mNativeImage->GlExtensionDestroy();
- mId = 0u;
- }
- }
- }
- else
- {
- //Create the texture and reserve memory for the first mipmap level.
- context.GenTextures( 1, &mId );
- context.BindTexture( mTarget, mId );
- context.PixelStorei( GL_UNPACK_ALIGNMENT, 1 ); // We always use tightly packed data
-
- //Apply default sampling parameters
- context.TexParameteri( mTarget, GL_TEXTURE_MIN_FILTER, DALI_MINIFY_DEFAULT );
- context.TexParameteri( mTarget, GL_TEXTURE_MAG_FILTER, DALI_MAGNIFY_DEFAULT );
- context.TexParameteri( mTarget, GL_TEXTURE_WRAP_S, GL_WRAP_DEFAULT );
- context.TexParameteri( mTarget, GL_TEXTURE_WRAP_T, GL_WRAP_DEFAULT );
-
- if( mType == TextureType::TEXTURE_2D )
- {
- if( !mIsCompressed )
- {
- context.TexImage2D(GL_TEXTURE_2D, 0, mGlInternalFormat, mWidth, mHeight, 0, mGlFormat, mPixelDataType, 0 );
- }
- else
- {
- context.CompressedTexImage2D(GL_TEXTURE_2D, 0, mGlInternalFormat, mWidth, mHeight, 0, 0, 0 );
- }
- }
- else if( mType == TextureType::TEXTURE_CUBE )
- {
- if( !mIsCompressed )
- {
- for( unsigned int i(0); i<6; ++i )
- {
- context.TexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, mGlInternalFormat, mWidth, mHeight, 0, mGlFormat, mPixelDataType, 0 );
- }
- }
- else
- {
- for( unsigned int i(0); i<6; ++i )
- {
- context.CompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, mGlInternalFormat, mWidth, mHeight, 0, 0, 0 );
- }
- }
- context.TexParameteri( mTarget, GL_TEXTURE_WRAP_R, GL_WRAP_DEFAULT );
- }
- }
-}
-
-void Texture::Upload( Context& context, PixelDataPtr pixelData, const Internal::Texture::UploadParams& params )
-{
- DALI_ASSERT_ALWAYS( mNativeImage == NULL );
-
- //Get pointer to the data of the PixelData object
- unsigned char* buffer( pixelData->GetBuffer() );
-
- //This buffer is only used if manually converting from RGB to RGBA
- unsigned char* tempBuffer(0);
-
- //Retrieves the pixel data element type, the gl format and gl internal format of the data contained in the PixelData object.
- GLenum glFormat;
- GLint glInternalFormat;
- GLenum pixelDataElementType;
- PixelFormatToGl( pixelData->GetPixelFormat(), glFormat, glInternalFormat, pixelDataElementType );
-
- //Get the maximum mipmap level to set GL_TEXTURE_MAX_LEVEL parameter in GLES3x because is not
- //necessary to upload all the mipmap levels
- mMaxMipMapLevel = ( mMaxMipMapLevel > params.mipmap ) ? mMaxMipMapLevel : params.mipmap;
-
- const bool isSubImage = ( ( params.xOffset != 0 ) ||
- ( params.yOffset != 0 ) ||
- ( params.width != ( mWidth / ( 1 << params.mipmap ) ) ) ||
- ( params.height != ( mHeight / ( 1 << params.mipmap ) ) ) );
-
- bool convert = ( ( glFormat == GL_RGB ) && ( mGlFormat == GL_RGBA ) );
-#if DALI_GLES_VERSION >= 30
- // Don't convert manually from RGB to RGBA if GLES >= 3.0 and a sub-image is uploaded.
- convert = convert && !isSubImage;
-#endif
-
- if( convert )
- {
- size_t dataSize = static_cast< size_t >( params.width ) * params.height;
- tempBuffer = new unsigned char[dataSize*4u];
- for( size_t i(0u); i<dataSize; i++ )
- {
- tempBuffer[i*4u] = buffer[i*3u];
- tempBuffer[i*4u+1] = buffer[i*3u+1];
- tempBuffer[i*4u+2] = buffer[i*3u+2];
- tempBuffer[i*4u+3] = 0xFF;
- }
-
- buffer = tempBuffer;
- glFormat = mGlFormat; // Set the glFormat to GL_RGBA
- }
-
- //Upload data to the texture
-
- context.BindTexture( mTarget, mId );
- GLenum target( mTarget );
- if( mType == TextureType::TEXTURE_CUBE )
- {
- target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + params.layer;
- }
-
- context.PixelStorei( GL_UNPACK_ALIGNMENT, 1 );
-
- if( !isSubImage )
- {
- //Specifying the whole image for the mipmap. We cannot assume that storage for that mipmap has been created so we need to use TexImage2D
- if( !mIsCompressed )
- {
- context.TexImage2D( target, params.mipmap, mGlInternalFormat, params.width, params.height, 0, glFormat, pixelDataElementType, buffer );
- }
- else
- {
- context.CompressedTexImage2D( target, params.mipmap, mGlInternalFormat, params.width, params.height, 0, pixelData->GetBufferSize(), buffer );
- }
- }
- else
- {
- //Specifying part of the image for the mipmap
- if( !mIsCompressed )
- {
- context.TexSubImage2D( target, params.mipmap,
- params.xOffset, params.yOffset, params.width, params.height,
- glFormat, pixelDataElementType, buffer );
- }
- else
- {
- context.CompressedTexSubImage2D( target, params.mipmap,
- params.xOffset, params.yOffset, params.width, params.height,
- glFormat, pixelData->GetBufferSize(), buffer );
- }
- }
-
-
- //Destroy temp buffer used for conversion RGB->RGBA
- delete[] tempBuffer;
-}
-
-bool Texture::Bind( Context& context, unsigned int textureUnit, Render::Sampler* sampler )
-{
- if( mNativeImage && mId == 0 )
- {
- Initialize( context );
- }
-
- if( mId != 0 )
- {
- context.BindTextureForUnit( static_cast<TextureUnit>( textureUnit ), mTarget, mId );
- ApplySampler( context, sampler );
-
- if( mNativeImage )
- {
- mNativeImage->PrepareTexture();
- }
-
- return true;
- }
-
- return false;
-}
-
-void Texture::ApplySampler( Context& context, Render::Sampler* sampler )
-{
- Render::Sampler oldSampler = mSampler;
- mSampler = sampler ? *sampler : Sampler();
-
- if( mSampler != oldSampler )
- {
- GLint mode = FilterModeToGL( mSampler.mMinificationFilter, DALI_MINIFY_DEFAULT, GL_MINIFY_DEFAULT );
- if( mode != FilterModeToGL( oldSampler.mMinificationFilter, DALI_MINIFY_DEFAULT, GL_MINIFY_DEFAULT ) )
- {
- context.TexParameteri( mTarget, GL_TEXTURE_MIN_FILTER, mode );
- }
-
- mode = FilterModeToGL( mSampler.mMagnificationFilter, DALI_MAGNIFY_DEFAULT, GL_MAGNIFY_DEFAULT );
- if( mode != FilterModeToGL( oldSampler.mMagnificationFilter, DALI_MAGNIFY_DEFAULT, GL_MAGNIFY_DEFAULT ) )
- {
- context.TexParameteri( mTarget, GL_TEXTURE_MAG_FILTER, mode );
- }
-
- mode = WrapModeToGL( mSampler.mSWrapMode, GL_WRAP_DEFAULT );
- if( mode != WrapModeToGL( oldSampler.mSWrapMode, GL_WRAP_DEFAULT ) )
- {
- context.TexParameteri( mTarget, GL_TEXTURE_WRAP_S, mode );
- }
-
- mode = WrapModeToGL( mSampler.mTWrapMode, GL_WRAP_DEFAULT );
- if( mode != WrapModeToGL( oldSampler.mTWrapMode, GL_WRAP_DEFAULT ) )
- {
- context.TexParameteri( mTarget, GL_TEXTURE_WRAP_T, mode );
- }
-
- if( mType == TextureType::TEXTURE_CUBE )
- {
- mode = WrapModeToGL( mSampler.mRWrapMode, GL_WRAP_DEFAULT );
- if( mode != WrapModeToGL( oldSampler.mRWrapMode, GL_WRAP_DEFAULT ) )
- {
- context.TexParameteri( mTarget, GL_TEXTURE_WRAP_R, mode );
- }
- }
-
-#if DALI_GLES_VERSION >= 30
- //In GLES 3.0 we do not need to upload all of the mipmap levels, but GL_TEXTURE_MAX_LEVEL must be set
- if(mMaxMipMapLevel)
- {
- context.TexParameteri( mTarget, GL_TEXTURE_MAX_LEVEL, mMaxMipMapLevel );
- }
-#endif
-
- }
-}
-
-bool Texture::HasAlphaChannel()
-{
- return mHasAlpha;
-}
-
-void Texture::GenerateMipmaps( Context& context )
-{
- //GL_TEXTURE_MAX_LEVEL does not need to be set when mipmaps are generated by GL
- mMaxMipMapLevel = 0;
- context.BindTexture( mTarget, mId );
- context.GenerateMipmap( mTarget );
-}
-
-} //Render
-
-} //Internal
-
-} //Dali
+++ /dev/null
-#ifndef DALI_INTERNAL_RENDER_TEXTURE_H
-#define DALI_INTERNAL_RENDER_TEXTURE_H
-
-/*
- * Copyright (c) 2018 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// EXTERNAL INCLUDES
-#include <string>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/images/image-operations.h> // Dali::ImageDimensions
-#include <dali/public-api/rendering/sampler.h>
-#include <dali/public-api/rendering/texture.h>
-#include <dali/internal/event/rendering/texture-impl.h>
-#include <dali/internal/render/gl-resources/context.h>
-#include <dali/internal/render/renderers/render-sampler.h>
-#include <dali/integration-api/gl-defines.h>
-#include <dali/graphics-api/graphics-api-accessor.h>
-#include <dali/graphics-api/graphics-api-texture.h>
-
-namespace Dali
-{
-namespace Internal
-{
-namespace Render
-{
-struct Sampler;
-
-class Texture
-{
-public:
-
- typedef Dali::TextureType::Type Type;
-
- /**
- * Constructor
- * @param[in] type The type of the texture
- * @param[in] format The format of the pixel data
- * @param[in] size The size of the texture
- */
- Texture( Type type, Pixel::Format format, ImageDimensions size );
-
- /**
- * Constructor from native image
- * @param[in] nativeImageInterface The native image
- */
- Texture( NativeImageInterfacePtr nativeImageInterface );
-
- /**
- * Destructor
- */
- ~Texture();
-
- /**
- * Creates the texture in the GPU.
- * Creates the texture and reserves memory for the first mipmap level
- * @param[in] context The GL context
- */
- void Initialize( Context& context );
-
- /**
- * Deletes the texture from the GPU
- * @param[in] context The GL context
- */
- void Destroy( Context& context );
-
- /**
- * Called by RenderManager to inform the texture that the context has been destroyed
- */
- void GlContextDestroyed();
-
- /**
- * Uploads data to the texture.
- * @param[in] context The GL context
- * @param[in] pixelData A pixel data object
- * @param[in] params Upload parameters. See UploadParams
- */
- void Upload( Context& context, PixelDataPtr pixelData, const Internal::Texture::UploadParams& params );
-
- /**
- * Bind the texture to the given texture unit and applies the given sampler
- * @param[in] context The GL context
- * @param[in] textureUnit the texture unit
- * @param[in] sampler The sampler to be used with the texture
- * @return true if the bind succeeded, false otherwise
- */
- bool Bind( Context& context, unsigned int textureUnit, Render::Sampler* sampler );
-
- /**
- * Auto generates mipmaps for the texture
- * @param[in] context The GL context
- */
- void GenerateMipmaps( Context& context );
-
- /**
- * Retrieve wheter the texture has an alpha channel
- * @return True if the texture has alpha channel, false otherwise
- */
- bool HasAlphaChannel();
-
- /**
- * Get the id of the texture
- * @return Id of the texture
- */
- GLuint GetId()
- {
- return mId;
- }
-
- /**
- * Get the type of the texture
- * @return Type of the texture
- */
- Type GetType() const
- {
- return mType;
- }
-
- /**
- * Check if the texture is a native image
- * @return if the texture is a native image
- */
- bool IsNativeImage() const
- {
- return mNativeImage;
- }
-
- void SetId( uint32_t textureId )
- {
- mId = textureId;
- }
-
- void SetGfxObject( Graphics::API::Accessor<Graphics::API::Texture> texture )
- {
- mGfxTexture = texture;
- }
-
- const Graphics::API::Accessor<Graphics::API::Texture>& GetGfxObject() const
- {
- return mGfxTexture;
- }
-
-private:
-
- /**
- * Helper method to apply a sampler to the texture
- * @param[in] context The GL context
- * @param[in] sampler The sampler
- */
- void ApplySampler( Context& context, Render::Sampler* sampler );
-
- NativeImageInterfacePtr mNativeImage; ///< Pointer to native image
- Render::Sampler mSampler; ///< The current sampler state
- GLuint mId; ///< Id of the texture
- GLuint mTarget; ///< Specifies the target to which the texture is bound.
- GLint mGlInternalFormat; ///< The gl internal format of the pixel data
- GLenum mGlFormat; ///< The gl format of the pixel data
- GLenum mPixelDataType; ///< The data type of the pixel data
- uint16_t mWidth; ///< Width of the texture
- uint16_t mHeight; ///< Height of the texture
- uint16_t mMaxMipMapLevel; ///< Maximum mipmap level
- Type mType:2; ///< Type of the texture
- bool mHasAlpha : 1; ///< Whether the format has an alpha channel
- bool mIsCompressed : 1; ///< Whether the format is compressed
-
- Graphics::API::Accessor<Graphics::API::Texture> mGfxTexture; ///< TODO: find right place to store texture
-};
-
-
-} // namespace Render
-
-} // namespace Internal
-
-} // namespace Dali
-
-
-#endif // DALI_INTERNAL_RENDER_TEXTURE_H
+++ /dev/null
-#ifndef __DALI_INTERNAL_PROGRAM_CACHE_H__
-#define __DALI_INTERNAL_PROGRAM_CACHE_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/gl-abstraction.h> // for GLenum
-#include <dali/internal/common/shader-data.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-class Program;
-
-/**
- * This class is interface for caching Program objects
- */
-class ProgramCache
-{
-public:
-
- /**
- * Constructor
- */
- ProgramCache()
- { }
-
- /**
- * Destructor, virtual as this is an interface
- */
- virtual ~ProgramCache()
- { }
-
-public: // API
-
- /**
- * @return GlAbstraction
- */
- virtual Integration::GlAbstraction& GetGlAbstraction() = 0;
-
- /**
- * Get the program from cache with hash
- * @param shaderHash to use
- * @return program
- */
- virtual Program* GetProgram( size_t shaderHash ) = 0;
-
- /**
- * Add a program to cache
- * @param shaderHash of the program
- * @param program to add
- */
- virtual void AddProgram( size_t shaderHash, Program* program ) = 0;
-
- /**
- * Get currently bound program
- * @return program that is currently used
- */
- virtual Program* GetCurrentProgram() = 0;
-
- /**
- * Set the currently bound program
- * @param program that is used
- */
- virtual void SetCurrentProgram( Program* program ) = 0;
-
- /**
- * @return true if program binaries are supported
- */
- virtual bool IsBinarySupported() = 0;
-
- /**
- * @return the binary format to use
- */
- virtual GLenum ProgramBinaryFormat() = 0;
-
- /**
- * @param programData to store/save
- */
- virtual void StoreBinary( Internal::ShaderDataPtr programData ) = 0;
-
-private: // not implemented as non-copyable
-
- ProgramCache( const ProgramCache& rhs );
- ProgramCache& operator=( const ProgramCache& rhs );
-
-};
-
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_PROGRAM_CACHE_H__
-
+++ /dev/null
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/shaders/program-controller.h>
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/gl-defines.h>
-#include <dali/internal/common/shader-saver.h>
-#include <dali/internal/render/gl-resources/gl-call-debug.h>
-#include <dali/internal/render/shaders/program.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-ProgramController::ProgramController( Integration::GlAbstraction& glAbstraction )
-: mShaderSaver( 0 ),
- mGlAbstraction( glAbstraction ),
- mCurrentProgram( NULL ),
- mProgramBinaryFormat( 0 ),
- mNumberOfProgramBinaryFormats( 0 )
-{
- // we have 17 default programs so make room for those and a few custom ones as well
- mProgramCache.Reserve( 32 );
-}
-
-ProgramController::~ProgramController()
-{
-}
-
-void ProgramController::ResetProgramMatrices()
-{
- const ProgramIterator end = mProgramCache.End();
- for ( ProgramIterator iter = mProgramCache.Begin(); iter != end; ++iter )
- {
- Program* program = (*iter)->GetProgram();
- program->SetProjectionMatrix( NULL );
- program->SetViewMatrix( NULL );
- }
-}
-
-void ProgramController::GlContextCreated()
-{
- // reset any potential previous errors
- LOG_GL( "GetError()\n" );
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetError() );
-
- // find out if program binaries are supported and the format enum as well
- Dali::Vector<GLint> programBinaryFormats;
-
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS_OES, &mNumberOfProgramBinaryFormats ) );
- LOG_GL("GetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS_OES) = %d\n", mNumberOfProgramBinaryFormats );
-
- if( GL_NO_ERROR == mGlAbstraction.GetError() && 0 < mNumberOfProgramBinaryFormats )
- {
- programBinaryFormats.Resize( mNumberOfProgramBinaryFormats );
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetIntegerv(GL_PROGRAM_BINARY_FORMATS_OES, &programBinaryFormats[0] ) );
- LOG_GL("GetIntegerv(GL_PROGRAM_BINARY_FORMATS_OES) = %d\n", programBinaryFormats[0] );
- mProgramBinaryFormat = programBinaryFormats[0];
- }
-}
-
-void ProgramController::GlContextDestroyed()
-{
- mNumberOfProgramBinaryFormats = 0;
- mProgramBinaryFormat = 0;
-
- SetCurrentProgram( NULL );
- // Inform programs they are no longer valid
- const ProgramIterator end = mProgramCache.End();
- for ( ProgramIterator iter = mProgramCache.Begin(); iter != end; ++iter )
- {
- (*iter)->GetProgram()->GlContextDestroyed();
- }
-}
-
-Integration::GlAbstraction& ProgramController::GetGlAbstraction()
-{
- return mGlAbstraction;
-}
-
-Program* ProgramController::GetProgram( size_t shaderHash )
-{
- Program* program = NULL;
- const ProgramIterator end = mProgramCache.End();
- for ( ProgramIterator iter = mProgramCache.Begin(); iter != end; ++iter )
- {
- size_t hash = (*iter)->GetHash();
- if( shaderHash == hash )
- {
- program = (*iter)->GetProgram();
- break;
- }
- }
- return program;
-}
-
-void ProgramController::AddProgram( size_t shaderHash, Program* program )
-{
- // we expect unique hash values so its event thread sides job to guarantee that
- // AddProgram is only called after program checks that GetProgram returns NULL
- mProgramCache.PushBack( new ProgramPair( program, shaderHash ) );
-}
-
-Program* ProgramController::GetCurrentProgram()
-{
- return mCurrentProgram;
-}
-
-void ProgramController::SetCurrentProgram( Program* program )
-{
- mCurrentProgram = program;
-}
-
-bool ProgramController::IsBinarySupported()
-{
- return mNumberOfProgramBinaryFormats > 0;
-}
-
-unsigned int ProgramController::ProgramBinaryFormat()
-{
- return mProgramBinaryFormat;
-}
-
-void ProgramController::StoreBinary( Internal::ShaderDataPtr programData )
-{
- DALI_ASSERT_DEBUG( programData->GetBufferSize() > 0 );
- DALI_ASSERT_DEBUG( mShaderSaver && "SetShaderSaver() should have been called during startup." );
-
- if( mShaderSaver != NULL )
- {
- mShaderSaver->SaveBinary( programData );
- }
-}
-
-void ProgramController::SetShaderSaver( ShaderSaver& shaderSaver )
-{
- mShaderSaver = &shaderSaver;
-}
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_PROGRAM_CONTROLLER_H__
-#define __DALI_INTERNAL_PROGRAM_CONTROLLER_H__
-
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/devel-api/common/owner-container.h>
-#include <dali/internal/common/shader-data.h>
-#include <dali/internal/render/shaders/program.h>
-#include <dali/internal/render/shaders/program-cache.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-class ShaderSaver;
-
-/**
- * This class is the owner of GL shader programs
- */
-class ProgramController : public ProgramCache
-{
-public:
-
- /**
- * Wrapper for a program and its hash code
- */
- class ProgramPair
- {
- public: // API
-
- /**
- * Constructor
- * @param program
- * @param shaderHash
- */
- ProgramPair( Program* program, size_t shaderHash )
- : mProgram( program ), mShaderHash( shaderHash )
- { }
-
- /**
- * Destructor, non-virtual as not a base
- */
- ~ProgramPair()
- {
- delete mProgram;
- }
-
- /**
- * Inline getter for the program
- * @return the program
- */
- inline Program* GetProgram()
- {
- return mProgram;
- }
-
- /**
- * Inline getter for the hash
- * @return the hash
- */
- inline size_t GetHash()
- {
- return mShaderHash;
- }
-
- private: // Not implemented
- ProgramPair( const ProgramPair& );
- ProgramPair& operator=( const ProgramPair& );
-
- private: // Data
- Program* mProgram;
- size_t mShaderHash;
- };
-
- /**
- * Constructor
- * @param postProcessDispatcher to send save binary message back to update
- */
- ProgramController( Integration::GlAbstraction& glAbstraction );
-
- /**
- * Destructor, non virtual as not a base class
- */
- ~ProgramController();
-
-public: // API
-
- /**
- * Resets the program matrices. Must be called at the beginning of every frame
- */
- void ResetProgramMatrices();
-
- /**
- * Notifies the cache that context is (re)created
- */
- void GlContextCreated();
-
- /**
- * Notifies cache that context is lost
- */
- void GlContextDestroyed();
-
- /**
- * Set the destination for compiler shader binaries so they can be saved.
- * @note Must be called during initialisation.
- */
- void SetShaderSaver( ShaderSaver& shaderSaver );
-
-private: // From ProgramCache
-
- /**
- * @copydoc ProgramCache::GetGlAbstraction
- */
- virtual Integration::GlAbstraction& GetGlAbstraction();
-
- /**
- * @copydoc ProgramCache::GetProgram
- */
- virtual Program* GetProgram( size_t shaderHash );
-
- /**
- * @copydoc ProgramCache::AddProgram
- */
- virtual void AddProgram( size_t shaderHash, Program* program );
-
- /**
- * @copydoc ProgramCache::GetCurrentProgram
- */
- virtual Program* GetCurrentProgram();
-
- /**
- * @copydoc ProgramCache::SetCurrentProgram
- */
- virtual void SetCurrentProgram( Program* program );
-
- /**
- * @copydoc ProgramCache::IsBinarySupported
- */
- virtual bool IsBinarySupported();
-
- /**
- * @copydoc ProgramCache::ProgramBinaryFormat
- */
- virtual GLenum ProgramBinaryFormat();
-
- /**
- * @copydoc ProgramCache::StoreBinary
- */
- virtual void StoreBinary( Internal::ShaderDataPtr programData );
-
-private: // not implemented as non-copyable
-
- ProgramController( const ProgramController& rhs );
- ProgramController& operator=( const ProgramController& rhs );
-
-private: // Data
-
- ShaderSaver* mShaderSaver;
- Integration::GlAbstraction& mGlAbstraction;
- Program* mCurrentProgram;
-
- typedef OwnerContainer< ProgramPair* > ProgramContainer;
- typedef ProgramContainer::Iterator ProgramIterator;
- ProgramContainer mProgramCache;
-
- GLint mProgramBinaryFormat;
- GLint mNumberOfProgramBinaryFormats;
-
-};
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_PROGRAM_CONTROLLER_H__
-
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/shaders/program.h>
-
-// EXTERNAL INCLUDES
-#include <iomanip>
-#include <cstring>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h>
-#include <dali/public-api/common/dali-vector.h>
-#include <dali/public-api/common/constants.h>
-#include <dali/integration-api/debug.h>
-#include <dali/internal/common/shader-data.h>
-#include <dali/integration-api/gl-defines.h>
-#include <dali/internal/render/common/performance-monitor.h>
-#include <dali/internal/render/shaders/program-cache.h>
-#include <dali/internal/render/gl-resources/gl-call-debug.h>
-
-namespace
-{
-void LogWithLineNumbers( const char * source )
-{
- unsigned int lineNumber = 0u;
- const char *prev = source;
- const char *ptr = prev;
-
- while( true )
- {
- if(lineNumber > 200u)
- {
- break;
- }
- // seek the next end of line or end of text
- while( *ptr!='\n' && *ptr != '\0' )
- {
- ++ptr;
- }
-
- std::string line( prev, ptr-prev );
- Dali::Integration::Log::LogMessage(Dali::Integration::Log::DebugError, "%4d %s\n", lineNumber, line.c_str());
-
- if( *ptr == '\0' )
- {
- break;
- }
- prev = ++ptr;
- ++lineNumber;
- }
-}
-
-} //namespace
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-// LOCAL STUFF
-namespace
-{
-
-const char* gStdAttribs[ Program::ATTRIB_TYPE_LAST ] =
-{
- "aPosition", // ATTRIB_POSITION
- "aTexCoord", // ATTRIB_TEXCOORD
-};
-
-const char* gStdUniforms[ Program::UNIFORM_TYPE_LAST ] =
-{
- "uMvpMatrix", // UNIFORM_MVP_MATRIX
- "uModelView", // UNIFORM_MODELVIEW_MATRIX
- "uProjection", // UNIFORM_PROJECTION_MATRIX
- "uModelMatrix", // UNIFORM_MODEL_MATRIX,
- "uViewMatrix", // UNIFORM_VIEW_MATRIX,
- "uNormalMatrix", // UNIFORM_NORMAL_MATRIX
- "uColor", // UNIFORM_COLOR
- "sTexture", // UNIFORM_SAMPLER
- "sTextureRect", // UNIFORM_SAMPLER_RECT
- "sEffect", // UNIFORM_EFFECT_SAMPLER
- "uSize" // UNIFORM_SIZE
-};
-
-} // <unnamed> namespace
-
-// IMPLEMENTATION
-
-Program* Program::New( ProgramCache& cache, Internal::ShaderDataPtr shaderData, bool modifiesGeometry )
-{
- size_t shaderHash = shaderData->GetHashValue();
- Program* program = cache.GetProgram( shaderHash );
-
- if( NULL == program )
- {
- // program not found so create it
- program = new Program( cache, shaderData, modifiesGeometry );
- program->Load();
- cache.AddProgram( shaderHash, program );
- }
-
- return program;
-}
-
-void Program::Use()
-{
- if ( mLinked )
- {
- if ( this != mCache.GetCurrentProgram() )
- {
- LOG_GL( "UseProgram(%d)\n", mProgramId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.UseProgram(mProgramId) );
-
- mCache.SetCurrentProgram( this );
- }
- }
-}
-
-bool Program::IsUsed()
-{
- return ( this == mCache.GetCurrentProgram() );
-}
-
-GLint Program::GetAttribLocation( AttribType type )
-{
- DALI_ASSERT_DEBUG(type != ATTRIB_UNKNOWN);
-
- return GetCustomAttributeLocation( type );
-}
-
-unsigned int Program::RegisterCustomAttribute( const std::string& name )
-{
- unsigned int index = 0;
- // find the value from cache
- for( ;index < mAttributeLocations.size(); ++index )
- {
- if( mAttributeLocations[ index ].first == name )
- {
- // name found so return index
- return index;
- }
- }
- // if we get here, index is one past end so push back the new name
- mAttributeLocations.push_back( std::make_pair( name, ATTRIB_UNKNOWN ) );
- return index;
-}
-
-GLint Program::GetCustomAttributeLocation( unsigned int attributeIndex )
-{
- // debug check that index is within name cache
- DALI_ASSERT_DEBUG( mAttributeLocations.size() > attributeIndex );
-
- // check if we have already queried the location of the attribute
- GLint location = mAttributeLocations[ attributeIndex ].second;
-
- if( location == ATTRIB_UNKNOWN )
- {
- location = CHECK_GL( mGlAbstraction, mGlAbstraction.GetAttribLocation( mProgramId, mAttributeLocations[ attributeIndex ].first.c_str() ) );
-
- mAttributeLocations[ attributeIndex ].second = location;
- LOG_GL( "GetAttributeLocation(program=%d,%s) = %d\n", mProgramId, mAttributeLocations[ attributeIndex ].first.c_str(), mAttributeLocations[ attributeIndex ].second );
- }
-
- return location;
-}
-
-
-unsigned int Program::RegisterUniform( const std::string& name )
-{
- unsigned int index = 0;
- // find the value from cache
- for( ;index < mUniformLocations.size(); ++index )
- {
- if( mUniformLocations[ index ].first == name )
- {
- // name found so return index
- return index;
- }
- }
- // if we get here, index is one past end so push back the new name
- mUniformLocations.push_back( std::make_pair( name, UNIFORM_NOT_QUERIED ) );
- return index;
-}
-
-GLint Program::GetUniformLocation( unsigned int uniformIndex )
-{
- // debug check that index is within name cache
- DALI_ASSERT_DEBUG( mUniformLocations.size() > uniformIndex );
-
- // check if we have already queried the location of the uniform
- GLint location = mUniformLocations[ uniformIndex ].second;
-
- if( location == UNIFORM_NOT_QUERIED )
- {
- location = CHECK_GL( mGlAbstraction, mGlAbstraction.GetUniformLocation( mProgramId, mUniformLocations[ uniformIndex ].first.c_str() ) );
-
- mUniformLocations[ uniformIndex ].second = location;
- LOG_GL( "GetUniformLocation(program=%d,%s) = %d\n", mProgramId, mUniformLocations[ uniformIndex ].first.c_str(), mUniformLocations[ uniformIndex ].second );
- }
-
- return location;
-}
-
-namespace
-{
-/**
- * This struct is used to record the position of a uniform declaration
- * within the fragment shader source code.
- */
-struct LocationPosition
-{
- GLint uniformLocation; ///< The location of the uniform (used as an identifier)
- int position; ///< the position of the uniform declaration
- LocationPosition( GLint uniformLocation, int position )
- : uniformLocation(uniformLocation), position(position)
- {
- }
-};
-
-bool sortByPosition( LocationPosition a, LocationPosition b )
-{
- return a.position < b.position;
-}
-}
-
-void Program::GetActiveSamplerUniforms()
-{
- GLint numberOfActiveUniforms = -1;
- GLint uniformMaxNameLength=-1;
-
- mGlAbstraction.GetProgramiv( mProgramId, GL_ACTIVE_UNIFORMS, &numberOfActiveUniforms );
- mGlAbstraction.GetProgramiv( mProgramId, GL_ACTIVE_UNIFORM_MAX_LENGTH, &uniformMaxNameLength );
-
- std::vector<std::string> samplerNames;
- char name[uniformMaxNameLength+1]; // Allow for null terminator
- std::vector< LocationPosition > samplerUniformLocations;
-
- {
- int nameLength = -1;
- int number = -1;
- GLenum type = GL_ZERO;
-
- for( int i=0; i<numberOfActiveUniforms; ++i )
- {
- mGlAbstraction.GetActiveUniform( mProgramId, static_cast< GLuint >( i ), uniformMaxNameLength,
- &nameLength, &number, &type, name );
-
- if( type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || type == GL_SAMPLER_EXTERNAL_OES )
- {
- GLuint location = mGlAbstraction.GetUniformLocation( mProgramId, name );
- samplerNames.push_back(name);
- samplerUniformLocations.push_back(LocationPosition(location, -1));
- }
- }
- }
-
- //Determine declaration order of each sampler
- char* fragShader = strdup( mProgramData->GetFragmentShader() );
- char* nextPtr = NULL;
- const char* token = strtok_r( fragShader, " ;\n", &nextPtr );
- int samplerPosition = 0;
- while( token )
- {
- if( ( strncmp( token, "sampler2D", 9u ) == 0 ) ||
- ( strncmp( token, "samplerCube", 11u ) == 0 ) ||
- ( strncmp( token, "samplerExternalOES", 18u ) == 0 ) )
- {
- bool found( false );
- token = strtok_r( NULL, " ;\n", &nextPtr );
- for( size_t i=0; i<samplerUniformLocations.size(); ++i )
- {
- if( samplerUniformLocations[i].position == -1 &&
- strncmp( token, samplerNames[i].c_str(), samplerNames[i].size() ) == 0 )
- {
- samplerUniformLocations[i].position = samplerPosition++;
- found = true;
- break;
- }
- }
- if( !found )
- {
- DALI_LOG_ERROR("Sampler uniform %s declared but not used in the shader\n", token );
- }
- }
- else
- {
- token = strtok_r( NULL, " ;\n", &nextPtr );
- }
- }
-
- free( fragShader );
-
- // Re-order according to declaration order in the fragment source.
- size_t samplerUniformCount = samplerUniformLocations.size();
- if( samplerUniformCount > 1 )
- {
- std::sort( samplerUniformLocations.begin(), samplerUniformLocations.end(), sortByPosition);
- }
-
- mSamplerUniformLocations.resize( samplerUniformCount );
- for( size_t i=0; i<samplerUniformCount; ++i )
- {
- mSamplerUniformLocations[i] = samplerUniformLocations[i].uniformLocation;
- }
-}
-
-bool Program::GetSamplerUniformLocation( unsigned int index, GLint& location )
-{
- bool result = false;
- if( index < mSamplerUniformLocations.size() )
- {
- location = mSamplerUniformLocations[index];
- result = true;
- }
- return result;
-}
-
-size_t Program::GetActiveSamplerCount() const
-{
- return mSamplerUniformLocations.size();
-}
-
-void Program::SetUniform1i( GLint location, GLint value0 )
-{
- DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
-
- if( UNIFORM_UNKNOWN == location )
- {
- // From http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml : Notes
- // If location is equal to UNIFORM_UNKNOWN, the data passed in will be silently ignored and the
- // specified uniform variable will not be changed.following opengl silently do nothing
- return;
- }
-
- // check if uniform location fits the cache
- if( location >= MAX_UNIFORM_CACHE_SIZE )
- {
- // not cached, make the gl call
- LOG_GL( "Uniform1i(%d,%d)\n", location, value0 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform1i( location, value0 ) );
- }
- else
- {
- // check if the value is different from what's already been set
- if( value0 != mUniformCacheInt[ location ] )
- {
- // make the gl call
- LOG_GL( "Uniform1i(%d,%d)\n", location, value0 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform1i( location, value0 ) );
- // update cache
- mUniformCacheInt[ location ] = value0;
- }
- }
-}
-
-void Program::SetUniform4i( GLint location, GLint value0, GLint value1, GLint value2, GLint value3 )
-{
- DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
-
- if( UNIFORM_UNKNOWN == location )
- {
- // From http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml : Notes
- // If location is equal to UNIFORM_UNKNOWN, the data passed in will be silently ignored and the
- // specified uniform variable will not be changed.following opengl silently do nothing
- return;
- }
-
- // Not caching these as based on current analysis this is not called that often by our shaders
- LOG_GL( "Uniform4i(%d,%d,%d,%d,%d)\n", location, value0, value1, value2, value3 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform4i( location, value0, value1, value2, value3 ) );
-}
-
-void Program::SetUniform1f( GLint location, GLfloat value0 )
-{
- DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
-
- if( UNIFORM_UNKNOWN == location )
- {
- // From http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml : Notes
- // If location is equal to UNIFORM_UNKNOWN, the data passed in will be silently ignored and the
- // specified uniform variable will not be changed.following opengl silently do nothing
- return;
- }
-
- // check if uniform location fits the cache
- if( location >= MAX_UNIFORM_CACHE_SIZE )
- {
- // not cached, make the gl call
- LOG_GL( "Uniform1f(%d,%f)\n", location, value0 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform1f( location, value0 ) );
- }
- else
- {
- // check if the same value has already been set, reset if it is different
- if( ( fabsf(value0 - mUniformCacheFloat[ location ]) >= Math::MACHINE_EPSILON_1 ) )
- {
- // make the gl call
- LOG_GL( "Uniform1f(%d,%f)\n", location, value0 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform1f( location, value0 ) );
-
- // update cache
- mUniformCacheFloat[ location ] = value0;
- }
- }
-}
-
-void Program::SetUniform2f( GLint location, GLfloat value0, GLfloat value1 )
-{
- DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
-
- if( UNIFORM_UNKNOWN == location )
- {
- // From http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml : Notes
- // If location is equal to UNIFORM_UNKNOWN, the data passed in will be silently ignored and the
- // specified uniform variable will not be changed.following opengl silently do nothing
- return;
- }
-
- // check if uniform location fits the cache
- if( location >= MAX_UNIFORM_CACHE_SIZE )
- {
- // not cached, make the gl call
- LOG_GL( "Uniform2f(%d,%f,%f)\n", location, value0, value1 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform2f( location, value0, value1 ) );
- }
- else
- {
- // check if the same value has already been set, reset if it is different
- if( ( fabsf(value0 - mUniformCacheFloat2[ location ][ 0 ]) >= Math::MACHINE_EPSILON_1 )||
- ( fabsf(value1 - mUniformCacheFloat2[ location ][ 1 ]) >= Math::MACHINE_EPSILON_1 ) )
- {
- // make the gl call
- LOG_GL( "Uniform2f(%d,%f,%f)\n", location, value0, value1 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform2f( location, value0, value1 ) );
-
- // update cache
- mUniformCacheFloat2[ location ][ 0 ] = value0;
- mUniformCacheFloat2[ location ][ 1 ] = value1;
- }
- }
-}
-
-void Program::SetSizeUniform3f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2 )
-{
- if( ( fabsf(value0 - mSizeUniformCache.x) >= Math::MACHINE_EPSILON_1 )||
- ( fabsf(value1 - mSizeUniformCache.y) >= Math::MACHINE_EPSILON_1 )||
- ( fabsf(value2 - mSizeUniformCache.z) >= Math::MACHINE_EPSILON_1 ) )
- {
- mSizeUniformCache.x = value0;
- mSizeUniformCache.y = value1;
- mSizeUniformCache.z = value2;
- SetUniform3f( location, value0, value1, value2 );
- }
-}
-
-void Program::SetUniform3f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2 )
-{
- DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
-
- if( UNIFORM_UNKNOWN == location )
- {
- // From http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml : Notes
- // If location is equal to UNIFORM_UNKNOWN, the data passed in will be silently ignored and the
- // specified uniform variable will not be changed.following opengl silently do nothing
- return;
- }
-
- // Not caching these as based on current analysis this is not called that often by our shaders
- LOG_GL( "Uniform3f(%d,%f,%f,%f)\n", location, value0, value1, value2 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform3f( location, value0, value1, value2 ) );
-}
-
-void Program::SetUniform4f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2, GLfloat value3 )
-{
- DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
-
- if( UNIFORM_UNKNOWN == location )
- {
- // From http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml : Notes
- // If location is equal to UNIFORM_UNKNOWN, the data passed in will be silently ignored and the
- // specified uniform variable will not be changed.following opengl silently do nothing
- return;
- }
-
- // check if uniform location fits the cache
- if( location >= MAX_UNIFORM_CACHE_SIZE )
- {
- // not cached, make the gl call
- LOG_GL( "Uniform4f(%d,%f,%f,%f,%f)\n", location, value0, value1, value2, value3 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform4f( location, value0, value1, value2, value3 ) );
- }
- else
- {
- // check if the same value has already been set, reset if any component is different
- // checking index 3 first because we're often animating alpha (rgba)
- if( ( fabsf(value3 - mUniformCacheFloat4[ location ][ 3 ]) >= Math::MACHINE_EPSILON_1 )||
- ( fabsf(value0 - mUniformCacheFloat4[ location ][ 0 ]) >= Math::MACHINE_EPSILON_1 )||
- ( fabsf(value1 - mUniformCacheFloat4[ location ][ 1 ]) >= Math::MACHINE_EPSILON_1 )||
- ( fabsf(value2 - mUniformCacheFloat4[ location ][ 2 ]) >= Math::MACHINE_EPSILON_1 ) )
- {
- // make the gl call
- LOG_GL( "Uniform4f(%d,%f,%f,%f,%f)\n", location, value0, value1, value2, value3 );
- CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform4f( location, value0, value1, value2, value3 ) );
- // update cache
- mUniformCacheFloat4[ location ][ 0 ] = value0;
- mUniformCacheFloat4[ location ][ 1 ] = value1;
- mUniformCacheFloat4[ location ][ 2 ] = value2;
- mUniformCacheFloat4[ location ][ 3 ] = value3;
- }
- }
-}
-
-void Program::SetUniformMatrix4fv( GLint location, GLsizei count, const GLfloat* value )
-{
- DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
-
- if( UNIFORM_UNKNOWN == location )
- {
- // From http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml : Notes
- // If location is equal to UNIFORM_UNKNOWN, the data passed in will be silently ignored and the
- // specified uniform variable will not be changed.following opengl silently do nothing
- return;
- }
-
- // Not caching these calls. Based on current analysis this is called very often
- // but with different values (we're using this for MVP matrices)
- // NOTE! we never want driver or GPU to transpose
- LOG_GL( "UniformMatrix4fv(%d,%d,GL_FALSE,%x)\n", location, count, value );
- CHECK_GL( mGlAbstraction, mGlAbstraction.UniformMatrix4fv( location, count, GL_FALSE, value ) );
-}
-
-void Program::SetUniformMatrix3fv( GLint location, GLsizei count, const GLfloat* value )
-{
- DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
-
- if( UNIFORM_UNKNOWN == location )
- {
- // From http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml : Notes
- // If location is equal to UNIFORM_UNKNOWN, the data passed in will be silently ignored and the
- // specified uniform variable will not be changed.following opengl silently do nothing
- return;
- }
-
-
- // Not caching these calls. Based on current analysis this is called very often
- // but with different values (we're using this for MVP matrices)
- // NOTE! we never want driver or GPU to transpose
- LOG_GL( "UniformMatrix3fv(%d,%d,GL_FALSE,%x)\n", location, count, value );
- CHECK_GL( mGlAbstraction, mGlAbstraction.UniformMatrix3fv( location, count, GL_FALSE, value ) );
-}
-
-void Program::GlContextCreated()
-{
-}
-
-void Program::GlContextDestroyed()
-{
- mLinked = false;
- mVertexShaderId = 0;
- mFragmentShaderId = 0;
- mProgramId = 0;
-
- ResetAttribsUniformCache();
-}
-
-bool Program::ModifiesGeometry()
-{
- return mModifiesGeometry;
-}
-
-Program::Program( ProgramCache& cache, Internal::ShaderDataPtr shaderData, bool modifiesGeometry )
-: mCache( cache ),
- mGlAbstraction( mCache.GetGlAbstraction() ),
- mProjectionMatrix( NULL ),
- mViewMatrix( NULL ),
- mLinked( false ),
- mVertexShaderId( 0 ),
- mFragmentShaderId( 0 ),
- mProgramId( 0 ),
- mProgramData(shaderData),
- mModifiesGeometry( modifiesGeometry )
-{
- // reserve space for standard attributes
- mAttributeLocations.reserve( ATTRIB_TYPE_LAST );
- for( int i=0; i<ATTRIB_TYPE_LAST; ++i )
- {
- RegisterCustomAttribute( gStdAttribs[i] );
- }
-
- // reserve space for standard uniforms
- mUniformLocations.reserve( UNIFORM_TYPE_LAST );
- // reset built in uniform names in cache
- for( int i = 0; i < UNIFORM_TYPE_LAST; ++i )
- {
- RegisterUniform( gStdUniforms[ i ] );
- }
-
- // reset values
- ResetAttribsUniformCache();
-}
-
-Program::~Program()
-{
- Unload();
-}
-
-void Program::Load()
-{
- DALI_ASSERT_ALWAYS( NULL != mProgramData.Get() && "Program data is not initialized" );
- DALI_ASSERT_DEBUG( mProgramId == 0 && "mProgramId != 0, so about to leak a GL resource by overwriting it." );
-
- LOG_GL( "CreateProgram()\n" );
- mProgramId = CHECK_GL( mGlAbstraction, mGlAbstraction.CreateProgram() );
-
- GLint linked = GL_FALSE;
-
- const bool binariesSupported = mCache.IsBinarySupported();
-
- // if shader binaries are supported and ShaderData contains compiled bytecode?
- if( binariesSupported && mProgramData->HasBinary() )
- {
- DALI_LOG_INFO(Debug::Filter::gShader, Debug::General, "Program::Load() - Using Compiled Shader, Size = %d\n", mProgramData->GetBufferSize());
-
- CHECK_GL( mGlAbstraction, mGlAbstraction.ProgramBinary(mProgramId, mCache.ProgramBinaryFormat(), mProgramData->GetBufferData(), mProgramData->GetBufferSize()) );
-
- CHECK_GL( mGlAbstraction, mGlAbstraction.ValidateProgram(mProgramId) );
-
- GLint success;
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetProgramiv( mProgramId, GL_VALIDATE_STATUS, &success ) );
-
- DALI_LOG_INFO(Debug::Filter::gShader, Debug::General, "ValidateProgram Status = %d\n", success);
-
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetProgramiv( mProgramId, GL_LINK_STATUS, &linked ) );
-
- if( GL_FALSE == linked )
- {
- DALI_LOG_ERROR("Failed to load program binary \n");
-
- GLint nLength;
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetProgramiv( mProgramId, GL_INFO_LOG_LENGTH, &nLength) );
- if(nLength > 0)
- {
- Dali::Vector< char > szLog;
- szLog.Reserve( nLength ); // Don't call Resize as we don't want to initialise the data, just reserve a buffer
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetProgramInfoLog( mProgramId, nLength, &nLength, szLog.Begin() ) );
- DALI_LOG_ERROR( "Program Link Error: %s\n", szLog.Begin() );
- }
- }
- else
- {
- mLinked = true;
- DALI_LOG_INFO( Debug::Filter::gShader, Debug::General, "Reused binary.\n" );
- }
- }
-
- // Fall back to compiling and linking the vertex and fragment sources
- if( GL_FALSE == linked )
- {
- DALI_LOG_INFO(Debug::Filter::gShader, Debug::General, "Program::Load() - Runtime compilation\n");
- if( CompileShader( GL_VERTEX_SHADER, mVertexShaderId, mProgramData->GetVertexShader() ) )
- {
- if( CompileShader( GL_FRAGMENT_SHADER, mFragmentShaderId, mProgramData->GetFragmentShader() ) )
- {
- Link();
-
- if( binariesSupported && mLinked )
- {
- GLint binaryLength = 0;
- GLenum binaryFormat;
- DALI_LOG_INFO( Debug::Filter::gShader, Debug::General, "Compiled and linked.\n\nVS:\n%s\nFS:\n%s\n", mProgramData->GetVertexShader(), mProgramData->GetFragmentShader() );
-
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetProgramiv(mProgramId, GL_PROGRAM_BINARY_LENGTH_OES, &binaryLength) );
- DALI_LOG_INFO(Debug::Filter::gShader, Debug::General, "Program::Load() - GL_PROGRAM_BINARY_LENGTH_OES: %d\n", binaryLength);
- if( binaryLength > 0 )
- {
- // Allocate space for the bytecode in ShaderData
- mProgramData->AllocateBuffer(binaryLength);
- // Copy the bytecode to ShaderData
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetProgramBinary(mProgramId, binaryLength, NULL, &binaryFormat, mProgramData->GetBufferData()) );
- mCache.StoreBinary( mProgramData );
- DALI_LOG_INFO( Debug::Filter::gShader, Debug::General, "Saved binary.\n" );
- }
- }
- }
- }
- }
-
- GetActiveSamplerUniforms();
-
- // No longer needed
- FreeShaders();
-}
-
-void Program::Unload()
-{
- FreeShaders();
-
- if( this == mCache.GetCurrentProgram() )
- {
- CHECK_GL( mGlAbstraction, mGlAbstraction.UseProgram(0) );
-
- mCache.SetCurrentProgram( NULL );
- }
-
- if (mProgramId)
- {
- LOG_GL( "DeleteProgram(%d)\n", mProgramId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteProgram( mProgramId ) );
- mProgramId = 0;
- }
-
- mLinked = false;
-
-}
-
-bool Program::CompileShader( GLenum shaderType, GLuint& shaderId, const char* src )
-{
- if (!shaderId)
- {
- LOG_GL( "CreateShader(%d)\n", shaderType );
- shaderId = CHECK_GL( mGlAbstraction, mGlAbstraction.CreateShader( shaderType ) );
- LOG_GL( "AttachShader(%d,%d)\n", mProgramId, shaderId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.AttachShader( mProgramId, shaderId ) );
- }
-
- LOG_GL( "ShaderSource(%d)\n", shaderId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.ShaderSource(shaderId, 1, &src, NULL ) );
-
- LOG_GL( "CompileShader(%d)\n", shaderId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.CompileShader( shaderId ) );
-
- GLint compiled;
- LOG_GL( "GetShaderiv(%d)\n", shaderId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetShaderiv( shaderId, GL_COMPILE_STATUS, &compiled ) );
-
- if (compiled == GL_FALSE)
- {
- DALI_LOG_ERROR("Failed to compile shader\n");
- LogWithLineNumbers(src);
-
- GLint nLength;
- mGlAbstraction.GetShaderiv( shaderId, GL_INFO_LOG_LENGTH, &nLength);
- if(nLength > 0)
- {
- Dali::Vector< char > szLog;
- szLog.Reserve( nLength ); // Don't call Resize as we don't want to initialise the data, just reserve a buffer
- mGlAbstraction.GetShaderInfoLog( shaderId, nLength, &nLength, szLog.Begin() );
- DALI_LOG_ERROR( "Shader Compiler Error: %s\n", szLog.Begin() );
- }
-
- DALI_ASSERT_ALWAYS( 0 && "Shader compilation failure" );
- }
-
- return compiled != 0;
-}
-
-void Program::Link()
-{
- LOG_GL( "LinkProgram(%d)\n", mProgramId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.LinkProgram( mProgramId ) );
-
- GLint linked;
- LOG_GL( "GetProgramiv(%d)\n", mProgramId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.GetProgramiv( mProgramId, GL_LINK_STATUS, &linked ) );
-
- if (linked == GL_FALSE)
- {
- DALI_LOG_ERROR("Shader failed to link \n");
-
- GLint nLength;
- mGlAbstraction.GetProgramiv( mProgramId, GL_INFO_LOG_LENGTH, &nLength);
- if(nLength > 0)
- {
- Dali::Vector< char > szLog;
- szLog.Reserve( nLength ); // Don't call Resize as we don't want to initialise the data, just reserve a buffer
- mGlAbstraction.GetProgramInfoLog( mProgramId, nLength, &nLength, szLog.Begin() );
- DALI_LOG_ERROR( "Shader Link Error: %s\n", szLog.Begin() );
- }
-
- DALI_ASSERT_ALWAYS( 0 && "Shader linking failure" );
- }
-
- mLinked = linked != GL_FALSE;
-}
-
-void Program::FreeShaders()
-{
- if (mVertexShaderId)
- {
- LOG_GL( "DeleteShader(%d)\n", mVertexShaderId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.DetachShader( mProgramId, mVertexShaderId ) );
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteShader( mVertexShaderId ) );
- mVertexShaderId = 0;
- }
-
- if (mFragmentShaderId)
- {
- LOG_GL( "DeleteShader(%d)\n", mFragmentShaderId );
- CHECK_GL( mGlAbstraction, mGlAbstraction.DetachShader( mProgramId, mFragmentShaderId ) );
- CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteShader( mFragmentShaderId ) );
- mFragmentShaderId = 0;
- }
-}
-
-void Program::ResetAttribsUniformCache()
-{
- // reset attribute locations
- for( unsigned i = 0; i < mAttributeLocations.size() ; ++i )
- {
- mAttributeLocations[ i ].second = ATTRIB_UNKNOWN;
- }
-
- // reset all gl uniform locations
- for( unsigned int i = 0; i < mUniformLocations.size(); ++i )
- {
- // reset gl program locations and names
- mUniformLocations[ i ].second = UNIFORM_NOT_QUERIED;
- }
-
- mSamplerUniformLocations.clear();
-
- // reset uniform caches
- mSizeUniformCache.x = mSizeUniformCache.y = mSizeUniformCache.z = 0.f;
-
- for( int i = 0; i < MAX_UNIFORM_CACHE_SIZE; ++i )
- {
- // GL initializes uniforms to 0
- mUniformCacheInt[ i ] = 0;
- mUniformCacheFloat[ i ] = 0.0f;
- mUniformCacheFloat2[ i ][ 0 ] = 0.0f;
- mUniformCacheFloat2[ i ][ 1 ] = 0.0f;
- mUniformCacheFloat4[ i ][ 0 ] = 0.0f;
- mUniformCacheFloat4[ i ][ 1 ] = 0.0f;
- mUniformCacheFloat4[ i ][ 2 ] = 0.0f;
- mUniformCacheFloat4[ i ][ 3 ] = 0.0f;
- }
-}
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_PROGRAM_H__
-#define __DALI_INTERNAL_PROGRAM_H__
-
-/*
- * Copyright (c) 2016 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// EXTERNAL INCLUDES
-#include <string>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/common/vector-wrapper.h>
-#include <dali/public-api/object/ref-object.h>
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/internal/common/shader-data.h>
-
-namespace Dali
-{
-
-class Matrix;
-
-namespace Integration
-{
-class GlAbstraction;
-class ShaderData;
-}
-
-namespace Internal
-{
-
-class ProgramCache;
-
-/*
- * A program contains a vertex & fragment shader.
- *
- * A program will contain vertex attributes and uniform variables.
- *
- * uColor is set to the value specified by Actor::SetColor and is
- * animatable through the property Actor::COLOR
- */
-class Program
-{
-public:
-
- /**
- * Size of the uniform cache per program
- * GLES specification states that minimum uniform count for fragment shader
- * is 16 and for vertex shader 128. We're caching the 16 common ones for now
- */
- static const int MAX_UNIFORM_CACHE_SIZE = 16;
-
- /**
- * Constant for uniform / attribute not found
- */
- static const int NOT_FOUND = -1;
-
- /**
- * Vertex attributes
- */
- enum AttribType
- {
- ATTRIB_UNKNOWN = -1,
- ATTRIB_POSITION,
- ATTRIB_TEXCOORD,
- ATTRIB_TYPE_LAST
- };
-
- /**
- * Common shader uniform names
- */
- enum UniformType
- {
- UNIFORM_NOT_QUERIED = -2,
- UNIFORM_UNKNOWN = -1,
- UNIFORM_MVP_MATRIX,
- UNIFORM_MODELVIEW_MATRIX,
- UNIFORM_PROJECTION_MATRIX,
- UNIFORM_MODEL_MATRIX,
- UNIFORM_VIEW_MATRIX,
- UNIFORM_NORMAL_MATRIX,
- UNIFORM_COLOR,
- UNIFORM_SAMPLER,
- UNIFORM_SAMPLER_RECT,
- UNIFORM_EFFECT_SAMPLER,
-
- UNIFORM_SIZE,
- UNIFORM_TYPE_LAST
- };
-
- /**
- * Creates a new program, or returns a copy of an existing program in the program cache
- * @param[in] cache where the programs are stored
- * @param[in] shaderData A pointer to a data structure containing the program source
- * and optionally precompiled binary. If the binary is empty the program bytecode
- * is copied into it after compilation and linking)
- * @param[in] modifiesGeometry True if the shader modifies geometry
- * @return pointer to the program
- */
- static Program* New( ProgramCache& cache, Internal::ShaderDataPtr shaderData, bool modifiesGeometry );
-
- /**
- * Takes this program into use
- */
- void Use();
-
- /**
- * @return true if this program is used currently
- */
- bool IsUsed();
-
- /**
- * @param [in] type of the attribute
- * @return the index of the attribute
- */
- GLint GetAttribLocation( AttribType type );
-
- /**
- * Register an attribute name in our local cache
- * @param [in] name attribute name
- * @return the index of the attribute name in local cache
- */
- unsigned int RegisterCustomAttribute( const std::string& name );
-
- /**
- * Gets the location of a pre-registered attribute.
- * @param [in] attributeIndex of the attribute in local cache
- * @return the index of the attribute in the GL program
- */
- GLint GetCustomAttributeLocation( unsigned int attributeIndex );
-
- /**
- * Register a uniform name in our local cache
- * @param [in] name uniform name
- * @return the index of the uniform name in local cache
- */
- unsigned int RegisterUniform( const std::string& name );
-
- /**
- * Gets the location of a pre-registered uniform.
- * Uniforms in list UniformType are always registered and in the order of the enumeration
- * @param [in] uniformIndex of the uniform in local cache
- * @return the index of the uniform in the GL program
- */
- GLint GetUniformLocation( unsigned int uniformIndex );
-
- /**
- * Introspect the newly loaded shader to get the active sampler locations
- */
- void GetActiveSamplerUniforms();
-
- /**
- * Gets the uniform location for a sampler
- * @param [in] index The index of the active sampler
- * @param [out] location The location of the requested sampler
- * @return true if the active sampler was found
- */
- bool GetSamplerUniformLocation( unsigned int index, GLint& location );
-
- /**
- * Get the number of active samplers present in the shader
- * @return The number of active samplers
- */
- size_t GetActiveSamplerCount() const;
-
- /**
- * Sets the uniform value
- * @param [in] location of uniform
- * @param [in] value0 as int
- */
- void SetUniform1i( GLint location, GLint value0 );
-
- /**
- * Sets the uniform value
- * @param [in] location of uniform
- * @param [in] value0 as int
- * @param [in] value1 as int
- * @param [in] value2 as int
- * @param [in] value3 as int
- */
- void SetUniform4i( GLint location, GLint value0, GLint value1, GLint value2, GLint value3 );
-
- /**
- * Sets the uniform value
- * @param [in] location of uniform
- * @param [in] value0 as float
- */
- void SetUniform1f( GLint location, GLfloat value0 );
-
- /**
- * Sets the uniform value
- * @param [in] location of uniform
- * @param [in] value0 as float
- * @param [in] value1 as float
- */
- void SetUniform2f( GLint location, GLfloat value0, GLfloat value1 );
-
- /**
- * Special handling for size as we're using uniform geometry so size is passed on to most programs
- * but it rarely changes so we can cache it
- * @param [in] location of uniform
- * @param [in] value0 as float
- * @param [in] value1 as float
- * @param [in] value2 as float
- */
- void SetSizeUniform3f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2 );
-
- /**
- * Sets the uniform value
- * @param [in] location of uniform
- * @param [in] value0 as float
- * @param [in] value1 as float
- * @param [in] value2 as float
- */
- void SetUniform3f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2 );
-
- /**
- * Sets the uniform value
- * @param [in] location of uniform
- * @param [in] value0 as float
- * @param [in] value1 as float
- * @param [in] value2 as float
- * @param [in] value3 as float
- */
- void SetUniform4f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2, GLfloat value3 );
-
- /**
- * Sets the uniform value as matrix. NOTE! we never want GPU to transpose
- * so make sure your matrix is in correct order for GL.
- * @param [in] location Location of uniform
- * @param [in] count Count of matrices
- * @param [in] value values as float pointers
- */
- void SetUniformMatrix4fv( GLint location, GLsizei count, const GLfloat* value );
-
- /**
- * Sets the uniform value as matrix. NOTE! we never want GPU to transpose
- * so make sure your matrix is in correct order for GL.
- * @param [in] location Location of uniform
- * @param [in] count Count of matrices
- * @param [in] value values as float pointers
- */
- void SetUniformMatrix3fv( GLint location, GLsizei count, const GLfloat* value );
-
- /**
- * Needs to be called when GL context is (re)created
- */
- void GlContextCreated();
-
- /**
- * Needs to be called when GL context is destroyed
- */
- void GlContextDestroyed();
-
- /**
- * @return true if this program modifies geometry
- */
- bool ModifiesGeometry();
-
- /**
- * Set the projection matrix that has currently been sent
- * @param matrix to set
- */
- void SetProjectionMatrix( const Matrix* matrix )
- {
- mProjectionMatrix = matrix;
- }
-
- /**
- * Get the projection matrix that has currently been sent
- * @return the matrix that is set
- */
- const Matrix* GetProjectionMatrix()
- {
- return mProjectionMatrix;
- }
-
- /**
- * Set the projection matrix that has currently been sent
- * @param matrix to set
- */
- void SetViewMatrix( const Matrix* matrix )
- {
- mViewMatrix = matrix;
- }
-
- /**
- * Get the projection matrix that has currently been sent
- * @return the matrix that is set
- */
- const Matrix* GetViewMatrix()
- {
- return mViewMatrix;
- }
-
-private: // Implementation
-
- /**
- * Constructor, private so no direct instantiation
- * @param[in] cache where the programs are stored
- * @param[in] shaderData A smart pointer to a data structure containing the program source and binary
- * @param[in] modifiesGeometry True if the vertex shader changes geometry
- */
- Program( ProgramCache& cache, Internal::ShaderDataPtr shaderData, bool modifiesGeometry );
-
-public:
-
- /**
- * Destructor, non virtual as no virtual methods or inheritance
- */
- ~Program();
-
-private:
-
- Program(); ///< default constructor, not defined
- Program( const Program& ); ///< copy constructor, not defined
- Program& operator=( const Program& ); ///< assignment operator, not defined
-
- /**
- * Load the shader, from a precompiled binary if available, else from source code
- */
- void Load();
-
- /**
- * Unload the shader
- */
- void Unload();
-
- /**
- * Compile the shader
- * @param shaderType vertex or fragment shader
- * @param shaderId of the shader, returned
- * @param src of the shader
- * @return true if the compilation succeeded
- */
- bool CompileShader(GLenum shaderType, GLuint& shaderId, const char* src);
-
- /**
- * Links the shaders together to create program
- */
- void Link();
-
- /**
- * Frees the shader programs
- */
- void FreeShaders();
-
- /**
- * Resets caches
- */
- void ResetAttribsUniformCache();
-
-private: // Data
-
- ProgramCache& mCache; ///< The program cache
- Integration::GlAbstraction& mGlAbstraction; ///< The OpenGL Abstraction layer
- const Matrix* mProjectionMatrix; ///< currently set projection matrix
- const Matrix* mViewMatrix; ///< currently set view matrix
- bool mLinked; ///< whether the program is linked
- GLuint mVertexShaderId; ///< GL identifier for vertex shader
- GLuint mFragmentShaderId; ///< GL identifier for fragment shader
- GLuint mProgramId; ///< GL identifier for program
- Internal::ShaderDataPtr mProgramData; ///< Shader program source and binary (when compiled & linked or loaded)
-
- // location caches
- typedef std::pair< std::string, GLint > NameLocationPair;
- typedef std::vector< NameLocationPair > Locations;
-
- Locations mAttributeLocations; ///< attribute location cache
- Locations mUniformLocations; ///< uniform location cache
- std::vector<GLint> mSamplerUniformLocations; ///< sampler uniform location cache
-
- // uniform value caching
- GLint mUniformCacheInt[ MAX_UNIFORM_CACHE_SIZE ]; ///< Value cache for uniforms of single int
- GLfloat mUniformCacheFloat[ MAX_UNIFORM_CACHE_SIZE ]; ///< Value cache for uniforms of single float
- GLfloat mUniformCacheFloat2[ MAX_UNIFORM_CACHE_SIZE ][2]; ///< Value cache for uniforms of two floats
- GLfloat mUniformCacheFloat4[ MAX_UNIFORM_CACHE_SIZE ][4]; ///< Value cache for uniforms of four floats
- Vector3 mSizeUniformCache; ///< Cache value for size uniform
- bool mModifiesGeometry; ///< True if the program changes geometry
-
-};
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_PROGRAM_H__
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/render/shaders/scene-graph-shader.h>
-
-// INTERNAL INCLUDES
-#include <dali/integration-api/debug.h>
-#include <dali/internal/render/queue/render-queue.h>
-#include <dali/internal/render/common/render-debug.h>
-#include <dali/internal/render/shaders/program.h>
-#include <dali/internal/common/image-sampler.h>
-
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace SceneGraph
-{
-
-Shader::Shader( Dali::Shader::Hint::Value& hints )
-: mHints( hints ),
- mProgram( NULL ),
- mConnectionObservers(),
- mGfxShader( nullptr )
-{
- AddUniformMapObserver( *this );
-}
-
-Shader::~Shader()
-{
- mConnectionObservers.Destroy( *this );
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// The following methods are called during RenderManager::Render()
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void Shader::SetProgram( Internal::ShaderDataPtr shaderData,
- ProgramCache* programCache,
- bool modifiesGeometry )
-{
- DALI_LOG_TRACE_METHOD_FMT( Debug::Filter::gShader, "%d\n", shaderData->GetHashValue() );
-
- mProgram = Program::New( *programCache, shaderData, modifiesGeometry );
- // The program cache owns the Program object so we don't need to worry about this raw allocation here.
-
- mConnectionObservers.ConnectionsChanged(*this);
-}
-
-void Shader::SetGfxObject( const Graphics::API::Accessor<Graphics::API::Shader>& shader )
-{
- mGfxShader = shader;
-}
-
-Graphics::API::Accessor<Graphics::API::Shader>& Shader::GetGfxObject()
-{
- return mGfxShader;
-}
-
-Program* Shader::GetProgram()
-{
- return mProgram;
-}
-
-void Shader::AddConnectionObserver( ConnectionChangePropagator::Observer& observer )
-{
- mConnectionObservers.Add(observer);
-}
-
-void Shader::RemoveConnectionObserver( ConnectionChangePropagator::Observer& observer )
-{
- mConnectionObservers.Remove(observer);
-}
-
-void Shader::UniformMappingsChanged( const UniformMap& mappings )
-{
- // Our uniform map, or that of one of the watched children has changed.
- // Inform connected observers.
- mConnectionObservers.ConnectedUniformMapChanged();
-}
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/internal/common/memory-pool-object-allocator.h>
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
#include <dali/public-api/math/math-utils.h>
namespace //Unnamed namespace
{
#define __DALI_INTERNAL_SCENE_GRAPH_CONSTRAINT_H__
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/update/common/animatable-property.h>
#include <dali/internal/update/common/property-owner.h>
#include <dali/internal/update/animation/scene-graph-constraint-base.h>
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
namespace Dali
{
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/update/common/discard-queue.h>
// INTERNAL INCLUDES
-#include <dali/internal/render/gl-resources/gl-resource-owner.h>
#include <dali/internal/common/message.h>
#include <dali/internal/update/nodes/node.h>
-#include <dali/internal/render/queue/render-queue.h>
-#include <dali/internal/render/renderers/render-renderer.h>
-#include <dali/internal/render/shaders/scene-graph-shader.h>
+#include <dali/internal/update/rendering/scene-graph-shader.h>
#include <dali/internal/update/render-tasks/scene-graph-camera.h>
namespace Dali
namespace SceneGraph
{
-DiscardQueue::DiscardQueue( RenderQueue& renderQueue )
-: mRenderQueue( renderQueue ),
- mNodeQueue(),
+DiscardQueue::DiscardQueue()
+: mNodeQueue(),
mShaderQueue(),
mRendererQueue(),
mCameraQueue()
#define __DALI_INTERNAL_DISCARD_QUEUE_H__
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
namespace SceneGraph
{
-class RenderQueue;
class Shader;
class Camera;
/**
* Create a new DiscardQueue.
- * @param[in] renderQueue Used to send GL clean-up messages for the next Render.
*/
- DiscardQueue( RenderQueue& renderQueue );
+ DiscardQueue();
/**
* Non-virtual destructor; DiscardQueue is not suitable as a base class.
private:
- RenderQueue& mRenderQueue; ///< Used to send GL clean-up messages for the next Render.
+ //RenderQueue& mRenderQueue; ///< Used to send GL clean-up messages for the next Render.
// Messages are queued here following the current update buffer number
OwnerContainer< Node* > mNodeQueue[2];
+++ /dev/null
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include <dali/internal/update/controllers/render-message-dispatcher.h>
-
-// INTERNAL INCLUDES
-#include <dali/internal/render/common/render-manager.h>
-#include <dali/internal/render/queue/render-queue.h>
-#include <dali/internal/render/renderers/render-renderer.h>
-#include <dali/internal/common/message.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-
-namespace SceneGraph
-{
-
-RenderMessageDispatcher::RenderMessageDispatcher( RenderManager& renderManager, RenderQueue& renderQueue, const SceneGraphBuffers& buffers )
-: mRenderManager( renderManager ),
- mRenderQueue( renderQueue ),
- mBuffers( buffers )
-{
-}
-
-RenderMessageDispatcher::~RenderMessageDispatcher()
-{
-}
-
-void RenderMessageDispatcher::AddRenderer( OwnerPointer< Render::Renderer >& renderer )
-{
- // Message has ownership of renderer while in transit from update -> render
- typedef MessageValue1< RenderManager, OwnerPointer< Render::Renderer > > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mRenderManager, &RenderManager::AddRenderer, renderer );
-}
-
-void RenderMessageDispatcher::RemoveRenderer( Render::Renderer& renderer )
-{
- typedef MessageValue1< RenderManager, Render::Renderer* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mRenderManager, &RenderManager::RemoveRenderer, &renderer );
-}
-
-void RenderMessageDispatcher::AddRenderTracker( Render::RenderTracker& renderTracker )
-{
- typedef MessageValue1< RenderManager, Render::RenderTracker* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mRenderManager, &RenderManager::AddRenderTracker, &renderTracker );
-}
-
-void RenderMessageDispatcher::RemoveRenderTracker( Render::RenderTracker& renderTracker )
-{
- typedef MessageValue1< RenderManager, Render::RenderTracker* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mRenderManager, &RenderManager::RemoveRenderTracker, &renderTracker );
-}
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_INTERNAL_SCENE_GRAPH_RENDER_MESSAGE_DISPATCHER_H__
-#define __DALI_INTERNAL_SCENE_GRAPH_RENDER_MESSAGE_DISPATCHER_H__
-
-/*
- * Copyright (c) 2017 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// INTERNAL INCLUDES
-#include <dali/internal/update/common/scene-graph-buffers.h>
-#include <dali/internal/render/gl-resources/gpu-buffer.h>
-#include <dali/internal/render/renderers/render-renderer.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
-
-namespace Dali
-{
-
-namespace Internal
-{
-class MessageBase;
-
-namespace Render
-{
-class RenderTracker;
-}
-namespace SceneGraph
-{
-
-class RenderManager;
-class RenderQueue;
-class PropertyBufferDataProvider;
-/**
- * A utility class for sending messages to the render-thread.
- */
-class RenderMessageDispatcher
-{
-public:
-
- /**
- * Constructor
- */
- RenderMessageDispatcher( RenderManager& renderManager, RenderQueue& renderQueue, const SceneGraphBuffers& buffers );
-
- /**
- * Destructor
- */
- virtual ~RenderMessageDispatcher();
-
- /**
- * Add a Renderer.
- * @param[in] renderer The renderer to add.
- * @post renderer ownership is transferred.
- */
- void AddRenderer( OwnerPointer< Render::Renderer >& renderer );
-
- /**
- * Remove a Renderer.
- * @param[in] renderer The renderer to remove.
- * @post renderer will be destroyed in the next Render.
- */
- void RemoveRenderer( Render::Renderer& renderer );
-
- /**
- * Add a Render tracker.
- * @param[in] renderTracker The render tracker to add.
- * @post ownership is transferred
- */
- void AddRenderTracker( Render::RenderTracker& renderTracker );
-
- /**
- * Remove a Render tracker.
- * @param[in] renderTracker The render tracker to add.
- * @post render tracker will be destroyed in the next Render pass.
- */
- void RemoveRenderTracker( Render::RenderTracker& renderTracker );
-
-private:
-
- RenderManager& mRenderManager;
- RenderQueue& mRenderQueue;
-
- const SceneGraphBuffers& mBuffers;
-};
-
-} // namespace SceneGraph
-
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // __DALI_INTERNAL_SCENE_GRAPH_RENDERER_DISPATCHER_H__
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
namespace SceneGraph
{
-SceneControllerImpl::SceneControllerImpl( RenderMessageDispatcher& renderMessageDispatcher,
- RenderQueue& renderQueue,
- DiscardQueue& discardQueue )
-: mRenderMessageDispatcher( renderMessageDispatcher ),
- mRenderQueue( renderQueue ),
- mDiscardQueue( discardQueue )
+SceneControllerImpl::SceneControllerImpl( DiscardQueue& discardQueue )
+: mDiscardQueue( discardQueue )
{
}
#define __DALI_INTERNAL_SCENE_GRAPH_SCENE_CONTROLLER_IMPL_H__
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
/**
* Constructor
- * @param[in] rendererDispatcher Used for passing ownership of renderers to the render-thread.
- * @param[in] renderQueue The renderQueue
* @param[in] discardQueue The discardQueue
*/
- SceneControllerImpl( RenderMessageDispatcher& renderMessageDispatcher,
- RenderQueue& renderQueue,
- DiscardQueue& discardQueue );
+ SceneControllerImpl( DiscardQueue& discardQueue );
/**
* Destructor
public: // from SceneController
/**
- * @copydoc SceneController::GetRenderMessageDispatcher()
- */
- virtual RenderMessageDispatcher& GetRenderMessageDispatcher() { return mRenderMessageDispatcher; }
-
- /**
- * @copydoc SceneController::GetRenderQueue()
- */
- virtual RenderQueue& GetRenderQueue() { return mRenderQueue; }
-
- /**
* @copydoc SceneController::GetDiscardQueue()
*/
virtual DiscardQueue& GetDiscardQueue() { return mDiscardQueue; }
private:
-
- // Undefined copy constructor.
- SceneControllerImpl( const SceneControllerImpl& );
-
- // Undefined assignment operator.
- SceneControllerImpl& operator=( const SceneControllerImpl& );
+ SceneControllerImpl( const SceneControllerImpl& ) = delete;
+ SceneControllerImpl& operator=( const SceneControllerImpl& ) = delete;
private:
-
- RenderMessageDispatcher& mRenderMessageDispatcher; ///< Used for passing messages to the render-thread
- RenderQueue& mRenderQueue; ///< render queue
DiscardQueue& mDiscardQueue; ///< discard queue
};
#define __DALI_INTERNAL_SCENE_GRAPH_SCENE_CONTROLLER_H__
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
namespace SceneGraph
{
-class RenderMessageDispatcher;
-class RenderQueue;
class DiscardQueue;
/**
}
/**
- * Return the render message dispatcher
- * @return A reference to the render message dispatcher
- */
- virtual RenderMessageDispatcher& GetRenderMessageDispatcher() = 0;
-
- /**
- * Return the render queue
- * @return A reference to the render queue
- */
- virtual RenderQueue& GetRenderQueue() = 0;
-
- /**
* Return the discard queue
* @return A reference to the discard queue
*/
// CLASS HEADER
#include <dali/internal/update/graphics/graphics-algorithms.h>
-#include <dali/internal/update/rendering/scene-graph-texture-set.h>
-#include <dali/internal/render/renderers/render-geometry.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
-#include <dali/internal/render/shaders/scene-graph-shader.h>
-#include <glm/glm.hpp>
-// EXTERNAL INCLUDES
+// EXTERNAL INCLUDES
+#include <glm/glm.hpp>
#include <dali/graphics-api/graphics-api-controller.h>
#include <dali/graphics-api/graphics-api-frame.h>
#include <dali/graphics-api/graphics-api-render-command.h>
-
// INTERNAL INCLUDES
#include <dali/internal/common/buffer-index.h>
-#include <dali/internal/render/common/render-instruction-container.h>
-#include <dali/internal/render/common/render-instruction.h>
+#include <dali/internal/update/rendering/render-instruction-container.h>
+#include <dali/internal/update/rendering/render-instruction.h>
+#include <dali/internal/update/rendering/scene-graph-texture-set.h>
+#include <dali/internal/update/rendering/scene-graph-renderer.h>
+#include <dali/internal/update/rendering/scene-graph-geometry.h>
+#include <dali/internal/update/rendering/scene-graph-property-buffer.h>
+#include <dali/internal/update/rendering/scene-graph-shader.h>
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
#include <dali/graphics-api/graphics-api-controller.h>
// INTERNAL INCLUDES
-#include <dali/internal/render/common/render-instruction-container.h>
+#include <dali/internal/update/rendering/render-instruction-container.h>
#include <dali/internal/common/buffer-index.h>
namespace Dali
} // namespace Internal
} // namespace Dali
-#endif // DALI_INTERNAL_GRAPHICS_ALGORITHMS_H
\ No newline at end of file
+#endif // DALI_INTERNAL_GRAPHICS_ALGORITHMS_H
--- /dev/null
+#ifndef DALI_INTERNAL_UPDATE_MANAGER_NODE_DEPTHS_H
+#define DALI_INTERNAL_UPDATE_MANAGER_NODE_DEPTHS_H
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+class Node;
+
+struct NodeDepthPair
+{
+ SceneGraph::Node* node;
+ uint32_t sortedDepth;
+ NodeDepthPair( SceneGraph::Node* node, uint32_t sortedDepth )
+ : node(node),
+ sortedDepth(sortedDepth)
+ {
+ }
+};
+
+struct NodeDepths
+{
+ NodeDepths()
+ {
+ }
+
+ void Add( SceneGraph::Node* node, uint32_t sortedDepth )
+ {
+ nodeDepths.push_back( NodeDepthPair( node, sortedDepth ) );
+ }
+
+ std::vector<NodeDepthPair> nodeDepths;
+};
+
+
+
+} // namespace SceneGraph
+
+} // namespace Internal
+
+} // namespace Dali
+
+
+#endif //DALI_INTERNAL_UPDATE_MANAGER_NODE_DEPTHS_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/update/manager/sorted-layers.h>
#include <dali/internal/update/render-tasks/scene-graph-render-task.h>
#include <dali/internal/update/rendering/scene-graph-texture-set.h>
-#include <dali/internal/render/common/render-item.h>
-#include <dali/internal/render/common/render-tracker.h>
-#include <dali/internal/render/common/render-instruction.h>
-#include <dali/internal/render/common/render-instruction-container.h>
-#include <dali/internal/render/shaders/scene-graph-shader.h>
-#include <dali/internal/render/renderers/render-renderer.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
+#include <dali/internal/update/rendering/render-item.h>
+#include <dali/internal/update/rendering/render-tracker.h>
+#include <dali/internal/update/rendering/render-instruction.h>
+#include <dali/internal/update/rendering/render-instruction-container.h>
#include <dali/internal/update/nodes/scene-graph-layer.h>
namespace
if( DALI_LIKELY( renderable.mRenderer ) )
{
- item.mRenderer = &renderable.mRenderer->GetRenderer();
item.mTextureSet = renderable.mRenderer->GetTextures();
item.mDepthIndex += renderable.mRenderer->GetDepthIndex();
}
else
{
- item.mRenderer = nullptr;
item.mTextureSet = nullptr;
}
// Therefore we check a combined sum of all renderer addresses.
size_t checkSumNew = 0;
size_t checkSumOld = 0;
- for( size_t index = 0; index < renderableCount; ++index )
- {
- const Render::Renderer& renderer = renderables[index].mRenderer->GetRenderer();
- checkSumNew += size_t( &renderer );
- checkSumOld += size_t( &renderList.GetRenderer( index ) );
- }
+
+ // Used to add all renderers to checksum.
+
if( checkSumNew == checkSumOld )
{
// tell list to reuse its existing items
{
RenderItem& item = renderList.GetItem( index );
- if( item.mRenderer )
- {
- item.mRenderer->SetSortAttributes( bufferIndex, mSortingHelper[ index ] );
- }
-
// texture set
mSortingHelper[ index ].textureSet = item.mTextureSet;
{
RenderItem& item = renderList.GetItem( index );
- item.mRenderer->SetSortAttributes( bufferIndex, mSortingHelper[ index ] );
-
// texture set
mSortingHelper[ index ].textureSet = item.mTextureSet;
-
mSortingHelper[ index ].zValue = (*sortFunction)( item.mModelViewMatrix.GetTranslation3() ) - item.mDepthIndex;
// Keep the RenderItem pointer in the helper so we can quickly reorder items after sort.
for( unsigned int index = 0; index < renderableCount; ++index, ++renderListIter )
{
*renderListIter = mSortingHelper[ index ].renderItem;
- DALI_LOG_INFO( gRenderListLogFilter, Debug::Verbose, " sortedList[%d] = %p\n", index, mSortingHelper[ index ].renderItem->mRenderer);
+ DALI_LOG_INFO( gRenderListLogFilter, Debug::Verbose, " sortedList[%d]\n", index );
}
}
#define DALI_INTERNAL_SCENE_GRAPH_RENDER_INSTRUCTION_PROCESSOR_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
namespace Dali
{
-
namespace Internal
{
-namespace Render
-{
-class Geometry;
-}
-
namespace SceneGraph
{
-
+class Geometry;
class RenderTracker;
struct RenderItem;
-class Shader;
struct RenderList;
class RenderTask;
class RenderInstructionContainer;
-
+class Shader;
/**
* @brief This class handles the sorting and preparation of Renderers for each layer.
RenderItem* renderItem; ///< The render item that is being sorted (includes depth index)
const Shader* shader; ///< The shader instance
const void* textureSet; ///< The textureSet instance
- const Render::Geometry* geometry; ///< The geometry instance
+ const SceneGraph::Geometry* geometry; ///< The geometry instance
float zValue; ///< The Z value of the given renderer (either distance from camera, or a custom calculated value)
};
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/update/render-tasks/scene-graph-render-task.h>
#include <dali/internal/update/render-tasks/scene-graph-render-task-list.h>
#include <dali/internal/update/nodes/scene-graph-layer.h>
-#include <dali/internal/render/common/render-item.h>
-#include <dali/internal/render/common/render-tracker.h>
-#include <dali/internal/render/common/render-instruction.h>
-#include <dali/internal/render/common/render-instruction-container.h>
-#include <dali/internal/render/renderers/render-renderer.h>
+#include <dali/internal/update/rendering/render-item.h>
+#include <dali/internal/update/rendering/render-tracker.h>
+#include <dali/internal/update/rendering/render-instruction.h>
+#include <dali/internal/update/rendering/render-instruction-container.h>
#include <dali/integration-api/debug.h>
#if defined(DEBUG_ENABLED)
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/update/nodes/node.h>
#include <dali/internal/update/animation/scene-graph-constraint-base.h>
#include <dali/internal/update/nodes/scene-graph-layer.h>
-#include <dali/internal/render/renderers/render-renderer.h>
#include <dali/integration-api/debug.h>
inline int UpdateNodes( Node& node,
int parentFlags,
BufferIndex updateBufferIndex,
- RenderQueue& renderQueue,
Layer& currentLayer,
int inheritedDrawMode )
{
cumulativeDirtyFlags |=UpdateNodes( child,
nodeDirtyFlags,
updateBufferIndex,
- renderQueue,
*layer,
inheritedDrawMode );
}
* The root node is treated separately; it cannot inherit values since it has no parent
*/
int UpdateNodeTree( Layer& rootNode,
- BufferIndex updateBufferIndex,
- RenderQueue& renderQueue )
+ BufferIndex updateBufferIndex )
{
DALI_ASSERT_DEBUG( rootNode.IsRoot() );
cumulativeDirtyFlags |= UpdateNodes( child,
nodeDirtyFlags,
updateBufferIndex,
- renderQueue,
rootNode,
drawMode );
}
#define __DALI_INTERNAL_SCENE_GRAPH_UPDATE_ALGORITHMS_H__
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
class Layer;
class Node;
class PropertyOwner;
-class RenderQueue;
/**
* Constrain the local properties of the PropertyOwner.
* @param[in] renderQueue Used to query messages for the next Render.
* @return The cumulative (ORed) dirty flags for the updated nodes
*/
-int UpdateNodeTree( Layer& rootNode,
- BufferIndex updateBufferIndex,
- RenderQueue& renderQueue );
+int UpdateNodeTree( Layer& rootNode, BufferIndex updateBufferIndex );
} // namespace SceneGraph
} // namespace Dali
#endif // __DALI_INTERNAL_SCENE_GRAPH_UPDATE_ALGORITHMS_H__
-
*
*/
-#define DEBUG_OVERRIDE_VULKAN_SHADER
-#ifdef DEBUG_OVERRIDE_VULKAN_SHADER
-#include <dali/graphics/vulkan/generated/spv-shaders-gen.h>
-#endif
// CLASS HEADER
#include <dali/internal/update/manager/update-manager.h>
#include <dali/internal/event/common/property-notification-impl.h>
#include <dali/internal/event/common/property-notifier.h>
#include <dali/internal/event/effects/shader-factory.h>
-#include <dali/internal/render/common/render-instruction-container.h>
-#include <dali/internal/render/common/render-manager.h>
-#include <dali/internal/render/queue/render-queue.h>
-#include <dali/internal/render/shaders/scene-graph-shader.h>
#include <dali/internal/update/animation/scene-graph-animation.h>
#include <dali/internal/update/animation/scene-graph-animator.h>
#include <dali/internal/update/common/discard-queue.h>
#include <dali/internal/update/common/scene-graph-buffers.h>
-#include <dali/internal/update/controllers/render-message-dispatcher.h>
#include <dali/internal/update/controllers/scene-controller-impl.h>
#include <dali/internal/update/gestures/scene-graph-pan-gesture.h>
#include <dali/internal/update/graphics/graphics-algorithms.h>
#include <dali/internal/update/render-tasks/scene-graph-camera.h>
#include <dali/internal/update/render-tasks/scene-graph-render-task-list.h>
#include <dali/internal/update/render-tasks/scene-graph-render-task.h>
+#include <dali/internal/update/rendering/render-instruction-container.h>
+#include <dali/internal/update/rendering/shader-cache.h>
#include <dali/graphics-api/graphics-api-buffer-factory.h>
#include <dali/graphics-api/graphics-api-buffer.h>
} // unnamed namespace
-//@todo: find better place for it
-// for now we don't want to spam with new shaders
-struct ShaderCache
-{
- explicit ShaderCache( Dali::Graphics::API::Controller& _controller )
- : controller( _controller )
- {
-
- }
- struct Item
- {
- Item() = default;
- ~Item() = default;
- Dali::Graphics::API::Accessor<Dali::Graphics::API::Shader> shader{ nullptr };
- Dali::Graphics::API::ShaderDetails::ShaderSource vertexSource{""};
- Dali::Graphics::API::ShaderDetails::ShaderSource fragmentSource{""};
- };
-
- std::vector<Item> items;
-
- Dali::Graphics::API::Accessor<Dali::Graphics::API::Shader> GetShader(
- const Dali::Graphics::API::ShaderDetails::ShaderSource& vsh,
- const Dali::Graphics::API::ShaderDetails::ShaderSource& fsh
- )
- {
- for( auto&& item : items )
- {
- if( item.vertexSource == vsh && item.fragmentSource == fsh )
- {
- return item.shader;
- }
- }
- auto shaderRef =
- controller.CreateShader( controller.GetShaderFactory()
- .SetShaderModule( Graphics::API::ShaderDetails::PipelineStage::VERTEX,
- Graphics::API::ShaderDetails::Language::SPIRV_1_0,
- vsh )
- .SetShaderModule( Graphics::API::ShaderDetails::PipelineStage::FRAGMENT,
- Graphics::API::ShaderDetails::Language::SPIRV_1_0,
- fsh )
- );
- items.emplace_back( Item() = { shaderRef, vsh, fsh } );
- return shaderRef;
- }
-
- Dali::Graphics::API::Controller& controller;
-};
/**
* Structure to contain UpdateManager internal data
PropertyNotifier& propertyNotifier,
DiscardQueue& discardQueue,
RenderController& renderController,
- RenderManager& renderManager,
- RenderQueue& renderQueue,
SceneGraphBuffers& sceneGraphBuffers,
RenderTaskProcessor& renderTaskProcessor,
Integration::Graphics::Graphics& graphics )
- : renderMessageDispatcher( renderManager, renderQueue, sceneGraphBuffers ),
- notificationManager( notificationManager ),
+ : notificationManager( notificationManager ),
transformManager(),
animationPlaylist( animationPlaylist ),
propertyNotifier( propertyNotifier ),
- shaderSaver( NULL ),
discardQueue( discardQueue ),
renderController( renderController ),
sceneController( NULL ),
- renderManager( renderManager ),
- renderQueue( renderQueue ),
- renderInstructions( renderManager.GetRenderInstructionContainer() ),
+ renderInstructions( ),
renderTaskProcessor( renderTaskProcessor ),
graphics( graphics ),
backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ),
- taskList( renderMessageDispatcher ),
- systemLevelTaskList( renderMessageDispatcher ),
+ taskList( /*renderMessageDispatcher*/ ),
+ systemLevelTaskList( /*renderMessageDispatcher*/ ),
root( NULL ),
systemLevelRoot( NULL ),
renderers(),
renderersAdded( false ),
shaderCache( graphics.GetController() )
{
- sceneController = new SceneControllerImpl( renderMessageDispatcher, renderQueue, discardQueue );
+ sceneController = new SceneControllerImpl( discardQueue );
// create first 'dummy' node
nodes.PushBack(0u);
}
SceneGraphBuffers sceneGraphBuffers; ///< Used to keep track of which buffers are being written or read
- RenderMessageDispatcher renderMessageDispatcher; ///< Used for passing messages to the render-thread
NotificationManager& notificationManager; ///< Queues notification messages for the event-thread.
TransformManager transformManager; ///< Used to update the transformation matrices of the nodes
CompleteNotificationInterface& animationPlaylist; ///< Holds handles to all the animations
PropertyNotifier& propertyNotifier; ///< Provides notification to applications when properties are modified.
- ShaderSaver* shaderSaver; ///< Saves shader binaries.
+
DiscardQueue& discardQueue; ///< Nodes are added here when disconnected from the scene-graph.
RenderController& renderController; ///< render controller
SceneControllerImpl* sceneController; ///< scene controller
- RenderManager& renderManager; ///< This is responsible for rendering the results of each "update"
- RenderQueue& renderQueue; ///< Used to queue messages for the next render
- RenderInstructionContainer& renderInstructions; ///< Used to prepare the render instructions
+ RenderInstructionContainer renderInstructions; ///< Used to prepare the render instructions @todo GRAPHICS Remove
RenderTaskProcessor& renderTaskProcessor; ///< Handles RenderTasks and RenderInstrucitons
+
Integration::Graphics::Graphics& graphics; ///< Graphics
Vector4 backgroundColor; ///< The glClear color used at the beginning of each frame.
OwnerContainer< Renderer* > renderers; ///< A container of owned renderers
OwnerContainer< TextureSet* > textureSets; ///< A container of owned texture sets
OwnerContainer< Shader* > shaders; ///< A container of owned shaders
+
+ OwnerContainer< SceneGraph::Sampler* > samplerContainer; ///< List of owned samplers
+ OwnerContainer< SceneGraph::Texture* > textureContainer; ///< List of owned textures
+ OwnerContainer< SceneGraph::FrameBuffer* > frameBufferContainer; ///< List of owned framebuffers
+ OwnerContainer< SceneGraph::PropertyBuffer* > propertyBufferContainer; ///< List of owned property buffers
+ OwnerContainer< SceneGraph::Geometry* > geometryContainer; ///< List of owned Geometries
+
OwnerPointer< PanGesture > panGestureProcessor; ///< Owned pan gesture processor; it lives for the lifecycle of UpdateManager
MessageQueue messageQueue; ///< The messages queued from the event-thread
- std::vector<Internal::ShaderDataPtr> renderCompiledShaders; ///< Shaders compiled on Render thread are inserted here for update thread to pass on to event thread.
- std::vector<Internal::ShaderDataPtr> updateCompiledShaders; ///< Shaders to be sent from Update to Event
- Mutex compiledShaderMutex; ///< lock to ensure no corruption on the renderCompiledShaders
float keepRenderingSeconds; ///< Set via Dali::Stage::KeepRendering
int nodeDirtyFlags; ///< cumulative node dirty flags from previous frame
PropertyNotifier& propertyNotifier,
DiscardQueue& discardQueue,
RenderController& controller,
- RenderManager& renderManager,
- RenderQueue& renderQueue,
RenderTaskProcessor& renderTaskProcessor,
Integration::Graphics::Graphics& graphics )
: mImpl( new Impl( notificationManager,
propertyNotifier,
discardQueue,
controller,
- renderManager,
- renderQueue,
mSceneGraphBuffers,
renderTaskProcessor,
graphics) )
void UpdateManager::AddShader( OwnerPointer< Shader >& shader )
{
+ shader->Initialize( mImpl->graphics, mImpl->shaderCache );
mImpl->shaders.PushBack( shader.Release() );
}
EraseUsingDiscardQueue( mImpl->shaders, shader, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() );
}
-void UpdateManager::SetShaderProgram( Shader* shader,
- Internal::ShaderDataPtr shaderData, bool modifiesGeometry )
-{
- // TODO: for now we will use hardcoded binary SPIRV shaders which will replace anything
- // that is passed by the caller
-#ifdef DEBUG_OVERRIDE_VULKAN_SHADER
-
- auto shaderRef = mImpl->shaderCache.GetShader( Graphics::API::ShaderDetails::ShaderSource( VSH_IMAGE_VISUAL_CODE ),
- Graphics::API::ShaderDetails::ShaderSource( FSH_IMAGE_VISUAL_CODE ));
-
-#else
- auto shaderRef =
- controller.CreateShader( controller.GetShaderFactory()
- .SetShaderModule( Graphics::API::ShaderDetails::PipelineStage::VERTEX,
- Graphics::API::ShaderDetails::Language::SPIRV_1_0,
- Graphics::API::ShaderDetails::ShaderSource( shaderData->GetVertexShader() ))
- .SetShaderModule( Graphics::API::ShaderDetails::PipelineStage::FRAGMENT,
- Graphics::API::ShaderDetails::Language::SPIRV_1_0,
- Graphics::API::ShaderDetails::ShaderSource( shaderData->GetFragmentShader() ))
- );
-#endif
- shader->SetGfxObject( shaderRef );
-
-#if 0
- if( shaderData )
- {
-
- typedef MessageValue3< Shader, Internal::ShaderDataPtr, ProgramCache*, bool> DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( shader, &Shader::SetProgram, shaderData, mImpl->renderManager.GetProgramCache(), modifiesGeometry );
- }
-#endif
-}
-
-void UpdateManager::SaveBinary( Internal::ShaderDataPtr shaderData )
-{
- DALI_ASSERT_DEBUG( shaderData && "No NULL shader data pointers please." );
- DALI_ASSERT_DEBUG( shaderData->GetBufferSize() > 0 && "Shader binary empty so nothing to save." );
- {
- // lock as update might be sending previously compiled shaders to event thread
- Mutex::ScopedLock lock( mImpl->compiledShaderMutex );
- mImpl->renderCompiledShaders.push_back( shaderData );
- }
-}
-
-void UpdateManager::SetShaderSaver( ShaderSaver& upstream )
-{
- mImpl->shaderSaver = &upstream;
-}
-
void UpdateManager::AddRenderer( OwnerPointer< Renderer >& renderer )
{
- renderer->ConnectToSceneGraph( *mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex() );
+ renderer->ConnectToSceneGraph( mSceneGraphBuffers.GetUpdateBufferIndex() );
mImpl->renderers.PushBack( renderer.Release() );
mImpl->renderersAdded = true;
}
void UpdateManager::RemoveRenderer( Renderer* renderer )
{
// Find the renderer and destroy it
+ // @todo Don't need to use discard queue for SceneGraph::Renderer any more ( No dependency from Graphics::RenderCommand )
EraseUsingDiscardQueue( mImpl->renderers, renderer, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() );
- // Need to remove the render object as well
- renderer->DisconnectFromSceneGraph( *mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex() );
+ renderer->DisconnectFromSceneGraph( mSceneGraphBuffers.GetUpdateBufferIndex() );
}
void UpdateManager::SetPanGestureProcessor( PanGesture* panGestureProcessor )
}
}
-void UpdateManager::ForwardCompiledShadersToEventThread()
-{
- DALI_ASSERT_DEBUG( (mImpl->shaderSaver != 0) && "shaderSaver should be wired-up during startup." );
- if( mImpl->shaderSaver )
- {
- // lock and swap the queues
- {
- // render might be attempting to send us more binaries at the same time
- Mutex::ScopedLock lock( mImpl->compiledShaderMutex );
- mImpl->renderCompiledShaders.swap( mImpl->updateCompiledShaders );
- }
-
- if( mImpl->updateCompiledShaders.size() > 0 )
- {
- ShaderSaver& factory = *mImpl->shaderSaver;
- for( auto&& shader : mImpl->updateCompiledShaders )
- {
- mImpl->notificationManager.QueueMessage( ShaderCompiledMessage( factory, shader ) );
- }
- // we don't need them in update anymore
- mImpl->updateCompiledShaders.clear();
- }
- }
-}
-
void UpdateManager::UpdateRenderers( BufferIndex bufferIndex )
{
const unsigned int rendererCount = mImpl->renderers.Count();
//Apply constraints
ConstrainPropertyOwner( *mImpl->renderers[i], bufferIndex );
- //mImpl->renderers[i]->PrepareRender( bufferIndex );
mImpl->renderers[i]->PrepareRender( mImpl->graphics.GetController(), bufferIndex );
}
}
// Prepare resources, update shaders, for each node
// And add the renderers to the sorted layers. Start from root, which is also a layer
- mImpl->nodeDirtyFlags = UpdateNodeTree( *( mImpl->root ),
- bufferIndex,
- mImpl->renderQueue );
+ mImpl->nodeDirtyFlags = UpdateNodeTree( *( mImpl->root ), bufferIndex );
if ( mImpl->systemLevelRoot )
{
- mImpl->nodeDirtyFlags |= UpdateNodeTree( *( mImpl->systemLevelRoot ),
- bufferIndex,
- mImpl->renderQueue );
+ mImpl->nodeDirtyFlags |= UpdateNodeTree( *( mImpl->systemLevelRoot ), bufferIndex );
}
}
// be set again
updateScene |= mImpl->messageQueue.ProcessMessages( bufferIndex );
- //Forward compiled shader programs to event thread for saving
- ForwardCompiledShadersToEventThread();
-
// Although the scene-graph may not require an update, we still need to synchronize double-buffered
// renderer lists if the scene was updated in the previous frame.
// We should not start skipping update steps or reusing lists until there has been two frames where nothing changes
void UpdateManager::SetBackgroundColor( const Vector4& color )
{
- typedef MessageValue1< RenderManager, Vector4 > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetBackgroundColor, color );
+ DALI_ASSERT_ALWAYS( true && "GRAPHICS: FIXME" );
}
void UpdateManager::SetDefaultSurfaceRect( const Rect<int>& rect )
{
- typedef MessageValue1< RenderManager, Rect<int> > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetDefaultSurfaceRect, rect );
+ DALI_ASSERT_ALWAYS( true && "GRAPHICS: FIXME" );
}
void UpdateManager::KeepRendering( float durationSeconds )
SortSiblingNodesRecursively( *( mImpl->root ) );
}
-void UpdateManager::AddSampler( OwnerPointer< Render::Sampler >& sampler )
-{
- // Message has ownership of Sampler while in transit from update to render
- typedef MessageValue1< RenderManager, OwnerPointer< Render::Sampler > > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AddSampler, sampler );
-}
-
-void UpdateManager::RemoveSampler( Render::Sampler* sampler )
-{
- typedef MessageValue1< RenderManager, Render::Sampler* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::RemoveSampler, sampler );
-}
-
-void UpdateManager::SetFilterMode( Render::Sampler* sampler, unsigned int minFilterMode, unsigned int magFilterMode )
-{
- typedef MessageValue3< RenderManager, Render::Sampler*, unsigned int, unsigned int > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetFilterMode, sampler, minFilterMode, magFilterMode );
-}
-
-void UpdateManager::SetWrapMode( Render::Sampler* sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode )
-{
- typedef MessageValue4< RenderManager, Render::Sampler*, unsigned int, unsigned int, unsigned int > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetWrapMode, sampler, rWrapMode, sWrapMode, tWrapMode );
-}
-
-void UpdateManager::AddPropertyBuffer( OwnerPointer< Render::PropertyBuffer >& propertyBuffer )
+void UpdateManager::AddSampler( OwnerPointer< SceneGraph::Sampler >& sampler )
{
- // Message has ownership of format while in transit from update -> render
- typedef MessageValue1< RenderManager, OwnerPointer< Render::PropertyBuffer > > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AddPropertyBuffer, propertyBuffer );
-}
-
-void UpdateManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer )
-{
- typedef MessageValue1< RenderManager, Render::PropertyBuffer* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::RemovePropertyBuffer, propertyBuffer );
+ mImpl->samplerContainer.PushBack( sampler.Release() );
}
-#if 0
-void UpdateManager::SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Render::PropertyBuffer::Format>& format )
+void UpdateManager::RemoveSampler( SceneGraph::Sampler* sampler )
{
- // Message has ownership of format while in transit from update -> render
- typedef MessageValue2< RenderManager, Render::PropertyBuffer*, OwnerPointer< Render::PropertyBuffer::Format > > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetPropertyBufferFormat, propertyBuffer, format );
+ mImpl->samplerContainer.EraseObject( sampler );
}
-#endif
-void UpdateManager::SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Render::PropertyBuffer::Format>& format )
+void UpdateManager::AddPropertyBuffer( OwnerPointer< SceneGraph::PropertyBuffer >& propertyBuffer )
{
- // todo: may not be needed yet
- // Message has ownership of format while in transit from update -> render
- //auto& controller = GetGraphicsController();
- //controller.CreateBuffer( controller.GetBufferFactory()
- //.SetSize( format->size * format->components ))
-
- // set format directly, on the update thread
- propertyBuffer->SetFormat( format.Release() );
+ propertyBuffer->Initialize( mImpl->graphics );
+ mImpl->propertyBufferContainer.PushBack( propertyBuffer.Release() );
}
-#if 0
-void UpdateManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector<char> >& data, size_t size )
+void UpdateManager::RemovePropertyBuffer( SceneGraph::PropertyBuffer* propertyBuffer )
{
- // Message has ownership of format while in transit from update -> render
- typedef MessageValue3< RenderManager, Render::PropertyBuffer*, OwnerPointer< Dali::Vector<char> >, size_t > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetPropertyBufferData, propertyBuffer, data, size );
+ mImpl->propertyBufferContainer.EraseObject( propertyBuffer );
}
-#endif
-void UpdateManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector<char> >& data, size_t size )
+void UpdateManager::AddGeometry( OwnerPointer< SceneGraph::Geometry >& geometry )
{
- auto& controller = GetGraphicsController();
- auto buffer = controller.CreateBuffer( controller.GetBufferFactory()
- .SetSize( uint32_t(propertyBuffer->GetFormat()->size * size) )
- .SetUsage(Graphics::API::Buffer::UsageHint::ATTRIBUTES ));
- propertyBuffer->SetGfxObject( buffer );
- propertyBuffer->SetData( data.Release(), size );
+ geometry->Initialize( mImpl->graphics );
+ mImpl->geometryContainer.PushBack( geometry.Release() );
}
-void UpdateManager::AddGeometry( OwnerPointer< Render::Geometry >& geometry )
+void UpdateManager::RemoveGeometry( SceneGraph::Geometry* geometry )
{
-
- // Message has ownership of format while in transit from update -> render
- typedef MessageValue1< RenderManager, OwnerPointer< Render::Geometry > > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AddGeometry, geometry );
+ mImpl->geometryContainer.EraseObject( geometry );
}
-void UpdateManager::RemoveGeometry( Render::Geometry* geometry )
+void UpdateManager::AddTexture( OwnerPointer< SceneGraph::Texture >& texture )
{
- typedef MessageValue1< RenderManager, Render::Geometry* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::RemoveGeometry, geometry );
+ texture->Initialize( mImpl->graphics );
+ mImpl->textureContainer.PushBack( texture.Release() );
}
-void UpdateManager::SetGeometryType( Render::Geometry* geometry, unsigned int geometryType )
+void UpdateManager::RemoveTexture( SceneGraph::Texture* texture)
{
- typedef MessageValue2< RenderManager, Render::Geometry*, unsigned int > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
+ DALI_ASSERT_DEBUG( NULL != texture );
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetGeometryType, geometry, geometryType );
-}
-
-void UpdateManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector<unsigned short>& indices )
-{
- typedef IndexBufferMessage< RenderManager > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, geometry, indices );
-}
-
-void UpdateManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer )
-{
- /*
- typedef MessageValue2< RenderManager, Render::Geometry*, Render::PropertyBuffer* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::RemoveVertexBuffer, geometry, propertyBuffer );
- */
- geometry->RemovePropertyBuffer( propertyBuffer );
-}
-
-void UpdateManager::AttachVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer )
-{
- //typedef MessageValue2< RenderManager, Render::Geometry*, Render::PropertyBuffer* > DerivedType;
-
- // Reserve some memory inside the render queue
- //unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- //new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AttachVertexBuffer, geometry, propertyBuffer );
-
- geometry->AddPropertyBuffer( propertyBuffer );
-}
-
-void UpdateManager::AddTexture( OwnerPointer< Render::Texture >& texture )
-{
- // Message has ownership of Texture while in transit from update -> render
- typedef MessageValue1< RenderManager, OwnerPointer< Render::Texture > > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AddTexture, texture );
-}
-
-void UpdateManager::RemoveTexture( Render::Texture* texture)
-{
- typedef MessageValue1< RenderManager, Render::Texture* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::RemoveTexture, texture );
-}
-
-void UpdateManager::UploadTexture( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params )
-{
- typedef MessageValue3< RenderManager, Render::Texture*, PixelDataPtr, Texture::UploadParams > DerivedType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::UploadTexture, texture, pixelData, params );
-}
-
-void UpdateManager::UploadTextureV2( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params )
-{
- //fixme: AB: This is temporary solution to create a texture object on the Graphics API side
- //fixme: using controller directly in the update thread
- auto& controller = mImpl->graphics.GetController();
-
- auto tex = controller.CreateTexture( controller.GetTextureFactory()
- .SetFormat( Graphics::API::TextureDetails::Format::RGBA8 )
- .SetSize( { pixelData->GetWidth(), pixelData->GetHeight() } )
- .SetType( Graphics::API::TextureDetails::Type::TEXTURE_2D )
- .SetMipMapFlag( Graphics::API::TextureDetails::MipMapFlag::DISABLED )
- .SetData( pixelData->GetBuffer() )
- .SetDataSize( pixelData->GetBufferSize() )
- );
-
- // TODO: Render::Texture will be gone, however currently it's still in use
- // so it carries the accessor to the texture object
- texture->SetGfxObject( tex );
-
- texture->SetId( static_cast<uint32_t>(tex.GetHandle()) );
-}
-
-void UpdateManager::GenerateMipmaps( Render::Texture* texture )
-{
- typedef MessageValue1< RenderManager, Render::Texture* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::GenerateMipmaps, texture );
+ // Find the texture, use reference to pointer so we can do the erase safely
+ for ( auto&& iter : mImpl->textureContainer )
+ {
+ if ( iter == texture )
+ {
+ //texture->Destroy(); //@todo Do something in Gfx?
+ mImpl->textureContainer.Erase( &iter ); // Texture found; now destroy it
+ return;
+ }
+ }
}
-void UpdateManager::AddFrameBuffer( Render::FrameBuffer* frameBuffer )
+void UpdateManager::AddFrameBuffer( SceneGraph::FrameBuffer* frameBuffer )
{
- typedef MessageValue1< RenderManager, Render::FrameBuffer* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AddFrameBuffer, frameBuffer );
+ mImpl->frameBufferContainer.PushBack( frameBuffer );
+ //frameBuffer->Initialize(); @todo Rewrite for Gfx
}
-void UpdateManager::RemoveFrameBuffer( Render::FrameBuffer* frameBuffer)
+void UpdateManager::RemoveFrameBuffer( SceneGraph::FrameBuffer* frameBuffer)
{
- typedef MessageValue1< RenderManager, Render::FrameBuffer* > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
+ DALI_ASSERT_DEBUG( NULL != frameBuffer );
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::RemoveFrameBuffer, frameBuffer );
+ // Find the sampler, use reference so we can safely do the erase
+ for ( auto&& iter : mImpl->frameBufferContainer )
+ {
+ if ( iter == frameBuffer )
+ {
+ //frameBuffer->Destroy(); @todo Rewrite for Gfx
+ mImpl->frameBufferContainer.Erase( &iter ); // frameBuffer found; now destroy it
+ break;
+ }
+ }
}
-void UpdateManager::AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, unsigned int mipmapLevel, unsigned int layer )
+void UpdateManager::AttachColorTextureToFrameBuffer( SceneGraph::FrameBuffer* frameBuffer, SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int layer )
{
- typedef MessageValue4< RenderManager, Render::FrameBuffer*, Render::Texture*, unsigned int, unsigned int > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AttachColorTextureToFrameBuffer, frameBuffer, texture, mipmapLevel, layer );
+ //frameBuffer->AttachColorTexture( mImpl->context, texture, mipmapLevel, layer ); @todo Rewrite for Gfx
+ DALI_ASSERT_ALWAYS( true && "GRAPHICS: FIXME" );
}
Graphics::API::Controller& UpdateManager::GetGraphicsController() const
#include <dali/public-api/common/vector-wrapper.h>
#include <dali/internal/common/message.h>
-#include <dali/internal/common/shader-saver.h>
+
#include <dali/internal/common/type-abstraction-enums.h>
#include <dali/internal/event/common/event-thread-services.h>
#include <dali/internal/event/rendering/texture-impl.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
-#include <dali/internal/render/shaders/scene-graph-shader.h> // for OwnerPointer< Shader >
#include <dali/internal/update/animation/scene-graph-animation.h>
#include <dali/internal/update/common/scene-graph-buffers.h>
#include <dali/internal/update/common/scene-graph-property-notification.h>
#include <dali/internal/update/gestures/scene-graph-pan-gesture.h>
+#include <dali/internal/update/manager/node-depths.h>
#include <dali/internal/update/nodes/node.h>
#include <dali/internal/update/nodes/scene-graph-layer.h>
#include <dali/internal/update/render-tasks/scene-graph-camera.h>
+#include <dali/internal/update/rendering/scene-graph-geometry.h>
+#include <dali/internal/update/rendering/scene-graph-property-buffer.h>
+#include <dali/internal/update/rendering/scene-graph-frame-buffer.h>
+#include <dali/internal/update/rendering/scene-graph-texture.h>
#include <dali/internal/update/rendering/scene-graph-renderer.h> // for OwnerPointer< Renderer >
+#include <dali/internal/update/rendering/scene-graph-shader.h> // for OwnerPointer< Shader >
#include <dali/internal/update/rendering/scene-graph-texture-set.h> // for OwnerPointer< TextureSet >
#include <dali/graphics-api/graphics-api-controller.h>
namespace Integration
{
-class GlSyncAbstraction;
class RenderController;
namespace Graphics
{
namespace Internal
{
+namespace SceneGraph
+{
+class FrameBuffer;
+}
class PropertyNotifier;
class NotificationManager;
class CompleteNotificationInterface;
class TouchResampler;
-namespace Render
-{
-struct Sampler;
-class FrameBuffer;
-}
// value types used by messages
template <> struct ParameterType< PropertyNotification::NotifyMode >
: public BasicType< PropertyNotification::NotifyMode > {};
class RenderQueue;
class PropertyBuffer;
-struct NodeDepthPair
-{
- SceneGraph::Node* node;
- uint32_t sortedDepth;
- NodeDepthPair( SceneGraph::Node* node, uint32_t sortedDepth )
- : node(node),
- sortedDepth(sortedDepth)
- {
- }
-};
-
-struct NodeDepths
-{
- NodeDepths()
- {
- }
-
- void Add( SceneGraph::Node* node, uint32_t sortedDepth )
- {
- nodeDepths.push_back( NodeDepthPair( node, sortedDepth ) );
- }
-
- std::vector<NodeDepthPair> nodeDepths;
-};
-
/**
* UpdateManager maintains a scene graph i.e. a tree of nodes as well as
* It also maintains the lifecycle of nodes and other property owners that are
* disconnected from the scene graph.
*/
-class UpdateManager : public ShaderSaver
+class UpdateManager
{
public:
* @param[in] propertyNotifier The PropertyNotifier
* @param[in] discardQueue Nodes are added here when disconnected from the scene-graph.
* @param[in] controller After messages are flushed, we request a render from the RenderController.
- * @param[in] renderManager This is responsible for rendering the results of each "update".
- * @param[in] renderQueue Used to queue messages for the next render.
* @param[in] renderTaskProcessor Handles RenderTasks and RenderInstrucitons.
*/
UpdateManager( NotificationManager& notificationManager,
PropertyNotifier& propertyNotifier,
DiscardQueue& discardQueue,
Integration::RenderController& controller,
- RenderManager& renderManager,
- RenderQueue& renderQueue,
RenderTaskProcessor& renderTaskProcessor,
Dali::Integration::Graphics::Graphics& graphics);
*/
void RemoveShader( Shader* shader );
- /**
- * Set the shader program for a Shader object
- * @param[in] shader The shader to modify
- * @param[in] shaderData Source code, hash over source, and optional compiled binary for the shader program
- * @param[in] modifiesGeometry True if the vertex shader modifies geometry
- */
- void SetShaderProgram( Shader* shader, Internal::ShaderDataPtr shaderData, bool modifiesGeometry );
-
- /**
- * @brief Accept compiled shaders passed back on render thread for saving.
- * @param[in] shaderData Source code, hash over source, and corresponding compiled binary to be saved.
- */
- virtual void SaveBinary( Internal::ShaderDataPtr shaderData );
-
- /**
- * @brief Set the destination for compiled shader binaries to be passed on to.
- * The dispatcher passed in will be called from the update thread.
- * @param[in] upstream A sink for ShaderDatas to be passed into.
- */
- void SetShaderSaver( ShaderSaver& upstream );
-
// Renderers
/**
* @post Sends a message to RenderManager to add the sampler.
* The sampler will be owned by RenderManager
*/
- void AddSampler( OwnerPointer< Render::Sampler >& sampler );
+ void AddSampler( OwnerPointer< SceneGraph::Sampler >& sampler );
/**
* Removes an existing sampler from RenderManager
* @param[in] sampler The sampler to remove
* @post The sampler will be destroyed in the render thread
*/
- void RemoveSampler( Render::Sampler* sampler );
-
- /**
- * Sets the filter modes for an existing sampler
- * @param[in] sampler The sampler
- * @param[in] minFilterMode The filter to use under minification
- * @param[in] magFilterMode The filter to use under magnification
- */
- void SetFilterMode( Render::Sampler* sampler, unsigned int minFilterMode, unsigned int magFilterMode );
-
- /**
- * Sets the wrap mode for an existing sampler
- * @param[in] sampler The sampler
- * @param[in] rWrapMode Wrapping mode in z direction
- * @param[in] sWrapMode Wrapping mode in x direction
- * @param[in] tWrapMode Wrapping mode in y direction
- */
- void SetWrapMode( Render::Sampler* sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode );
+ void RemoveSampler( SceneGraph::Sampler* sampler );
/**
* Add a new property buffer to RenderManager
* @post Sends a message to RenderManager to add the property buffer.
* The property buffer will be owned by RenderManager
*/
- void AddPropertyBuffer( OwnerPointer< Render::PropertyBuffer >& propertryBuffer );
+ void AddPropertyBuffer( OwnerPointer< SceneGraph::PropertyBuffer >& propertyBuffer );
/**
* Removes an existing PropertyBuffer from RenderManager
* @param[in] propertryBuffer The property buffer to remove
* @post The property buffer will be destroyed in the render thread
*/
- void RemovePropertyBuffer( Render::PropertyBuffer* propertryBuffer );
+ void RemovePropertyBuffer( SceneGraph::PropertyBuffer* propertryBuffer );
/**
* Sets the format of an existing property buffer
* @param[in] format The new format of the buffer
* @post Sends a message to RenderManager to set the new format to the property buffer.
*/
- void SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Render::PropertyBuffer::Format>& format );
+ void SetPropertyBufferFormat( SceneGraph::PropertyBuffer* propertyBuffer, OwnerPointer< SceneGraph::PropertyBuffer::Format>& format );
/**
* Sets the data of an existing property buffer
* @param[in] size The new size of the buffer
* @post Sends a message to RenderManager to set the new data to the property buffer.
*/
- void SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector<char> >& data, size_t size );
+ void SetPropertyBufferData( SceneGraph::PropertyBuffer* propertyBuffer, OwnerPointer< Vector<char> >& data, size_t size );
/**
* Adds a geometry to the RenderManager
* @post Sends a message to RenderManager to add the Geometry
* The geometry will be owned by RenderManager
*/
- void AddGeometry( OwnerPointer< Render::Geometry >& geometry );
+ void AddGeometry( OwnerPointer< SceneGraph::Geometry >& geometry );
/**
* Removes an existing Geometry from RenderManager
* @param[in] geometry The geometry to remove
* @post The geometry will be destroyed in the render thread
*/
- void RemoveGeometry( Render::Geometry* geometry );
+ void RemoveGeometry( SceneGraph::Geometry* geometry );
/**
* Sets the geometry type of an existing Geometry
* @param[in] geometry The geometry
* @param[in] geometryType The type of the geometry
*/
- void SetGeometryType( Render::Geometry* geometry, unsigned int geometryType );
+ void SetGeometryType( SceneGraph::Geometry* geometry, unsigned int geometryType );
/**
* Sets the index buffer to be used by a geometry
* @param[in] geometry The geometry
* @param[in] indices A vector containing the indices for the geometry
*/
- void SetIndexBuffer( Render::Geometry* geometry, Dali::Vector<unsigned short>& indices );
+ void SetIndexBuffer( SceneGraph::Geometry* geometry, Dali::Vector<unsigned short>& indices );
/**
* Adds a vertex buffer to a geometry
* @param[in] geometry The geometry
* @param[in] propertyBuffer The property buffer
*/
- void AttachVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer );
+ void AttachVertexBuffer( SceneGraph::Geometry* geometry, SceneGraph::PropertyBuffer* propertyBuffer );
/**
* Removes a vertex buffer from a geometry
* @param[in] geometry The geometry
* @param[in] propertyBuffer The property buffer
*/
- void RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer );
+ void RemoveVertexBuffer( SceneGraph::Geometry* geometry, SceneGraph::PropertyBuffer* propertyBuffer );
/**
* Adds a texture to the render manager
* @param[in] texture The texture to add
* The texture will be owned by RenderManager
*/
- void AddTexture( OwnerPointer< Render::Texture >& texture );
+ void AddTexture( OwnerPointer< SceneGraph::Texture >& texture );
/**
* Removes a texture from the render manager
* @param[in] texture The texture to remove
* @post The texture will be destroyed in the render thread
*/
- void RemoveTexture( Render::Texture* texture );
-
- /**
- * Uploads data to a texture owned by the RenderManager
- * @param[in] texture The texture
- * @param[in] pixelData The pixel data object
- * @param[in] params The parameters for the upload
- */
- void UploadTexture( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params );
-
- void UploadTextureV2( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params );
-
- /**
- * Generates mipmaps for a texture owned by the RenderManager
- * @param[in] texture The texture
- */
- void GenerateMipmaps( Render::Texture* texture );
+ void RemoveTexture( SceneGraph::Texture* texture );
/**
* Adds a framebuffer to the render manager
* @param[in] frameBuffer The framebuffer to add
* The framebuffer will be owned by RenderManager
*/
- void AddFrameBuffer( Render::FrameBuffer* frameBuffer );
+ void AddFrameBuffer( SceneGraph::FrameBuffer* frameBuffer );
/**
* Removes a FrameBuffer from the render manager
* @param[in] frameBuffer The FrameBuffer to remove
* @post The FrameBuffer will be destroyed in the render thread
*/
- void RemoveFrameBuffer( Render::FrameBuffer* frameBuffer );
+ void RemoveFrameBuffer( SceneGraph::FrameBuffer* frameBuffer );
/**
* Attach a texture as color output to an existing FrameBuffer
* @param[in] mipmapLevel The mipmap of the texture to be attached
* @param[in] layer Indicates which layer of a cube map or array texture to attach. Unused for 2D textures
*/
- void AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, unsigned int mipmapLevel, unsigned int face );
+ void AttachColorTextureToFrameBuffer( SceneGraph::FrameBuffer* frameBuffer, SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int face );
Graphics::API::Controller& GetGraphicsController() const;
new (slot) LocalType( &manager, &UpdateManager::RemoveShader, &shader );
}
-inline void SetShaderProgramMessage( UpdateManager& manager,
- Shader& shader,
- Internal::ShaderDataPtr shaderData,
- bool modifiesGeometry )
-{
- typedef MessageValue3< UpdateManager, Shader*, Internal::ShaderDataPtr, bool > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::SetShaderProgram, &shader, shaderData, modifiesGeometry );
-}
-
inline void SetBackgroundColorMessage( UpdateManager& manager, const Vector4& color )
{
typedef MessageValue1< UpdateManager, Vector4 > LocalType;
new (slot) LocalType( &manager, &UpdateManager::RemoveTextureSet, &textureSet );
}
-inline void AddSamplerMessage( UpdateManager& manager, OwnerPointer< Render::Sampler >& sampler )
+inline void AddSamplerMessage( UpdateManager& manager, OwnerPointer< SceneGraph::Sampler >& sampler )
{
// Message has ownership of Sampler while in transit from event -> update
- typedef MessageValue1< UpdateManager, OwnerPointer< Render::Sampler > > LocalType;
+ typedef MessageValue1< UpdateManager, OwnerPointer< SceneGraph::Sampler > > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::AddSampler, sampler );
}
-inline void RemoveSamplerMessage( UpdateManager& manager, Render::Sampler& sampler )
+inline void RemoveSamplerMessage( UpdateManager& manager, SceneGraph::Sampler& sampler )
{
- typedef MessageValue1< UpdateManager, Render::Sampler* > LocalType;
+ typedef MessageValue1< UpdateManager, SceneGraph::Sampler* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::RemoveSampler, &sampler );
}
-inline void SetFilterModeMessage( UpdateManager& manager, Render::Sampler& sampler, unsigned int minFilterMode, unsigned int magFilterMode )
-{
- typedef MessageValue3< UpdateManager, Render::Sampler*, unsigned int, unsigned int > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::SetFilterMode, &sampler, minFilterMode, magFilterMode );
-}
-
-inline void SetWrapModeMessage( UpdateManager& manager, Render::Sampler& sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode )
-{
- typedef MessageValue4< UpdateManager, Render::Sampler*, unsigned int, unsigned int, unsigned int > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::SetWrapMode, &sampler, rWrapMode, sWrapMode, tWrapMode );
-}
-
-inline void AddPropertyBuffer( UpdateManager& manager, OwnerPointer< Render::PropertyBuffer >& propertyBuffer )
+inline void AddPropertyBuffer( UpdateManager& manager, OwnerPointer< SceneGraph::PropertyBuffer >& propertyBuffer )
{
// Message has ownership of propertyBuffer while in transit from event -> update
- typedef MessageValue1< UpdateManager, OwnerPointer< Render::PropertyBuffer > > LocalType;
+ typedef MessageValue1< UpdateManager, OwnerPointer< SceneGraph::PropertyBuffer > > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::AddPropertyBuffer, propertyBuffer );
}
-inline void RemovePropertyBuffer( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer )
+inline void RemovePropertyBuffer( UpdateManager& manager, SceneGraph::PropertyBuffer& propertyBuffer )
{
- typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType;
+ typedef MessageValue1< UpdateManager, SceneGraph::PropertyBuffer* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::RemovePropertyBuffer, &propertyBuffer );
}
-inline void SetPropertyBufferFormat( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, OwnerPointer< Render::PropertyBuffer::Format>& format )
-{
- // Message has ownership of PropertyBuffer::Format while in transit from event -> update
- typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, OwnerPointer< Render::PropertyBuffer::Format> > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferFormat, &propertyBuffer, format );
-}
-
-inline void SetPropertyBufferData( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, OwnerPointer< Vector<char> >& data, size_t size )
-{
- // Message has ownership of PropertyBuffer data while in transit from event -> update
- typedef MessageValue3< UpdateManager, Render::PropertyBuffer*, OwnerPointer< Vector<char> >, size_t > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferData, &propertyBuffer, data, size );
-}
-
-inline void AddGeometry( UpdateManager& manager, OwnerPointer< Render::Geometry >& geometry )
+inline void AddGeometry( UpdateManager& manager, OwnerPointer< SceneGraph::Geometry >& geometry )
{
// Message has ownership of Geometry while in transit from event -> update
- typedef MessageValue1< UpdateManager, OwnerPointer< Render::Geometry > > LocalType;
+ typedef MessageValue1< UpdateManager, OwnerPointer< SceneGraph::Geometry > > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::AddGeometry, geometry );
}
-inline void RemoveGeometry( UpdateManager& manager, Render::Geometry& geometry )
+inline void RemoveGeometry( UpdateManager& manager, SceneGraph::Geometry& geometry )
{
- typedef MessageValue1< UpdateManager, Render::Geometry* > LocalType;
+ typedef MessageValue1< UpdateManager, SceneGraph::Geometry* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::RemoveGeometry, &geometry );
}
-inline void AttachVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::PropertyBuffer& vertexBuffer )
-{
- typedef MessageValue2< UpdateManager, Render::Geometry*, Render::PropertyBuffer* > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::AttachVertexBuffer, &geometry, const_cast<Render::PropertyBuffer*>(&vertexBuffer) );
-}
-
-inline void RemoveVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::PropertyBuffer& vertexBuffer )
-{
- typedef MessageValue2< UpdateManager, Render::Geometry*, Render::PropertyBuffer* > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::RemoveVertexBuffer, &geometry, const_cast<Render::PropertyBuffer*>(&vertexBuffer) );
-}
-
-// Custom message type for SetIndexBuffer() used to move data with Vector::Swap()
-template< typename T >
-class IndexBufferMessage : public MessageBase
-{
-public:
-
- /**
- * Constructor which does a Vector::Swap()
- */
- IndexBufferMessage( T* manager, Render::Geometry* geometry, Dali::Vector<unsigned short>& indices )
- : MessageBase(),
- mManager( manager ),
- mRenderGeometry( geometry )
- {
- mIndices.Swap( indices );
- }
-
- /**
- * Virtual destructor
- */
- virtual ~IndexBufferMessage()
- {
- }
-
- /**
- * @copydoc MessageBase::Process
- */
- virtual void Process( BufferIndex /*bufferIndex*/ )
- {
- DALI_ASSERT_DEBUG( mManager && "Message does not have an object" );
- mManager->SetIndexBuffer( mRenderGeometry, mIndices );
- }
-
-private:
-
- T* mManager;
- Render::Geometry* mRenderGeometry;
- Dali::Vector<unsigned short> mIndices;
-};
-
-inline void SetIndexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, Dali::Vector<unsigned short>& indices )
-{
- typedef IndexBufferMessage< UpdateManager > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &geometry, indices );
-}
-
-inline void SetGeometryTypeMessage( UpdateManager& manager, Render::Geometry& geometry, unsigned int geometryType )
-{
- typedef MessageValue2< UpdateManager, Render::Geometry*, unsigned int > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::SetGeometryType, &geometry, geometryType );
-}
-
-inline void AddTexture( UpdateManager& manager, OwnerPointer< Render::Texture >& texture )
+inline void AddTextureMessage( UpdateManager& manager, OwnerPointer< SceneGraph::Texture >& texture )
{
// Message has ownership of Texture while in transit from event -> update
- typedef MessageValue1< UpdateManager, OwnerPointer< Render::Texture > > LocalType;
+ typedef MessageValue1< UpdateManager, OwnerPointer< SceneGraph::Texture > > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::AddTexture, texture );
}
-inline void RemoveTexture( UpdateManager& manager, Render::Texture& texture )
+inline void RemoveTextureMessage( UpdateManager& manager, SceneGraph::Texture& texture )
{
- typedef MessageValue1< UpdateManager, Render::Texture* > LocalType;
+ typedef MessageValue1< UpdateManager, SceneGraph::Texture* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::RemoveTexture, &texture );
}
-inline void UploadTextureMessage( UpdateManager& manager, Render::Texture& texture, PixelDataPtr pixelData, const Texture::UploadParams& params )
-{
- typedef MessageValue3< UpdateManager, Render::Texture*, PixelDataPtr, Texture::UploadParams > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::UploadTexture, &texture, pixelData, params );
-}
-
-inline void UploadTextureMessageV2( UpdateManager& manager, Render::Texture& texture, PixelDataPtr pixelData, const Texture::UploadParams& params )
-{
- typedef MessageValue3< UpdateManager, Render::Texture*, PixelDataPtr, Texture::UploadParams > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::UploadTextureV2, &texture, pixelData, params );
-}
-
-inline void GenerateMipmapsMessage( UpdateManager& manager, Render::Texture& texture )
-{
- typedef MessageValue1< UpdateManager, Render::Texture* > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &manager, &UpdateManager::GenerateMipmaps, &texture );
-}
-
-inline void AddFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer )
+inline void AddFrameBuffer( UpdateManager& manager, SceneGraph::FrameBuffer& frameBuffer )
{
- typedef MessageValue1< UpdateManager, Render::FrameBuffer* > LocalType;
+ typedef MessageValue1< UpdateManager, SceneGraph::FrameBuffer* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::AddFrameBuffer, &frameBuffer );
}
-inline void RemoveFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer )
+inline void RemoveFrameBuffer( UpdateManager& manager, SceneGraph::FrameBuffer& frameBuffer )
{
- typedef MessageValue1< UpdateManager, Render::FrameBuffer* > LocalType;
+ typedef MessageValue1< UpdateManager, SceneGraph::FrameBuffer* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &manager, &UpdateManager::RemoveFrameBuffer, &frameBuffer );
}
-inline void AttachColorTextureToFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer, Render::Texture* texture, unsigned int mipmapLevel, unsigned int layer )
+inline void AttachColorTextureToFrameBuffer( UpdateManager& manager, SceneGraph::FrameBuffer& frameBuffer, SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int layer )
{
- typedef MessageValue4< UpdateManager, Render::FrameBuffer*, Render::Texture*, unsigned int, unsigned int > LocalType;
+ typedef MessageValue4< UpdateManager, SceneGraph::FrameBuffer*, SceneGraph::Texture*, unsigned int, unsigned int > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
#define DALI_INTERNAL_SCENE_GRAPH_NODE_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/integration-api/debug.h>
#include <dali/internal/common/message.h>
#include <dali/internal/event/common/event-thread-services.h>
-#include <dali/internal/render/data-providers/node-data-provider.h>
#include <dali/internal/update/common/animatable-property.h>
#include <dali/internal/update/common/property-owner.h>
#include <dali/internal/update/common/property-vector3.h>
#include <dali/internal/update/manager/transform-manager.h>
#include <dali/internal/update/manager/transform-manager-property.h>
#include <dali/internal/update/nodes/node-declarations.h>
-#include <dali/internal/update/rendering/scene-graph-renderer.h>
+#include <dali/internal/update/rendering/data-providers/node-data-provider.h>
+
+//#include <dali/internal/update/rendering/scene-graph-renderer.h>
+
namespace Dali
{
class Layer;
class RenderTask;
class UpdateManager;
+class Renderer;
+
+using RendererContainer = Dali::Vector<Renderer*>;
+
/**
* Flag whether property has changed, during the Update phase.
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/integration-api/render-controller.h>
#include <dali/internal/common/message.h>
#include <dali/internal/common/message-buffer.h>
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
using std::vector;
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
namespace SceneGraph
{
-RenderTaskList::RenderTaskList( RenderMessageDispatcher& renderMessageDispatcher )
-: mNotificationObject( NULL ),
- mRenderMessageDispatcher( renderMessageDispatcher )
+RenderTaskList::RenderTaskList( /*RenderMessageDispatcher& renderMessageDispatcher*/ )
+: mNotificationObject( NULL )
+ //,mRenderMessageDispatcher( renderMessageDispatcher )
{
}
{
DALI_ASSERT_DEBUG( newTask != NULL && "SceneGraph RenderTask is null");
- newTask->Initialize( mRenderMessageDispatcher );
+ newTask->Initialize( /*mRenderMessageDispatcher*/ );
// mRenderTasks container takes ownership
mRenderTasks.PushBack( newTask.Release() );
}
#define __DALI_INTERNAL_SCENE_GRAPH_RENDER_TASK_LIST_H__
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
namespace SceneGraph
{
-class RenderMessageDispatcher;
+
class RenderTask;
/**
* Constructor
* @param renderMessageDispatcher to send messages
*/
- RenderTaskList( RenderMessageDispatcher& renderMessageDispatcher );
+ RenderTaskList( /*RenderMessageDispatcher& renderMessageDispatcher*/ );
/**
* Destructor
private:
CompleteNotificationInterface* mNotificationObject; ///< object to pass in to the complete notification
- RenderMessageDispatcher& mRenderMessageDispatcher; ///< for sending messages to render thread
RenderTaskContainer mRenderTasks; ///< A container of owned RenderTasks
-
};
// Messages for RenderTaskList
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/public-api/math/matrix.h>
-#include <dali/internal/update/controllers/render-message-dispatcher.h>
+
#include <dali/internal/update/nodes/node.h>
-#include <dali/internal/render/common/render-instruction.h>
-#include <dali/internal/render/common/render-tracker.h>
+#include <dali/internal/update/rendering/render-instruction.h>
+#include <dali/internal/update/rendering/render-tracker.h>
#include <dali/internal/update/render-tasks/scene-graph-render-task-debug.h>
mSourceNode->SetExclusiveRenderTask( NULL );
}
}
- if( mRenderSyncTracker )
- {
- mRenderMessageDispatcher->RemoveRenderTracker( *mRenderSyncTracker );
- }
+ // @todo remove any hard sync object
}
-void RenderTask::Initialize( RenderMessageDispatcher& renderMessageDispatcher )
+void RenderTask::Initialize()
{
- mRenderMessageDispatcher = &renderMessageDispatcher;
}
void RenderTask::SetSourceNode( Node* node )
mCamera = camera;
}
-void RenderTask::SetFrameBuffer( Render::FrameBuffer* frameBuffer )
+void RenderTask::SetFrameBuffer( SceneGraph::FrameBuffer* frameBuffer )
{
mFrameBuffer = frameBuffer;
}
-Render::FrameBuffer* RenderTask::GetFrameBuffer()
+SceneGraph::FrameBuffer* RenderTask::GetFrameBuffer()
{
return mFrameBuffer;
}
mNotifyTrigger = false;
if( mFrameBuffer )
{
- if( !mRenderSyncTracker || (mRenderSyncTracker && mRenderSyncTracker->IsSynced() ))
+ // @todo If hard sync exists, check if it has completed before cleaning up
{
mWaitingToRender = false;
mNotifyTrigger = true;
if( mRequiresSync &&
mRefreshRate == Dali::RenderTask::REFRESH_ONCE )
{
- // create tracker if one doesn't yet exist.
- if( !mRenderSyncTracker )
- {
- mRenderSyncTracker = new Render::RenderTracker();
- mRenderMessageDispatcher->AddRenderTracker( *mRenderSyncTracker );
- }
- instruction.mRenderTracker = mRenderSyncTracker;
- }
- else
- {
- // no sync needed, texture FBOs are "ready" the same frame they are rendered to
- instruction.mRenderTracker = NULL;
+ // Perform a hard synchronization after render instruction has executed.
}
}
: mViewportPosition( Vector2::ZERO),
mViewportSize( Vector2::ZERO),
mClearColor( Dali::RenderTask::DEFAULT_CLEAR_COLOR ),
- mRenderMessageDispatcher( NULL ),
- mRenderSyncTracker( NULL ),
+ //mRenderSyncTracker( NULL ),
mSourceNode( NULL ),
mCameraNode( NULL ),
mCamera( NULL ),
#define DALI_INTERNAL_SCENE_GRAPH_RENDER_TASK_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/event/common/event-thread-services.h>
#include <dali/internal/update/common/property-owner.h>
#include <dali/internal/update/common/animatable-property.h>
-#include <dali/internal/render/renderers/render-frame-buffer.h>
+#include <dali/internal/update/rendering/scene-graph-frame-buffer.h>
namespace Dali
{
-
namespace Internal
{
-
-namespace Render
-{
-class RenderTracker;
-}
-
namespace SceneGraph
{
class Node;
class Camera;
class RenderInstruction;
-class RenderMessageDispatcher;
+
/**
* RenderTasks describe how the Dali scene should be rendered.
/**
* Initialize the render task. Called in update thread
- * @param[in] renderMessageDispatcher to send messages to render thread
*/
- void Initialize( RenderMessageDispatcher& renderMessageDispatcher );
+ void Initialize();
/**
* Set the nodes to be rendered.
* Set the frame-buffer used as a render target.
* @param[in] frameBuffer The framebuffer
*/
- void SetFrameBuffer( Render::FrameBuffer* frameBuffer );
+ void SetFrameBuffer( SceneGraph::FrameBuffer* frameBuffer );
/**
* Retrieve the resource ID of the frame-buffer.
* @return The resource ID, or zero if not rendering off-screen.
*/
- Render::FrameBuffer* GetFrameBuffer();
+ SceneGraph::FrameBuffer* GetFrameBuffer();
/**
* Set the value of property viewportPosition
AnimatableProperty< Vector4 > mClearColor; ///< clearColor
private:
- RenderMessageDispatcher* mRenderMessageDispatcher;
- Render::RenderTracker* mRenderSyncTracker;
Node* mSourceNode;
Node* mCameraNode;
SceneGraph::Camera* mCamera;
- Render::FrameBuffer* mFrameBuffer;
+ SceneGraph::FrameBuffer* mFrameBuffer;
bool mWaitingToRender:1; ///< True when an render once to FBO is waiting
bool mNotifyTrigger:1; ///< True if a render once render task has finished renderering
};
// Messages for RenderTask
-inline void SetFrameBufferMessage( EventThreadServices& eventThreadServices, RenderTask& task, Render::FrameBuffer* frameBuffer )
+inline void SetFrameBufferMessage( EventThreadServices& eventThreadServices, RenderTask& task, SceneGraph::FrameBuffer* frameBuffer )
{
- typedef MessageValue1< RenderTask, Render::FrameBuffer*> LocalType;
+ typedef MessageValue1< RenderTask, SceneGraph::FrameBuffer*> LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
#define __DALI_INTERNAL_SCENE_GRAPH_NODE_DATA_PROVIDER_H__
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*
*/
-#include <dali/internal/render/data-providers/uniform-map-data-provider.h>
+#include <dali/internal/update/rendering/data-providers/uniform-map-data-provider.h>
namespace Dali
{
#define DALI_INTERNAL_SCENE_GRAPH_PROPERTY_BUFFER_DATA_PROVIDER_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*
*/
-#include "render-data-provider.h"
+#include <dali/internal/update/rendering/data-providers/render-data-provider.h>
namespace Dali
{
return mSamplers;
}
-std::vector<Render::Texture*>& RenderDataProvider::GetTextures()
+std::vector<SceneGraph::Texture*>& RenderDataProvider::GetTextures()
{
return mTextures;
}
#define __DALI_INTERNAL_SCENE_GRAPH_RENDER_DATA_PROVIDER_H__
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/common/vector-wrapper.h>
#include <dali/public-api/rendering/renderer.h>
-#include <dali/internal/render/data-providers/node-data-provider.h>
-#include <dali/internal/render/data-providers/property-buffer-data-provider.h>
-#include <dali/internal/render/data-providers/uniform-map-data-provider.h>
-#include <dali/internal/render/renderers/render-sampler.h>
-#include <dali/internal/render/renderers/render-texture.h>
+#include <dali/internal/update/rendering/data-providers/node-data-provider.h>
+#include <dali/internal/update/rendering/data-providers/property-buffer-data-provider.h>
+#include <dali/internal/update/rendering/data-providers/uniform-map-data-provider.h>
+#include <dali/internal/update/rendering/scene-graph-sampler.h>
+#include <dali/internal/update/rendering/scene-graph-texture.h>
namespace Dali
{
struct BlendingOptions;
+
namespace SceneGraph
{
class PropertyBuffer;
class RenderDataProvider
{
public:
-
- typedef std::vector< Render::Sampler* > Samplers;
+ typedef Dali::Vector< const PropertyBufferDataProvider* > VertexBuffers;
+ typedef std::vector< SceneGraph::Sampler* > Samplers;
/**
* Constructor.
* Returns the shader
* @return The shader
*/
- Dali::Internal::SceneGraph::Shader& GetShader() const;
+ Shader& GetShader() const;
/**
* Returns the list of samplers
* Returns the list of Textures
* @return The list of Textures
*/
- std::vector<Render::Texture*>& GetTextures();
+ std::vector<SceneGraph::Texture*>& GetTextures();
private:
const UniformMapDataProvider* mUniformMapDataProvider;
- Dali::Internal::SceneGraph::Shader* mShader;
- std::vector<Render::Texture*> mTextures;
+ Shader* mShader;
+ std::vector<SceneGraph::Texture*> mTextures;
Samplers mSamplers;
// Give Renderer access to our private data to reduce copying vectors on construction.
#define DALI_INTERNAL_SCENE_GRAPH_UNIFORM_MAP_DATA_PROVIDER_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*/
// CLASS HEADER
-#include <dali/internal/render/common/render-instruction-container.h>
+#include <dali/internal/update/rendering/render-instruction-container.h>
// INTERNAL INCLUDES
-#include <dali/internal/render/common/render-instruction.h>
+#include <dali/internal/update/rendering/render-instruction.h>
namespace Dali
{
#define __DALI_INTERNAL_SCENE_GRAPH_RENDER_INSTRUCTION_CONTAINER_H__
/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*/
// CLASS HEADER
-#include <dali/internal/render/common/render-instruction.h>
+#include <dali/internal/update/rendering/render-instruction.h>
// INTERNAL INCLUDES
#include <dali/public-api/common/constants.h> // for Color::BLACK
-#include <dali/internal/render/common/render-tracker.h>
+#include <dali/internal/update/rendering/render-tracker.h>
#include <dali/integration-api/debug.h>
namespace Dali
{
RenderInstruction::RenderInstruction()
-: mRenderTracker( NULL ),
- mClearColor(),
+: mClearColor(),
mIsViewportSet( false ),
mIsClearColorSet( false ),
mIgnoreRenderToFbo( false ),
return mRenderLists[ index ];
}
-void RenderInstruction::Reset( Camera* camera,
- Render::FrameBuffer* frameBuffer,
- const Viewport* viewport,
- const Vector4* clearColor )
+void RenderInstruction::Reset( Camera* camera,
+ SceneGraph::FrameBuffer* frameBuffer,
+ const Viewport* viewport,
+ const Vector4* clearColor )
{
mCamera = camera;
mViewport = viewport ? *viewport : Viewport();
mIsViewportSet = NULL != viewport;
mClearColor = clearColor ? *clearColor : Color::BLACK;
mIsClearColorSet = NULL != clearColor;
- mRenderTracker = NULL;
mNextFreeRenderList = 0;
mFrameBuffer = frameBuffer;
#define DALI_INTERNAL_SCENE_GRAPH_RENDER_INSTRUCTION_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/math/matrix.h>
#include <dali/public-api/math/viewport.h>
#include <dali/internal/update/render-tasks/scene-graph-camera.h>
-#include <dali/internal/render/common/render-list.h>
-#include <dali/internal/render/renderers/render-frame-buffer.h>
+#include <dali/internal/update/rendering/render-list.h>
+#include <dali/internal/update/rendering/scene-graph-frame-buffer.h>
namespace Dali
{
-
namespace Internal
{
-
-namespace Render
-{
-class RenderTracker;
-}
-
namespace SceneGraph
{
* @param[in] clearColor A pointer to a color to clear with, or NULL if no clear is required.
*/
void Reset( Camera* camera,
- Render::FrameBuffer* frameBuffer,
+ SceneGraph::FrameBuffer* frameBuffer,
const Viewport* viewport,
const Vector4* clearColor );
public: // Data
- Render::RenderTracker* mRenderTracker; ///< Pointer to an optional tracker object (not owned)
-
Viewport mViewport; ///< Optional viewport
Vector4 mClearColor; ///< Optional color to clear with
bool mIsViewportSet:1; ///< Flag to determine whether the viewport is set
bool mIsClearColorSet:1; ///< Flag to determine whether the clearColor is set
bool mIgnoreRenderToFbo:1; ///< Whether to ignore the render to FBO option (used to measure the performance above 60 fps)
- Render::FrameBuffer* mFrameBuffer;
+ SceneGraph::FrameBuffer* mFrameBuffer;
private: // Data
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*/
// CLASS HEADER
-#include <dali/internal/render/common/render-item.h>
+#include <dali/internal/update/rendering/render-item.h>
// INTERNAL INCLUDES
#include <dali/internal/common/memory-pool-object-allocator.h>
-#include <dali/internal/render/renderers/render-renderer.h>
#include <dali/internal/common/math.h>
namespace
: mModelMatrix( false ),
mModelViewMatrix( false ),
mSize(),
- mRenderer( NULL ),
+ //mRenderer( NULL ),
mNode( NULL ),
mTextureSet( NULL ),
mDepthIndex( 0 ),
#define DALI_INTERNAL_SCENE_GRAPH_RENDER_ITEM_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
namespace Internal
{
-namespace Render
-{
-class Renderer;
-}
-
namespace SceneGraph
{
Matrix mModelMatrix;
Matrix mModelViewMatrix;
Vector3 mSize;
- Render::Renderer* mRenderer;
Node* mNode;
const void* mTextureSet; //< Used for sorting only
int mDepthIndex;
#define DALI_INTERNAL_SCENE_GRAPH_RENDER_LIST_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/public-api/math/rect.h>
#include <dali/devel-api/common/owner-container.h>
-#include <dali/internal/render/common/render-item.h>
+#include <dali/internal/update/rendering/render-item.h>
namespace Dali
{
namespace Internal
{
-namespace Render
-{
-class Renderer;
-}
-
namespace SceneGraph
{
}
/**
- * Get renderer from an item in the list
- */
- const Render::Renderer& GetRenderer( RenderItemContainer::SizeType index ) const
- {
- DALI_ASSERT_DEBUG( index < GetCachedItemCount() );
- return *mItems[ index ]->mRenderer;
- }
-
- /**
* Get the number of real items
* Because of caching, the actual size may be bit more
* @return The number of items
#define __DALI_INTERNAL_RENDER_RENDER_TRACKER_H
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*
*/
-#include <dali/integration-api/gl-sync-abstraction.h>
#include <dali/internal/common/message.h>
namespace Dali
/**
* Creates a sync object for this tracker. Will delete any existing sync object.
*/
- void CreateSyncObject( Integration::GlSyncAbstraction& glSyncAbstraction );
+ void CreateSyncObject();
/**
- * Check the GL Sync objects. This is called from Render Thread.
- * If the GlSyncObject has been triggered, then atomically set the sync trigger
+ * Check the Sync objects.
+ * If the SyncObject has been triggered, then atomically set the sync trigger
*/
void PollSyncObject();
void SetSyncFlag();
private:
-
- Integration::GlSyncAbstraction* mGlSyncAbstraction; // The sync abstraction
- Integration::GlSyncAbstraction::SyncObject* mSyncObject; // Associated sync object
- volatile int mSyncTrigger; // Trigger that update thread can read
+ /**
+ * @todo Need a new sync mechanism from Graphics API
+ */
+ volatile int mSyncTrigger; // Trigger that update thread can read
};
--- /dev/null
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// CLASS HEADER
+#include <dali/internal/update/rendering/scene-graph-frame-buffer.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/update/rendering/scene-graph-texture.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+FrameBuffer::FrameBuffer( unsigned int width, unsigned int height, unsigned int attachments )
+: mWidth( width ),
+ mHeight( height )
+{
+}
+
+FrameBuffer::~FrameBuffer()
+{
+}
+
+void FrameBuffer::AttachColorTexture( SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int layer )
+{
+}
+
+unsigned int FrameBuffer::GetWidth() const
+{
+ return mWidth;
+}
+
+unsigned int FrameBuffer::GetHeight() const
+{
+ return mHeight;
+}
+
+
+} //Render
+
+} //Internal
+
+} //Dali
-#ifndef DALI_INTERNAL_RENDER_FRAME_BUFFER_H
-#define DALI_INTERNAL_RENDER_FRAME_BUFFER_H
+#ifndef DALI_INTERNAL_SCENE_GRAPH_FRAME_BUFFER_H
+#define DALI_INTERNAL_SCENE_GRAPH_FRAME_BUFFER_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/public-api/rendering/frame-buffer.h>
-#include <dali/internal/render/gl-resources/context.h>
-#include <dali/internal/render/renderers/render-sampler.h>
-#include <dali/integration-api/gl-defines.h>
+#include <dali/internal/update/rendering/scene-graph-texture.h>
namespace Dali
{
namespace Internal
{
-namespace Render
+
+namespace SceneGraph
{
-class Texture;
class FrameBuffer
{
~FrameBuffer();
/**
- * Creates a FrameBuffer object in the GPU.
- * @param[in] context The GL context
- */
- void Initialize(Context& context);
-
- /**
- * Deletes the framebuffer object from the GPU
- * @param[in] context The GL context
- */
- void Destroy( Context& context );
-
- /**
- * Called by RenderManager to inform the framebuffer that the context has been destroyed
- */
- void GlContextDestroyed();
-
- /**
* @brief Attach a texture for color rendering. Valid only for Framebuffers with COLOR attachments.
* param[in] context The GL context
* @param[in] texture The texture that will be used as output when rendering
* @param[in] mipmapLevel The mipmap of the texture to be attached
* @param[in] layer Indicates which layer of a cube map or array texture to attach. Unused for 2D textures
*/
- void AttachColorTexture( Context& context, Render::Texture* texture, unsigned int mipmapLevel, unsigned int layer );
-
- /**
- * @brief Bind the framebuffer
- * @param[in] context The GL context
- */
- void Bind( Context& context );
+ void AttachColorTexture( SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int layer );
/**
* @brief Get the width of the FrameBuffer
private:
- GLuint mId;
- GLuint mDepthBuffer;
- GLuint mStencilBuffer;
unsigned int mWidth;
unsigned int mHeight;
};
-} // namespace Render
+} // namespace SceneGraph
} // namespace Internal
} // namespace Dali
-#endif // DALI_INTERNAL_RENDER_FRAME_BUFFER_H
+#endif // DALI_INTERNAL_SCENE_GRAPH_FRAME_BUFFER_H
--- /dev/null
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// CLASS HEADER
+#include <dali/internal/update/rendering/scene-graph-geometry.h>
+
+// INTERNAL HEADERS
+#include <dali/integration-api/debug.h>
+#include <dali/internal/common/buffer-index.h>
+#include <dali/internal/update/rendering/scene-graph-property-buffer.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+Geometry::Geometry()
+: mIndices(),
+ mGeometryType( Dali::Geometry::TRIANGLES ),
+ mIndicesChanged(false),
+ mHasBeenUpdated(false),
+ mAttributesChanged(true)
+{
+}
+
+Geometry::~Geometry()
+{
+}
+
+void Geometry::Initialize( Integration::Graphics::Graphics& graphics )
+{
+ mGraphics = &graphics;
+}
+
+void Geometry::AddPropertyBuffer( SceneGraph::PropertyBuffer* propertyBuffer )
+{
+ mVertexBuffers.PushBack( propertyBuffer );
+ mAttributesChanged = true;
+}
+
+void Geometry::SetIndexBuffer( Dali::Vector<unsigned short>& indices )
+{
+ mIndices.Swap( indices );
+ mIndicesChanged = true;
+}
+
+void Geometry::RemovePropertyBuffer( const SceneGraph::PropertyBuffer* propertyBuffer )
+{
+ size_t bufferCount = mVertexBuffers.Size();
+ for( size_t i(0); i<bufferCount; ++i )
+ {
+ if( propertyBuffer == mVertexBuffers[i] )
+ {
+ //This will delete the gpu buffer associated to the RenderPropertyBuffer if there is one
+ mVertexBuffers.Remove( mVertexBuffers.Begin()+i );
+ mAttributesChanged = true;
+ break;
+ }
+ }
+}
+
+} // namespace SceneGraph
+} // namespace Internal
+} // namespace Dali
--- /dev/null
+#ifndef DALI_INTERNAL_SCENE_GRAPH_GEOMETRY_H
+#define DALI_INTERNAL_SCENE_GRAPH_GEOMETRY_H
+
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dali/public-api/common/dali-vector.h>
+#include <dali/public-api/rendering/geometry.h>
+#include <dali/devel-api/common/owner-container.h>
+#include <dali/graphics-api/graphics-api-controller.h>
+#include <dali/integration-api/graphics/graphics.h>
+#include <dali/internal/common/message.h>
+#include <dali/internal/common/owner-pointer.h>
+#include <dali/internal/common/buffer-index.h>
+#include <dali/internal/common/owner-pointer.h>
+#include <dali/internal/event/common/event-thread-services.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+class PropertyBuffer;
+
+/**
+ * This class encapsulates vertex data and index data used to describe a mesh.
+ */
+class Geometry
+{
+public:
+ typedef Dali::Geometry::Type Type;
+
+ Geometry();
+
+ /**
+ * Destructor
+ */
+ ~Geometry();
+
+ /**
+ * Initialize the geometry object with the Graphics API when added to UpdateManager
+ *
+ * @param[in] graphics The Graphics API
+ */
+ void Initialize( Integration::Graphics::Graphics& graphics );
+
+ /**
+ * Adds a property buffer to the geometry
+ * @param[in] dataProvider The PropertyBuffer data provider
+ */
+ void AddPropertyBuffer( SceneGraph::PropertyBuffer* propertyBuffer );
+
+ /**
+ * Set the data for the index buffer to be used by the geometry
+ * @param[in] indices A vector containing the indices
+ */
+ void SetIndexBuffer( Dali::Vector<unsigned short>& indices );
+
+ /**
+ * Removes a PropertyBuffer from the geometry
+ * @param[in] propertyBuffer The property buffer to be removed
+ */
+ void RemovePropertyBuffer( const SceneGraph::PropertyBuffer* propertyBuffer );
+
+ /**
+ * Gets the attribute locations on the shader for the attributes defined in the geometry RenderBuffers
+ * @param[out] attributeLocation The vector where the attributes locations will be stored
+ * @param[in] program The program
+ * @param[in] bufferIndex The current buffer index
+ */
+
+ /**
+ * Chack if the attributes for the geometry have changed
+ * @return True if vertex buffers have been added or removed since last frame, false otherwise
+ */
+ bool AttributesChanged() const
+ {
+ return mAttributesChanged;
+ }
+
+ /**
+ * Sets the geometry type
+ * @param[in] type The new geometry type
+ */
+ void SetType( Type type )
+ {
+ mGeometryType = type;
+ }
+
+ /**
+ * Upload the geometry if it has changed, set up the attributes and perform
+ * the Draw call corresponding to the geometry type
+ * @param[in] bufferIndex The current buffer index
+ * @param[in] attributeLocation The location for the attributes in the shader
+ * @param[in] elementBufferOffset The index of first element to draw if index buffer bound
+ * @param[in] elementBufferCount Number of elements to draw if index buffer bound, uses whole buffer when 0
+ */
+ void UploadAndDraw( Graphics::API::Controller& controller,
+ BufferIndex bufferIndex,
+ Vector<uint32_t>& attributeLocation,
+ size_t elementBufferOffset,
+ size_t elementBufferCount );
+
+ /**
+ * @return
+ */
+ const Vector< SceneGraph::PropertyBuffer* >& GetVertexBuffers() const
+ {
+ return mVertexBuffers;
+ }
+
+ const Dali::Vector< unsigned short>& GetIndices() const
+ {
+ return mIndices;
+ }
+
+private:
+ Integration::Graphics::Graphics* mGraphics; ///< Graphics interface object
+
+ // PropertyBuffers
+ Vector< SceneGraph::PropertyBuffer* > mVertexBuffers;
+ Dali::Vector< unsigned short> mIndices;
+
+ Type mGeometryType;
+
+ // Booleans
+ bool mIndicesChanged : 1;
+ bool mHasBeenUpdated : 1;
+ bool mAttributesChanged : 1;
+};
+
+} // SceneGraph
+
+// Enums can be passed via message by templating a suitable ParameterType.
+template <> struct ParameterType< Dali::Geometry::Type > : public BasicType< Dali::Geometry::Type > {};
+
+namespace SceneGraph
+{
+
+// Custom message type for SetIndexBuffer() used to move data with Vector::Swap()
+class IndexBufferMessage : public MessageBase
+{
+public:
+
+ /**
+ * Constructor which does a Vector::Swap()
+ */
+ IndexBufferMessage( SceneGraph::Geometry* geometry, Dali::Vector<unsigned short>& indices )
+ : MessageBase(),
+ mGeometry( geometry )
+ {
+ mIndices.Swap( indices );
+ }
+
+ /**
+ * Virtual destructor
+ */
+ virtual ~IndexBufferMessage()
+ {
+ }
+
+ /**
+ * @copydoc MessageBase::Process
+ */
+ virtual void Process( BufferIndex /*bufferIndex*/ )
+ {
+ DALI_ASSERT_DEBUG( mGeometry && "Message does not have an object" );
+ mGeometry->SetIndexBuffer( mIndices );
+ }
+
+private:
+ SceneGraph::Geometry* mGeometry;
+ Dali::Vector<unsigned short> mIndices;
+};
+
+inline void SetIndexBufferMessage( EventThreadServices& eventThreadServices, SceneGraph::Geometry& geometry, Dali::Vector<unsigned short>& indices )
+{
+ typedef IndexBufferMessage LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &geometry, indices );
+}
+
+inline void AttachVertexBufferMessage( EventThreadServices& eventThreadServices, SceneGraph::Geometry& geometry, const SceneGraph::PropertyBuffer& vertexBuffer )
+{
+ typedef MessageValue1< SceneGraph::Geometry, SceneGraph::PropertyBuffer* > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &geometry, &Geometry::AddPropertyBuffer, const_cast<SceneGraph::PropertyBuffer*>(&vertexBuffer) );
+}
+
+inline void RemoveVertexBufferMessage( EventThreadServices& eventThreadServices, SceneGraph::Geometry& geometry, const SceneGraph::PropertyBuffer& vertexBuffer )
+{
+ typedef MessageValue1< SceneGraph::Geometry, const SceneGraph::PropertyBuffer* > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &geometry, &Geometry::RemovePropertyBuffer, &vertexBuffer );
+}
+
+inline void SetGeometryTypeMessage( EventThreadServices& eventThreadServices, SceneGraph::Geometry& geometry, Dali::Geometry::Type geometryType )
+{
+ typedef MessageValue1< Geometry, Dali::Geometry::Type > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &geometry, &Geometry::SetType, geometryType );
+}
+
+} // namespace SceneGraph
+} // namespace Internal
+} // namespace Dali
+
+#endif // DALI_INTERNAL_SCENE_GRAPH_GEOMETRY_H
--- /dev/null
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/update/rendering/scene-graph-property-buffer.h>
+
+// INTERNAL HEADERS
+#include <dali/internal/event/common/property-buffer-impl.h> // Dali::Internal::PropertyBuffer
+#include <dali/graphics-api/graphics-api-controller.h>
+#include <dali/graphics-api/graphics-api-buffer.h>
+
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+PropertyBuffer::PropertyBuffer()
+: mGraphics( nullptr ),
+ mFormat( nullptr ),
+ mData( nullptr ),
+ mSize(0),
+ mDataChanged(true),
+ mGraphicsBuffer{ nullptr },
+ mGraphicsBufferUsage{ Graphics::API::Buffer::UsageHint::ATTRIBUTES }
+{
+}
+
+PropertyBuffer::~PropertyBuffer()
+{
+}
+
+void PropertyBuffer::Initialize( Integration::Graphics::Graphics& graphics )
+{
+ mGraphics = &graphics;
+}
+
+void PropertyBuffer::SetUsage( Graphics::API::Buffer::UsageHint usage )
+{
+ mGraphicsBufferUsage = usage;
+}
+
+void PropertyBuffer::SetFormat( OwnerPointer< PropertyBuffer::Format >& format )
+{
+ mFormat.Swap( format );
+ mDataChanged = true;
+}
+
+void PropertyBuffer::SetData( OwnerPointer< Dali::Vector<char> >& data, size_t size )
+{
+ mData.Swap( data );
+ mSize = size;
+ mDataChanged = true;
+
+ if( mGraphics )
+ {
+ auto& controller = mGraphics->GetController();
+ mGraphicsBuffer = controller.CreateBuffer( controller.GetBufferFactory()
+ .SetSize( uint32_t( mFormat->size * size) )
+ .SetUsage(Graphics::API::Buffer::UsageHint::ATTRIBUTES ));
+
+ }
+}
+
+bool PropertyBuffer::Update( Dali::Graphics::API::Controller& controller )
+{
+ if( !mData || !mFormat || !mSize )
+ {
+ return false;
+ }
+
+ if( mDataChanged || !mGraphicsBuffer )
+ {
+ if( !mGraphicsBuffer )
+ {
+ mGraphicsBuffer = controller.CreateBuffer( controller.GetBufferFactory()
+ .SetUsage( mGraphicsBufferUsage )
+ .SetSize( mSize ) );
+ }
+
+ // schedule deferred write
+ mGraphicsBuffer.Get().Write( mData.Get()->begin(), GetDataSize(), 0u );
+
+ mDataChanged = false;
+ }
+
+ return true;
+}
+
+} //Render
+} //Internal
+} //Dali
-#ifndef DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H
-#define DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H
+#ifndef DALI_INTERNAL_SCENE_GRAPH_PROPERTY_BUFFER_H
+#define DALI_INTERNAL_SCENE_GRAPH_PROPERTY_BUFFER_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/actors/sampling.h>
#include <dali/public-api/common/vector-wrapper.h>
#include <dali/public-api/rendering/sampler.h>
-#include <dali/internal/common/owner-pointer.h>
-#include <dali/internal/render/renderers/render-sampler.h>
-#include <dali/internal/render/gl-resources/gpu-buffer.h>
#include <dali/graphics-api/graphics-api-accessor.h>
#include <dali/graphics-api/graphics-api-buffer.h>
+#include <dali/integration-api/graphics/graphics.h>
+#include <dali/internal/common/message.h>
+#include <dali/internal/common/owner-pointer.h>
+#include <dali/internal/event/common/event-thread-services.h>
+#include <dali/internal/update/rendering/scene-graph-sampler.h>
namespace Dali
{
namespace Internal
{
-namespace Render
+namespace SceneGraph
{
class PropertyBuffer
~PropertyBuffer();
/**
+ * Initialize the shader object with the Graphics API when added to UpdateManager
+ *
+ * @param[in] graphics The Graphics API
+ */
+ void Initialize( Integration::Graphics::Graphics& graphics );
+
+ /**
* @brief Set the format of the buffer
*
* This function takes ownership of the pointer
*
* @param[in] format The format for the PropertyBuffer
*/
- void SetFormat( PropertyBuffer::Format* format );
+ void SetFormat( OwnerPointer<PropertyBuffer::Format>& format );
+
/**
* @brief Set the data of the PropertyBuffer
* @param[in] data The new data of the PropertyBuffer
* @param[in] size The new size of the buffer
*/
- void SetData( Dali::Vector<char>* data, size_t size );
+ void SetData( OwnerPointer< Dali::Vector<char> >& data, size_t size );
/**
* @brief Set the number of elements
void SetSize( unsigned int size );
/**
- * @brief Bind the property buffer
- * @param[in] target The binding point
- */
- void BindBuffer(GpuBuffer::Target target);
-
-#if 0
- /**
- * Perform the upload of the buffer only when requiered
- * @param[in] context The GL context
- */
- bool Update( Context& context );
-#endif
-
- /**
* Perform the upload of the buffer only when required
- * @param controller
+ * @param[in] controller
* @return
*/
bool Update( Dali::Graphics::API::Controller& controller );
/**
- * Enable the vertex attributes for each vertex buffer from the corresponding
- * shader program.
- * @param[in] context The GL context
- * @param[in] vAttributeLocation Vector containing attributes location for current program
- * @param[in] locationBase Index in vAttributeLocation corresponding to the first attribute defined by this buffer
- */
- unsigned int EnableVertexAttributes( Context& context, Vector<GLint>& vAttributeLocation, unsigned int locationBase );
-
- /**
* Get the number of attributes present in the buffer
* @return The number of attributes stored in this buffer
*/
return mSize;
}
- /**
- * Retrieve reference to the data storage vector
- * @return Reference to the data storage
- */
- inline const Dali::Vector< char >& GetData() const
- {
- return *mData.Get();
- }
-
- /**
- * Retrieve data writeable pointer ( direct access to the buffer data )
- * @return Pointer to data converted to requested type
- */
- template <typename T>
- inline T* GetDataTypedPtr()
- {
- Dali::Vector< char >* data = mData.Release();
- mData = data;
- return reinterpret_cast<T*>( &data->operator[]( 0 ) );
- }
-
inline const PropertyBuffer::Format* GetFormat() const
{
return mFormat.Get();
}
-
- inline void SetGfxObject( Graphics::API::Accessor<Graphics::API::Buffer> gfxObject )
- {
- mGfxBuffer = gfxObject;
- }
-
inline Graphics::API::Accessor<Graphics::API::Buffer> GetGfxObject() const
{
- return mGfxBuffer;
+ return mGraphicsBuffer;
}
void SetUsage( Graphics::API::Buffer::UsageHint usage );
private:
+ Integration::Graphics::Graphics* mGraphics; ///< Graphics interface object
OwnerPointer< PropertyBuffer::Format > mFormat; ///< Format of the buffer
OwnerPointer< Dali::Vector< char > > mData; ///< Data
- OwnerPointer< GpuBuffer > mGpuBuffer; ///< Pointer to the GpuBuffer associated with this RenderPropertyBuffer
size_t mSize; ///< Number of Elements in the buffer
bool mDataChanged; ///< Flag to know if data has changed in a frame
// GRAPHICS
- Graphics::API::Accessor<Graphics::API::Buffer> mGfxBuffer;
- Graphics::API::Buffer::UsageHint mGfxBufferUsage;
+ Graphics::API::Accessor<Graphics::API::Buffer> mGraphicsBuffer;
+ Graphics::API::Buffer::UsageHint mGraphicsBufferUsage;
};
-} // namespace Render
+
+inline void SetPropertyBufferFormatMessage( EventThreadServices& eventThreadServices, SceneGraph::PropertyBuffer& propertyBuffer, OwnerPointer< SceneGraph::PropertyBuffer::Format>& format )
+{
+ // Message has ownership of PropertyBuffer::Format while in transit from event -> update
+ typedef MessageValue1< SceneGraph::PropertyBuffer, OwnerPointer< SceneGraph::PropertyBuffer::Format> > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &propertyBuffer, &PropertyBuffer::SetFormat, format );
+}
+
+inline void SetPropertyBufferDataMessage( EventThreadServices& eventThreadServices, SceneGraph::PropertyBuffer& propertyBuffer, OwnerPointer< Vector<char> >& data, size_t size )
+{
+ // Message has ownership of PropertyBuffer data while in transit from event -> update
+ typedef MessageValue2< SceneGraph::PropertyBuffer, OwnerPointer< Vector<char> >, size_t > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &propertyBuffer, &PropertyBuffer::SetData, data, size );
+}
+
+} // namespace SceneGraph
} // namespace Internal
} // namespace Dali
-#endif // DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H
+#endif // DALI_INTERNAL_SCENE_GRAPH_PROPERTY_BUFFER_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// INTERNAL INCLUDES
#include <dali/internal/common/internal-constants.h>
#include <dali/internal/common/memory-pool-object-allocator.h>
-#include <dali/internal/update/controllers/render-message-dispatcher.h>
-#include <dali/internal/update/controllers/scene-controller.h>
#include <dali/internal/update/nodes/node.h>
+#include <dali/internal/update/rendering/data-providers/node-data-provider.h>
+#include <dali/internal/update/rendering/scene-graph-geometry.h>
+#include <dali/internal/update/rendering/scene-graph-property-buffer.h>
#include <dali/internal/update/rendering/scene-graph-texture-set.h>
-#include <dali/internal/render/data-providers/node-data-provider.h>
-#include <dali/internal/render/queue/render-queue.h>
-#include <dali/internal/render/renderers/render-geometry.h>
-#include <dali/internal/render/shaders/program.h>
-#include <dali/internal/render/shaders/scene-graph-shader.h>
+#include <dali/internal/update/rendering/scene-graph-shader.h>
#include <dali/graphics-api/graphics-api-controller.h>
#include <dali/graphics-api/graphics-api-render-command.h>
}
Renderer::Renderer()
-: mSceneController( 0 ),
- mRenderer( NULL ),
+: mRenderDataProvider(),
mTextureSet( NULL ),
mGeometry( NULL ),
mShader( NULL ),
}
}
-
-
/**
* REGENERATE UNIFORM MAP
*/
mRegenerateUniformMap--;
}
-
-
-
auto& shader = mShader->GetGfxObject().Get();
auto uboCount = shader.GetUniformBlockCount();
if( mResendFlag != 0 )
{
- if( mResendFlag & RESEND_DATA_PROVIDER )
- {
- OwnerPointer<RenderDataProvider> dataProvider = NewRenderDataProvider();
-
- typedef MessageValue1< Render::Renderer, OwnerPointer<RenderDataProvider> > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetRenderDataProvider, dataProvider );
- }
-
- if( mResendFlag & RESEND_GEOMETRY )
- {
- typedef MessageValue1< Render::Renderer, Render::Geometry* > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetGeometry, mGeometry );
- }
-
- if( mResendFlag & RESEND_FACE_CULLING_MODE )
- {
- typedef MessageValue1< Render::Renderer, FaceCullingMode::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetFaceCullingMode, mFaceCullingMode );
- }
-
- if( mResendFlag & RESEND_BLEND_BIT_MASK )
- {
- typedef MessageValue1< Render::Renderer, unsigned int > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendingBitMask, mBlendBitmask );
- }
-
- if( mResendFlag & RESEND_BLEND_COLOR )
- {
- typedef MessageValue1< Render::Renderer, Vector4 > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendColor, GetBlendColor() );
- }
-
- if( mResendFlag & RESEND_PREMULTIPLIED_ALPHA )
- {
- typedef MessageValue1< Render::Renderer, bool > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::EnablePreMultipliedAlpha, mPremultipledAlphaEnabled );
- }
-
- if( mResendFlag & RESEND_INDEXED_DRAW_FIRST_ELEMENT )
- {
- typedef MessageValue1< Render::Renderer, size_t > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetIndexedDrawFirstElement, mIndexedDrawFirstElement );
- }
-
- if( mResendFlag & RESEND_INDEXED_DRAW_ELEMENTS_COUNT )
- {
- typedef MessageValue1< Render::Renderer, size_t > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetIndexedDrawElementsCount, mIndexedDrawElementsCount );
- }
-
- if( mResendFlag & RESEND_DEPTH_WRITE_MODE )
- {
- typedef MessageValue1< Render::Renderer, DepthWriteMode::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthWriteMode, mDepthWriteMode );
- }
-
- if( mResendFlag & RESEND_DEPTH_TEST_MODE )
- {
- typedef MessageValue1< Render::Renderer, DepthTestMode::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthTestMode, mDepthTestMode );
- }
-
- if( mResendFlag & RESEND_DEPTH_FUNCTION )
- {
- typedef MessageValue1< Render::Renderer, DepthFunction::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthFunction, mDepthFunction );
- }
-
- if( mResendFlag & RESEND_RENDER_MODE )
- {
- typedef MessageValue1< Render::Renderer, RenderMode::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetRenderMode, mStencilParameters.renderMode );
- }
-
- if( mResendFlag & RESEND_STENCIL_FUNCTION )
- {
- typedef MessageValue1< Render::Renderer, StencilFunction::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilFunction, mStencilParameters.stencilFunction );
- }
-
- if( mResendFlag & RESEND_STENCIL_FUNCTION_MASK )
- {
- typedef MessageValue1< Render::Renderer, int > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilFunctionMask, mStencilParameters.stencilFunctionMask );
- }
-
- if( mResendFlag & RESEND_STENCIL_FUNCTION_REFERENCE )
- {
- typedef MessageValue1< Render::Renderer, int > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilFunctionReference, mStencilParameters.stencilFunctionReference );
- }
-
- if( mResendFlag & RESEND_STENCIL_MASK )
- {
- typedef MessageValue1< Render::Renderer, int > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilMask, mStencilParameters.stencilMask );
- }
-
- if( mResendFlag & RESEND_STENCIL_OPERATION_ON_FAIL )
- {
- typedef MessageValue1< Render::Renderer, StencilOperation::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilOperationOnFail, mStencilParameters.stencilOperationOnFail );
- }
-
- if( mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_FAIL )
- {
- typedef MessageValue1< Render::Renderer, StencilOperation::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilOperationOnZFail, mStencilParameters.stencilOperationOnZFail );
- }
-
- if( mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_PASS )
- {
- typedef MessageValue1< Render::Renderer, StencilOperation::Type > DerivedType;
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
- new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilOperationOnZPass, mStencilParameters.stencilOperationOnZPass );
- }
-
+ // This used to send messages to obsolete Render::Renderer at this point
mResendFlag = 0;
}
}
mResendFlag |= RESEND_DATA_PROVIDER;
}
-void Renderer::SetGeometry( Render::Geometry* geometry )
+void Renderer::SetGeometry( SceneGraph::Geometry* geometry )
{
DALI_ASSERT_DEBUG( geometry != NULL && "Geometry pointer is NULL");
mGeometry = geometry;
-
- if( mRenderer )
- {
- mResendFlag |= RESEND_GEOMETRY;
- }
}
void Renderer::SetDepthIndex( int depthIndex )
}
//Called when SceneGraph::Renderer is added to update manager ( that happens when an "event-thread renderer" is created )
-void Renderer::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
+void Renderer::ConnectToSceneGraph( BufferIndex bufferIndex )
{
mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
- mSceneController = &sceneController;
- RenderDataProvider* dataProvider = NewRenderDataProvider();
-
- mRenderer = Render::Renderer::New( dataProvider, mGeometry, mBlendBitmask, GetBlendColor(), static_cast< FaceCullingMode::Type >( mFaceCullingMode ),
- mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters );
-
- OwnerPointer< Render::Renderer > transferOwnership( mRenderer );
- mSceneController->GetRenderMessageDispatcher().AddRenderer( transferOwnership );
-}
-
-//Called just before destroying the scene-graph renderer ( when the "event-thread renderer" is no longer referenced )
-void Renderer::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
-{
- //Remove renderer from RenderManager
- if( mRenderer )
- {
- mSceneController->GetRenderMessageDispatcher().RemoveRenderer( *mRenderer );
- mRenderer = NULL;
- }
- mSceneController = NULL;
-}
-RenderDataProvider* Renderer::NewRenderDataProvider()
-{
- RenderDataProvider* dataProvider = new RenderDataProvider();
+ mRenderDataProvider = std::make_unique< RenderDataProvider >();
- dataProvider->mUniformMapDataProvider = this;
- dataProvider->mShader = mShader;
+ mRenderDataProvider->mUniformMapDataProvider = this;
+ mRenderDataProvider->mShader = mShader;
if( mTextureSet )
{
size_t textureCount = mTextureSet->GetTextureCount();
- dataProvider->mTextures.resize( textureCount );
- dataProvider->mSamplers.resize( textureCount );
+ mRenderDataProvider->mTextures.resize( textureCount );
+ mRenderDataProvider->mSamplers.resize( textureCount );
for( unsigned int i(0); i<textureCount; ++i )
{
- dataProvider->mTextures[i] = mTextureSet->GetTexture(i);
- dataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i);
+ mRenderDataProvider->mTextures[i] = mTextureSet->GetTexture(i);
+ mRenderDataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i);
}
}
+}
- return dataProvider;
+//Called just before destroying the scene-graph renderer ( when the "event-thread renderer" is no longer referenced )
+void Renderer::DisconnectFromSceneGraph( BufferIndex bufferIndex )
+{
}
const Vector4& Renderer::GetBlendColor() const
return Color::TRANSPARENT;
}
-Render::Renderer& Renderer::GetRenderer()
-{
- return *mRenderer;
-}
-
const CollectedUniformMap& Renderer::GetUniformMap( BufferIndex bufferIndex ) const
{
return mCollectedUniformMap[bufferIndex];
} // namespace Internal
} // namespace Dali
-#pragma GCC diagnostic pop
\ No newline at end of file
+#pragma GCC diagnostic pop
#define DALI_INTERNAL_SCENE_GRAPH_RENDERER_H
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/internal/update/common/property-owner.h>
#include <dali/internal/update/common/uniform-map.h>
#include <dali/internal/update/common/scene-graph-connection-change-propagator.h>
-#include <dali/internal/render/data-providers/render-data-provider.h>
-#include <dali/internal/render/renderers/render-renderer.h>
+#include <dali/internal/update/rendering/data-providers/render-data-provider.h>
+#include <dali/internal/update/rendering/stencil-parameters.h>
+#include <dali/graphics-api/graphics-api-render-command.h>
+#include <dali/graphics-api/graphics-api-controller.h>
namespace Dali
{
namespace Internal
{
-namespace Render
-{
-class Renderer;
-class Geometry;
-}
+
namespace SceneGraph
{
+class Geometry;
class SceneController;
+class TextureSet;
class Renderer;
typedef Dali::Vector< Renderer* > RendererContainer;
typedef RendererContainer::Iterator RendererIter;
typedef RendererContainer::ConstIterator RendererConstIter;
-class TextureSet;
-class Geometry;
-class Renderer : public PropertyOwner,
- public UniformMapDataProvider,
- public UniformMap::Observer,
- public ConnectionChangePropagator::Observer
+class Renderer : public PropertyOwner,
+ public UniformMapDataProvider,
+ public UniformMap::Observer,
+ public ConnectionChangePropagator::Observer
{
public:
* Set the geometry for the renderer
* @param[in] geometry The geometry this renderer will use
*/
- void SetGeometry( Render::Geometry* geometry );
+ void SetGeometry( SceneGraph::Geometry* geometry );
- Render::Geometry* GetGeometry() const
+ /**
+ * Get the geometry for the renderer
+ * @return The geometry this renderer will use
+ */
+ SceneGraph::Geometry* GetGeometry() const
{
return mGeometry;
}
* @param controller
* @param updateBufferIndex
*/
- void PrepareRender( class Graphics::API::Controller& controller, BufferIndex updateBufferIndex );
-
- /*
- * Retrieve the Render thread renderer
- * @return The associated render thread renderer
- */
- Render::Renderer& GetRenderer();
+ void PrepareRender( Graphics::API::Controller& controller, BufferIndex updateBufferIndex );
Graphics::API::RenderCommand& GetGfxRenderCommand()
{
/**
* Connect the object to the scene graph
*
- * @param[in] sceneController The scene controller - used for sending messages to render thread
* @param[in] bufferIndex The current buffer index - used for sending messages to render thread
*/
- void ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
+ void ConnectToSceneGraph( BufferIndex bufferIndex );
/**
* Disconnect the object from the scene graph
- * @param[in] sceneController The scene controller - used for sending messages to render thread
* @param[in] bufferIndex The current buffer index - used for sending messages to render thread
*/
- void DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
+ void DisconnectFromSceneGraph( BufferIndex bufferIndex );
public: // Implementation of ConnectionChangePropagator
/**
private:
CollectedUniformMap mCollectedUniformMap[2]; ///< Uniform maps collected by the renderer
- SceneController* mSceneController; ///< Used for initializing renderers
- Render::Renderer* mRenderer; ///< Raw pointer to the renderer (that's owned by RenderManager)
+ std::unique_ptr<RenderDataProvider> mRenderDataProvider; ///< Contains data for graphics renderer @todo Refactor
TextureSet* mTextureSet; ///< The texture set this renderer uses. (Not owned)
- Render::Geometry* mGeometry; ///< The geometry this renderer uses. (Not owned)
+ SceneGraph::Geometry* mGeometry; ///< The geometry this renderer uses. (Not owned)
Shader* mShader; ///< The shader this renderer uses. (Not owned)
OwnerPointer< Vector4 > mBlendColor; ///< The blend color for blending operation
- Dali::Internal::Render::Renderer::StencilParameters mStencilParameters; ///< Struct containing all stencil related options
+ StencilParameters mStencilParameters; ///< Struct containing all stencil related options
size_t mIndexedDrawFirstElement; ///< first element index to be drawn using indexed draw
size_t mIndexedDrawElementsCount; ///< number of elements to be drawn using indexed draw
bool mUniformMapChanged[2]; ///< Records if the uniform map has been altered this frame
bool mPremultipledAlphaEnabled:1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
- std::vector<std::vector<char>> mUboMemory; ///< Transient memory allocated for each UBO
- std::unique_ptr<Graphics::API::RenderCommand> mGfxRenderCommand;
-public:
+ std::vector<std::vector<char>> mUboMemory; ///< Transient memory allocated for each UBO
+ std::unique_ptr<Graphics::API::RenderCommand> mGfxRenderCommand;
+public:
int mDepthIndex; ///< Used only in PrepareRenderInstructions
-
};
new (slot) LocalType( &renderer, &Renderer::SetTextures, const_cast<TextureSet*>(&textureSet) );
}
-inline void SetGeometryMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const Render::Geometry& geometry )
+inline void SetGeometryMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const SceneGraph::Geometry& geometry )
{
- typedef MessageValue1< Renderer, Render::Geometry* > LocalType;
+ typedef MessageValue1< Renderer, SceneGraph::Geometry* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
// Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &renderer, &Renderer::SetGeometry, const_cast<Render::Geometry*>(&geometry) );
+ new (slot) LocalType( &renderer, &Renderer::SetGeometry, const_cast<SceneGraph::Geometry*>(&geometry) );
}
inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, Shader& shader )
--- /dev/null
+#ifndef DALI_INTERNAL_SCENE_GRAPH_SAMPLER_H
+#define DALI_INTERNAL_SCENE_GRAPH_SAMPLER_H
+
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dali/public-api/actors/sampling.h>
+#include <dali/public-api/rendering/sampler.h>
+#include <dali/internal/common/message.h>
+#include <dali/internal/event/common/event-thread-services.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+struct Sampler
+{
+
+ typedef Dali::FilterMode::Type FilterMode;
+ typedef Dali::WrapMode::Type WrapMode;
+
+ /**
+ * Constructor
+ */
+ Sampler()
+ :mMinificationFilter(FilterMode::DEFAULT),
+ mMagnificationFilter(FilterMode::DEFAULT),
+ mSWrapMode(WrapMode::DEFAULT),
+ mTWrapMode(WrapMode::DEFAULT),
+ mRWrapMode(WrapMode::DEFAULT)
+ {}
+
+ /**
+ * Destructor
+ */
+ ~Sampler()
+ {}
+
+
+ /**
+ * Sets the filter modes for an existing sampler
+ * @param[in] sampler The sampler
+ * @param[in] minFilterMode The filter to use under minification
+ * @param[in] magFilterMode The filter to use under magnification
+ */
+ void SetFilterMode( unsigned int minFilterMode, unsigned int magFilterMode )
+ {
+ mMinificationFilter = static_cast<Dali::FilterMode::Type>(minFilterMode);
+ mMagnificationFilter = static_cast<Dali::FilterMode::Type>(magFilterMode );
+ }
+
+ /**
+ * Sets the wrap mode for an existing sampler
+ * @param[in] sampler The sampler
+ * @param[in] rWrapMode Wrapping mode in z direction
+ * @param[in] sWrapMode Wrapping mode in x direction
+ * @param[in] tWrapMode Wrapping mode in y direction
+ */
+ void SetWrapMode( unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode )
+ {
+ mRWrapMode = static_cast<Dali::WrapMode::Type>(rWrapMode);
+ mSWrapMode = static_cast<Dali::WrapMode::Type>(sWrapMode);
+ mTWrapMode = static_cast<Dali::WrapMode::Type>(tWrapMode);
+ }
+
+ bool operator==(const Sampler& rhs) const
+ {
+ return ( ( mMinificationFilter == rhs.mMinificationFilter ) &&
+ ( mMagnificationFilter == rhs.mMagnificationFilter ) &&
+ ( mSWrapMode == rhs.mSWrapMode ) &&
+ ( mTWrapMode == rhs.mTWrapMode ) &&
+ ( mRWrapMode == rhs.mRWrapMode ) );
+ }
+
+ bool operator!=(const Sampler& rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+ FilterMode mMinificationFilter : 4; ///< The minify filter
+ FilterMode mMagnificationFilter : 4; ///< The magnify filter
+ WrapMode mSWrapMode : 4; ///< The horizontal wrap mode
+ WrapMode mTWrapMode : 4; ///< The vertical wrap mode
+ WrapMode mRWrapMode : 4; ///< The vertical wrap mode
+};
+
+
+inline void SetFilterModeMessage( EventThreadServices& eventThreadServices, SceneGraph::Sampler& sampler, unsigned int minFilterMode, unsigned int magFilterMode )
+{
+ typedef MessageValue2< SceneGraph::Sampler, unsigned int, unsigned int > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &sampler, &Sampler::SetFilterMode, minFilterMode, magFilterMode );
+}
+
+inline void SetWrapModeMessage( EventThreadServices& eventThreadServices, SceneGraph::Sampler& sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode )
+{
+ typedef MessageValue3< SceneGraph::Sampler, unsigned int, unsigned int, unsigned int > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &sampler, &Sampler::SetWrapMode, rWrapMode, sWrapMode, tWrapMode );
+}
+
+} // namespace SceneGraph
+
+} // namespace Internal
+
+} // namespace Dali
+
+
+#endif // DALI_INTERNAL_SCENE_GRAPH_SAMPLER_H
--- /dev/null
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/update/rendering/scene-graph-shader.h>
+
+// INTERNAL INCLUDES
+#define DEBUG_OVERRIDE_VULKAN_SHADER
+#ifdef DEBUG_OVERRIDE_VULKAN_SHADER
+#include <dali/graphics/vulkan/generated/spv-shaders-gen.h>
+#endif
+
+namespace Dali
+{
+
+namespace Internal
+{
+
+namespace SceneGraph
+{
+
+Shader::Shader( Dali::Shader::Hint::Value& hints )
+: mGraphics( nullptr ),
+ mGraphicsShader( nullptr ),
+ mShaderCache( nullptr ),
+ mHints( hints ),
+ mConnectionObservers()
+{
+ AddUniformMapObserver( *this );
+}
+
+Shader::~Shader()
+{
+ mConnectionObservers.Destroy( *this );
+}
+
+void Shader::Initialize( Integration::Graphics::Graphics& graphics, ShaderCache& shaderCache )
+{
+ mGraphics = &graphics;
+ mShaderCache = &shaderCache;
+}
+
+Graphics::API::Accessor<Graphics::API::Shader>& Shader::GetGfxObject()
+{
+ return mGraphicsShader;
+}
+
+void Shader::AddConnectionObserver( ConnectionChangePropagator::Observer& observer )
+{
+ mConnectionObservers.Add(observer);
+}
+
+void Shader::RemoveConnectionObserver( ConnectionChangePropagator::Observer& observer )
+{
+ mConnectionObservers.Remove(observer);
+}
+
+void Shader::UniformMappingsChanged( const UniformMap& mappings )
+{
+ // Our uniform map, or that of one of the watched children has changed.
+ // Inform connected observers.
+ mConnectionObservers.ConnectedUniformMapChanged();
+}
+
+void Shader::SetShaderProgram( Internal::ShaderDataPtr shaderData, bool modifiesGeometry )
+{
+ // TODO: for now we will use hardcoded binary SPIRV shaders which will replace anything
+ // that is passed by the caller
+#ifdef DEBUG_OVERRIDE_VULKAN_SHADER
+
+ mGraphicsShader = mShaderCache->GetShader( Graphics::API::ShaderDetails::ShaderSource( VSH_IMAGE_VISUAL_CODE ),
+ Graphics::API::ShaderDetails::ShaderSource( FSH_IMAGE_VISUAL_CODE ));
+
+#else
+ auto& controller = mGraphics->GetController();
+
+ mGraphicsShader = controller.CreateShader(
+ controller.GetShaderFactory()
+ .SetShaderModule( Graphics::API::ShaderDetails::PipelineStage::VERTEX,
+ Graphics::API::ShaderDetails::Language::SPIRV_1_0,
+ Graphics::API::ShaderDetails::ShaderSource( shaderData->GetVertexShader() ))
+ .SetShaderModule( Graphics::API::ShaderDetails::PipelineStage::FRAGMENT,
+ Graphics::API::ShaderDetails::Language::SPIRV_1_0,
+ Graphics::API::ShaderDetails::ShaderSource( shaderData->GetFragmentShader() )) );
+#endif
+}
+
+
+} // namespace SceneGraph
+
+} // namespace Internal
+
+} // namespace Dali
#define __DALI_INTERNAL_SCENE_GRAPH_SHADER_H__
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
*/
// INTERNAL INCLUDES
+#include <dali/graphics-api/graphics-api-controller.h>
+#include <dali/graphics-api/graphics-api-accessor.h>
+#include <dali/graphics-api/graphics-api-shader.h>
+
+#include <dali/integration-api/graphics/graphics.h>
+
+#include <dali/internal/common/message.h>
#include <dali/internal/common/shader-data.h>
+#include <dali/internal/event/common/event-thread-services.h>
#include <dali/internal/update/common/property-owner.h>
#include <dali/internal/update/common/scene-graph-connection-change-propagator.h>
-#include <dali/graphics-api/graphics-api-accessor.h>
-#include <dali/graphics-api/graphics-api-shader.h>
+#include <dali/internal/update/rendering/shader-cache.h>
namespace Dali
{
namespace Internal
{
-class Program;
-class ProgramCache;
-
namespace SceneGraph
{
class ConnectionObserver;
class SceneController;
+
/**
- * A holder class for Program; also enables sharing of uniform properties
+ * Owner of Graphics Shader; also enables sharing of uniform properties.
+ * Owned by UpdateManager.
*/
class Shader : public PropertyOwner, public UniformMap::Observer
{
*/
virtual ~Shader();
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // The following methods are called during Update
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * Initialize the shader object with the Graphics API when added to UpdateManager
+ *
+ * @param[in] graphics The Graphics API
+ * @param[in] shaderCache A cache
+ */
+ void Initialize( Integration::Graphics::Graphics& graphics, ShaderCache& shaderCache );
/**
* Query whether a shader hint is set.
}
/**
- * @return True if the fragment shader outputs only 1.0 on the alpha channel
- *
- * @note Shaders that can output any value on the alpha channel
- * including 1.0 should return false for this.
- */
- bool IsOutputOpaque();
-
- /**
- * @return True if the fragment shader can output any value but 1.0 on the alpha channel
- *
- * @note Shaders that can output any value on the alpha channel
- * including 1.0 should return false for this
- */
- bool IsOutputTransparent();
-
- /**
* @copydoc Dali::Internal::SceneGraph::PropertyOwner::ResetDefaultProperties
*/
virtual void ResetDefaultProperties( BufferIndex updateBufferIndex )
// no default properties
}
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // The following methods are called during Render
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
/**
- * @brief Set the program for this shader.
- * @param[in] shaderData The program's vertex/fragment source and optionally precompiled shader binary.
- * @param[in] programCache Owner of the Programs.
- * @param[in] modifiesGeometry True if the vertex shader changes the positions of vertexes such that
- * they might exceed the bounding box of vertexes passing through the default transformation.
+ * Get the graphics shader object
+ * @return the graphics shader object
*/
- void SetProgram( Internal::ShaderDataPtr shaderData,
- ProgramCache* programCache,
- bool modifiesGeometry );
-
- void SetGfxObject( const Graphics::API::Accessor<Graphics::API::Shader>& shader );
-
Graphics::API::Accessor<Graphics::API::Shader>& GetGfxObject();
+public: // Messages
/**
- * Get the program built for this shader
- * @return The program built from the shader sources.
+ * Set the shader data into the graphics API.
+ *
+ * @param[in] shaderData The shader source or binary.
+ * @param[in] modifiesGeometry Hint to say if the shader modifies geometry. (useful for culling)
*/
- Program* GetProgram();
+ void SetShaderProgram( Internal::ShaderDataPtr shaderData, bool modifiesGeometry );
public: // Implementation of ConnectionChangePropagator
*/
virtual void UniformMappingsChanged( const UniformMap& mappings );
+
private: // Data
+ Integration::Graphics::Graphics* mGraphics; ///< Graphics interface object
+ Graphics::API::Accessor<Graphics::API::Shader> mGraphicsShader; ///< The graphics object
+ ShaderCache* mShaderCache;
+ Dali::Shader::Hint::Value mHints; ///< Hints for the shader
+ ConnectionChangePropagator mConnectionObservers; ///< Watch for connection changes
+};
- Dali::Shader::Hint::Value mHints;
- Program* mProgram;
+inline void SetShaderProgramMessage( EventThreadServices& eventThreadServices,
+ Shader& shader,
+ Internal::ShaderDataPtr shaderData,
+ bool modifiesGeometry )
+{
+ typedef MessageValue2< Shader, Internal::ShaderDataPtr, bool > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &shader, &Shader::SetShaderProgram, shaderData, modifiesGeometry );
+}
- ConnectionChangePropagator mConnectionObservers;
- Graphics::API::Accessor<Graphics::API::Shader> mGfxShader;
-};
} // namespace SceneGraph
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
gTextureSetMemoryPool.FreeThreadSafe( static_cast<TextureSet*>( ptr ) );
}
-void TextureSet::SetSampler( size_t index, Render::Sampler* sampler )
+void TextureSet::SetSampler( size_t index, SceneGraph::Sampler* sampler )
{
size_t samplerCount( mSamplers.Size() );
if( samplerCount < index + 1 )
NotifyChangeToRenderers();
}
-void TextureSet::SetTexture( size_t index, Render::Texture* texture )
+void TextureSet::SetTexture( size_t index, SceneGraph::Texture* texture )
{
const size_t textureCount( mTextures.Size() );
if( textureCount < index + 1 )
#define DALI_INTERNAL_SCENE_GRAPH_TEXTURE_SET_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
{
namespace Internal
{
-
-namespace Render
-{
-struct Sampler;
-class Texture;
-}
namespace SceneGraph
{
+
class Renderer;
+class Sampler;
+class Texture;
class TextureSet
{
* @param[in] index The index of the texture
* @param[in] sampler The sampler to be used by the texture
*/
- void SetSampler( size_t index, Render::Sampler* sampler );
+ void SetSampler( size_t index, SceneGraph::Sampler* sampler );
/**
* Set the texture at position "index"
* @param[in] index The index of the texture
* @param[in] texture The texture
*/
- void SetTexture( size_t index, Render::Texture* texture );
+ void SetTexture( size_t index, SceneGraph::Texture* texture );
/**
* Return whether any texture in the texture set has an alpha channel
* @param[in] index The index of the texture in the textures array
* @return the sampler used by the texture
*/
- Render::Sampler* GetTextureSampler( size_t index )
+ SceneGraph::Sampler* GetTextureSampler( size_t index )
{
return mSamplers[index];
}
* @param[in] index The index of the texture in the textures array
* @return the pointer to the Texture in that position
*/
- Render::Texture* GetTexture( size_t index )
+ SceneGraph::Texture* GetTexture( size_t index )
{
return mTextures[index];
}
private: // Data
- Vector< Render::Sampler* > mSamplers; ///< List of samplers used by each texture. Not owned
- Vector< Render::Texture* > mTextures; ///< List of Textures. Not owned
- Vector<Renderer*> mRenderers; ///< List of renderers using the TextureSet
- bool mHasAlpha; ///< if any of the textures has an alpha channel
+ Vector< SceneGraph::Sampler* > mSamplers; ///< List of samplers used by each texture. Not owned
+ Vector< SceneGraph::Texture* > mTextures; ///< List of Textures. Not owned
+ Vector<Renderer*> mRenderers; ///< List of renderers using the TextureSet
+ bool mHasAlpha; ///< if any of the textures has an alpha channel
};
-inline void SetTextureMessage( EventThreadServices& eventThreadServices, const TextureSet& textureSet, size_t index, Render::Texture* texture )
+inline void SetTextureMessage( EventThreadServices& eventThreadServices, const TextureSet& textureSet, size_t index, SceneGraph::Texture* texture )
{
- typedef MessageValue2< TextureSet, size_t, Render::Texture* > LocalType;
+ typedef MessageValue2< TextureSet, size_t, SceneGraph::Texture* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
new (slot) LocalType( &textureSet, &TextureSet::SetTexture, index, texture );
}
-inline void SetSamplerMessage( EventThreadServices& eventThreadServices, const TextureSet& textureSet, size_t index, Render::Sampler* sampler )
+inline void SetSamplerMessage( EventThreadServices& eventThreadServices, const TextureSet& textureSet, size_t index, SceneGraph::Sampler* sampler )
{
- typedef MessageValue2< TextureSet, size_t, Render::Sampler* > LocalType;
+ typedef MessageValue2< TextureSet, size_t, SceneGraph::Sampler* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
--- /dev/null
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// CLASS HEADER
+#include <dali/internal/update/rendering/scene-graph-texture.h>
+
+// EXTERNAL INCLUDES
+#include <string>
+
+// INTERNAL INCLUDES
+#include <dali/public-api/images/image-operations.h> // Dali::ImageDimensions
+#include <dali/public-api/rendering/sampler.h>
+#include <dali/public-api/rendering/texture.h>
+#include <dali/integration-api/debug.h>
+#include <dali/internal/event/rendering/texture-impl.h>
+#include <dali/internal/update/rendering/scene-graph-sampler.h>
+#include <dali/graphics-api/graphics-api-accessor.h>
+#include <dali/graphics-api/graphics-api-controller.h>
+#include <dali/graphics-api/graphics-api-texture.h>
+#include <dali/graphics-api/graphics-api-texture-details.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+namespace
+{
+
+/**
+ * @brief Whether specified pixel format is compressed.
+ *
+ * @param [in] pixelformat Pixel format
+ * @return true if format is compressed, false otherwise
+ */
+bool IsCompressedFormat(Pixel::Format pixelFormat)
+{
+ switch (pixelFormat)
+ {
+ case Pixel::L8:
+ case Pixel::A8:
+ case Pixel::LA88:
+ case Pixel::RGB565:
+ case Pixel::RGBA4444:
+ case Pixel::RGBA5551:
+ case Pixel::BGR565:
+ case Pixel::BGRA4444:
+ case Pixel::BGRA5551:
+ case Pixel::RGB888:
+ case Pixel::RGB8888:
+ case Pixel::BGR8888:
+ case Pixel::RGBA8888:
+ case Pixel::BGRA8888:
+ case Pixel::RGB16F:
+ case Pixel::RGB32F:
+ case Pixel::INVALID:
+ {
+ return false;
+ }
+
+ case Pixel::COMPRESSED_R11_EAC:
+ case Pixel::COMPRESSED_SIGNED_R11_EAC:
+ case Pixel::COMPRESSED_RG11_EAC:
+ case Pixel::COMPRESSED_SIGNED_RG11_EAC:
+ case Pixel::COMPRESSED_RGB8_ETC2:
+ case Pixel::COMPRESSED_SRGB8_ETC2:
+ case Pixel::COMPRESSED_RGB8_ETC1:
+ case Pixel::COMPRESSED_RGB_PVRTC_4BPPV1:
+ case Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ case Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ case Pixel::COMPRESSED_RGBA8_ETC2_EAC:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+ case Pixel::COMPRESSED_RGBA_ASTC_4x4_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_5x4_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_5x5_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_6x5_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_6x6_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_8x5_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_8x6_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_8x8_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_10x5_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_10x6_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_10x8_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_10x10_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_12x10_KHR:
+ case Pixel::COMPRESSED_RGBA_ASTC_12x12_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+ case Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+} //Unnamed namespace
+
+
+Texture::Texture( Type type, Pixel::Format format, ImageDimensions size )
+: mGraphics( nullptr ),
+ mGraphicsTexture( nullptr ),
+ mNativeImage(),
+ mSampler(),
+ mId( 0 ),
+ mWidth( size.GetWidth() ),
+ mHeight( size.GetHeight() ),
+ mMaxMipMapLevel( 0 ),
+ mType( type ),
+ mHasAlpha( HasAlpha( format ) ),
+ mIsCompressed( IsCompressedFormat( format ) )
+{
+}
+
+Texture::Texture( NativeImageInterfacePtr nativeImageInterface )
+: mGraphics( nullptr ),
+ mGraphicsTexture( nullptr ),
+ mNativeImage( nativeImageInterface ),
+ mSampler(),
+ mId( 0 ),
+ mWidth( nativeImageInterface->GetWidth() ),
+ mHeight( nativeImageInterface->GetHeight() ),
+ mMaxMipMapLevel( 0 ),
+ mType( TextureType::TEXTURE_2D ),
+ mHasAlpha( nativeImageInterface->RequiresBlending() ),
+ mIsCompressed( false )
+{
+}
+
+Texture::~Texture()
+{}
+
+void Texture::Initialize( Integration::Graphics::Graphics& graphics )
+{
+ mGraphics = &graphics;
+}
+
+const Graphics::API::Accessor<Graphics::API::Texture>& Texture::GetGfxObject() const
+{
+ return mGraphicsTexture;
+}
+
+void Texture::UploadTexture( PixelDataPtr pixelData, const Internal::Texture::UploadParams& params )
+{
+ if( mGraphics )
+ {
+ auto& controller = mGraphics->GetController();
+
+ mGraphicsTexture = controller.CreateTexture( controller.GetTextureFactory()
+ .SetFormat( Graphics::API::TextureDetails::Format::RGBA8 )
+ .SetSize( { pixelData->GetWidth(), pixelData->GetHeight() } )
+ .SetType( Graphics::API::TextureDetails::Type::TEXTURE_2D )
+ .SetMipMapFlag( Graphics::API::TextureDetails::MipMapFlag::DISABLED )
+ .SetData( pixelData->GetBuffer() )
+ .SetDataSize( pixelData->GetBufferSize() )
+ );
+
+ mId = static_cast< uint32_t >( mGraphicsTexture.GetHandle() );
+ }
+}
+
+bool Texture::HasAlphaChannel()
+{
+ return mHasAlpha;
+}
+
+void Texture::GenerateMipmaps()
+{
+ mMaxMipMapLevel = 0;
+ DALI_LOG_ERROR( "FIXME: GRAPHICS\n");
+ //@todo Implement with GraphicsAPI
+}
+
+
+} // namespace SceneGraph
+} // namespace Internal
+} // namespace Dali
--- /dev/null
+#ifndef DALI_INTERNAL_SCENE_GRAPH_TEXTURE_H
+#define DALI_INTERNAL_SCENE_GRAPH_TEXTURE_H
+
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// EXTERNAL INCLUDES
+#include <string>
+
+// INTERNAL INCLUDES
+#include <dali/public-api/images/image-operations.h> // Dali::ImageDimensions
+#include <dali/public-api/rendering/sampler.h>
+#include <dali/public-api/rendering/texture.h>
+#include <dali/graphics-api/graphics-api-accessor.h>
+#include <dali/graphics-api/graphics-api-texture.h>
+#include <dali/integration-api/graphics/graphics.h>
+#include <dali/internal/common/message.h>
+#include <dali/internal/event/rendering/texture-impl.h>
+#include <dali/internal/update/rendering/scene-graph-sampler.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+/**
+ * The SceneGraph::Texture object wraps the Graphics texture object, and is owned
+ * by the UpdateManager. It is used by SceneGraphRenderer to set up RenderCommands.
+ */
+class Texture
+{
+public:
+ typedef Dali::TextureType::Type Type;
+
+ /**
+ * Constructor
+ * @param[in] type The type of the texture
+ * @param[in] format The format of the pixel data
+ * @param[in] size The size of the texture
+ */
+ Texture( Type type, Pixel::Format format, ImageDimensions size );
+
+ /**
+ * Constructor from native image
+ * @param[in] nativeImageInterface The native image
+ */
+ Texture( NativeImageInterfacePtr nativeImageInterface );
+
+ /**
+ * Destructor
+ */
+ ~Texture();
+
+ /**
+ * Initialize the texture object with the Graphics API when added to UpdateManager
+ *
+ * @param[in] graphics The Graphics API
+ */
+ void Initialize( Integration::Graphics::Graphics& graphics );
+
+ /**
+ * Retrieve wheter the texture has an alpha channel
+ * @return True if the texture has alpha channel, false otherwise
+ */
+ bool HasAlphaChannel();
+
+ /**
+ * Get the type of the texture
+ * @return Type of the texture
+ */
+ Type GetType() const
+ {
+ return mType;
+ }
+
+ /**
+ * Check if the texture is a native image
+ * @return if the texture is a native image
+ */
+ bool IsNativeImage() const
+ {
+ return mNativeImage;
+ }
+
+ /**
+ * Get the Graphics object associated with this texture
+ * @return The graphics object.
+ */
+ const Graphics::API::Accessor<Graphics::API::Texture>& GetGfxObject() const;
+
+ /**
+ * Get the texture id associated with the graphics texture
+ */
+ uint32_t GetId()
+ {
+ return mId;
+ }
+
+public: // From messages
+ /**
+ * Uploads data to Graphics
+ * @param[in] pixelData The pixel data object
+ * @param[in] params The parameters for the upload
+ */
+ void UploadTexture( PixelDataPtr pixelData, const Internal::Texture::UploadParams& params );
+
+ /**
+ * Generates mipmaps
+ */
+ void GenerateMipmaps();
+
+
+private:
+ Integration::Graphics::Graphics* mGraphics; ///< Graphics interface object
+ Graphics::API::Accessor<Graphics::API::Texture> mGraphicsTexture; ///< Graphics texture
+
+ NativeImageInterfacePtr mNativeImage; ///< Pointer to native image
+ SceneGraph::Sampler mSampler; ///< The current sampler state
+ uint32_t mId; ///< The Graphics texture handle
+ uint16_t mWidth; ///< Width of the texture
+ uint16_t mHeight; ///< Height of the texture
+ uint16_t mMaxMipMapLevel; ///< Maximum mipmap level
+ Type mType:2; ///< Type of the texture
+ bool mHasAlpha : 1; ///< Whether the format has an alpha channel
+ bool mIsCompressed : 1; ///< Whether the format is compressed
+};
+
+
+inline void UploadTextureMessage( EventThreadServices& eventThreadServices, SceneGraph::Texture& texture, PixelDataPtr pixelData, const Internal::Texture::UploadParams& params )
+{
+ typedef MessageValue2< SceneGraph::Texture, PixelDataPtr, Internal::Texture::UploadParams > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &texture, &SceneGraph::Texture::UploadTexture, pixelData, params );
+}
+
+inline void GenerateMipmapsMessage( EventThreadServices& eventThreadServices, SceneGraph::Texture& texture )
+{
+ typedef Message< SceneGraph::Texture > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &texture, &SceneGraph::Texture::GenerateMipmaps );
+}
+
+} // namespace SceneGraph
+
+} // namespace Internal
+
+} // namespace Dali
+
+
+#endif // DALI_INTERNAL_SCENE_GRAPH_TEXTURE_H
--- /dev/null
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dali/internal/update/rendering/shader-cache.h>
+#include <dali/graphics-api/graphics-api-controller.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+ShaderCache::ShaderCache( Dali::Graphics::API::Controller& controller )
+: mController( controller )
+{
+}
+
+Dali::Graphics::API::Accessor<Dali::Graphics::API::Shader> ShaderCache::GetShader(
+ const Dali::Graphics::API::ShaderDetails::ShaderSource& vsh,
+ const Dali::Graphics::API::ShaderDetails::ShaderSource& fsh )
+{
+ for( auto&& item : mItems )
+ {
+ if( item.vertexSource == vsh && item.fragmentSource == fsh )
+ {
+ return item.shader;
+ }
+ }
+ auto shaderRef =
+ mController.CreateShader( mController.GetShaderFactory()
+ .SetShaderModule( Graphics::API::ShaderDetails::PipelineStage::VERTEX,
+ Graphics::API::ShaderDetails::Language::SPIRV_1_0,
+ vsh )
+ .SetShaderModule( Graphics::API::ShaderDetails::PipelineStage::FRAGMENT,
+ Graphics::API::ShaderDetails::Language::SPIRV_1_0,
+ fsh ) );
+ mItems.emplace_back( Item() = { shaderRef, vsh, fsh } );
+ return shaderRef;
+}
+
+} // namespace SceneGraph
+} // namespace Internal
+} // namespace Dali
--- /dev/null
+#ifndef DALI_INTERNAL_UPDATE_RENDERING_SHADER_CACHE_H
+#define DALI_INTERNAL_UPDATE_RENDERING_SHADER_CACHE_H
+
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dali/integration-api/graphics/graphics.h>
+#include <dali/graphics-api/graphics-api-accessor.h>
+#include <dali/graphics-api/graphics-api-shader.h>
+#include <dali/graphics-api/graphics-api-shader-details.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+/**
+ * Caches graphics shaders as they are created by SceneGraph::Shader.
+ */
+struct ShaderCache
+{
+ struct Item
+ {
+ Item() = default;
+ ~Item() = default;
+ Dali::Graphics::API::Accessor<Dali::Graphics::API::Shader> shader{ nullptr };
+ Dali::Graphics::API::ShaderDetails::ShaderSource vertexSource{""};
+ Dali::Graphics::API::ShaderDetails::ShaderSource fragmentSource{""};
+ };
+
+ /**
+ * Constructor
+ *
+ * @param[in] controller The graphics controller
+ */
+ explicit ShaderCache( Dali::Graphics::API::Controller& controller );
+
+ /**
+ * Get a shader from it's source code
+ */
+ Dali::Graphics::API::Accessor<Dali::Graphics::API::Shader> GetShader(
+ const Dali::Graphics::API::ShaderDetails::ShaderSource& vsh,
+ const Dali::Graphics::API::ShaderDetails::ShaderSource& fsh );
+
+private:
+ std::vector<Item> mItems;
+ Dali::Graphics::API::Controller& mController;
+};
+
+} // namespace SceneGraph
+} // namespace Internal
+} // namespace Dali
+
+#endif //DALI_INTERNAL_UPDATE_RENDERING_SHADER_CACHE_H
--- /dev/null
+#ifndef DALI_INTERNAL_UPDATE_RENDERING_STENCIL_PARAMETERS_H
+#define DALI_INTERNAL_UPDATE_RENDERING_STENCIL_PARAMETERS_H
+/*
+ * Copyright (c) 2018 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dali/public-api/rendering/renderer.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+
+/**
+ * @brief Struct to encapsulate stencil parameters required for control of the stencil buffer.
+ */
+struct StencilParameters
+{
+ StencilParameters( RenderMode::Type renderMode, StencilFunction::Type stencilFunction, int stencilFunctionMask,
+ int stencilFunctionReference, int stencilMask, StencilOperation::Type stencilOperationOnFail,
+ StencilOperation::Type stencilOperationOnZFail, StencilOperation::Type stencilOperationOnZPass )
+ : stencilFunctionMask ( stencilFunctionMask ),
+ stencilFunctionReference ( stencilFunctionReference ),
+ stencilMask ( stencilMask ),
+ renderMode ( renderMode ),
+ stencilFunction ( stencilFunction ),
+ stencilOperationOnFail ( stencilOperationOnFail ),
+ stencilOperationOnZFail ( stencilOperationOnZFail ),
+ stencilOperationOnZPass ( stencilOperationOnZPass )
+ {
+ }
+
+ int stencilFunctionMask; ///< The stencil function mask
+ int stencilFunctionReference; ///< The stencil function reference
+ int stencilMask; ///< The stencil mask
+ RenderMode::Type renderMode:3; ///< The render mode
+ StencilFunction::Type stencilFunction:3; ///< The stencil function
+ StencilOperation::Type stencilOperationOnFail:3; ///< The stencil operation for stencil test fail
+ StencilOperation::Type stencilOperationOnZFail:3; ///< The stencil operation for depth test fail
+ StencilOperation::Type stencilOperationOnZPass:3; ///< The stencil operation for depth test pass
+};
+
+
+} // namespace SceneGraph
+
+} // namespace Interanl
+
+} // namespace Dali
+
+#endif //DALI_INTERNAL_UPDATE_RENDERING_STENCIL_PARAMETERS_H
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/math/vector4.h>
#include <dali/public-api/math/quaternion.h>
#include <dali/public-api/math/math-utils.h>
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
namespace
{
/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/math/matrix.h>
#include <dali/public-api/math/radian.h>
#include <dali/public-api/math/math-utils.h>
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
namespace Dali
{
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/common/dali-common.h>
#include <dali/public-api/math/vector3.h>
#include <dali/public-api/math/math-utils.h>
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
namespace Dali
{
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/math/vector2.h>
#include <dali/public-api/math/vector4.h>
#include <dali/public-api/math/math-utils.h>
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
namespace Dali
{
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
#include <dali/public-api/math/vector2.h>
#include <dali/public-api/math/vector3.h>
#include <dali/public-api/math/math-utils.h>
-#include <dali/internal/render/common/performance-monitor.h>
+#include <dali/internal/common/performance-monitor.h>
namespace Dali
{