From: adam.b Date: Fri, 25 May 2018 15:48:18 +0000 (+0100) Subject: [Vulkan] Pipeline safeguards X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6909c5c98e23dd18cc6a1ceaa2fdc3265fe74171;p=platform%2Fcore%2Fuifw%2Fdali-core.git [Vulkan] Pipeline safeguards Added safeguards checking whether pipeline is compatible with renderer. Change-Id: I4654f8148a8381be5d3f41e79332833edc1c775d --- diff --git a/dali/graphics/vulkan/api/internal/vulkan-ubo-manager.cpp b/dali/graphics/vulkan/api/internal/vulkan-ubo-manager.cpp index fc4c698..c3e3941 100644 --- a/dali/graphics/vulkan/api/internal/vulkan-ubo-manager.cpp +++ b/dali/graphics/vulkan/api/internal/vulkan-ubo-manager.cpp @@ -18,8 +18,6 @@ #include #include -#include - #define debug( x ) std::cout << x << std::endl; namespace Dali diff --git a/dali/graphics/vulkan/api/internal/vulkan-ubo-manager.h b/dali/graphics/vulkan/api/internal/vulkan-ubo-manager.h index ad58277..45e8c7d 100644 --- a/dali/graphics/vulkan/api/internal/vulkan-ubo-manager.h +++ b/dali/graphics/vulkan/api/internal/vulkan-ubo-manager.h @@ -24,16 +24,11 @@ namespace Dali { namespace Graphics { -namespace Vulkan -{ -class Controller; -} namespace VulkanAPI { -using Controller = Vulkan::Controller; +class Controller; class Ubo; - class UboManager { public: diff --git a/dali/graphics/vulkan/api/internal/vulkan-ubo-pool.cpp b/dali/graphics/vulkan/api/internal/vulkan-ubo-pool.cpp index b147db5..72c387a 100644 --- a/dali/graphics/vulkan/api/internal/vulkan-ubo-pool.cpp +++ b/dali/graphics/vulkan/api/internal/vulkan-ubo-pool.cpp @@ -18,12 +18,12 @@ #include #include #include -#include +#include #include #include #include -#include + #define debug( x ) std::cout << x << std::endl; diff --git a/dali/graphics/vulkan/api/internal/vulkan-ubo-pool.h b/dali/graphics/vulkan/api/internal/vulkan-ubo-pool.h index ccc6e73..ee21087 100644 --- a/dali/graphics/vulkan/api/internal/vulkan-ubo-pool.h +++ b/dali/graphics/vulkan/api/internal/vulkan-ubo-pool.h @@ -26,14 +26,11 @@ namespace Dali { namespace Graphics { -namespace Vulkan -{ -class Controller; -} namespace VulkanAPI { -using Controller = Vulkan::Controller; +class Controller; class Ubo; + class UboPool { public: diff --git a/dali/graphics/vulkan/api/vulkan-api-buffer-factory.cpp b/dali/graphics/vulkan/api/vulkan-api-buffer-factory.cpp index b8e80fd..9bbe138 100644 --- a/dali/graphics/vulkan/api/vulkan-api-buffer-factory.cpp +++ b/dali/graphics/vulkan/api/vulkan-api-buffer-factory.cpp @@ -19,14 +19,14 @@ #include #include #include -#include +#include namespace Dali { namespace Graphics { namespace VulkanAPI { -BufferFactory::BufferFactory( Vulkan::Controller& controller ) +BufferFactory::BufferFactory( Controller& controller ) : mController( controller ), mGraphics(controller.GetGraphics() ) { diff --git a/dali/graphics/vulkan/api/vulkan-api-buffer-factory.h b/dali/graphics/vulkan/api/vulkan-api-buffer-factory.h index 22bfcaa..d1a5f9a 100644 --- a/dali/graphics/vulkan/api/vulkan-api-buffer-factory.h +++ b/dali/graphics/vulkan/api/vulkan-api-buffer-factory.h @@ -29,15 +29,15 @@ namespace Graphics namespace Vulkan { class Graphics; -class Controller; } namespace VulkanAPI { +class Controller; class BufferFactory : public Dali::Graphics::API::BufferFactory { public: - explicit BufferFactory( Vulkan::Controller& controller ); + explicit BufferFactory( Controller& controller ); VulkanAPI::BufferFactory& SetUsage( API::Buffer::UsageHint usage ) override; @@ -47,7 +47,7 @@ public: private: - Vulkan::Controller& mController; + Controller& mController; Vulkan::Graphics& mGraphics; vk::BufferUsageFlagBits mUsage; API::Buffer::UsageHint mUsageHints; diff --git a/dali/graphics/vulkan/api/vulkan-api-buffer.cpp b/dali/graphics/vulkan/api/vulkan-api-buffer.cpp index 080316b..eacf487 100644 --- a/dali/graphics/vulkan/api/vulkan-api-buffer.cpp +++ b/dali/graphics/vulkan/api/vulkan-api-buffer.cpp @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include + namespace Dali { namespace Graphics @@ -29,7 +29,7 @@ namespace Graphics namespace VulkanAPI { -Buffer::Buffer( Vulkan::Controller& controller, vk::BufferUsageFlagBits usage, API::Buffer::UsageHint usageHints, uint32_t size ) +Buffer::Buffer( Controller& controller, vk::BufferUsageFlagBits usage, API::Buffer::UsageHint usageHints, uint32_t size ) : mController( controller ), mGraphics( controller.GetGraphics() ), mUsageHints( usageHints ), mSize( size ) { diff --git a/dali/graphics/vulkan/api/vulkan-api-buffer.h b/dali/graphics/vulkan/api/vulkan-api-buffer.h index 6428331..eeb0e10 100644 --- a/dali/graphics/vulkan/api/vulkan-api-buffer.h +++ b/dali/graphics/vulkan/api/vulkan-api-buffer.h @@ -29,13 +29,9 @@ namespace Dali { namespace Graphics { -namespace Vulkan -{ -class Controller; -} namespace VulkanAPI { - +class Controller; /** * Buffer represents a Buffer-type resource @@ -44,7 +40,7 @@ class Buffer : public Graphics::API::Buffer { public: - explicit Buffer( Vulkan::Controller& controller, vk::BufferUsageFlagBits usage, API::Buffer::UsageHint usageHints, uint32_t size ); + explicit Buffer( Controller& controller, vk::BufferUsageFlagBits usage, API::Buffer::UsageHint usageHints, uint32_t size ); bool Initialise(); @@ -71,7 +67,7 @@ public: private: - Vulkan::Controller& mController; + Controller& mController; Vulkan::Graphics& mGraphics; vk::BufferUsageFlagBits mUsage{ vk::BufferUsageFlagBits::eVertexBuffer}; API::Buffer::UsageHint mUsageHints; diff --git a/dali/graphics/vulkan/api/vulkan-api-controller.cpp b/dali/graphics/vulkan/api/vulkan-api-controller.cpp index 3fec95f..7a79f27 100644 --- a/dali/graphics/vulkan/api/vulkan-api-controller.cpp +++ b/dali/graphics/vulkan/api/vulkan-api-controller.cpp @@ -257,16 +257,6 @@ API::Accessor Controller::CreateTexture( const API::BaseFactory( mImpl->mTexturesOwner, handle); } -API::Accessor Controller::CreateTextureSet( const API::BaseFactory& factory ) -{ - return { nullptr }; -} - -API::Accessor Controller::CreateDynamicBuffer( const API::BaseFactory& factory ) -{ - return { nullptr }; -} - API::Accessor Controller::CreateBuffer( const API::BaseFactory& factory ) { auto handle = mImpl->mBuffersOwner.CreateObject( factory ); @@ -275,11 +265,6 @@ API::Accessor Controller::CreateBuffer( const API::BaseFactory( mImpl->mBuffersOwner, handle); } -API::Accessor Controller::CreateStaticBuffer( const API::BaseFactory& factory ) -{ - return { nullptr }; -} - API::Accessor Controller::CreateSampler( const API::BaseFactory& factory ) { return { nullptr }; diff --git a/dali/graphics/vulkan/api/vulkan-api-render-command.cpp b/dali/graphics/vulkan/api/vulkan-api-render-command.cpp index 72dbf18..404f683 100644 --- a/dali/graphics/vulkan/api/vulkan-api-render-command.cpp +++ b/dali/graphics/vulkan/api/vulkan-api-render-command.cpp @@ -34,7 +34,7 @@ #include #include -#include +#include #include #define debug( x ) std::cout << x << std::endl; diff --git a/dali/graphics/vulkan/api/vulkan-api-render-command.h b/dali/graphics/vulkan/api/vulkan-api-render-command.h index 61f3252..9b60f19 100644 --- a/dali/graphics/vulkan/api/vulkan-api-render-command.h +++ b/dali/graphics/vulkan/api/vulkan-api-render-command.h @@ -22,8 +22,6 @@ #include #include -//#include - namespace Dali { namespace Graphics @@ -31,13 +29,10 @@ namespace Graphics namespace Vulkan { class PipelineCache; -class Controller; } namespace VulkanAPI { - -using Controller = Vulkan::Controller; - +class Controller; class Ubo; /** diff --git a/dali/graphics/vulkan/vulkan-graphics.cpp b/dali/graphics/vulkan/vulkan-graphics.cpp index dd3758f..0a0ffbd 100644 --- a/dali/graphics/vulkan/vulkan-graphics.cpp +++ b/dali/graphics/vulkan/vulkan-graphics.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include @@ -46,8 +46,6 @@ #define VK_KHR_XCB_SURFACE_EXTENSION_NAME "VK_KHR_xcb_surface" #endif -#include - namespace Dali { namespace Graphics @@ -96,7 +94,7 @@ Dali::Graphics::API::Controller& Graphics::GetController() { if(!mGfxController) { - mGfxController = Dali::Graphics::Vulkan::Controller::New(*this); + mGfxController = Dali::Graphics::VulkanAPI::Controller::New(*this); } return *mGfxController.get(); diff --git a/dali/graphics/vulkan/vulkan-graphics.h b/dali/graphics/vulkan/vulkan-graphics.h index b713d84..c39bfd6 100644 --- a/dali/graphics/vulkan/vulkan-graphics.h +++ b/dali/graphics/vulkan/vulkan-graphics.h @@ -30,12 +30,11 @@ namespace Dali { namespace Graphics { +using SurfaceFactory = Dali::Integration::Graphics::SurfaceFactory; namespace API { class Controller; } -using SurfaceFactory = Dali::Integration::Graphics::SurfaceFactory; - namespace Vulkan { @@ -56,7 +55,6 @@ class Surface; class CommandPool; class DescriptorPool; class GpuMemoryManager; -class Controller; class PipelineCache; struct SwapchainSurfacePair @@ -191,7 +189,7 @@ private: std::vector mFramebufferCache; private: - std::unique_ptr mGfxController; + std::unique_ptr mGfxController; // TODO: rename std::unique_ptr mPipelineDatabase; diff --git a/dali/internal/update/graphics/graphics-algorithms.cpp b/dali/internal/update/graphics/graphics-algorithms.cpp index 6ebb9af..b66b747 100644 --- a/dali/internal/update/graphics/graphics-algorithms.cpp +++ b/dali/internal/update/graphics/graphics-algorithms.cpp @@ -21,7 +21,6 @@ // EXTERNAL INCLUDES #include #include -#include #include // INTERNAL INCLUDES @@ -34,11 +33,6 @@ #include #include -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-variable" -#pragma GCC diagnostic ignored "-Wunused-but-set-variable" -#pragma GCC diagnostic ignored "-Wunused-function" - namespace Dali { namespace Internal @@ -47,69 +41,6 @@ namespace SceneGraph { namespace { -Graphics::API::RenderCommand& BuildRenderCommand( - Graphics::API::Controller& graphics, - Graphics::API::Frame& frame, - BufferIndex bufferIndex, - - Matrix viewProjection, - const RenderList& renderItemList, - Graphics::API::RenderCommand& command -) -{ - /* - // per item/renderer - //const auto& renderer = renderItemList.GetRenderer(0); - const auto& item = renderItemList.GetItem(0); - - // scenegraph renderer should have complete data - const auto sgRenderer = item.mNode->GetRendererAt(0); - - - const auto& renderer = *item.mRenderer; - const auto& dataProviderConst = renderer.GetRenderDataProvider(); - auto& dataProvider = const_cast( dataProviderConst ); - const auto& uniformMap = dataProvider.GetUniformMap().GetUniformMap( bufferIndex ); - - // get resources - const auto& shader = sgRenderer->GetShader(); - const auto& textures = sgRenderer->GetTextures(); - // todo: samplers - //const auto& samplers = sgRenderer->Get; - - - // prepare vertex buffers - const auto& vertexBuffers = sgRenderer->GetGeometry()->GetVertexBuffers(); - std::vector vertexAttributeBindings; - auto attribLocation = 0u; - auto bindingIndex = 0u; - - for( auto&& vertexBuffer : vertexBuffers ) - { - auto attributeCountInForBuffer = vertexBuffer->GetAttributeCount(); - - for( auto i = 0u; i < attributeCountInForBuffer; ++i ) - { - // create binding per attribute - auto binding = Graphics::API::RenderCommand::VertexAttributeBufferBinding{} - .SetOffset( (vertexBuffer->GetFormat()->components[i]).offset ) - .SetBinding( bindingIndex ) - .SetBuffer( vertexBuffer->GetGfxObject() ) - .SetInputAttributeRate( Graphics::API::RenderCommand::InputAttributeRate::PER_VERTEX ) - .SetLocation( attribLocation + i ) - .SetStride( vertexBuffer->GetFormat()->size ); - - vertexAttributeBindings.emplace_back( std::move(binding) ); - } - } - - // prepare uniforms - auto gfxShader = shader.GetGfxObject(); - - // find mapped uniforms -*/ - return command; -} static constexpr float CLIP_MATRIX_DATA[] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 1.0f @@ -118,9 +49,7 @@ static const Matrix CLIP_MATRIX(CLIP_MATRIX_DATA); void SubmitRenderItemList( Graphics::API::Controller& graphics, - Graphics::API::Frame& frame, BufferIndex bufferIndex, - Graphics::API::RenderCommandBuilder& commandBuilder, Matrix viewProjection, RenderInstruction& instruction, const RenderList& renderItemList ) @@ -139,12 +68,27 @@ void SubmitRenderItemList( Graphics::API::Controller& graphics, Matrix::Multiply( vulkanProjectionMatrix, *projectionMatrix, CLIP_MATRIX ); std::vector commandList; + + // @todo: this should be probably separated ??? + auto renderTargetBinding = Graphics::API::RenderCommand::RenderTargetBinding{} + .SetClearColors( { + { instruction.mClearColor.r, + instruction.mClearColor.g, + instruction.mClearColor.b, + instruction.mClearColor.a + }}); + + for( auto i = 0u; i < numberOfRenderItems; ++i ) { auto& item = renderItemList.GetItem( i ); auto sgRenderer = item.mNode->GetRendererAt(0); auto& cmd = sgRenderer->GetGfxRenderCommand(); - + if(cmd.GetVertexBufferBindings().empty()) + { + continue; + } + cmd.BindRenderTarget( renderTargetBinding ); Matrix mvp; Matrix::Multiply( mvp, item.mModelMatrix, viewProjection ); sgRenderer->WriteUniform( "uModelMatrix", item.mModelMatrix ); @@ -161,33 +105,22 @@ void SubmitRenderItemList( Graphics::API::Controller& graphics, } void SubmitInstruction( Graphics::API::Controller& graphics, - Graphics::API::Frame& frame, BufferIndex bufferIndex, RenderInstruction& instruction ) { using namespace Graphics::API; // Create constant buffer with static uniforms: view matrix, projection matrix - - // TODO: @todo: buffer for constant uniforms - /* - auto contantUniforms = BuildBuffer(); - constantUniforms["uProjection"] = projectionMatrix; - constantUniforms["uViewMatrix"] = viewMatrix; - */ - const Matrix* viewMatrix = instruction.GetViewMatrix( bufferIndex ); const Matrix* projectionMatrix = instruction.GetProjectionMatrix( bufferIndex ); Matrix viewProjection; Matrix::Multiply( viewProjection, *viewMatrix, *projectionMatrix ); - auto commandBuilder = RenderCommandBuilder{}; - auto numberOfRenderLists = instruction.RenderListCount(); for( auto i = 0u; i < numberOfRenderLists; ++i ) { SubmitRenderItemList( - graphics, frame, bufferIndex, commandBuilder, viewProjection, instruction, *instruction.GetRenderList( i ) ); + graphics, bufferIndex, viewProjection, instruction, *instruction.GetRenderList( i ) ); } } } // namespace @@ -196,7 +129,6 @@ void SubmitRenderInstructions( Graphics::API::Controller& graphics, RenderInstructionContainer& renderInstructions, BufferIndex bufferIndex ) { - auto frame = Graphics::API::Frame{}; graphics.BeginFrame(); @@ -205,7 +137,7 @@ void SubmitRenderInstructions( Graphics::API::Controller& graphics, { RenderInstruction& instruction = renderInstructions.At( bufferIndex, i ); - SubmitInstruction( graphics, frame, bufferIndex, instruction ); + SubmitInstruction( graphics, bufferIndex, instruction ); } graphics.EndFrame( ); @@ -215,4 +147,3 @@ void SubmitRenderInstructions( Graphics::API::Controller& graphics, } // namespace Internal } // namespace Dali -#pragma GCC diagnostic pop diff --git a/dali/internal/update/manager/update-manager.cpp b/dali/internal/update/manager/update-manager.cpp index 9561be7..900cc98 100644 --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -24,7 +24,7 @@ #include // EXTERNAL INCLUDES -#include +#include // INTERNAL INCLUDES #include diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index abf4281..39c2841 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -287,6 +287,10 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex ) } } + // Invalid input attributes! + if( mShader->GetGfxObject().Get().GetVertexAttributeLocations().size() != vertexAttributeBindings.size()) + return; + UpdateUniformMap( updateBufferIndex ); auto& shader = mShader->GetGfxObject().Get(); @@ -389,16 +393,23 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex ) auto textureBindings = Graphics::API::RenderCommand::NewTextureBindings(); auto samplers = shader.GetSamplers(); - for( auto i = 0u; i < mTextureSet->GetTextureCount(); ++i ) + if( mTextureSet ) { - auto texture = mTextureSet->GetTexture( i ); - auto gfxTexture = texture->GetGfxObject(); - auto binding = Graphics::API::RenderCommand::TextureBinding{} - .SetBinding( samplers[i].binding ) - .SetTexture( texture->GetGfxObject() ) - .SetSampler( nullptr ); - - textureBindings.emplace_back( binding ); + if(!samplers.empty()) + { + for (auto i = 0u; i < mTextureSet->GetTextureCount(); ++i) + { + + auto texture = mTextureSet->GetTexture(i); + auto gfxTexture = texture->GetGfxObject(); + auto binding = Graphics::API::RenderCommand::TextureBinding{} + .SetBinding(samplers[i].binding) + .SetTexture(texture->GetGfxObject()) + .SetSampler(nullptr); + + textureBindings.emplace_back(binding); + } + } } // Build render command @@ -407,11 +418,15 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex ) const auto& vb = mGeometry->GetVertexBuffers()[0]; //vb->Update() + + + mGfxRenderCommand->PushConstants( std::move(pushConstantsBindings) ); mGfxRenderCommand->BindVertexBuffers( std::move(vertexAttributeBindings) ); mGfxRenderCommand->BindTextures( std::move(textureBindings) ); - mGfxRenderCommand->BindRenderState( std::move( Graphics::API::RenderCommand::RenderState{} - .SetShader( mShader->GetGfxObject() ) ) ); + mGfxRenderCommand->BindRenderState( Graphics::API::RenderCommand::RenderState{} + .SetShader( mShader->GetGfxObject() ) + .SetBlendState( { mBlendMode != BlendMode::OFF }) ); mGfxRenderCommand->Draw( std::move(Graphics::API::RenderCommand::DrawCommand{} .SetFirstVertex(0u) .SetDrawType( Graphics::API::RenderCommand::DrawType::VERTEX_DRAW )