#include <dali/internal/event/common/property-input-impl.h>
#include <dali/internal/update/common/animatable-property-messages.h>
#include <dali/internal/update/manager/update-manager.h>
+#include <dali/internal/update/rendering/scene-graph-renderer-messages.h>
#include <dali/internal/update/rendering/scene-graph-renderer.h>
#include <dali/public-api/object/type-registry.h>
{
if(!mUniformMapped)
{
+ // Mark as we will not use shared uniform block.
+ // TODO : Currently, we ignore whole shared uniform blocks. We should specify the name of UBO in future.
+ EnableSharedUniformBlockMessage(GetEventThreadServices(), GetRendererSceneObject(), false);
+
mUniformMapped = true;
AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_OFFSET, ConstString("offset"));
AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_SIZE, ConstString("size"));
totalSizeCPU += memoryRequirements.totalCpuSizeRequired;
totalSizeGPU += memoryRequirements.totalGpuSizeRequired;
+
+ if(!item.mRenderer->UseSharedUniformBlock())
+ {
+ totalSizeGPU += memoryRequirements.sharedGpuSizeRequired;
+ }
}
}
}
mDepthTestMode(depthTestMode),
mPremultipliedAlphaEnabled(preMultipliedAlphaEnabled),
mShaderChanged(false),
- mPipelineCached(false)
+ mPipelineCached(false),
+ mUseSharedUniformBlock(true)
{
if(blendingBitmask != 0u)
{
mUniformBufferBindings[i].dataSize = reflection.GetUniformBlockSize(i);
bool useSharedBlock = !standaloneUniforms &&
- programRequirements.sharedBlock[i];
+ programRequirements.sharedBlock[i] &&
+ UseSharedUniformBlock();
if(useSharedBlock)
{
auto* ubo = uboViews[uniform.uniformBlockIndex];
if(ubo == nullptr) // Uniform belongs to shared UniformBlock, can't overwrite
{
- uniform.state = UniformIndexMap::State::NOT_USED;
continue;
}
WriteDynUniform(iter.propertyValue, uniform, *ubo, updateBufferIndex);
*/
Vector4 GetTextureUpdateArea() const noexcept;
+ /**
+ * @brief Mark whether we should consider shared uniform block, or ignore it.
+ * @todo Currently, we ignore whole shared uniform blocks. We should specify the name of UBO in future.
+ *
+ * @param[in] enabled True if we will use shared uniform block. False otherwise.
+ */
+ void EnableSharedUniformBlock(bool enabled)
+ {
+ mUseSharedUniformBlock = enabled;
+ }
+
+ /**
+ * @brief Check whether we should consider shared uniform block, or ignore it.
+ * @todo Currently, we ignore whole shared uniform blocks. We should specify the name of UBO in future.
+ *
+ * @return True if we will use shared uniform block. False otherwise.
+ */
+ [[nodiscard]] bool UseSharedUniformBlock() const
+ {
+ return mUseSharedUniformBlock;
+ }
+
public: // From Program::LifecycleObserver
/**
* @copydoc Dali::Internal::Program::LifecycleObserver::ProgramDestroyed()
bool mPremultipliedAlphaEnabled : 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
bool mPipelineCached : 1; ///< Flag indicating whether renderer cache valid pipeline or not.
+ bool mUseSharedUniformBlock : 1; ///< Flag whether we should use shared uniform block or not. Usually it must be true.
std::vector<Dali::DevelRenderer::DrawCommand> mDrawCommands; // Devel stuff
RenderCallback* mRenderCallback{nullptr};
new(slot) LocalType(&renderer, &SceneGraph::Renderer::SetUpdateAreaExtents, updateAreaExtents);
}
+inline void EnableSharedUniformBlockMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, bool enabled)
+{
+ using LocalType = MessageValue1<Renderer, bool>;
+ uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
+ new(slot) LocalType(&renderer, &Renderer::EnableSharedUniformBlock, enabled);
+}
+
} // namespace Dali::Internal::SceneGraph
#endif //DALI_INTERNAL_SCENE_GRAPH_RENDERER_MESSAGES_H
RESEND_WRITE_TO_COLOR_BUFFER = 1 << 18,
RESEND_SHADER = 1 << 19,
RESEND_DRAW_COMMANDS = 1 << 20,
- RESEND_SET_RENDER_CALLBACK = 1 << 21
+ RESEND_SET_RENDER_CALLBACK = 1 << 21,
+ RESEND_SHARED_UNIFORM_BLOCK_USED = 1 << 22,
};
inline Vector4 AdjustExtents(const Vector4& updateArea, const Dali::Extents& updateAreaExtents)
mVisualPropertiesDirtyFlags(CLEAN_FLAG),
mRegenerateUniformMap(false),
mPremultipledAlphaEnabled(false),
+ mUseSharedUniformBlock(true),
mMixColor(Color::WHITE),
mDepthIndex(0)
{
uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
new(slot) DerivedType(rendererPtr, &Render::Renderer::SetRenderCallback, mRenderCallback);
}
+
+ if(mResendFlag & RESEND_SHARED_UNIFORM_BLOCK_USED)
+ {
+ using DerivedType = MessageValue1<Render::Renderer, bool>;
+ uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
+ new(slot) DerivedType(rendererPtr, &Render::Renderer::EnableSharedUniformBlock, mUseSharedUniformBlock);
+ }
mResendFlag = 0;
}
return mCollectedUniformMap;
}
+void Renderer::EnableSharedUniformBlock(bool enabled)
+{
+ if(mUseSharedUniformBlock != enabled)
+ {
+ mUseSharedUniformBlock = enabled;
+ mResendFlag |= RESEND_SHARED_UNIFORM_BLOCK_USED;
+ SetUpdated(true);
+ }
+}
+
bool Renderer::IsUpdated() const
{
// We should check Whether
*/
const CollectedUniformMap& GetCollectedUniformMap() const override;
+public: // For VisualRenderer
+ /**
+ * Mark whether we should consider shared uniform block, or ignore it.
+ */
+ void EnableSharedUniformBlock(bool enabled);
+
public: // For VisualProperties
/**
* To be used only for 1st stage initialization in event thread.
bool mRegenerateUniformMap : 1; ///< true if the map should be regenerated
bool mPremultipledAlphaEnabled : 1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
+ bool mUseSharedUniformBlock : 1;
std::vector<Dali::DevelRenderer::DrawCommand> mDrawCommands;
Dali::RenderCallback* mRenderCallback{nullptr};