END_TEST;
}
+
+int UtcDaliRendererRegenerateUniformMap(void)
+{
+ TestApplication application;
+
+ tet_infoline( "Test regenerating uniform map when attaching renderer to the node" );
+
+ Geometry geometry = CreateQuadGeometry();
+ Shader shader = Shader::New( "vertexSrc", "fragmentSrc" );
+ Renderer renderer = Renderer::New( geometry, shader );
+
+ Actor actor = Actor::New();
+ actor.AddRenderer( renderer );
+ actor.SetSize( 400, 400 );
+ actor.SetColor( Vector4( 1.0f, 0.0f, 1.0f, 1.0f ) );
+ Stage::GetCurrent().Add( actor );
+
+ application.SendNotification();
+ application.Render();
+
+ actor.RemoveRenderer( renderer );
+ shader = Shader::New( "vertexSrc", "fragmentSrc" );
+ shader.RegisterProperty( "opacity", 0.5f );
+ renderer.SetShader( shader );
+
+ Stage::GetCurrent().KeepRendering( 1.0f );
+
+ // Update for several frames
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // Add Renderer
+ actor.AddRenderer( renderer );
+ application.SendNotification();
+ application.Render();
+
+ // Nothing to test here, the test must not crash
+ auto updateStatus = application.GetUpdateStatus();
+ DALI_TEST_CHECK( updateStatus & Integration::KeepUpdating::STAGE_KEEP_RENDERING );
+
+ END_TEST;
+}
mDepthWriteMode( depthWriteMode ),
mDepthTestMode( depthTestMode ),
mUpdateAttributesLocation( true ),
- mPremultipledAlphaEnabled( preMultipliedAlphaEnabled )
+ mPremultipledAlphaEnabled( preMultipliedAlphaEnabled ),
+ mShaderChanged( false )
{
if( blendingBitmask != 0u )
{
if( uniformMapDataProvider.GetUniformMapChanged( bufferIndex ) ||
node.GetUniformMapChanged(bufferIndex) ||
- mUniformIndexMap.Count() == 0)
+ mUniformIndexMap.Count() == 0 ||
+ mShaderChanged )
{
+ // Reset shader pointer
+ mShaderChanged = false;
+
const SceneGraph::CollectedUniformMap& uniformMap = uniformMapDataProvider.GetUniformMap( bufferIndex );
const SceneGraph::CollectedUniformMap& uniformMapNode = node.GetUniformMap( bufferIndex );
sortAttributes.geometry = mGeometry;
}
+void Renderer::SetShaderChanged( bool value )
+{
+ mShaderChanged = value;
+}
+
} // namespace SceneGraph
} // namespace Internal
*/
void SetSortAttributes( BufferIndex bufferIndex, SceneGraph::RenderInstructionProcessor::SortAttributes& sortAttributes ) const;
+ /**
+ * Sets the flag indicating whether shader changed.
+ *
+ * @param[in] value True if shader changed
+ */
+ void SetShaderChanged( bool value );
+
private:
struct UniformIndexMap;
DepthTestMode::Type mDepthTestMode:3; ///< 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
+ bool mShaderChanged:1; ///< Flag indicating the shader changed and uniform maps have to be updated
+
};
RESEND_STENCIL_OPERATION_ON_FAIL = 1 << 15,
RESEND_STENCIL_OPERATION_ON_Z_FAIL = 1 << 16,
RESEND_STENCIL_OPERATION_ON_Z_PASS = 1 << 17,
- RESEND_WRITE_TO_COLOR_BUFFER = 1 << 18
+ RESEND_WRITE_TO_COLOR_BUFFER = 1 << 18,
+ RESEND_SHADER = 1 << 19,
};
} // Anonymous namespace
new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilOperationOnZPass, mStencilParameters.stencilOperationOnZPass );
}
+ if( mResendFlag & RESEND_SHADER )
+ {
+ typedef MessageValue1< Render::Renderer, bool > DerivedType;
+ uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
+ new (slot) DerivedType( mRenderer, &Render::Renderer::SetShaderChanged, true );
+ }
+
mResendFlag = 0;
}
}
mShader = shader;
mShader->AddConnectionObserver( *this );
mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
- mResendFlag |= RESEND_GEOMETRY;
+ mResendFlag |= RESEND_GEOMETRY | RESEND_SHADER;
if( mRenderDataProvider )
{
DepthWriteMode::Type mDepthWriteMode:3; ///< Local copy of the depth write mode
DepthTestMode::Type mDepthTestMode:3; ///< Local copy of the depth test mode
DevelRenderer::Rendering::Type mRenderingBehavior:2; ///< The rendering behavior
-
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