Added new shader hint for modifying geometry 64/25164/6
authorDavid Steele <david.steele@partner.samsung.com>
Tue, 22 Jul 2014 16:05:31 +0000 (17:05 +0100)
committerDavid Steele <david.steele@partner.samsung.com>
Thu, 31 Jul 2014 16:03:05 +0000 (17:03 +0100)
Culling can only be performed when the vertex shader doesn't move
vertices outside the bounding box. Custom shaders can specify whether
they dont change geometry by setting the hint DOESNT_MODIFY_GEOMETRY.
This will turn culling on for the actors that this shader is used
to render.

Further clean up applied.

Change-Id: Ia28ba7bc0f23613316c9b21a536a94e851337bd2
Signed-off-by: David Steele <david.steele@partner.samsung.com>
dali/internal/event/effects/shader-effect-impl.cpp
dali/internal/event/effects/shader-effect-impl.h
dali/internal/event/effects/shader-factory.cpp
dali/internal/render/renderers/scene-graph-renderer.cpp
dali/internal/render/shaders/program.cpp
dali/internal/render/shaders/program.h
dali/internal/render/shaders/shader.cpp
dali/internal/render/shaders/shader.h
dali/internal/update/manager/update-manager.cpp
dali/internal/update/manager/update-manager.h
dali/public-api/shader-effects/shader-effect.h

index 648675d..aaf5af6 100644 (file)
@@ -151,22 +151,6 @@ std::string GetShader(const std::string& field, const Property::Value& property)
 } // anon namespace
 
 
-ShaderEffectPtr ShaderEffect::New( Dali::ShaderEffect::GeometryHints hints )
-{
-  ThreadLocalStorage& tls = ThreadLocalStorage::Get();
-  UpdateManager& updateManager = tls.GetUpdateManager();
-  ShaderFactory& shaderFactory = tls.GetShaderFactory();
-
-  // Create a new scene-object, temporarily owned
-  Shader* sceneObject = new Shader( hints );
-  DALI_ASSERT_DEBUG( NULL != sceneObject );
-
-  ShaderEffectPtr shaderEffect( new ShaderEffect( updateManager, shaderFactory, *sceneObject ) );
-  shaderEffect->RegisterObject();
-
-  return shaderEffect;
-}
-
 ShaderEffectPtr ShaderEffect::New( const string& vertexShader,
                                    const string& fragmentShader,
                                    GeometryType geometryType,
@@ -211,6 +195,29 @@ ShaderEffectPtr ShaderEffect::New( const string& imageVertexShader,
   return shaderEffect;
 }
 
+ShaderEffectPtr ShaderEffect::New( Dali::ShaderEffect::GeometryHints hints )
+{
+  ThreadLocalStorage& tls = ThreadLocalStorage::Get();
+  UpdateManager& updateManager = tls.GetUpdateManager();
+
+  ShaderEffectPtr shaderEffect( new ShaderEffect( updateManager, hints ) );
+  shaderEffect->RegisterObject();
+
+  return shaderEffect;
+}
+
+ShaderEffect::ShaderEffect( UpdateManager& updateManager, Dali::ShaderEffect::GeometryHints hints )
+: mUpdateManager( updateManager ),
+  mConnectionCount (0),
+  mGeometryHints( hints )
+{
+  mSceneObject = new Shader( hints );
+  DALI_ASSERT_DEBUG( NULL != mSceneObject );
+
+  // Transfer shader ownership to a scene message
+  AddShaderMessage( mUpdateManager, *mSceneObject );
+}
+
 ShaderEffect::~ShaderEffect()
 {
   DALI_ASSERT_DEBUG( mSceneObject != NULL );
@@ -225,16 +232,6 @@ ShaderEffect::~ShaderEffect()
   }
 }
 
-ShaderEffect::ShaderEffect( UpdateManager& updateManager, ShaderFactory& shaderFactory, Shader& sceneObject )
-: mUpdateManager( updateManager ),
-  mShaderFactory( shaderFactory ),
-  mSceneObject( &sceneObject ),
-  mConnectionCount (0)
-{
-  // Transfer shader ownership to a scene message
-  AddShaderMessage( mUpdateManager, *mSceneObject );
-}
-
 void ShaderEffect::SetEffectImage( Dali::Image image )
 {
   // if images are the same, do nothing
@@ -303,19 +300,19 @@ const Dali::ShaderEffect::Extension& ShaderEffect::GetExtension() const
 
 void ShaderEffect::SetProgram( GeometryType geometryType, ShaderSubTypes subType,
                                const string& vertexSource, const string& fragmentSource,
-                               ShaderEffect::FixedVertexShader fixedShader )
+                               GeometryState modifiesGeometry )
 {
-  SetProgramImpl(geometryType, subType, vertexSource, fragmentSource, fixedShader);
+  SetProgramImpl(geometryType, subType, vertexSource, fragmentSource, modifiesGeometry);
 }
 
 void ShaderEffect::SetProgram( GeometryType geometryType, ShaderSubTypes subType,
                                const std::string& vertexPrefix, const std::string& fragmentPrefix,
                                const std::string& vertexSource, const std::string& fragmentSource,
-                               ShaderEffect::FixedVertexShader fixedShader )
+                               GeometryState modifiesGeometry )
 {
   const std::string vertex( vertexPrefix + vertexSource );
   const std::string fragment( fragmentPrefix + fragmentSource );
-  SetProgramImpl( geometryType, subType, vertex, fragment, fixedShader );
+  SetProgramImpl( geometryType, subType, vertex, fragment, modifiesGeometry );
 }
 
 void ShaderEffect::Connect()
@@ -524,6 +521,10 @@ void ShaderEffect::SetDefaultProperty( Property::Index index, const Property::Va
       {
         hint = Dali::ShaderEffect::HINT_BLENDING;
       }
+      else if(s == "HINT_DOESNT_MODIFY_GEOMETRY")
+      {
+        hint = Dali::ShaderEffect::HINT_DOESNT_MODIFY_GEOMETRY;
+      }
       else
       {
         DALI_ASSERT_ALWAYS(!"Geometry hint unknown" );
@@ -692,25 +693,40 @@ void ShaderEffect::SetWrappedProgram( GeometryType geometryType, ShaderSubTypes
   }
 
   // Add the program
-  SetProgramImpl( geometryType, subType, vertexSource, fragmentSource, ShaderEffect::FLEXIBLE );
+  SetProgramImpl( geometryType, subType, vertexSource, fragmentSource );
+}
+
+void ShaderEffect::SetProgramImpl( GeometryType geometryType, ShaderSubTypes subType,
+                                   const string& vertexSource, const string& fragmentSource )
+{
+  GeometryState modifiesGeometry = MODIFIES_GEOMETRY;
+
+  if( (mGeometryHints & Dali::ShaderEffect::HINT_DOESNT_MODIFY_GEOMETRY ) != 0 )
+  {
+    modifiesGeometry = DOESNT_MODIFY_GEOMETRY;
+  }
+
+  SetProgramImpl( geometryType, subType, vertexSource, fragmentSource, modifiesGeometry );
 }
 
 void ShaderEffect::SetProgramImpl( GeometryType geometryType, ShaderSubTypes subType,
                                    const string& vertexSource, const string& fragmentSource,
-                                   ShaderEffect::FixedVertexShader fixedShader )
+                                   GeometryState modifiesGeometry )
 {
   // Load done asynchronously in update thread. SetProgram message below must be processed afterwards.
   // Therefore, resource manager cannot farm out the loading to the adaptor resource threads,
   // but must instead use synchronous loading via PlatformAbstraction::LoadFile()
+
+  ThreadLocalStorage& tls = ThreadLocalStorage::Get();
+  ShaderFactory& shaderFactory = tls.GetShaderFactory();
   size_t shaderHash;
-  ResourceTicketPtr ticket( mShaderFactory.Load(vertexSource, fragmentSource, shaderHash) );
 
-  DALI_LOG_INFO( Debug::Filter::gShader, Debug::General, "ShaderEffect: SetProgram(geometryType %d subType:%d ticket.id:%d)\n", geometryType, subType, ticket->GetId() );
+  ResourceTicketPtr ticket( shaderFactory.Load(vertexSource, fragmentSource, shaderHash) );
 
-  bool areVerticesFixed = (fixedShader == ShaderEffect::FIXED);
+  DALI_LOG_INFO( Debug::Filter::gShader, Debug::General, "ShaderEffect: SetProgram(geometryType %d subType:%d ticket.id:%d)\n", geometryType, subType, ticket->GetId() );
 
   // Add shader program to scene-object using a message to the UpdateManager
-  SetShaderProgramMessage( mUpdateManager, *mSceneObject, geometryType, subType, ticket->GetId(), shaderHash, areVerticesFixed );
+  SetShaderProgramMessage( mUpdateManager, *mSceneObject, geometryType, subType, ticket->GetId(), shaderHash, modifiesGeometry==MODIFIES_GEOMETRY );
 
   mTickets.push_back(ticket);       // add ticket to collection to keep it alive.
 }
index 82acf80..f6ca2da 100644 (file)
@@ -34,8 +34,6 @@ namespace Dali
 namespace Internal
 {
 
-class ShaderFactory;
-
 namespace SceneGraph
 {
 class UpdateManager;
@@ -49,9 +47,14 @@ class UpdateManager;
 class ShaderEffect : public ProxyObject
 {
 public:
-
   typedef Dali::ShaderEffect::UniformCoordinateType UniformCoordinateType;
 
+  enum GeometryState
+  {
+    DOESNT_MODIFY_GEOMETRY,
+    MODIFIES_GEOMETRY
+  };
+
   /**
    * Create a new ShaderEffect with no programs
    * @param hints GeometryHints to define the geometry of the rendered object
@@ -146,22 +149,17 @@ public:
    */
   const Dali::ShaderEffect::Extension& GetExtension() const;
 
-  enum FixedVertexShader
-  {
-    FLEXIBLE,
-    FIXED,
-  };
-
   /**
    * Add a GeometryType specific default program to this ShaderEffect
    * @param[in] geometryType    The GeometryType rendered by the shader program
    * @param[in] subType         The subtype, one of ShaderSubTypes.
    * @param[in] vertexSource    The source code for the vertex shader
    * @param[in] fragmentSource  The source code for the fragment shader
+   * @param[in] modifiesGeometry True if the shader modifies geometry
    */
   void SetProgram( GeometryType geometryType, ShaderSubTypes subType,
                    const std::string& vertexSource, const std::string& fragmentSource,
-                   FixedVertexShader fixedVertexShader=FLEXIBLE);
+                   GeometryState modifiesGeometry );
 
   /**
    * Add a GeometryType specific default program to this ShaderEffect.
@@ -173,12 +171,12 @@ public:
    * @param[in] fragmentPrefix  The prefix source code for the fragment shader
    * @param[in] vertexSource    The source code for the vertex shader
    * @param[in] fragmentSource  The source code for the fragment shader
-   * @param[in] fixedVertexShader True if this shader doesn't change the vertices
+   * @param[in] modifiesGeometry True if the shader modifies geometry
    */
   void SetProgram( GeometryType geometryType, ShaderSubTypes subType,
                    const std::string& vertexPrefix, const std::string& fragmentPrefix,
                    const std::string& vertexSource, const std::string& fragmentSource,
-                   FixedVertexShader fixedVertexShader=FLEXIBLE);
+                   GeometryState modifiesGeometry );
 
   /**
    * Notify ShaderEffect that it's being used by an Actor.
@@ -272,7 +270,7 @@ protected:
   /**
    * Protected constructor.
    */
-  ShaderEffect( SceneGraph::UpdateManager& updateManager, ShaderFactory& shaderFactory, SceneGraph::Shader& sceneObject );
+  ShaderEffect( SceneGraph::UpdateManager& updateManager, Dali::ShaderEffect::GeometryHints hints );
 
   /**
    * A reference counted object may only be deleted by calling Unreference()
@@ -317,33 +315,37 @@ private:
 
   /**
    * Send shader program to scene-graph object.
-   * Uses the shader hints to determine whether the vertices are fixed.
+   * Uses the shader hints to determine whether the shader modifies geometry
    * @param[in] geometryType    The GeometryType rendered by the shader program
    * @param[in] subType         The subtype, one of ShaderSubTypes.
    * @param[in] vertexSource    The source code for the vertex shader
    * @param[in] fragmentSource  The source code for the fragment shader
-   * @param[in] fixedVertexShader True if this shader doesn't change the vertices
+   */
+  void SetProgramImpl( GeometryType geometryType, ShaderSubTypes subType,
+                       const std::string& vertexSource, const std::string& fragmentSource );
+
+  /**
+   * Send shader program to scene-graph object.
+   * @param[in] geometryType    The GeometryType rendered by the shader program
+   * @param[in] subType         The subtype, one of ShaderSubTypes.
+   * @param[in] vertexSource    The source code for the vertex shader
+   * @param[in] fragmentSource  The source code for the fragment shader
+   * @param[in] modifiesGeometry True if the shader modifies geometry
    */
   void SetProgramImpl( GeometryType geometryType, ShaderSubTypes subType,
                        const std::string& vertexSource, const std::string& fragmentSource,
-                       FixedVertexShader fixedVertexShader );
+                       GeometryState modifiesGeometry );
 
 private: // Data
 
-  SceneGraph::UpdateManager& mUpdateManager;            ///< reference to the update manager
-  ShaderFactory& mShaderFactory;                        ///< reference to the shader factory
-
-  SceneGraph::Shader* mSceneObject;                     ///< pointer to the scene shader, should not be changed on this thread
-
-  Dali::Image mImage;                                   ///< Client-side handle for the effect image
-
-  CustomUniformMetaLookup mCustomMetadata;            ///< Used for accessing metadata for custom Shader properties
-
+  SceneGraph::UpdateManager& mUpdateManager;///< reference to the update manager
+  SceneGraph::Shader* mSceneObject;         ///< pointer to the scene shader, should not be changed on this thread
+  Dali::Image mImage;                       ///< Client-side handle for the effect image
+  CustomUniformMetaLookup mCustomMetadata;  ///< Used for accessing metadata for custom Shader properties
   IntrusivePtr<Dali::ShaderEffect::Extension> mExtension;
-
-  std::vector<ResourceTicketPtr>  mTickets;             ///< Collection of shader program tickets
-
-  unsigned int  mConnectionCount;                       ///< number of on-stage ImageActors using this shader effect
+  std::vector<ResourceTicketPtr>  mTickets; ///< Collection of shader program tickets
+  unsigned int  mConnectionCount;           ///< number of on-stage ImageActors using this shader effect
+  Dali::ShaderEffect::GeometryHints  mGeometryHints; ///< shader geometry hints for building the geometry
 
   // Default properties
   typedef std::map<std::string, Property::Index> DefaultPropertyLookup;
index 8d69fa0..54dbf98 100644 (file)
@@ -113,9 +113,9 @@ void ShaderFactory::LoadDefaultShaders()
 {
   mDefaultShader = ShaderEffect::New();
 
-  mDefaultShader->SetProgram( GEOMETRY_TYPE_IMAGE, SHADER_DEFAULT, FlatColorTextureVertex, FlatColorTextureFragment, ShaderEffect::FIXED );
+  mDefaultShader->SetProgram( GEOMETRY_TYPE_IMAGE, SHADER_DEFAULT, FlatColorTextureVertex, FlatColorTextureFragment, ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
-  mDefaultShader->SetProgram( GEOMETRY_TYPE_TEXT, SHADER_DEFAULT, DistanceFieldFontVertex, DistanceFieldFontFragment, ShaderEffect::FIXED );
+  mDefaultShader->SetProgram( GEOMETRY_TYPE_TEXT, SHADER_DEFAULT, DistanceFieldFontVertex, DistanceFieldFontFragment, ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
   LoadTextSubtypeShaders(mDefaultShader); // TODO: Remove when applications no longer need these shaders
 
@@ -125,42 +125,42 @@ void ShaderFactory::LoadDefaultShaders()
                               SHADER_DEF_USE_LIGHTING, // fragment shader defs
                               CustomMeshPrefixVertex + MeshColorNoTextureVertex,
                               CustomMeshPrefixFragment + MeshColorNoTextureFragment,
-                              ShaderEffect::FIXED );
+                              ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
   mDefaultShader->SetProgram( GEOMETRY_TYPE_MESH, SHADER_EVENLY_LIT,
                               "", // Vertex shader defs
                               "", // fragment shader defs
                               CustomMeshPrefixVertex + MeshColorNoTextureVertex,
                               CustomMeshPrefixFragment + MeshColorNoTextureFragment,
-                              ShaderEffect::FIXED );
+                              ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
   mDefaultShader->SetProgram( GEOMETRY_TYPE_MESH, SHADER_RIGGED_AND_LIT,
                               SHADER_DEF_USE_BONES,    // vertex shader defs
                               SHADER_DEF_USE_LIGHTING, // fragment shader defs
                               CustomMeshPrefixVertex + MeshColorNoTextureVertex,
                               CustomMeshPrefixFragment + MeshColorNoTextureFragment,
-                              ShaderEffect::FLEXIBLE);
+                              ShaderEffect::MODIFIES_GEOMETRY );
 
   mDefaultShader->SetProgram( GEOMETRY_TYPE_MESH, SHADER_RIGGED_AND_EVENLY_LIT,
                               SHADER_DEF_USE_BONES, // Vertex shader defs
                               "",                   // Fragment shader defs
                               CustomMeshPrefixVertex + MeshColorNoTextureVertex,
                               CustomMeshPrefixFragment + MeshColorNoTextureFragment,
-                              ShaderEffect::FLEXIBLE);
+                              ShaderEffect::MODIFIES_GEOMETRY );
 
   mDefaultShader->SetProgram( GEOMETRY_TYPE_MESH, SHADER_RIGGED_AND_VERTEX_COLOR,
                               (SHADER_DEF_USE_BONES SHADER_DEF_USE_COLOR), // Vertex shader defs
                               SHADER_DEF_USE_COLOR,                        // Fragment shader defs
                               CustomMeshPrefixVertex + MeshColorNoTextureVertex,
                               CustomMeshPrefixFragment + MeshColorNoTextureFragment,
-                              ShaderEffect::FLEXIBLE);
+                              ShaderEffect::MODIFIES_GEOMETRY );
 
   mDefaultShader->SetProgram( GEOMETRY_TYPE_MESH, SHADER_VERTEX_COLOR,
                               SHADER_DEF_USE_COLOR,  // Vertex shader defs
                               SHADER_DEF_USE_COLOR,  // Fragment shader defs
                               CustomMeshPrefixVertex + MeshColorNoTextureVertex,
                               CustomMeshPrefixFragment + MeshColorNoTextureFragment,
-                              ShaderEffect::FIXED);
+                              ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
   // Textured meshes
   mDefaultShader->SetProgram( GEOMETRY_TYPE_TEXTURED_MESH, SHADER_DEFAULT,
@@ -168,7 +168,7 @@ void ShaderFactory::LoadDefaultShaders()
                               SHADER_DEF_USE_LIGHTING, // fragment shader defs
                               CustomMeshPrefixVertex + MeshVertex,
                               CustomMeshPrefixFragment + MeshFragment,
-                              ShaderEffect::FIXED);
+                              ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
 
   mDefaultShader->SetProgram( GEOMETRY_TYPE_TEXTURED_MESH, SHADER_EVENLY_LIT,
@@ -176,21 +176,21 @@ void ShaderFactory::LoadDefaultShaders()
                               "",                      // Fragment shader defs
                               CustomMeshPrefixVertex + MeshVertex,
                               CustomMeshPrefixFragment + MeshFragment,
-                              ShaderEffect::FIXED);
+                              ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
   mDefaultShader->SetProgram( GEOMETRY_TYPE_TEXTURED_MESH, SHADER_RIGGED_AND_LIT,
                               SHADER_DEF_USE_BONES,    // Vertex shader defs
                               SHADER_DEF_USE_LIGHTING, // Fragment shader defs
                               CustomMeshPrefixVertex + MeshVertex,
                               CustomMeshPrefixFragment + MeshFragment,
-                              ShaderEffect::FLEXIBLE);
+                              ShaderEffect::MODIFIES_GEOMETRY );
 
   mDefaultShader->SetProgram( GEOMETRY_TYPE_TEXTURED_MESH, SHADER_RIGGED_AND_EVENLY_LIT,
                               SHADER_DEF_USE_BONES, // Vertex shader defs
                               "",                   // Fragment shader defs
                               CustomMeshPrefixVertex + MeshVertex,
                               CustomMeshPrefixFragment + MeshFragment,
-                              ShaderEffect::FLEXIBLE);
+                              ShaderEffect::MODIFIES_GEOMETRY );
 }
 
 void ShaderFactory::LoadTextSubtypeShaders(ShaderEffectPtr shaderEffect)
@@ -199,15 +199,15 @@ void ShaderFactory::LoadTextSubtypeShaders(ShaderEffectPtr shaderEffect)
                            SHADER_DEF_USE_GRADIENT,
                            SHADER_DEF_USE_GRADIENT,
                            DistanceFieldFontVertex, DistanceFieldFontFragment,
-                           ShaderEffect::FIXED);
+                           ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
-  shaderEffect->SetProgram(GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_GLOW, DistanceFieldFontGlowVertex, DistanceFieldFontGlowFragment, ShaderEffect::FIXED);
+  shaderEffect->SetProgram(GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_GLOW, DistanceFieldFontGlowVertex, DistanceFieldFontGlowFragment, ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
-  shaderEffect->SetProgram(GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_SHADOW, DistanceFieldFontShadowVertex, DistanceFieldFontShadowFragment, ShaderEffect::FIXED);
+  shaderEffect->SetProgram(GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_SHADOW, DistanceFieldFontShadowVertex, DistanceFieldFontShadowFragment, ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
-  shaderEffect->SetProgram(GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_OUTLINE, DistanceFieldFontOutlineVertex, DistanceFieldFontOutlineFragment, ShaderEffect::FIXED);
+  shaderEffect->SetProgram(GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_OUTLINE, DistanceFieldFontOutlineVertex, DistanceFieldFontOutlineFragment, ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 
-  shaderEffect->SetProgram(GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_OUTLINE_GLOW, DistanceFieldFontOutlineGlowVertex, DistanceFieldFontOutlineGlowFragment, ShaderEffect::FIXED);
+  shaderEffect->SetProgram(GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_OUTLINE_GLOW, DistanceFieldFontOutlineGlowVertex, DistanceFieldFontOutlineGlowFragment, ShaderEffect::DOESNT_MODIFY_GEOMETRY );
 }
 
 
index 55fdbdd..ad6bb47 100644 (file)
@@ -174,8 +174,7 @@ void Renderer::Render( BufferIndex bufferIndex,
   Program& program = mShader->GetProgram( *mContext, geometryType, subType, programIndex );
 
   // Check culling (does not need the program to be in use)
-  bool areVerticesFixed = program.AreVerticesFixed();
-  if( cull && areVerticesFixed )
+  if( cull && ! program.ModifiesGeometry() )
   {
     if( IsOutsideClipSpace( modelMatrix, gModelViewProjectionMatrix ) )
     {
index 9fdc1a3..c25fdb0 100644 (file)
@@ -118,7 +118,7 @@ const char* gStdUniforms[ Program::UNIFORM_TYPE_LAST ] =
 
 // IMPLEMENTATION
 
-Program* Program::New( const Integration::ResourceId& resourceId, Integration::ShaderData* shaderData, Context& context, bool fixedVertices )
+Program* Program::New( const Integration::ResourceId& resourceId, Integration::ShaderData* shaderData, Context& context, bool modifiesGeometry )
 {
   size_t shaderHash = shaderData->GetHashValue();
   Program* program = context.GetCachedProgram( shaderHash );
@@ -126,7 +126,7 @@ Program* Program::New( const Integration::ResourceId& resourceId, Integration::S
   if( NULL == program )
   {
     // program not found so create it
-    program = new Program( shaderData, context, fixedVertices );
+    program = new Program( shaderData, context, modifiesGeometry );
 
     program->Load();
 
@@ -430,12 +430,12 @@ void Program::GlContextDestroyed()
   ResetAttribsUniforms();
 }
 
-bool Program::AreVerticesFixed()
+bool Program::ModifiesGeometry()
 {
-  return mAreVerticesFixed;
+  return mModifiesGeometry;
 }
 
-Program::Program(Integration::ShaderData* shaderData, Context& context, bool areVerticesFixed )
+Program::Program(Integration::ShaderData* shaderData, Context& context, bool modifiesGeometry )
 : mContext( context ),
   mGlAbstraction( context.GetAbstraction() ),
   mProjectionMatrix( NULL ),
@@ -445,7 +445,7 @@ Program::Program(Integration::ShaderData* shaderData, Context& context, bool are
   mFragmentShaderId( 0 ),
   mProgramId( 0 ),
   mProgramData(shaderData),
-  mAreVerticesFixed(areVerticesFixed)
+  mModifiesGeometry( modifiesGeometry )
 {
   // reserve space for standard uniforms
   mUniformLocations.reserve( UNIFORM_TYPE_LAST );
index 5878e7c..0a0e94a 100644 (file)
@@ -136,10 +136,10 @@ public:
    *                        and optionally precompiled binary. If the binary is empty the program bytecode
    *                        is copied into it after compilation and linking)
    * @param [in] context    GL context
-   * @param [in] fixedVertices True if the vertex shader does not change verts
+   * @param [in] modifiesGeometry True if the shader modifies geometry
    * @return pointer to the program
    */
-  static Program* New( const Integration::ResourceId& resourceId, Integration::ShaderData* shaderData, Context& context, bool fixedVertices );
+  static Program* New( const Integration::ResourceId& resourceId, Integration::ShaderData* shaderData, Context& context, bool modifiesGeometry );
 
   /**
    * Takes this program into use
@@ -252,9 +252,9 @@ public:
   void GlContextDestroyed();
 
   /**
-   * @return true if this program does not change vertex position
+   * @return true if this program modifies geometry
    */
-  bool AreVerticesFixed();
+  bool ModifiesGeometry();
 
   /**
    * Set the projection matrix that has currently been sent
@@ -298,9 +298,9 @@ private: // Implementation
    * Constructor, private so no direct instantiation
    * @param[in] shaderData A pointer to a data structure containing the program source and binary
    * @param[in] context    The GL context state cache.
-   * @param[in] areVerticesFixed True if the vertex shader does not move vertices
+   * @param[in] modifiesGeometry True if the vertex shader changes geometry
    */
-  Program( Integration::ShaderData* shaderData, Context& context, bool areVerticesFixed );
+  Program( Integration::ShaderData* shaderData, Context& context, bool modifiesGeometry );
 
 public:
 
@@ -370,7 +370,7 @@ private:  // Data
   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 mUniformCacheFloat4[ MAX_UNIFORM_CACHE_SIZE ][4]; ///< Value cache for uniforms of four float
-  bool mAreVerticesFixed;  ///< True if the program does not change vertex position
+  bool mModifiesGeometry;  ///< True if the program changes geometry
 };
 
 } // namespace Internal
index 299cc2e..2a969de 100644 (file)
@@ -182,9 +182,9 @@ void Shader::ForwardGridDensity( BufferIndex updateBufferIndex, float density )
   new (slot) DerivedType( this, &Shader::SetGridDensity, density );
 }
 
-void Shader::ForwardHints( BufferIndex updateBufferIndex, int hint )
+void Shader::ForwardHints( BufferIndex updateBufferIndex, Dali::ShaderEffect::GeometryHints hint )
 {
-  typedef MessageValue1< Shader, int > DerivedType;
+  typedef MessageValue1< Shader, Dali::ShaderEffect::GeometryHints > DerivedType;
 
   // Reserve some memory inside the render queue
   unsigned int* slot = mRenderQueue->ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
@@ -231,13 +231,13 @@ void Shader::SetProgram( GeometryType geometryType,
                          Integration::ResourceId resourceId,
                          Integration::ShaderDataPtr shaderData,
                          Context* context,
-                         bool areVerticesFixed )
+                         bool modifiesGeometry )
 {
   DALI_LOG_TRACE_METHOD_FMT(Debug::Filter::gShader, "%d %d\n", (int)geometryType, resourceId);
 
   bool precompiledBinary = shaderData->HasBinary();
 
-  Program* program = Program::New( resourceId, shaderData.Get(), *context, areVerticesFixed );
+  Program* program = Program::New( resourceId, shaderData.Get(), *context, modifiesGeometry );
 
   ShaderSubTypes theSubType = subType;
   if( subType == SHADER_SUBTYPE_ALL )
index ca8c639..b11f401 100644 (file)
@@ -154,7 +154,7 @@ public:
    * Retrieve the set of geometry hints.
    * @return The hints.
    */
-  int GetGeometryHints() const
+  Dali::ShaderEffect::GeometryHints GetGeometryHints() const
   {
     return mGeometryHints;
   }
@@ -163,7 +163,7 @@ public:
    * Set the geometry hints.
    * @param[in] hints The hints.
    */
-  void SetGeometryHints( int hints )
+  void SetGeometryHints( Dali::ShaderEffect::GeometryHints hints )
   {
     mGeometryHints = hints;
   }
@@ -215,7 +215,7 @@ public:
    * @param[in] updateBufferIndex The current update buffer index.
    * @param[in] hint The geometry hints.
    */
-  void ForwardHints( BufferIndex updateBufferIndex, int hint );
+  void ForwardHints( BufferIndex updateBufferIndex, Dali::ShaderEffect::GeometryHints hint );
 
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   // The following methods are called in Render thread
@@ -262,14 +262,14 @@ public:
    * @param[in] resourceId    The resource ID for the program.
    * @param[in] shaderData    The program's vertex/fragment source and optionally compiled bytecode
    * @param[in] context       Reference to the GL context.
-   * @param[in] areVerticesFixed True if the vertex shader does not change vertex position
+   * @param[in] modifiesGeometry True if the vertex shader changes geometry
    */
   void SetProgram( GeometryType geometryType,
                    Internal::ShaderSubTypes subType,
                    Integration::ResourceId resourceId,
                    Integration::ShaderDataPtr shaderData,
                    Context* context,
-                   bool areVerticesFixed );
+                   bool modifiesGeometry );
 
   /**
    * Determine if subtypes are required for the given geometry type
@@ -311,7 +311,7 @@ private: // Data
 
   typedef OwnerContainer< UniformMeta* > UniformMetaContainer;
 
-  int                            mGeometryHints;    ///< shader geometry hints for building the geometry
+  Dali::ShaderEffect::GeometryHints mGeometryHints;    ///< shader geometry hints for building the geometry
   float                          mGridDensity;      ///< grid density
   Texture*                       mTexture;          ///< Raw Pointer to Texture
   Integration::ResourceId        mRenderTextureId;  ///< Copy of the texture ID for the render thread
@@ -329,6 +329,15 @@ private: // Data
   TextureCache*                  mTextureCache; // Used for retrieving textures in the render thread
 };
 
+} // namespace SceneGraph
+
+template <> struct ParameterType<Dali::ShaderEffect::GeometryHints> : public BasicType< Dali::ShaderEffect::GeometryHints >
+{
+};
+
+namespace SceneGraph
+{
+
 // Messages for Shader, to be processed in Update thread.
 
 inline void SetTextureIdMessage( EventToUpdate& eventToUpdate, const Shader& shader, Integration::ResourceId textureId )
@@ -355,7 +364,7 @@ inline void SetGridDensityMessage( EventToUpdate& eventToUpdate, const Shader& s
 
 inline void SetHintsMessage( EventToUpdate& eventToUpdate, const Shader& shader, Dali::ShaderEffect::GeometryHints hint )
 {
-  typedef MessageDoubleBuffered1< Shader, int > LocalType;
+  typedef MessageDoubleBuffered1< Shader, Dali::ShaderEffect::GeometryHints > LocalType;
 
   // Reserve some memory inside the message queue
   unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
index ce1f435..3065a7a 100644 (file)
@@ -586,7 +586,7 @@ void UpdateManager::RemoveShader(Shader* shader)
   DALI_ASSERT_DEBUG(false);
 }
 
-void UpdateManager::SetShaderProgram( Shader* shader, GeometryType geometryType, ShaderSubTypes subType, ResourceId resourceId, size_t shaderHash, bool fixed )
+void UpdateManager::SetShaderProgram( Shader* shader, GeometryType geometryType, ShaderSubTypes subType, ResourceId resourceId, size_t shaderHash, bool modifiesGeometry )
 {
   DALI_LOG_TRACE_METHOD_FMT(Debug::Filter::gShader, " - (geometryType:%d subType:%d id:%d hash:%d)\n", geometryType, subType, resourceId, shaderHash);
 
@@ -605,7 +605,7 @@ void UpdateManager::SetShaderProgram( Shader* shader, GeometryType geometryType,
     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, geometryType, subType, resourceId, shaderData, &(mImpl->renderManager.GetContext()), fixed );
+    new (slot) DerivedType( shader, &Shader::SetProgram, geometryType, subType, resourceId, shaderData, &(mImpl->renderManager.GetContext()), modifiesGeometry );
   }
 }
 
index 8e64e15..67c2daf 100644 (file)
@@ -304,9 +304,9 @@ public:
    * @param[in] subType       The program subtype
    * @param[in] resourceId    A ResourceManager ticket ID for the program data (source and compiled binary)
    * @param[in] shaderHash    hash key created with vertex and fragment shader code
-   * @param[in] fixed         True if the vertex shader doesn't alter vertices
+   * @param[in] modifiesGeometry True if the vertex shader modifies geometry
    */
-  void SetShaderProgram( Shader* shader, GeometryType geometryType, ShaderSubTypes subType, Integration::ResourceId resourceId, size_t shaderHash, bool fixed );
+  void SetShaderProgram( Shader* shader, GeometryType geometryType, ShaderSubTypes subType, Integration::ResourceId resourceId, size_t shaderHash, bool modifiesGeometry );
 
   /**
    * Add an animatable mesh
@@ -717,7 +717,7 @@ inline void SetShaderProgramMessage( UpdateManager& manager,
                                      ShaderSubTypes subType,
                                      Integration::ResourceId resourceId,
                                      size_t shaderHash,
-                                     bool fixed )
+                                     bool modifiesGeometry )
 {
   typedef MessageValue6< UpdateManager, Shader*, GeometryType, ShaderSubTypes, Integration::ResourceId, size_t, bool > LocalType;
 
@@ -725,7 +725,7 @@ inline void SetShaderProgramMessage( UpdateManager& manager,
   unsigned int* slot = manager.GetEventToUpdate().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, geometryType, subType, resourceId, shaderHash, fixed );
+  new (slot) LocalType( &manager, &UpdateManager::SetShaderProgram, &shader, geometryType, subType, resourceId, shaderHash, modifiesGeometry );
 }
 
 // The render thread can safely change the AnimatableMesh
index 0f83f5a..94ed33a 100644 (file)
@@ -195,12 +195,13 @@ public:
    */
   enum GeometryHints
   {
-    HINT_NONE         = 0x00,   ///< no hints
-    HINT_GRID_X       = 0x01,   ///< Geometry must be subdivided in X
-    HINT_GRID_Y       = 0x02,   ///< Geometry must be subdivided in Y
-    HINT_GRID         = (HINT_GRID_X | HINT_GRID_Y),
-    HINT_DEPTH_BUFFER = 0x04,   ///< Needs depth buffering turned on
-    HINT_BLENDING     = 0x08    ///< Notifies the actor to use blending even if it's fully opaque. Needs actor's blending set to BlendingMode::AUTO
+    HINT_NONE           = 0x00,   ///< no hints
+    HINT_GRID_X         = 0x01,   ///< Geometry must be subdivided in X
+    HINT_GRID_Y         = 0x02,   ///< Geometry must be subdivided in Y
+    HINT_GRID           = (HINT_GRID_X | HINT_GRID_Y),
+    HINT_DEPTH_BUFFER   = 0x04,   ///< Needs depth buffering turned on
+    HINT_BLENDING       = 0x08,   ///< Notifies the actor to use blending even if it's fully opaque. Needs actor's blending set to BlendingMode::AUTO
+    HINT_DOESNT_MODIFY_GEOMETRY = 0x10 ///< Notifies that the vertex shader will not change geometry (enables bounding box culling)
   };
 
   /**