: UnregisteredCustomActor(impl)
{
mImpl = &impl;
- mImpl->SetOffScreenRenderableType(type);
+ mImpl->RegisterOffScreenRenderableType(type);
}
Dali::RenderTask GetForwardRenderTask()
{
{
return mImpl->mBackwardRenderTask;
}
+ void RegisterExternalOffScreenRenderableType(OffScreenRenderable::Type type)
+ {
+ tet_printf("type add : %d + %d\n", mImpl->GetOffScreenRenderableType(), type);
+ mImpl->RegisterOffScreenRenderableType(type);
+ mImpl->RequestRenderTaskReorder();
+ }
+ void UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type type)
+ {
+ tet_printf("type add : %d - %d\n", mImpl->GetOffScreenRenderableType(), type);
+ mImpl->UnregisterOffScreenRenderableType(type);
+ mImpl->RequestRenderTaskReorder();
+ }
OffScreenRenderable::Type GetOffScreenRenderableType()
{
tet_printf("type : %d\n", mImpl->GetOffScreenRenderableType());
* Fb Gf
* / \
* H I
- *
+ *
* A, C are Layer. C has smaller Depth value than A.
* B, E, F, G, and J are OffScreenCustomActor.
* B, F, and J are Type BACKWARD.
* Al
* / \
* Bb Cb
- *
- * A is Layer.
+ *
+ * A is Layer.
* B and C are BACKWARD OffScreenRenderable
*
* At the initial status, the OrderIndex of each RenderTask is
END_TEST;
}
+int UtcDaliCustomActorRegisterOffScreenRenderableTypeP(void)
+{
+ TestApplication application; // Need the type registry
+
+ DALI_TEST_EQUALS(application.GetScene().GetRenderTaskList().GetTaskCount(), 1, TEST_LOCATION);
+
+ /**
+ * Al
+ * /
+ * Bb
+ * / \
+ * Cb Df
+ *
+ * A is Layer.
+ * B and C are BACKWARD OffScreenRenderable,
+ * D is FORWARD OffScreenRenderable
+ *
+ * At the initial status, the OrderIndex of each RenderTask is
+ * B(Backward) - C(Backward) (D(Forward) is don't care)
+ *
+ * Al
+ * /
+ * Bfb
+ * / \
+ * Cb Df
+ *
+ * if we register B the forward renderable type, the OrderIndex of each RenderTask becomes
+ * (D(Forward) | C(Backward)) - B(Forward) - B(Backward)
+ *
+ * Al
+ * /
+ * Bff
+ * / \
+ * Cfb Df
+ *
+ * if we register B, C the forward renderable type again and B unregister backward,
+ * We don't care the order of C(Forward), C(Backward) and D(Forward).
+ * But all of them should be before B(Forward).
+ */
+
+ Layer A_layer = Layer::New();
+ OffScreenCustomActor B_offScreenCustomActor = OffScreenCustomActor::New(OffScreenRenderable::Type::BACKWARD);
+ OffScreenCustomActor C_offScreenCustomActor = OffScreenCustomActor::New(OffScreenRenderable::Type::BACKWARD);
+ OffScreenCustomActor D_offScreenCustomActor = OffScreenCustomActor::New(OffScreenRenderable::Type::FORWARD);
+
+ application.GetScene().Add(A_layer);
+
+ DALI_TEST_EQUALS(application.GetScene().GetRenderTaskList().GetTaskCount(), 1, TEST_LOCATION);
+ tet_printf("task cnt before : %d\n", application.GetScene().GetRenderTaskList().GetTaskCount());
+
+ A_layer.Add(B_offScreenCustomActor);
+ DALI_TEST_EQUALS(application.GetScene().GetRenderTaskList().GetTaskCount(), 3, TEST_LOCATION);
+
+ B_offScreenCustomActor.Add(C_offScreenCustomActor);
+ DALI_TEST_EQUALS(application.GetScene().GetRenderTaskList().GetTaskCount(), 5, TEST_LOCATION);
+
+ B_offScreenCustomActor.Add(D_offScreenCustomActor);
+ DALI_TEST_EQUALS(application.GetScene().GetRenderTaskList().GetTaskCount(), 7, TEST_LOCATION);
+
+ application.SendNotification();
+
+ tet_printf("B OrderIndex : %d, C OrderIndex : %d, D OrderIndex : %d\n", B_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex(), C_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex(), D_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex());
+ DALI_TEST_CHECK(B_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex() < C_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex());
+
+ B_offScreenCustomActor.RegisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(B_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::BOTH, TEST_LOCATION);
+ application.SendNotification();
+
+ tet_printf("B OrderIndex : f %d b %d, C OrderIndex : %d, D OrderIndex : %d\n", B_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex(), B_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex(), C_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex(), D_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex());
+ DALI_TEST_CHECK(C_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex() < B_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex());
+ DALI_TEST_CHECK(D_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex() < B_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex());
+ DALI_TEST_CHECK(B_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex() < D_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex());
+
+ B_offScreenCustomActor.RegisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(B_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::BOTH, TEST_LOCATION);
+ C_offScreenCustomActor.RegisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(C_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::BOTH, TEST_LOCATION);
+ B_offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::BACKWARD);
+ DALI_TEST_EQUALS(B_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::FORWARD, TEST_LOCATION);
+ application.SendNotification();
+
+ tet_printf("B OrderIndex : %d, C OrderIndex : f %d b %d, D OrderIndex : %d\n", B_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex(), C_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex(), C_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex(), D_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex());
+ DALI_TEST_CHECK(C_offScreenCustomActor.GetBackwardRenderTask().GetOrderIndex() < B_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex());
+ DALI_TEST_CHECK(C_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex() < B_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex());
+ DALI_TEST_CHECK(D_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex() < B_offScreenCustomActor.GetForwardRenderTask().GetOrderIndex());
+
+ tet_printf("Check unregister external type well\n");
+ B_offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(B_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::FORWARD, TEST_LOCATION);
+ B_offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(B_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::NONE, TEST_LOCATION);
+ C_offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::BACKWARD);
+ DALI_TEST_EQUALS(C_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::FORWARD, TEST_LOCATION);
+ C_offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(C_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::NONE, TEST_LOCATION);
+ D_offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(D_offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::NONE, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCustomActorRegisterOffScreenRenderableTypeN(void)
+{
+ TestApplication application; // Need the type registry
+
+ DALI_TEST_EQUALS(application.GetScene().GetRenderTaskList().GetTaskCount(), 1, TEST_LOCATION);
+
+ Layer layer = Layer::New();
+ OffScreenCustomActor offScreenCustomActor = OffScreenCustomActor::New(OffScreenRenderable::Type::NONE);
+
+ application.GetScene().Add(layer);
+
+ DALI_TEST_EQUALS(application.GetScene().GetRenderTaskList().GetTaskCount(), 1, TEST_LOCATION);
+
+ layer.Add(offScreenCustomActor);
+ application.SendNotification();
+
+ constexpr int MAX_REGISTERED_COUNT = 15;
+
+ for(int i = 0; i < MAX_REGISTERED_COUNT; ++i)
+ {
+ offScreenCustomActor.RegisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::FORWARD, TEST_LOCATION);
+ }
+
+ try
+ {
+ offScreenCustomActor.RegisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ tet_result(TET_FAIL); // Should not reach here
+ }
+ catch(DaliException e)
+ {
+ DALI_TEST_ASSERT(e, "forward registered more than 16 times", TEST_LOCATION);
+ }
+
+ for(int i = 0; i < MAX_REGISTERED_COUNT; ++i)
+ {
+ offScreenCustomActor.RegisterExternalOffScreenRenderableType(OffScreenRenderable::Type::BACKWARD);
+ DALI_TEST_EQUALS(offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::BOTH, TEST_LOCATION);
+ }
+
+ try
+ {
+ offScreenCustomActor.RegisterExternalOffScreenRenderableType(OffScreenRenderable::Type::BACKWARD);
+ tet_result(TET_FAIL); // Should not reach here
+ }
+ catch(DaliException e)
+ {
+ DALI_TEST_ASSERT(e, "backward registered more than 16 times", TEST_LOCATION);
+ }
+
+ for(int i = 0; i < MAX_REGISTERED_COUNT - 1; ++i)
+ {
+ offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::BOTH, TEST_LOCATION);
+ }
+ offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ DALI_TEST_EQUALS(offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::BACKWARD, TEST_LOCATION);
+
+ try
+ {
+ offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+ tet_result(TET_FAIL); // Should not reach here
+ }
+ catch(DaliException e)
+ {
+ DALI_TEST_ASSERT(e, "forward not registered before", TEST_LOCATION);
+ }
+
+ for(int i = 0; i < MAX_REGISTERED_COUNT - 1; ++i)
+ {
+ offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::BACKWARD);
+ DALI_TEST_EQUALS(offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::BACKWARD, TEST_LOCATION);
+ }
+ offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::BACKWARD);
+ DALI_TEST_EQUALS(offScreenCustomActor.GetOffScreenRenderableType(), OffScreenRenderable::Type::NONE, TEST_LOCATION);
+
+ try
+ {
+ offScreenCustomActor.UnregisterExternalOffScreenRenderableType(OffScreenRenderable::Type::BACKWARD);
+ tet_result(TET_FAIL); // Should not reach here
+ }
+ catch(DaliException e)
+ {
+ DALI_TEST_ASSERT(e, "backward not registered before", TEST_LOCATION);
+ }
+
+ END_TEST;
+}
+
int UtcDaliCustomActorImplSetRemoveCacheRenderer(void)
{
TestApplication application;
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 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.
return gVisibilityChangedActorStack;
}
+constexpr uint8_t EMPTY_OFF_SCREEN_RENDERABLE_BIT_FIELD = 0x00;
+constexpr uint8_t OFF_SCREEN_RENDERABLE_TYPE_FORWARD_MASK = 0x0f;
+constexpr uint8_t OFF_SCREEN_RENDERABLE_TYPE_FORWARD_VALUE = 0x01;
+constexpr uint8_t OFF_SCREEN_RENDERABLE_TYPE_BACKWARD_MASK = 0xf0;
+constexpr uint8_t OFF_SCREEN_RENDERABLE_TYPE_BACKWARD_VALUE = 0x10;
+
} // unnamed namespace
ActorPtr Actor::New()
{
}
-void Actor::SetOffScreenRenderableType(OffScreenRenderable::Type offScreenRenderableType)
+void Actor::RegisterOffScreenRenderableType(OffScreenRenderable::Type offScreenRenderableType)
+{
+ if(offScreenRenderableType & OffScreenRenderable::Type::FORWARD)
+ {
+ DALI_ASSERT_DEBUG((mOffScreenRenderableBitField & OFF_SCREEN_RENDERABLE_TYPE_FORWARD_MASK) != OFF_SCREEN_RENDERABLE_TYPE_FORWARD_MASK && "Off screen renderable type forward registered more than 16 times!");
+ mOffScreenRenderableBitField += OFF_SCREEN_RENDERABLE_TYPE_FORWARD_VALUE;
+ }
+ if(offScreenRenderableType & OffScreenRenderable::Type::BACKWARD)
+ {
+ DALI_ASSERT_DEBUG((mOffScreenRenderableBitField & OFF_SCREEN_RENDERABLE_TYPE_BACKWARD_MASK) != OFF_SCREEN_RENDERABLE_TYPE_BACKWARD_MASK && "Off screen renderable type backward registered more than 16 times!");
+ mOffScreenRenderableBitField += OFF_SCREEN_RENDERABLE_TYPE_BACKWARD_VALUE;
+ }
+}
+
+void Actor::UnregisterOffScreenRenderableType(OffScreenRenderable::Type offScreenRenderableType)
{
- mOffScreenRenderableType = offScreenRenderableType;
+ if(offScreenRenderableType & OffScreenRenderable::Type::FORWARD)
+ {
+ DALI_ASSERT_DEBUG((mOffScreenRenderableBitField & OFF_SCREEN_RENDERABLE_TYPE_FORWARD_MASK) != 0 && "Off screen renderable type forward not registered before!");
+ mOffScreenRenderableBitField -= OFF_SCREEN_RENDERABLE_TYPE_FORWARD_VALUE;
+ }
+ if(offScreenRenderableType & OffScreenRenderable::Type::BACKWARD)
+ {
+ DALI_ASSERT_DEBUG((mOffScreenRenderableBitField & OFF_SCREEN_RENDERABLE_TYPE_BACKWARD_MASK) != 0 && "Off screen renderable type backward not registered before!");
+ mOffScreenRenderableBitField -= OFF_SCREEN_RENDERABLE_TYPE_BACKWARD_VALUE;
+ }
}
OffScreenRenderable::Type Actor::GetOffScreenRenderableType() const
{
- return mOffScreenRenderableType;
+ return ((mOffScreenRenderableBitField & OFF_SCREEN_RENDERABLE_TYPE_FORWARD_MASK) ? OffScreenRenderable::Type::FORWARD : OffScreenRenderable::Type::NONE) |
+ ((mOffScreenRenderableBitField & OFF_SCREEN_RENDERABLE_TYPE_BACKWARD_MASK) ? OffScreenRenderable::Type::BACKWARD : OffScreenRenderable::Type::NONE);
}
void Actor::RequestRenderTaskReorder()
mClippingMode(ClippingMode::DISABLED),
mHoverState(PointState::FINISHED),
mBlendEquation(DevelBlendEquation::ADD),
- mOffScreenRenderableType(OffScreenRenderable::Type::NONE)
+ mOffScreenRenderableBitField(EMPTY_OFF_SCREEN_RENDERABLE_BIT_FIELD)
{
}
#define DALI_INTERNAL_ACTOR_H
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 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.
virtual void GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward);
/**
- * @brief Sets OffScreenRenderableType of this Actor.
+ * @brief Register OffScreenRenderableType of this Actor.
* This method is called by child class to set type itself.
*
* @param[in] offScreenRenderableType OffScreenRenderableType for this Actor.
* It could be one of NONE, FORWARD, BACKWARD, and BOTH.
+ * @note Each FORWARD / BACKWARD type could be added maxium 15 times.
+ * @post Call UnregisterOffScreenRenderableType() to unregister the type.
*/
- void SetOffScreenRenderableType(OffScreenRenderable::Type offScreenRenderableType);
+ void RegisterOffScreenRenderableType(OffScreenRenderable::Type offScreenRenderableType);
+
+ /**
+ * @brief Unregister OffScreenRenderableType of this Actor.
+ * This method is called by child class to set type itself.
+ *
+ * @param[in] offScreenRenderableType OffScreenRenderableType for this Actor.
+ * It could be one of NONE, FORWARD, BACKWARD, and BOTH.
+ * @pre Call RegisterOffScreenRenderableType() before unregister the type.
+ */
+ void UnregisterOffScreenRenderableType(OffScreenRenderable::Type offScreenRenderableType);
/**
* @brief Retrieves OffScreenRenderableType of this Actor.
ClippingMode::Type mClippingMode : 3; ///< Cached: Determines which clipping mode (if any) to use.
PointState::Type mHoverState : 3; ///< Stores the HoverEvent state of actor.
DevelBlendEquation::Type mBlendEquation : 16; ///< Cached: Determines which blend equation will be used to render renderers.
+ uint8_t mOffScreenRenderableBitField; ///< Bit field to store the offscreen renderable type of this actor. 0xf0 is backward, 0x0f is forward.
private:
static ActorContainer mNullChildren; ///< Empty container (shared by all actors, returned by GetChildren() const)
- // OffScreenRenderable
- OffScreenRenderable::Type mOffScreenRenderableType;
-
struct PropertyHandler;
struct SiblingHandler;
return static_cast<const Internal::Actor&>(handle);
}
+// specialization has to be done in the same namespace
+template<>
+struct EnableBitMaskOperators<OffScreenRenderable::Type>
+{
+ static const bool ENABLE = true;
+};
+
} // namespace Dali
#endif // DALI_INTERNAL_ACTOR_H