X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Frender%2Frenderers%2Frender-renderer.cpp;h=3150bf414bb7a21df4b8e6e88629da75c2af9d89;hb=5754ffcd05e7379ff8b2c80e565a3b2bbec5d8b5;hp=c6083a717e07010660966992be96ead805063d0b;hpb=eb07b0dfcfa3c654cb7e200e259571c4f8b6e50e;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/render/renderers/render-renderer.cpp b/dali/internal/render/renderers/render-renderer.cpp index c6083a7..3150bf4 100644 --- a/dali/internal/render/renderers/render-renderer.cpp +++ b/dali/internal/render/renderers/render-renderer.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -34,14 +35,13 @@ #include #include #include -#include namespace Dali::Internal { namespace { // Helper to get the property value getter by type -typedef const float&(PropertyInputImpl::*FuncGetter )(BufferIndex) const; +typedef const float& (PropertyInputImpl::*FuncGetter)(BufferIndex) const; constexpr FuncGetter GetPropertyValueGetter(Property::Type type) { switch(type) @@ -89,18 +89,42 @@ constexpr FuncGetter GetPropertyValueGetter(Property::Type type) * Helper function that returns size of uniform datatypes based * on property type. */ -constexpr int GetPropertyValueSizeForUniform( Property::Type type ) +constexpr int GetPropertyValueSizeForUniform(Property::Type type) { switch(type) { - case Property::Type::BOOLEAN:{ return sizeof(bool);} - case Property::Type::FLOAT:{ return sizeof(float);} - case Property::Type::INTEGER:{ return sizeof(int);} - case Property::Type::VECTOR2:{ return sizeof(Vector2);} - case Property::Type::VECTOR3:{ return sizeof(Vector3);} - case Property::Type::VECTOR4:{ return sizeof(Vector4);} - case Property::Type::MATRIX3:{ return sizeof(Matrix3);} - case Property::Type::MATRIX:{ return sizeof(Matrix);} + case Property::Type::BOOLEAN: + { + return sizeof(bool); + } + case Property::Type::FLOAT: + { + return sizeof(float); + } + case Property::Type::INTEGER: + { + return sizeof(int); + } + case Property::Type::VECTOR2: + { + return sizeof(Vector2); + } + case Property::Type::VECTOR3: + { + return sizeof(Vector3); + } + case Property::Type::VECTOR4: + { + return sizeof(Vector4); + } + case Property::Type::MATRIX3: + { + return sizeof(Matrix3); + } + case Property::Type::MATRIX: + { + return sizeof(Matrix); + } default: { return 0; @@ -185,8 +209,8 @@ Renderer::~Renderer() = default; void Renderer::SetGeometry(Render::Geometry* geometry) { - mGeometry = geometry; - mUpdated = true; + mGeometry = geometry; + mUpdated = true; } void Renderer::SetDrawCommands(Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size) { @@ -198,26 +222,31 @@ void Renderer::BindTextures(Graphics::CommandBuffer& commandBuffer, Vector& samplers(mRenderDataProvider->GetSamplers()); - std::vector& textures(mRenderDataProvider->GetTextures()); + const Dali::Vector* textures(mRenderDataProvider->GetTextures()); + const Dali::Vector* samplers(mRenderDataProvider->GetSamplers()); std::vector textureBindings; - for(uint32_t i = 0; i < static_cast(textures.size()); ++i) // not expecting more than uint32_t of textures + + if(textures != nullptr) { - if(textures[i] && textures[i]->GetGraphicsObject()) + for(uint32_t i = 0; i < static_cast(textures->Count()); ++i) // not expecting more than uint32_t of textures { - // if the sampler exists, - // if it's default, delete the graphics object - // otherwise re-initialize it if dirty + if((*textures)[i] && (*textures)[i]->GetGraphicsObject()) + { + // if the sampler exists, + // if it's default, delete the graphics object + // otherwise re-initialize it if dirty - const Graphics::Sampler* graphicsSampler = (samplers[i] ? samplers[i]->GetGraphicsObject() - : nullptr); + const Graphics::Sampler* graphicsSampler = samplers ? ((*samplers)[i] ? (*samplers)[i]->GetGraphicsObject() + : nullptr) + : nullptr; - boundTextures.PushBack(textures[i]->GetGraphicsObject()); - const Graphics::TextureBinding textureBinding{textures[i]->GetGraphicsObject(), graphicsSampler, textureUnit}; - textureBindings.push_back(textureBinding); + boundTextures.PushBack((*textures)[i]->GetGraphicsObject()); + const Graphics::TextureBinding textureBinding{(*textures)[i]->GetGraphicsObject(), graphicsSampler, textureUnit}; + textureBindings.push_back(textureBinding); - ++textureUnit; + ++textureUnit; + } } } @@ -431,28 +460,28 @@ bool Renderer::Render(Graphics::CommandBuffer& comma } // Create Program - ShaderDataPtr shaderData = mRenderDataProvider->GetShader().GetShaderData(); + ShaderDataPtr shaderData = mRenderDataProvider->GetShader().GetShaderData(); - Program* program = Program::New(*mProgramCache, + Program* program = Program::New(*mProgramCache, shaderData, *mGraphicsController); if(!program) { - DALI_LOG_ERROR("Failed to get program for shader at address %p.\n", reinterpret_cast(&mRenderDataProvider->GetShader())); + DALI_LOG_ERROR("Failed to get program for shader at address %p.\n", reinterpret_cast(&mRenderDataProvider->GetShader())); return false; } // If program doesn't have Gfx program object assigned yet, prepare it. if(!program->GetGraphicsProgramPtr()) { - const std::vector &vertShader = shaderData->GetShaderForPipelineStage(Graphics::PipelineStage::VERTEX_SHADER); - const std::vector &fragShader = shaderData->GetShaderForPipelineStage(Graphics::PipelineStage::FRAGMENT_SHADER); - Dali::Graphics::Shader &vertexShader = mShaderCache->GetShader( + const std::vector& vertShader = shaderData->GetShaderForPipelineStage(Graphics::PipelineStage::VERTEX_SHADER); + const std::vector& fragShader = shaderData->GetShaderForPipelineStage(Graphics::PipelineStage::FRAGMENT_SHADER); + Dali::Graphics::Shader& vertexShader = mShaderCache->GetShader( vertShader, Graphics::PipelineStage::VERTEX_SHADER, shaderData->GetSourceMode()); - Dali::Graphics::Shader &fragmentShader = mShaderCache->GetShader( + Dali::Graphics::Shader& fragmentShader = mShaderCache->GetShader( fragShader, Graphics::PipelineStage::FRAGMENT_SHADER, shaderData->GetSourceMode()); @@ -506,7 +535,7 @@ void Renderer::BuildUniformIndexMap(BufferIndex bufferIndex, const SceneGraph::N // Check if the map has changed DALI_ASSERT_DEBUG(mRenderDataProvider && "No Uniform map data provider available"); - const SceneGraph::UniformMapDataProvider& uniformMapDataProvider = mRenderDataProvider->GetUniformMap(); + const SceneGraph::UniformMapDataProvider& uniformMapDataProvider = mRenderDataProvider->GetUniformMapDataProvider(); if(uniformMapDataProvider.GetUniformMapChanged(bufferIndex) || node.GetUniformMapChanged(bufferIndex) || @@ -563,10 +592,6 @@ void Renderer::BuildUniformIndexMap(BufferIndex bufferIndex, const SceneGraph::N mUniformIndexMap.Resize(mapIndex); } - - // @todo Temporary workaround to reduce workload each frame. Find a better way. - auto& sceneGraphRenderer = const_cast(static_cast(uniformMapDataProvider)); - sceneGraphRenderer.AgeUniformMap(); } void Renderer::WriteUniformBuffer( @@ -584,7 +609,7 @@ void Renderer::WriteUniformBuffer( // Create the UBO uint32_t uboOffset{0u}; - auto &reflection = mGraphicsController->GetProgramReflection(program->GetGraphicsProgram()); + auto& reflection = mGraphicsController->GetProgramReflection(program->GetGraphicsProgram()); uint32_t uniformBlockAllocationBytes = program->GetUniformBlocksMemoryRequirements().totalSizeRequired; @@ -702,8 +727,8 @@ void Renderer::FillUniformBuffer(Program& p iter != end; ++iter) { - auto& uniform = *iter; - int arrayIndex = uniform.arrayIndex; + auto& uniform = *iter; + int arrayIndex = uniform.arrayIndex; if(!uniform.uniformFunc) { @@ -716,7 +741,7 @@ void Renderer::FillUniformBuffer(Program& p uniform.uniformOffset = uniformInfo.offset; uniform.uniformLocation = uniformInfo.location; - if (uniformFound) + if(uniformFound) { auto dst = ubo.GetOffset() + uniformInfo.offset; const auto typeSize = GetPropertyValueSizeForUniform((*iter).propertyValue->GetType()); @@ -738,7 +763,6 @@ void Renderer::FillUniformBuffer(Program& p const auto dest = dst + static_cast(typeSize) * arrayIndex; const auto func = uniform.uniformFunc; - ubo.Write(&((*iter).propertyValue->*func)(updateBufferIndex), typeSize, dest); @@ -776,11 +800,16 @@ bool Renderer::Updated(BufferIndex bufferIndex, const SceneGraph::NodeDataProvid return true; } - for(const auto& texture : mRenderDataProvider->GetTextures()) + auto* textures = mRenderDataProvider->GetTextures(); + if(textures) { - if(texture && texture->IsNativeImage()) + for(auto iter = textures->Begin(), end = textures->End(); iter < end; ++iter) { - return true; + auto texture = *iter; + if(texture && texture->IsNativeImage()) + { + return true; + } } } @@ -791,7 +820,7 @@ bool Renderer::Updated(BufferIndex bufferIndex, const SceneGraph::NodeDataProvid hash = uniformProperty.propertyPtr->Hash(bufferIndex, hash); } - const SceneGraph::UniformMapDataProvider& uniformMapDataProvider = mRenderDataProvider->GetUniformMap(); + const SceneGraph::UniformMapDataProvider& uniformMapDataProvider = mRenderDataProvider->GetUniformMapDataProvider(); const SceneGraph::CollectedUniformMap& uniformMap = uniformMapDataProvider.GetUniformMap(bufferIndex); for(const auto& uniformProperty : uniformMap) { @@ -820,15 +849,15 @@ Graphics::Pipeline& Renderer::PrepareGraphicsPipeline( // Prepare query info PipelineCacheQueryInfo queryInfo{}; - queryInfo.program = &program; - queryInfo.renderer = this; - queryInfo.geometry = mGeometry; - queryInfo.blendingEnabled = blend; - queryInfo.blendingOptions = &mBlendingOptions; - queryInfo.alphaPremultiplied = mPremultipliedAlphaEnabled; + queryInfo.program = &program; + queryInfo.renderer = this; + queryInfo.geometry = mGeometry; + queryInfo.blendingEnabled = blend; + queryInfo.blendingOptions = &mBlendingOptions; + queryInfo.alphaPremultiplied = mPremultipliedAlphaEnabled; queryInfo.cameraUsingReflection = instruction.GetCamera()->GetReflectionUsed(); - auto pipelineResult = mPipelineCache->GetPipeline( queryInfo, true ); + auto pipelineResult = mPipelineCache->GetPipeline(queryInfo, true); // should be never null? return *pipelineResult.pipeline;