From d56881f3b1392879cb1df6afa7e316e54a475129 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 8 Dec 2019 16:22:26 +0300 Subject: [PATCH 001/129] Updated Externals submodule and fixed MacOS build script with CMAKE_FLAGS setup. --- Build/MacOS/Build.sh | 2 +- Externals | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Build/MacOS/Build.sh b/Build/MacOS/Build.sh index 57f8dd3dd..e2bd51a29 100755 --- a/Build/MacOS/Build.sh +++ b/Build/MacOS/Build.sh @@ -18,7 +18,7 @@ SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) SOURCE_DIR=$SCRIPT_DIR/../.. OUTPUT_DIR=$SCRIPT_DIR/../Output/XCode INSTALL_DIR=$OUTPUT_DIR/Install -CMAKE_FLAGS=-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF +CMAKE_FLAGS='-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF' if [ "$IS_ANALYZE_BUILD" == true ]; then diff --git a/Externals b/Externals index f1c0434e9..04c6ff71e 160000 --- a/Externals +++ b/Externals @@ -1 +1 @@ -Subproject commit f1c0434e9457d817c701827d159642ff820302d1 +Subproject commit 04c6ff71ecbe7f5ab585a1486c58c2837a04a9ea From c0eacfada9e0daa8a2f37fe0e27483d1d94e636e Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 8 Dec 2019 21:16:05 +0300 Subject: [PATCH 002/129] D3D12 Render-Pass feature used for Methane Render-Pass setup on Windows. --- .../Include/Methane/Graphics/RenderPass.h | 4 +- .../Methane/Graphics/DirectX12/ProgramDX.cpp | 2 +- .../DirectX12/RenderCommandListDX.cpp | 26 +-- .../Graphics/DirectX12/RenderCommandListDX.h | 18 +- .../Graphics/DirectX12/RenderPassDX.cpp | 186 ++++++++++++++++-- .../Methane/Graphics/DirectX12/RenderPassDX.h | 68 +++++-- .../Graphics/DirectX12/RenderStateDX.cpp | 2 +- .../Methane/Graphics/Metal/RenderPassMT.mm | 4 +- .../Methane/Graphics/RenderPassBase.cpp | 24 ++- .../Sources/Methane/Graphics/RenderPassBase.h | 5 +- 10 files changed, 274 insertions(+), 65 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h index f47158b01..64dede672 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h @@ -52,7 +52,7 @@ struct RenderPass { DontCare = 0, Store, - Unknown, + Resolve, }; Texture::WeakPtr wp_texture; @@ -60,7 +60,7 @@ struct RenderPass uint32_t slice = 0; uint32_t depth_plane = 0; LoadAction load_action = LoadAction::DontCare; - StoreAction store_action = StoreAction::Unknown; + StoreAction store_action = StoreAction::DontCare; bool operator==(const Attachment& other) const; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp index 00e905927..9892e32bc 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp @@ -167,7 +167,7 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list) const }; RenderCommandListDX& render_command_list_dx = dynamic_cast(command_list); - wrl::ComPtr& cp_command_list = render_command_list_dx.GetNativeCommandList(); + wrl::ComPtr& cp_command_list = render_command_list_dx.GetNativeCommandList(); const CommandListBase::CommandState& command_state = render_command_list_dx.GetCommandState(); assert(!!cp_command_list); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp index e18193dec..7347c36f0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp @@ -89,24 +89,14 @@ void RenderCommandListDX::Reset(RenderState& render_state, const std::string& de m_is_committed = false; ThrowIfFailed(m_cp_command_allocator->Reset()); ThrowIfFailed(m_cp_command_list->Reset(m_cp_command_allocator.Get(), dx_state.GetNativePipelineState().Get())); - m_is_pass_applied = false; } RenderCommandListBase::Reset(render_state, debug_group); - // Set render target transition barriers and apply pass - if (!m_is_pass_applied) + RenderPassDX& pass_dx = GetPassDX(); + if (!pass_dx.IsBegun()) { - RenderPassDX& pass_dx = GetPassDX(); - m_present_resources = pass_dx.GetColorAttachmentResources(); - - if (!m_present_resources.empty()) - { - SetResourceTransitionBarriers(m_present_resources, ResourceBase::State::Present, ResourceBase::State::RenderTarget); - } - - pass_dx.Apply(*this); - m_is_pass_applied = true; + pass_dx.Begin(*this); } } @@ -207,9 +197,7 @@ void RenderCommandListDX::SetResourceBarriers(const ResourceBase::Barriers& reso ITT_FUNCTION_TASK(); if (resource_barriers.empty()) - { - throw std::invalid_argument("Can not set empty resource barriers"); - } + return; std::vector dx_resource_barriers; for (const ResourceBase::Barrier& resource_barrier : resource_barriers) @@ -225,11 +213,11 @@ void RenderCommandListDX::Commit(bool present_drawable) { ITT_FUNCTION_TASK(); - if (!m_present_resources.empty()) + RenderPassDX& pass_dx = GetPassDX(); + if (pass_dx.IsBegun()) { - SetResourceTransitionBarriers(m_present_resources, ResourceBase::State::RenderTarget, ResourceBase::State::Present); + pass_dx.End(*this); } - m_present_resources.clear(); RenderCommandListBase::Commit(present_drawable); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h index 15c3d31e9..2c82b5151 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h @@ -23,6 +23,8 @@ DirectX 12 implementation of the render command list interface. #pragma once +#include "RenderPassDX.h" + #include #include @@ -33,6 +35,12 @@ namespace Methane::Graphics namespace wrl = Microsoft::WRL; +#if D3D12_RENDER_PASS_ENABLED +using ID3D12GraphicsCommandListVer = ID3D12GraphicsCommandList4; +#else +using ID3D12GraphicsCommandListVer = ID3D12GraphicsCommandList; +#endif + class CommandQueueDX; class RenderPassDX; @@ -62,17 +70,15 @@ class RenderCommandListDX final : public RenderCommandListBase // Object interface void SetName(const std::string& name) override; - wrl::ComPtr& GetNativeCommandList() { return m_cp_command_list; } + wrl::ComPtr& GetNativeCommandList() { return m_cp_command_list; } protected: CommandQueueDX& GetCommandQueueDX(); RenderPassDX& GetPassDX(); - wrl::ComPtr m_cp_command_allocator; - wrl::ComPtr m_cp_command_list; - Resource::Refs m_present_resources; - bool m_is_committed = false; - bool m_is_pass_applied = false; + wrl::ComPtr m_cp_command_allocator; + wrl::ComPtr m_cp_command_list; + bool m_is_committed = false; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp index 4697f89bc..e1df5864a 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp @@ -24,31 +24,111 @@ DirectX 12 implementation of the render pass interface. #include "RenderPassDX.h" #include "DescriptorHeapDX.h" #include "RenderCommandListDX.h" +#include "TypesDX.h" #include #include #include +#include + #include namespace Methane::Graphics { -static DescriptorHeap::Type GetDescriptorHeapTypeByAccess(RenderPass::Access::Value access) noexcept +#if D3D12_RENDER_PASS_ENABLED + +RenderPassDX::AccessDesc::AccessDesc(const Attachment& attachment) + : descriptor(!attachment.wp_texture.expired() + ? static_cast(*attachment.wp_texture.lock()).GetNativeCPUDescriptorHandle(Resource::Usage::RenderTarget) + : D3D12_CPU_DESCRIPTOR_HANDLE()) { - ITT_FUNCTION_TASK(); - - switch (access) + if (attachment.wp_texture.expired()) { - case RenderPass::Access::ShaderResources: return DescriptorHeap::Type::ShaderResources; - case RenderPass::Access::Samplers: return DescriptorHeap::Type::Samplers; - case RenderPass::Access::RenderTargets: return DescriptorHeap::Type::RenderTargets; - case RenderPass::Access::DepthStencil: return DescriptorHeap::Type::DepthStencil; + beginning.Type = D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS; + ending.Type = D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS; + } + else + { + beginning.Type = GetBeginningAccessTypeByLoadAction(attachment.load_action); + ending.Type = GetEndingAccessTypeByStoreAction(attachment.store_action); + } + + if (attachment.store_action == Attachment::StoreAction::Resolve) + { + throw std::logic_error("Resolve parameters initialization is not implemented yet."); + // TODO: ending.Resolve = { ... } } - assert(0); - return DescriptorHeap::Type::Undefined; } +RenderPassDX::AccessDesc::AccessDesc(const ColorAttachment& color_attachment) + : AccessDesc(static_cast(color_attachment)) +{ + if (color_attachment.load_action == Attachment::LoadAction::Clear) + { + if (color_attachment.wp_texture.expired()) + { + throw std::invalid_argument("Can not clear render target attachment without texture."); + } + + const Texture::Ptr sp_color_rt = color_attachment.wp_texture.lock(); + const DXGI_FORMAT color_format = TypeConverterDX::DataFormatToDXGI(sp_color_rt->GetSettings().pixel_format); + const float clear_color_components[4] = { + color_attachment.clear_color.r(), + color_attachment.clear_color.g(), + color_attachment.clear_color.b(), + color_attachment.clear_color.a() + }; + beginning.Clear.ClearValue = CD3DX12_CLEAR_VALUE(color_format, clear_color_components); + } +} + +RenderPassDX::AccessDesc::AccessDesc(const DepthAttachment& depth_attachment, const StencilAttachment& stencil_attachment) + : AccessDesc(static_cast(depth_attachment)) +{ + InitDepthStencilClearValue(depth_attachment, stencil_attachment); +} + +RenderPassDX::AccessDesc::AccessDesc(const StencilAttachment& stencil_attachment, const DepthAttachment& depth_attachment) + : AccessDesc(static_cast(stencil_attachment)) +{ + InitDepthStencilClearValue(depth_attachment, stencil_attachment); +} + +void RenderPassDX::AccessDesc::InitDepthStencilClearValue(const DepthAttachment& depth_attachment, const StencilAttachment& stencil_attachment) +{ + if (depth_attachment.wp_texture.expired()) + { + throw std::invalid_argument("Depth attachments should point to the depth-stencil texture."); + } + + const DXGI_FORMAT depth_format = TypeConverterDX::DataFormatToDXGI(depth_attachment.wp_texture.lock()->GetSettings().pixel_format); + beginning.Clear.ClearValue = CD3DX12_CLEAR_VALUE(depth_format, depth_attachment.clear_value, stencil_attachment.clear_value); +} + +D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE RenderPassDX::AccessDesc::GetBeginningAccessTypeByLoadAction(Attachment::LoadAction load_action) noexcept +{ + switch (load_action) + { + case Attachment::LoadAction::DontCare: return D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_DISCARD; + case Attachment::LoadAction::Load: return D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_PRESERVE; + case Attachment::LoadAction::Clear: return D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR; + } +} + +D3D12_RENDER_PASS_ENDING_ACCESS_TYPE RenderPassDX::AccessDesc::GetEndingAccessTypeByStoreAction(Attachment::StoreAction store_action) noexcept +{ + switch (store_action) + { + case Attachment::StoreAction::DontCare: return D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_DISCARD; + case Attachment::StoreAction::Store: return D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE; + case Attachment::StoreAction::Resolve: return D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_RESOLVE; + } +} + +#else + RenderPassDX::RTClearInfo::RTClearInfo(const RenderPass::ColorAttachment& color_attach) : cpu_handle(!color_attach.wp_texture.expired() ? static_cast(*color_attach.wp_texture.lock()).GetNativeCPUDescriptorHandle(Resource::Usage::RenderTarget) : D3D12_CPU_DESCRIPTOR_HANDLE()) @@ -79,6 +159,23 @@ RenderPassDX::DSClearInfo::DSClearInfo(const RenderPass::DepthAttachment& depth_ } } +#endif + +static DescriptorHeap::Type GetDescriptorHeapTypeByAccess(RenderPass::Access::Value access) noexcept +{ + ITT_FUNCTION_TASK(); + + switch (access) + { + case RenderPass::Access::ShaderResources: return DescriptorHeap::Type::ShaderResources; + case RenderPass::Access::Samplers: return DescriptorHeap::Type::Samplers; + case RenderPass::Access::RenderTargets: return DescriptorHeap::Type::RenderTargets; + case RenderPass::Access::DepthStencil: return DescriptorHeap::Type::DepthStencil; + } + assert(0); + return DescriptorHeap::Type::Undefined; +} + RenderPass::Ptr RenderPass::Create(Context& context, const Settings& settings) { ITT_FUNCTION_TASK(); @@ -97,6 +194,31 @@ void RenderPassDX::Update(const Settings& settings) RenderPassBase::Update(settings); +#if D3D12_RENDER_PASS_ENABLED + + for (const RenderPassBase::ColorAttachment& color_attach : m_settings.color_attachments) + { + const AccessDesc render_target_access(color_attach); + + m_render_target_descs.emplace_back(D3D12_RENDER_PASS_RENDER_TARGET_DESC{ + render_target_access.descriptor, render_target_access.beginning, render_target_access.ending + }); + } + + if (!m_settings.depth_attachment.wp_texture.expired()) + { + const AccessDesc depth_access(m_settings.depth_attachment, m_settings.stencil_attachment); + const AccessDesc stencil_access(m_settings.stencil_attachment, m_settings.depth_attachment); + + m_depth_stencil_desc = D3D12_RENDER_PASS_DEPTH_STENCIL_DESC{ + depth_access.descriptor, + depth_access.beginning, stencil_access.beginning, + depth_access.ending, stencil_access.ending + }; + } + +#else + m_rt_clear_infos.clear(); for (const RenderPassBase::ColorAttachment& color_attach : m_settings.color_attachments) { @@ -105,15 +227,17 @@ void RenderPassDX::Update(const Settings& settings) if (color_attach.wp_texture.expired()) { - throw std::invalid_argument("Can not clear render target attachement without texture."); + throw std::invalid_argument("Can not clear render target attachment without texture."); } m_rt_clear_infos.emplace_back(color_attach); } m_ds_clear_info = DSClearInfo(m_settings.depth_attachment, m_settings.stencil_attachment); + +#endif } -void RenderPassDX::Apply(RenderCommandListBase& command_list) +void RenderPassDX::Begin(RenderCommandListBase& command_list) { ITT_FUNCTION_TASK(); @@ -123,9 +247,9 @@ void RenderPassDX::Apply(RenderCommandListBase& command_list) m_is_updated = true; } - RenderPassBase::Apply(command_list); + RenderPassBase::Begin(command_list); - wrl::ComPtr& cp_dx_command_list = static_cast(command_list).GetNativeCommandList(); + wrl::ComPtr& cp_dx_command_list = static_cast(command_list).GetNativeCommandList(); // Set descriptor heaps const std::vector descritor_heaps = GetNativeDescriptorHeaps(); @@ -134,6 +258,20 @@ void RenderPassDX::Apply(RenderCommandListBase& command_list) cp_dx_command_list->SetDescriptorHeaps(static_cast(descritor_heaps.size()), descritor_heaps.data()); } + // Set RT transition barriers + command_list.SetResourceTransitionBarriers(GetColorAttachmentResources(), ResourceBase::State::Present, ResourceBase::State::RenderTarget); + +#if D3D12_RENDER_PASS_ENABLED + + // Begin render pass + cp_dx_command_list->BeginRenderPass( + static_cast(m_render_target_descs.size()), m_render_target_descs.data(), + m_depth_stencil_desc ? &*m_depth_stencil_desc : nullptr, + m_pass_flags + ); + +#else + // Set render targets const std::vector rt_cpu_handles = GetNativeRenderTargetCPUHandles(); const D3D12_CPU_DESCRIPTOR_HANDLE* p_depth_stencil_cpu_handle = GetNativeDepthStencilCPUHandle(); @@ -150,6 +288,26 @@ void RenderPassDX::Apply(RenderCommandListBase& command_list) { cp_dx_command_list->ClearDepthStencilView(m_ds_clear_info.cpu_handle, m_ds_clear_info.clear_flags, m_ds_clear_info.depth_value, m_ds_clear_info.stencil_value, 0, nullptr); } + +#endif +} + +void RenderPassDX::End(RenderCommandListBase& command_list) +{ + ITT_FUNCTION_TASK(); + +#if D3D12_RENDER_PASS_ENABLED + + // End render pass + wrl::ComPtr& cp_dx_command_list = static_cast(command_list).GetNativeCommandList(); + cp_dx_command_list->EndRenderPass(); + +#endif + + // Set RT transition barriers + command_list.SetResourceTransitionBarriers(GetColorAttachmentResources(), ResourceBase::State::RenderTarget, ResourceBase::State::Present); + + RenderPassBase::End(command_list); } std::vector RenderPassDX::GetNativeDescriptorHeaps() const diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h index a046b1a4e..78dc5ec80 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h @@ -27,6 +27,13 @@ DirectX 12 implementation of the render pass interface. #include +#include +#include + +#ifndef D3D12_RENDER_PASS_ENABLED +#define D3D12_RENDER_PASS_ENABLED 1 +#endif + namespace Methane::Graphics { @@ -35,6 +42,45 @@ class RenderCommandListDX; class RenderPassDX : public RenderPassBase { public: + RenderPassDX(ContextBase& context, const Settings& settings); + + // RenderPass interface + void Update(const Settings& settings) override; + + // RenderPassBase interface + void Begin(RenderCommandListBase& command_list) override; + void End(RenderCommandListBase& command_list) override; + + std::vector GetNativeDescriptorHeaps() const; + std::vector GetNativeRenderTargetCPUHandles() const; + const D3D12_CPU_DESCRIPTOR_HANDLE* GetNativeDepthStencilCPUHandle(); + +private: +#if D3D12_RENDER_PASS_ENABLED + + struct AccessDesc + { + D3D12_CPU_DESCRIPTOR_HANDLE descriptor = { }; + D3D12_RENDER_PASS_BEGINNING_ACCESS beginning = { }; + D3D12_RENDER_PASS_ENDING_ACCESS ending = { }; + + AccessDesc(const Attachment& attachment); + AccessDesc(const ColorAttachment& color_attachment); + AccessDesc(const DepthAttachment& depth_attachment, const StencilAttachment& stencil_attachment); + AccessDesc(const StencilAttachment& stencil_attachment, const DepthAttachment& depth_attachment); + + void InitDepthStencilClearValue(const DepthAttachment& depth_attachment, const StencilAttachment& stencil_attachment); + + static D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE GetBeginningAccessTypeByLoadAction(Attachment::LoadAction load_action) noexcept; + static D3D12_RENDER_PASS_ENDING_ACCESS_TYPE GetEndingAccessTypeByStoreAction(Attachment::StoreAction store_action) noexcept; + }; + + std::vector m_render_target_descs; + std::optional m_depth_stencil_desc; + D3D12_RENDER_PASS_FLAGS m_pass_flags = D3D12_RENDER_PASS_FLAG_NONE; + +#else + struct RTClearInfo { D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle = {}; @@ -56,25 +102,13 @@ class RenderPassDX : public RenderPassBase DSClearInfo(const RenderPassBase::DepthAttachment& depth_attach, const RenderPassBase::StencilAttachment& stencil_attach); }; - RenderPassDX(ContextBase& context, const Settings& settings); - - // RenderPass interface - void Update(const Settings& settings) override; - - // RenderPassBase interface - void Apply(RenderCommandListBase& command_list) override; + std::vector m_rt_clear_infos; + DSClearInfo m_ds_clear_info; - std::vector GetNativeDescriptorHeaps() const; - std::vector GetNativeRenderTargetCPUHandles() const; - const D3D12_CPU_DESCRIPTOR_HANDLE* GetNativeDepthStencilCPUHandle(); - const std::vector& GetNativeRenderTargetsClearInfo() const { return m_rt_clear_infos; } - const DSClearInfo& GetNativeDepthStencilClearInfo() const { return m_ds_clear_info; } +#endif -private: - D3D12_CPU_DESCRIPTOR_HANDLE m_depth_stencil_cpu_handle = {}; - std::vector m_rt_clear_infos; - DSClearInfo m_ds_clear_info; - bool m_is_updated = false; + D3D12_CPU_DESCRIPTOR_HANDLE m_depth_stencil_cpu_handle = {}; + bool m_is_updated = false; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp index 509111c43..f4cf43bca 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp @@ -202,7 +202,7 @@ void RenderStateDX::Apply(RenderCommandListBase& command_list) ITT_FUNCTION_TASK(); RenderCommandListDX& dx_command_list = static_cast(command_list); - wrl::ComPtr& cp_dx_command_list = dx_command_list.GetNativeCommandList(); + wrl::ComPtr& cp_dx_command_list = dx_command_list.GetNativeCommandList(); cp_dx_command_list->SetPipelineState(GetNativePipelineState().Get()); cp_dx_command_list->SetGraphicsRootSignature(GetProgramDX().GetNativeRootSignature().Get()); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderPassMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderPassMT.mm index 02101c150..363a68bda 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderPassMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderPassMT.mm @@ -39,9 +39,9 @@ static MTLStoreAction GetMTLStoreAction(RenderPass::Attachment::StoreAction stor { case RenderPass::Attachment::StoreAction::DontCare: return MTLStoreActionDontCare; case RenderPass::Attachment::StoreAction::Store: return MTLStoreActionStore; - case RenderPass::Attachment::StoreAction::Unknown: return MTLStoreActionUnknown; + case RenderPass::Attachment::StoreAction::Resolve: return MTLStoreActionMultisampleResolve; } - return MTLStoreActionDontCare; + return MTLStoreActionUnknown; } static MTLLoadAction GetMTLLoadAction(RenderPass::Attachment::LoadAction load_action) noexcept diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderPassBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderPassBase.cpp index ea3b46b64..105599d89 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderPassBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderPassBase.cpp @@ -71,7 +71,8 @@ bool RenderPass::Settings::operator==(const Settings& other) const ITT_FUNCTION_TASK(); return color_attachments == other.color_attachments && depth_attachment == other.depth_attachment && - stencil_attachment == other.stencil_attachment; + stencil_attachment == other.stencil_attachment && + shader_access_mask == other.shader_access_mask; } bool RenderPass::Settings::operator!=(const Settings& other) const @@ -93,10 +94,15 @@ void RenderPassBase::Update(const RenderPass::Settings& settings) m_settings = settings; } -void RenderPassBase::Apply(RenderCommandListBase& command_list) +void RenderPassBase::Begin(RenderCommandListBase& command_list) { ITT_FUNCTION_TASK(); + if (m_is_begun) + { + throw std::logic_error("Can not begin pass which was begun already and was not ended."); + } + ResourceBase::Barriers resource_transition_barriers; for (ColorAttachment& color_attachment : m_settings.color_attachments) @@ -120,6 +126,20 @@ void RenderPassBase::Apply(RenderCommandListBase& command_list) { command_list.SetResourceBarriers(resource_transition_barriers); } + + m_is_begun = true; +} + +void RenderPassBase::End(RenderCommandListBase&) +{ + ITT_FUNCTION_TASK(); + + if (!m_is_begun) + { + throw std::logic_error("Can not end render pass, which was not begun."); + } + + m_is_begun = false; } Resource::Refs RenderPassBase::GetColorAttachmentResources() const diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderPassBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderPassBase.h index 9d409658b..cabbaded9 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderPassBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderPassBase.h @@ -43,14 +43,17 @@ class RenderPassBase const Settings& GetSettings() const override { return m_settings; } // RenderPassBase interface - virtual void Apply(RenderCommandListBase& command_list); + virtual void Begin(RenderCommandListBase& command_list); + virtual void End(RenderCommandListBase& command_list); Ptr GetPtr() { return shared_from_this(); } Resource::Refs GetColorAttachmentResources() const; + bool IsBegun() const { return m_is_begun; } protected: ContextBase& m_context; Settings m_settings; + bool m_is_begun = false; }; } // namespace Methane::Graphics From 72bdf369800732c80ad5d122dfd54284a65a4f54 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 8 Dec 2019 23:34:09 +0300 Subject: [PATCH 003/129] Optimized render pass descriptor updates, fixed memory leak, fixed compiler warnings, added missing ITT instrumentation on Windows. --- .../Graphics/DirectX12/RenderPassDX.cpp | 84 ++++++++++++++----- 1 file changed, 62 insertions(+), 22 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp index e1df5864a..64e08a685 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp @@ -37,13 +37,20 @@ DirectX 12 implementation of the render pass interface. namespace Methane::Graphics { +static D3D12_CPU_DESCRIPTOR_HANDLE GetRenderTargetTextureCpuDescriptor(const Texture::WeakPtr& wp_texture) +{ + return !wp_texture.expired() + ? static_cast(*wp_texture.lock()).GetNativeCPUDescriptorHandle(Resource::Usage::RenderTarget) + : D3D12_CPU_DESCRIPTOR_HANDLE(); +} + #if D3D12_RENDER_PASS_ENABLED RenderPassDX::AccessDesc::AccessDesc(const Attachment& attachment) - : descriptor(!attachment.wp_texture.expired() - ? static_cast(*attachment.wp_texture.lock()).GetNativeCPUDescriptorHandle(Resource::Usage::RenderTarget) - : D3D12_CPU_DESCRIPTOR_HANDLE()) + : descriptor(GetRenderTargetTextureCpuDescriptor(attachment.wp_texture)) { + ITT_FUNCTION_TASK(); + if (attachment.wp_texture.expired()) { beginning.Type = D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS; @@ -52,7 +59,7 @@ RenderPassDX::AccessDesc::AccessDesc(const Attachment& attachment) else { beginning.Type = GetBeginningAccessTypeByLoadAction(attachment.load_action); - ending.Type = GetEndingAccessTypeByStoreAction(attachment.store_action); + ending.Type = GetEndingAccessTypeByStoreAction(attachment.store_action); } if (attachment.store_action == Attachment::StoreAction::Resolve) @@ -65,6 +72,8 @@ RenderPassDX::AccessDesc::AccessDesc(const Attachment& attachment) RenderPassDX::AccessDesc::AccessDesc(const ColorAttachment& color_attachment) : AccessDesc(static_cast(color_attachment)) { + ITT_FUNCTION_TASK(); + if (color_attachment.load_action == Attachment::LoadAction::Clear) { if (color_attachment.wp_texture.expired()) @@ -87,17 +96,21 @@ RenderPassDX::AccessDesc::AccessDesc(const ColorAttachment& color_attachment) RenderPassDX::AccessDesc::AccessDesc(const DepthAttachment& depth_attachment, const StencilAttachment& stencil_attachment) : AccessDesc(static_cast(depth_attachment)) { + ITT_FUNCTION_TASK(); InitDepthStencilClearValue(depth_attachment, stencil_attachment); } RenderPassDX::AccessDesc::AccessDesc(const StencilAttachment& stencil_attachment, const DepthAttachment& depth_attachment) : AccessDesc(static_cast(stencil_attachment)) { + ITT_FUNCTION_TASK(); InitDepthStencilClearValue(depth_attachment, stencil_attachment); } void RenderPassDX::AccessDesc::InitDepthStencilClearValue(const DepthAttachment& depth_attachment, const StencilAttachment& stencil_attachment) { + ITT_FUNCTION_TASK(); + if (depth_attachment.wp_texture.expired()) { throw std::invalid_argument("Depth attachments should point to the depth-stencil texture."); @@ -109,38 +122,41 @@ void RenderPassDX::AccessDesc::InitDepthStencilClearValue(const DepthAttachment& D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE RenderPassDX::AccessDesc::GetBeginningAccessTypeByLoadAction(Attachment::LoadAction load_action) noexcept { + ITT_FUNCTION_TASK(); + switch (load_action) { case Attachment::LoadAction::DontCare: return D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_DISCARD; case Attachment::LoadAction::Load: return D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_PRESERVE; case Attachment::LoadAction::Clear: return D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR; } + return D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS; } D3D12_RENDER_PASS_ENDING_ACCESS_TYPE RenderPassDX::AccessDesc::GetEndingAccessTypeByStoreAction(Attachment::StoreAction store_action) noexcept { + ITT_FUNCTION_TASK(); + switch (store_action) { case Attachment::StoreAction::DontCare: return D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_DISCARD; case Attachment::StoreAction::Store: return D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE; case Attachment::StoreAction::Resolve: return D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_RESOLVE; } + return D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS; } #else RenderPassDX::RTClearInfo::RTClearInfo(const RenderPass::ColorAttachment& color_attach) - : cpu_handle(!color_attach.wp_texture.expired() ? static_cast(*color_attach.wp_texture.lock()).GetNativeCPUDescriptorHandle(Resource::Usage::RenderTarget) - : D3D12_CPU_DESCRIPTOR_HANDLE()) + : cpu_handle(GetRenderTargetTextureCpuDescriptor(color_attach.wp_texture)) , clear_color{ color_attach.clear_color.r(), color_attach.clear_color.g(), color_attach.clear_color.b(), color_attach.clear_color.a() } { ITT_FUNCTION_TASK(); } RenderPassDX::DSClearInfo::DSClearInfo(const RenderPass::DepthAttachment& depth_attach, const RenderPass::StencilAttachment& stencil_attach) - : cpu_handle(!depth_attach.wp_texture.expired() ? static_cast(*depth_attach.wp_texture.lock()).GetNativeCPUDescriptorHandle(ResourceBase::Usage::RenderTarget) - : !stencil_attach.wp_texture.expired() ? static_cast(*stencil_attach.wp_texture.lock()).GetNativeCPUDescriptorHandle(ResourceBase::Usage::RenderTarget) - : D3D12_CPU_DESCRIPTOR_HANDLE()) + : cpu_handle(GetRenderTargetTextureCpuDescriptor(depth_attach.wp_texture)) , depth_cleared(!depth_attach.wp_texture.expired() && depth_attach.load_action == RenderPass::Attachment::LoadAction::Clear) , depth_value(depth_attach.clear_value) , stencil_cleared(!stencil_attach.wp_texture.expired() && stencil_attach.load_action == RenderPass::Attachment::LoadAction::Clear) @@ -192,29 +208,53 @@ void RenderPassDX::Update(const Settings& settings) { ITT_FUNCTION_TASK(); + const bool settings_unchanged = m_settings == settings; RenderPassBase::Update(settings); #if D3D12_RENDER_PASS_ENABLED - for (const RenderPassBase::ColorAttachment& color_attach : m_settings.color_attachments) + const bool update_descriptors_only = settings_unchanged && m_render_target_descs.size() == m_settings.color_attachments.size(); + if (!update_descriptors_only) + { + m_render_target_descs.clear(); + m_depth_stencil_desc.reset(); + } + + uint32_t color_attachment_index = 0; + for (const RenderPassBase::ColorAttachment& color_attachment : m_settings.color_attachments) { - const AccessDesc render_target_access(color_attach); + if (update_descriptors_only) + { + m_render_target_descs[color_attachment_index].cpuDescriptor = GetRenderTargetTextureCpuDescriptor(color_attachment.wp_texture); + color_attachment_index++; + } + else + { + const AccessDesc render_target_access(color_attachment); - m_render_target_descs.emplace_back(D3D12_RENDER_PASS_RENDER_TARGET_DESC{ - render_target_access.descriptor, render_target_access.beginning, render_target_access.ending - }); + m_render_target_descs.emplace_back(D3D12_RENDER_PASS_RENDER_TARGET_DESC{ + render_target_access.descriptor, render_target_access.beginning, render_target_access.ending + }); + } } if (!m_settings.depth_attachment.wp_texture.expired()) { - const AccessDesc depth_access(m_settings.depth_attachment, m_settings.stencil_attachment); - const AccessDesc stencil_access(m_settings.stencil_attachment, m_settings.depth_attachment); - - m_depth_stencil_desc = D3D12_RENDER_PASS_DEPTH_STENCIL_DESC{ - depth_access.descriptor, - depth_access.beginning, stencil_access.beginning, - depth_access.ending, stencil_access.ending - }; + if (update_descriptors_only && m_depth_stencil_desc) + { + m_depth_stencil_desc->cpuDescriptor = GetRenderTargetTextureCpuDescriptor(m_settings.depth_attachment.wp_texture); + } + else + { + const AccessDesc depth_access(m_settings.depth_attachment, m_settings.stencil_attachment); + const AccessDesc stencil_access(m_settings.stencil_attachment, m_settings.depth_attachment); + + m_depth_stencil_desc = D3D12_RENDER_PASS_DEPTH_STENCIL_DESC{ + depth_access.descriptor, + depth_access.beginning, stencil_access.beginning, + depth_access.ending, stencil_access.ending + }; + } } #else From 4aeefca3001f878f73664b9b0581e8ace9a1c60f Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 10 Dec 2019 19:05:53 +0300 Subject: [PATCH 004/129] Enable native D3D12 Render-Pass usage when it's available in Command List interface, otherwise use fallback to explicit set RTs and Clears. --- Externals | 2 +- .../Methane/Graphics/DirectX12/DeviceDX.cpp | 15 +- .../Methane/Graphics/DirectX12/DeviceDX.h | 12 +- .../Methane/Graphics/DirectX12/ProgramDX.cpp | 2 +- .../DirectX12/RenderCommandListDX.cpp | 1 + .../Graphics/DirectX12/RenderCommandListDX.h | 12 +- .../Graphics/DirectX12/RenderPassDX.cpp | 176 +++++++++--------- .../Methane/Graphics/DirectX12/RenderPassDX.h | 22 +-- .../Graphics/DirectX12/RenderStateDX.cpp | 2 +- 9 files changed, 118 insertions(+), 126 deletions(-) diff --git a/Externals b/Externals index 04c6ff71e..f1c0434e9 160000 --- a/Externals +++ b/Externals @@ -1 +1 @@ -Subproject commit 04c6ff71ecbe7f5ab585a1486c58c2837a04a9ea +Subproject commit f1c0434e9457d817c701827d159642ff820302d1 diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp index fe05811dd..721b1c524 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp @@ -89,14 +89,17 @@ void DeviceDX::SetName(const std::string& name) const wrl::ComPtr& DeviceDX::GetNativeDevice() const { ITT_FUNCTION_TASK(); - if (!m_cp_device) + if (m_cp_device) + return m_cp_device; + + ThrowIfFailed(D3D12CreateDevice(m_cp_adapter.Get(), m_feature_level, IID_PPV_ARGS(&m_cp_device))); + if (!GetName().empty()) { - ThrowIfFailed(D3D12CreateDevice(m_cp_adapter.Get(), m_feature_level, IID_PPV_ARGS(&m_cp_device))); - if (!GetName().empty()) - { - m_cp_device->SetName(nowide::widen(GetName()).c_str()); - } + m_cp_device->SetName(nowide::widen(GetName()).c_str()); } + + ThrowIfFailed(m_cp_device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5, &m_feature_support, sizeof(m_feature_support))); + return m_cp_device; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.h index e84c24d5f..2905d5abb 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.h @@ -46,14 +46,16 @@ class DeviceDX final : public DeviceBase // Object interface void SetName(const std::string& name) override; - const wrl::ComPtr& GetNativeAdapter() const { return m_cp_adapter; } - const wrl::ComPtr& GetNativeDevice() const; + const D3D12_FEATURE_DATA_D3D12_OPTIONS5& GetNativeFeatureSupport() const { return m_feature_support; } + const wrl::ComPtr& GetNativeAdapter() const { return m_cp_adapter; } + const wrl::ComPtr& GetNativeDevice() const; void ReleaseNativeDevice(); protected: - const wrl::ComPtr m_cp_adapter; - const D3D_FEATURE_LEVEL m_feature_level; - mutable wrl::ComPtr m_cp_device; + const wrl::ComPtr m_cp_adapter; + const D3D_FEATURE_LEVEL m_feature_level; + mutable D3D12_FEATURE_DATA_D3D12_OPTIONS5 m_feature_support; + mutable wrl::ComPtr m_cp_device; }; class SystemDX final : public SystemBase diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp index 9892e32bc..00e905927 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp @@ -167,7 +167,7 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list) const }; RenderCommandListDX& render_command_list_dx = dynamic_cast(command_list); - wrl::ComPtr& cp_command_list = render_command_list_dx.GetNativeCommandList(); + wrl::ComPtr& cp_command_list = render_command_list_dx.GetNativeCommandList(); const CommandListBase::CommandState& command_state = render_command_list_dx.GetCommandState(); assert(!!cp_command_list); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp index 7347c36f0..9301854b2 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp @@ -74,6 +74,7 @@ RenderCommandListDX::RenderCommandListDX(CommandQueueBase& cmd_buffer, RenderPas ThrowIfFailed(cp_device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_cp_command_allocator))); ThrowIfFailed(cp_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_cp_command_allocator.Get(), nullptr, IID_PPV_ARGS(&m_cp_command_list))); + m_cp_command_list.As(&m_cp_command_list_4); } void RenderCommandListDX::Reset(RenderState& render_state, const std::string& debug_group) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h index 2c82b5151..9a12e3671 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h @@ -35,12 +35,6 @@ namespace Methane::Graphics namespace wrl = Microsoft::WRL; -#if D3D12_RENDER_PASS_ENABLED -using ID3D12GraphicsCommandListVer = ID3D12GraphicsCommandList4; -#else -using ID3D12GraphicsCommandListVer = ID3D12GraphicsCommandList; -#endif - class CommandQueueDX; class RenderPassDX; @@ -70,14 +64,16 @@ class RenderCommandListDX final : public RenderCommandListBase // Object interface void SetName(const std::string& name) override; - wrl::ComPtr& GetNativeCommandList() { return m_cp_command_list; } + wrl::ComPtr& GetNativeCommandList() { return m_cp_command_list; } + wrl::ComPtr& GetNativeCommandList4() { return m_cp_command_list_4; } protected: CommandQueueDX& GetCommandQueueDX(); RenderPassDX& GetPassDX(); wrl::ComPtr m_cp_command_allocator; - wrl::ComPtr m_cp_command_list; + wrl::ComPtr m_cp_command_list; + wrl::ComPtr m_cp_command_list_4; // extended interface for the same command list (may be unavailable on older Windows) bool m_is_committed = false; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp index 64e08a685..a1f7c94d5 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp @@ -24,11 +24,13 @@ DirectX 12 implementation of the render pass interface. #include "RenderPassDX.h" #include "DescriptorHeapDX.h" #include "RenderCommandListDX.h" +#include "DeviceDX.h" #include "TypesDX.h" #include #include #include +#include #include @@ -44,8 +46,6 @@ static D3D12_CPU_DESCRIPTOR_HANDLE GetRenderTargetTextureCpuDescriptor(const Tex : D3D12_CPU_DESCRIPTOR_HANDLE(); } -#if D3D12_RENDER_PASS_ENABLED - RenderPassDX::AccessDesc::AccessDesc(const Attachment& attachment) : descriptor(GetRenderTargetTextureCpuDescriptor(attachment.wp_texture)) { @@ -146,8 +146,6 @@ D3D12_RENDER_PASS_ENDING_ACCESS_TYPE RenderPassDX::AccessDesc::GetEndingAccessTy return D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS; } -#else - RenderPassDX::RTClearInfo::RTClearInfo(const RenderPass::ColorAttachment& color_attach) : cpu_handle(GetRenderTargetTextureCpuDescriptor(color_attach.wp_texture)) , clear_color{ color_attach.clear_color.r(), color_attach.clear_color.g(), color_attach.clear_color.b(), color_attach.clear_color.a() } @@ -175,8 +173,6 @@ RenderPassDX::DSClearInfo::DSClearInfo(const RenderPass::DepthAttachment& depth_ } } -#endif - static DescriptorHeap::Type GetDescriptorHeapTypeByAccess(RenderPass::Access::Value access) noexcept { ITT_FUNCTION_TASK(); @@ -211,70 +207,70 @@ void RenderPassDX::Update(const Settings& settings) const bool settings_unchanged = m_settings == settings; RenderPassBase::Update(settings); -#if D3D12_RENDER_PASS_ENABLED - - const bool update_descriptors_only = settings_unchanged && m_render_target_descs.size() == m_settings.color_attachments.size(); - if (!update_descriptors_only) - { - m_render_target_descs.clear(); - m_depth_stencil_desc.reset(); - } - - uint32_t color_attachment_index = 0; - for (const RenderPassBase::ColorAttachment& color_attachment : m_settings.color_attachments) + if (!m_is_native_render_pass_available.has_value() || m_is_native_render_pass_available.value()) { - if (update_descriptors_only) + const bool update_descriptors_only = settings_unchanged && m_render_target_descs.size() == m_settings.color_attachments.size(); + if (!update_descriptors_only) { - m_render_target_descs[color_attachment_index].cpuDescriptor = GetRenderTargetTextureCpuDescriptor(color_attachment.wp_texture); - color_attachment_index++; - } - else - { - const AccessDesc render_target_access(color_attachment); - - m_render_target_descs.emplace_back(D3D12_RENDER_PASS_RENDER_TARGET_DESC{ - render_target_access.descriptor, render_target_access.beginning, render_target_access.ending - }); + m_render_target_descs.clear(); + m_depth_stencil_desc.reset(); } - } - if (!m_settings.depth_attachment.wp_texture.expired()) - { - if (update_descriptors_only && m_depth_stencil_desc) + uint32_t color_attachment_index = 0; + for (const RenderPassBase::ColorAttachment& color_attachment : m_settings.color_attachments) { - m_depth_stencil_desc->cpuDescriptor = GetRenderTargetTextureCpuDescriptor(m_settings.depth_attachment.wp_texture); + if (update_descriptors_only) + { + m_render_target_descs[color_attachment_index].cpuDescriptor = GetRenderTargetTextureCpuDescriptor(color_attachment.wp_texture); + color_attachment_index++; + } + else + { + const AccessDesc render_target_access(color_attachment); + + m_render_target_descs.emplace_back(D3D12_RENDER_PASS_RENDER_TARGET_DESC{ + render_target_access.descriptor, render_target_access.beginning, render_target_access.ending + }); + } } - else + + if (!m_settings.depth_attachment.wp_texture.expired()) { - const AccessDesc depth_access(m_settings.depth_attachment, m_settings.stencil_attachment); - const AccessDesc stencil_access(m_settings.stencil_attachment, m_settings.depth_attachment); - - m_depth_stencil_desc = D3D12_RENDER_PASS_DEPTH_STENCIL_DESC{ - depth_access.descriptor, - depth_access.beginning, stencil_access.beginning, - depth_access.ending, stencil_access.ending - }; + if (update_descriptors_only && m_depth_stencil_desc) + { + m_depth_stencil_desc->cpuDescriptor = GetRenderTargetTextureCpuDescriptor(m_settings.depth_attachment.wp_texture); + } + else + { + const AccessDesc depth_access(m_settings.depth_attachment, m_settings.stencil_attachment); + const AccessDesc stencil_access(m_settings.stencil_attachment, m_settings.depth_attachment); + + m_depth_stencil_desc = D3D12_RENDER_PASS_DEPTH_STENCIL_DESC{ + depth_access.descriptor, + depth_access.beginning, stencil_access.beginning, + depth_access.ending, stencil_access.ending + }; + } } } - -#else - - m_rt_clear_infos.clear(); - for (const RenderPassBase::ColorAttachment& color_attach : m_settings.color_attachments) + + if (!m_is_native_render_pass_available.has_value() || !m_is_native_render_pass_available.value()) { - if (color_attach.load_action != RenderPassBase::Attachment::LoadAction::Clear) - continue; - - if (color_attach.wp_texture.expired()) + m_rt_clear_infos.clear(); + for (const RenderPassBase::ColorAttachment& color_attach : m_settings.color_attachments) { - throw std::invalid_argument("Can not clear render target attachment without texture."); + if (color_attach.load_action != RenderPassBase::Attachment::LoadAction::Clear) + continue; + + if (color_attach.wp_texture.expired()) + { + throw std::invalid_argument("Can not clear render target attachment without texture."); + } + m_rt_clear_infos.emplace_back(color_attach); } - m_rt_clear_infos.emplace_back(color_attach); - } - - m_ds_clear_info = DSClearInfo(m_settings.depth_attachment, m_settings.stencil_attachment); -#endif + m_ds_clear_info = DSClearInfo(m_settings.depth_attachment, m_settings.stencil_attachment); + } } void RenderPassDX::Begin(RenderCommandListBase& command_list) @@ -289,7 +285,8 @@ void RenderPassDX::Begin(RenderCommandListBase& command_list) RenderPassBase::Begin(command_list); - wrl::ComPtr& cp_dx_command_list = static_cast(command_list).GetNativeCommandList(); + RenderCommandListDX& command_list_dx = static_cast(command_list); + wrl::ComPtr& cp_dx_command_list = command_list_dx.GetNativeCommandList(); // Set descriptor heaps const std::vector descritor_heaps = GetNativeDescriptorHeaps(); @@ -301,48 +298,49 @@ void RenderPassDX::Begin(RenderCommandListBase& command_list) // Set RT transition barriers command_list.SetResourceTransitionBarriers(GetColorAttachmentResources(), ResourceBase::State::Present, ResourceBase::State::RenderTarget); -#if D3D12_RENDER_PASS_ENABLED - - // Begin render pass - cp_dx_command_list->BeginRenderPass( - static_cast(m_render_target_descs.size()), m_render_target_descs.data(), - m_depth_stencil_desc ? &*m_depth_stencil_desc : nullptr, - m_pass_flags - ); + wrl::ComPtr& cp_dx_command_list_4 = command_list_dx.GetNativeCommandList4(); + m_is_native_render_pass_available = !!cp_dx_command_list_4; -#else - - // Set render targets - const std::vector rt_cpu_handles = GetNativeRenderTargetCPUHandles(); - const D3D12_CPU_DESCRIPTOR_HANDLE* p_depth_stencil_cpu_handle = GetNativeDepthStencilCPUHandle(); - cp_dx_command_list->OMSetRenderTargets(static_cast(rt_cpu_handles.size()), rt_cpu_handles.data(), FALSE, p_depth_stencil_cpu_handle); - - // Clear render targets - for (const RenderPassDX::RTClearInfo& rt_clear : m_rt_clear_infos) + if (m_is_native_render_pass_available) { - cp_dx_command_list->ClearRenderTargetView(rt_clear.cpu_handle, rt_clear.clear_color, 0, nullptr); + // Begin render pass + cp_dx_command_list_4->BeginRenderPass( + static_cast(m_render_target_descs.size()), m_render_target_descs.data(), + m_depth_stencil_desc ? &*m_depth_stencil_desc : nullptr, + m_pass_flags + ); } - - // Clear depth-stencil buffer - if (m_ds_clear_info.depth_cleared || m_ds_clear_info.stencil_cleared) + else { - cp_dx_command_list->ClearDepthStencilView(m_ds_clear_info.cpu_handle, m_ds_clear_info.clear_flags, m_ds_clear_info.depth_value, m_ds_clear_info.stencil_value, 0, nullptr); - } + // Set render targets + const std::vector rt_cpu_handles = GetNativeRenderTargetCPUHandles(); + const D3D12_CPU_DESCRIPTOR_HANDLE* p_depth_stencil_cpu_handle = GetNativeDepthStencilCPUHandle(); + cp_dx_command_list->OMSetRenderTargets(static_cast(rt_cpu_handles.size()), rt_cpu_handles.data(), FALSE, p_depth_stencil_cpu_handle); -#endif + // Clear render targets + for (const RenderPassDX::RTClearInfo& rt_clear : m_rt_clear_infos) + { + cp_dx_command_list->ClearRenderTargetView(rt_clear.cpu_handle, rt_clear.clear_color, 0, nullptr); + } + + // Clear depth-stencil buffer + if (m_ds_clear_info.depth_cleared || m_ds_clear_info.stencil_cleared) + { + cp_dx_command_list->ClearDepthStencilView(m_ds_clear_info.cpu_handle, m_ds_clear_info.clear_flags, m_ds_clear_info.depth_value, m_ds_clear_info.stencil_value, 0, nullptr); + } + } } void RenderPassDX::End(RenderCommandListBase& command_list) { ITT_FUNCTION_TASK(); -#if D3D12_RENDER_PASS_ENABLED - - // End render pass - wrl::ComPtr& cp_dx_command_list = static_cast(command_list).GetNativeCommandList(); - cp_dx_command_list->EndRenderPass(); - -#endif + if (m_is_native_render_pass_available) + { + wrl::ComPtr& cp_dx_command_list_4 = static_cast(command_list).GetNativeCommandList4(); + assert(!!cp_dx_command_list_4); + cp_dx_command_list_4->EndRenderPass(); + } // Set RT transition barriers command_list.SetResourceTransitionBarriers(GetColorAttachmentResources(), ResourceBase::State::RenderTarget, ResourceBase::State::Present); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h index 78dc5ec80..5212d8e6b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h @@ -30,10 +30,6 @@ DirectX 12 implementation of the render pass interface. #include #include -#ifndef D3D12_RENDER_PASS_ENABLED -#define D3D12_RENDER_PASS_ENABLED 1 -#endif - namespace Methane::Graphics { @@ -56,8 +52,6 @@ class RenderPassDX : public RenderPassBase const D3D12_CPU_DESCRIPTOR_HANDLE* GetNativeDepthStencilCPUHandle(); private: -#if D3D12_RENDER_PASS_ENABLED - struct AccessDesc { D3D12_CPU_DESCRIPTOR_HANDLE descriptor = { }; @@ -75,12 +69,6 @@ class RenderPassDX : public RenderPassBase static D3D12_RENDER_PASS_ENDING_ACCESS_TYPE GetEndingAccessTypeByStoreAction(Attachment::StoreAction store_action) noexcept; }; - std::vector m_render_target_descs; - std::optional m_depth_stencil_desc; - D3D12_RENDER_PASS_FLAGS m_pass_flags = D3D12_RENDER_PASS_FLAG_NONE; - -#else - struct RTClearInfo { D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle = {}; @@ -102,11 +90,15 @@ class RenderPassDX : public RenderPassBase DSClearInfo(const RenderPassBase::DepthAttachment& depth_attach, const RenderPassBase::StencilAttachment& stencil_attach); }; + // D3D12 Render-Pass description + std::optional m_is_native_render_pass_available; + std::vector m_render_target_descs; + std::optional m_depth_stencil_desc; + D3D12_RENDER_PASS_FLAGS m_pass_flags = D3D12_RENDER_PASS_FLAG_NONE; + + // Fallback to input assember setup std::vector m_rt_clear_infos; DSClearInfo m_ds_clear_info; - -#endif - D3D12_CPU_DESCRIPTOR_HANDLE m_depth_stencil_cpu_handle = {}; bool m_is_updated = false; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp index f4cf43bca..509111c43 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp @@ -202,7 +202,7 @@ void RenderStateDX::Apply(RenderCommandListBase& command_list) ITT_FUNCTION_TASK(); RenderCommandListDX& dx_command_list = static_cast(command_list); - wrl::ComPtr& cp_dx_command_list = dx_command_list.GetNativeCommandList(); + wrl::ComPtr& cp_dx_command_list = dx_command_list.GetNativeCommandList(); cp_dx_command_list->SetPipelineState(GetNativePipelineState().Get()); cp_dx_command_list->SetGraphicsRootSignature(GetProgramDX().GetNativeRootSignature().Get()); From 2c1a57b7216e457641b853bbd536b9db1b522729 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 10 Dec 2019 19:56:39 +0300 Subject: [PATCH 005/129] Updated Externals submodule to latest version --- Externals | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Externals b/Externals index f1c0434e9..04c6ff71e 160000 --- a/Externals +++ b/Externals @@ -1 +1 @@ -Subproject commit f1c0434e9457d817c701827d159642ff820302d1 +Subproject commit 04c6ff71ecbe7f5ab585a1486c58c2837a04a9ea From f90c8a3fc2cec8c1465e939e0bd20fc5b7258628 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 10 Dec 2019 22:12:32 +0300 Subject: [PATCH 006/129] Fixed DirectX execution on older Windows versions, without D3D12 Render-Passes support. --- .../Methane/Graphics/DirectX12/DeviceDX.cpp | 10 +++++++--- .../Methane/Graphics/DirectX12/DeviceDX.h | 17 ++++++++++------- .../Methane/Graphics/DirectX12/RenderPassDX.cpp | 4 ++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp index 721b1c524..6cb7a5404 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp @@ -63,8 +63,8 @@ Device::Feature::Mask DeviceDX::GetSupportedFeatures(const wrl::ComPtr& cp_adapter, D3D_FEATURE_LEVEL feature_level) : DeviceBase(GetAdapterNameDXGI(*cp_adapter.Get()), - IsSoftwareAdapterDXGI(static_cast(*cp_adapter.Get())), - GetSupportedFeatures(cp_adapter, feature_level)) + IsSoftwareAdapterDXGI(static_cast(*cp_adapter.Get())), + GetSupportedFeatures(cp_adapter, feature_level)) , m_cp_adapter(cp_adapter) , m_feature_level(feature_level) { @@ -98,7 +98,11 @@ const wrl::ComPtr& DeviceDX::GetNativeDevice() const m_cp_device->SetName(nowide::widen(GetName()).c_str()); } - ThrowIfFailed(m_cp_device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5, &m_feature_support, sizeof(m_feature_support))); + D3D12_FEATURE_DATA_D3D12_OPTIONS5 feature_options_5 = {}; + if (m_cp_device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5, &feature_options_5, sizeof(feature_options_5)) == S_OK) + { + m_feature_options_5 = feature_options_5; + } return m_cp_device; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.h index 2905d5abb..32b15ca8c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.h @@ -30,6 +30,8 @@ DirectX 12 implementation of the device interface. #include #include +#include + namespace Methane::Graphics { @@ -46,16 +48,17 @@ class DeviceDX final : public DeviceBase // Object interface void SetName(const std::string& name) override; - const D3D12_FEATURE_DATA_D3D12_OPTIONS5& GetNativeFeatureSupport() const { return m_feature_support; } - const wrl::ComPtr& GetNativeAdapter() const { return m_cp_adapter; } - const wrl::ComPtr& GetNativeDevice() const; + using NativeFeatureOptions5 = std::optional; + const NativeFeatureOptions5& GetNativeFeatureOptions5() const { return m_feature_options_5; } + const wrl::ComPtr& GetNativeAdapter() const { return m_cp_adapter; } + const wrl::ComPtr& GetNativeDevice() const; void ReleaseNativeDevice(); protected: - const wrl::ComPtr m_cp_adapter; - const D3D_FEATURE_LEVEL m_feature_level; - mutable D3D12_FEATURE_DATA_D3D12_OPTIONS5 m_feature_support; - mutable wrl::ComPtr m_cp_device; + const wrl::ComPtr m_cp_adapter; + const D3D_FEATURE_LEVEL m_feature_level; + mutable NativeFeatureOptions5 m_feature_options_5; + mutable wrl::ComPtr m_cp_device; }; class SystemDX final : public SystemBase diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp index a1f7c94d5..b68d3a586 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp @@ -301,7 +301,7 @@ void RenderPassDX::Begin(RenderCommandListBase& command_list) wrl::ComPtr& cp_dx_command_list_4 = command_list_dx.GetNativeCommandList4(); m_is_native_render_pass_available = !!cp_dx_command_list_4; - if (m_is_native_render_pass_available) + if (m_is_native_render_pass_available.value()) { // Begin render pass cp_dx_command_list_4->BeginRenderPass( @@ -335,7 +335,7 @@ void RenderPassDX::End(RenderCommandListBase& command_list) { ITT_FUNCTION_TASK(); - if (m_is_native_render_pass_available) + if (m_is_native_render_pass_available.has_value() && m_is_native_render_pass_available.value()) { wrl::ComPtr& cp_dx_command_list_4 = static_cast(command_list).GetNativeCommandList4(); assert(!!cp_dx_command_list_4); From 2be1765ae78270c309ce9a055cc7b3ef6282b7e5 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 11 Dec 2019 17:27:34 +0300 Subject: [PATCH 007/129] ParallelRenderCommandList interface and initial base implementation stub --- Modules/Graphics/Core/CMakeLists.txt | 3 + .../Graphics/ParallelRenderCommandList.h | 47 +++++++++++++++ .../Methane/Graphics/RenderCommandList.h | 2 + .../ParallelRenderCommandListBase.cpp | 51 +++++++++++++++++ .../Graphics/ParallelRenderCommandListBase.h | 57 +++++++++++++++++++ .../Graphics/RenderCommandListBase.cpp | 4 -- 6 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h diff --git a/Modules/Graphics/Core/CMakeLists.txt b/Modules/Graphics/Core/CMakeLists.txt index 0ed341957..21b9eb9ec 100644 --- a/Modules/Graphics/Core/CMakeLists.txt +++ b/Modules/Graphics/Core/CMakeLists.txt @@ -118,6 +118,7 @@ set(HEADERS ${INCLUDE_DIR}/CommandQueue.h ${INCLUDE_DIR}/CommandList.h ${INCLUDE_DIR}/RenderCommandList.h + ${INCLUDE_DIR}/ParallelRenderCommandList.h ${INCLUDE_DIR}/RenderState.h ${INCLUDE_DIR}/RenderPass.h ${INCLUDE_DIR}/Types.h @@ -163,6 +164,8 @@ set(SOURCES ${PLATFORM_SOURCES} ${SOURCES_DIR}/CommandListBase.cpp ${SOURCES_DIR}/RenderCommandListBase.h ${SOURCES_DIR}/RenderCommandListBase.cpp + ${SOURCES_DIR}/ParallelRenderCommandListBase.h + ${SOURCES_DIR}/ParallelRenderCommandListBase.cpp ${SOURCES_DIR}/RenderPassBase.h ${SOURCES_DIR}/RenderPassBase.cpp ${SOURCES_DIR}/RenderStateBase.h diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h new file mode 100644 index 000000000..40f7b40b3 --- /dev/null +++ b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h @@ -0,0 +1,47 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/ParallelRenderCommandList.h +Methane parallel render command list interface +for multi-threaded rendering in the single render pass. + +******************************************************************************/ + +#pragma once + +#include "RenderCommandList.h" + +namespace Methane::Graphics +{ + +struct RenderState; +struct RenderPass; +struct RenderCommandList; + +struct ParallelRenderCommandList : virtual CommandList +{ + using Ptr = std::shared_ptr; + + // Create ParallelRenderCommandList instance + static Ptr Create(CommandQueue& command_queue, RenderPass& render_pass); + + // ParallelRenderCommandList interface + virtual const std::vector& GetParallelCommandLists() const = 0; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h index 982719287..410b6f530 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h @@ -31,6 +31,7 @@ namespace Methane::Graphics struct RenderState; struct RenderPass; +struct ParallelRenderCommandList; struct RenderCommandList : virtual CommandList { @@ -47,6 +48,7 @@ struct RenderCommandList : virtual CommandList // Create RenderCommandList instance static Ptr Create(CommandQueue& command_queue, RenderPass& render_pass); + static Ptr Create(ParallelRenderCommandList& parallel_command_list); // RenderCommandList interface virtual void Reset(RenderState& render_state, const std::string& debug_group = "") = 0; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp new file mode 100644 index 000000000..51edcf9f4 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp @@ -0,0 +1,51 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/ParallelRenderCommandListBase.cpp +Base implementation of the parallel render command list interface. + +******************************************************************************/ + +#include "ParallelRenderCommandListBase.h" +#include "RenderPassBase.h" +#include "RenderStateBase.h" +#include "BufferBase.h" +#include "ProgramBase.h" + +#include + +#include + +namespace Methane::Graphics +{ + +ParallelRenderCommandListBase::ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& pass) + : CommandListBase(command_queue) + , m_sp_pass(pass.GetPtr()) +{ + ITT_FUNCTION_TASK(); +} + +RenderPassBase& ParallelRenderCommandListBase::GetPass() +{ + ITT_FUNCTION_TASK(); + assert(!!m_sp_pass); + return static_cast(*m_sp_pass); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h new file mode 100644 index 000000000..b1229328f --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h @@ -0,0 +1,57 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/ParallelRenderCommandListBase.h +Base implementation of the parallel render command list interface. + +******************************************************************************/ + +#pragma once + +#include "CommandListBase.h" +#include "RenderPassBase.h" + +#include + +#include + +namespace Methane::Graphics +{ + +struct RenderState; + +class ParallelRenderCommandListBase + : public ParallelRenderCommandList + , public CommandListBase +{ +public: + using Ptr = std::shared_ptr; + + ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& render_pass); + + // ParallelRenderCommandList interface + const std::vector& GetParallelCommandLists() const override { return m_parallel_command_lists; } + + RenderPassBase& GetPass(); + +protected: + const RenderPass::Ptr m_sp_pass; + std::vector m_parallel_command_lists; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp index c61fd2ae5..9aebdbbd0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp @@ -31,10 +31,6 @@ Base implementation of the render command list interface. #include -#ifdef DrawState -#undef DrawState -#endif - namespace Methane::Graphics { From 1855c67bec2a63e70777201371ef56203a06c00c Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 12 Dec 2019 23:32:43 +0300 Subject: [PATCH 008/129] Parallel render command list initial implementation for Metal (WIP). --- Modules/Graphics/Core/CMakeLists.txt | 2 + .../Graphics/ParallelRenderCommandList.h | 4 +- .../Methane/Graphics/RenderCommandList.h | 1 + .../Metal/ParallelRenderCommandListMT.hh | 67 ++++++++ .../Metal/ParallelRenderCommandListMT.mm | 145 ++++++++++++++++++ .../Graphics/Metal/RenderCommandListMT.hh | 1 + .../Graphics/Metal/RenderCommandListMT.mm | 14 +- .../ParallelRenderCommandListBase.cpp | 12 ++ .../Graphics/ParallelRenderCommandListBase.h | 12 +- .../Graphics/RenderCommandListBase.cpp | 9 ++ .../Methane/Graphics/RenderCommandListBase.h | 2 + 11 files changed, 263 insertions(+), 6 deletions(-) create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm diff --git a/Modules/Graphics/Core/CMakeLists.txt b/Modules/Graphics/Core/CMakeLists.txt index 21b9eb9ec..73e355824 100644 --- a/Modules/Graphics/Core/CMakeLists.txt +++ b/Modules/Graphics/Core/CMakeLists.txt @@ -82,6 +82,8 @@ elseif(APPLE) ${SOURCES_GRAPHICS_DIR}/CommandQueueMT.mm ${SOURCES_GRAPHICS_DIR}/RenderCommandListMT.hh ${SOURCES_GRAPHICS_DIR}/RenderCommandListMT.mm + ${SOURCES_GRAPHICS_DIR}/ParallelRenderCommandListMT.hh + ${SOURCES_GRAPHICS_DIR}/ParallelRenderCommandListMT.mm ) set(PLATFORM_LIBRARIES diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h index 40f7b40b3..4779f4554 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h @@ -31,7 +31,6 @@ namespace Methane::Graphics struct RenderState; struct RenderPass; -struct RenderCommandList; struct ParallelRenderCommandList : virtual CommandList { @@ -41,7 +40,8 @@ struct ParallelRenderCommandList : virtual CommandList static Ptr Create(CommandQueue& command_queue, RenderPass& render_pass); // ParallelRenderCommandList interface - virtual const std::vector& GetParallelCommandLists() const = 0; + virtual void Reset() = 0; + virtual RenderCommandList::Ptrs CreateRenderCommandLists(uint32_t count) = 0; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h index 410b6f530..f7010d819 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h @@ -36,6 +36,7 @@ struct ParallelRenderCommandList; struct RenderCommandList : virtual CommandList { using Ptr = std::shared_ptr; + using Ptrs = std::vector; enum class Primitive { diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh new file mode 100644 index 000000000..c1f498dee --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh @@ -0,0 +1,67 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Metal/ParallelRenderCommandListMT.hh +Metal implementation of the parallel render command list interface. + +******************************************************************************/ + +#pragma once + +#include + +#include + +#import + +namespace Methane::Graphics +{ + +class CommandQueueMT; +class BufferMT; +class RenderPassMT; + +class ParallelRenderCommandListMT final : public ParallelRenderCommandListBase +{ +public: + ParallelRenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass); + + // ParallelRenderCommandList interface + void Reset() override; + + // CommandList interface + void Commit(bool present_drawable) override; + + // CommandListBase interface + void Execute(uint32_t frame_index) override; + + // Object interface + void SetName(const std::string& label) override; + + id& GetNativeCommandBuffer() noexcept { return m_mtl_cmd_buffer; } + id& GetNativeParallelRenderEncoder() noexcept { return m_mtl_parallel_render_encoder; } + +protected: + CommandQueueMT& GetCommandQueueMT() noexcept; + RenderPassMT& GetPassMT(); + + id m_mtl_cmd_buffer; + id m_mtl_parallel_render_encoder; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm new file mode 100644 index 000000000..bfea8247b --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm @@ -0,0 +1,145 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Metal/ParallelRenderCommandListMT.mm +Metal implementation of the render command list interface. + +******************************************************************************/ + +#include "ParallelRenderCommandListMT.hh" +#include "RenderPassMT.hh" +#include "CommandQueueMT.hh" +#include "ContextMT.hh" + +#include +#include + +namespace Methane::Graphics +{ + +ParallelRenderCommandList::Ptr ParallelRenderCommandList::Create(CommandQueue& command_queue, RenderPass& render_pass) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(command_queue), static_cast(render_pass)); +} + +ParallelRenderCommandListMT::ParallelRenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass) + : ParallelRenderCommandListBase(command_queue, render_pass) + , m_mtl_cmd_buffer(nil) + , m_mtl_parallel_render_encoder(nil) +{ + ITT_FUNCTION_TASK(); +} + +void ParallelRenderCommandListMT::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::SetName(name); + + NSString* ns_name = MacOS::ConvertToNSType(name); + + if (m_mtl_parallel_render_encoder != nil) + { + m_mtl_parallel_render_encoder.label = ns_name; + } + + if (m_mtl_cmd_buffer != nil) + { + m_mtl_cmd_buffer.label = ns_name; + } +} + +void ParallelRenderCommandListMT::Reset() +{ + ITT_FUNCTION_TASK(); + if (m_mtl_parallel_render_encoder != nil) + return; + + // NOTE: + // If command buffer was not created for current frame yet, + // then render pass descriptor should be reset with new frame drawable + RenderPassMT& render_pass = GetPassMT(); + MTLRenderPassDescriptor* mtl_render_pass = render_pass.GetNativeDescriptor(m_mtl_cmd_buffer == nil); + + if (m_mtl_cmd_buffer == nil) + { + m_mtl_cmd_buffer = [GetCommandQueueMT().GetNativeCommandQueue() commandBuffer]; + assert(m_mtl_cmd_buffer != nil); + + m_mtl_cmd_buffer.label = MacOS::ConvertToNSType(GetName()); + } + + assert(!!mtl_render_pass); + m_mtl_parallel_render_encoder = [m_mtl_cmd_buffer parallelRenderCommandEncoderWithDescriptor: mtl_render_pass]; + + assert(m_mtl_parallel_render_encoder != nil); + m_mtl_parallel_render_encoder.label = MacOS::ConvertToNSType(GetName()); + + ParallelRenderCommandListBase::Reset(); +} + +void ParallelRenderCommandListMT::Commit(bool present_drawable) +{ + ITT_FUNCTION_TASK(); + + assert(!IsCommitted()); + + ParallelRenderCommandListBase::Commit(present_drawable); + + if (!m_mtl_cmd_buffer || !m_mtl_parallel_render_encoder) + return; + + [m_mtl_parallel_render_encoder endEncoding]; + m_mtl_parallel_render_encoder = nil; + + if (present_drawable) + { + [m_mtl_cmd_buffer presentDrawable: GetCommandQueueMT().GetContextMT().GetNativeDrawable()]; + } + + [m_mtl_cmd_buffer enqueue]; +} + +void ParallelRenderCommandListMT::Execute(uint32_t frame_index) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::Execute(frame_index); + + [m_mtl_cmd_buffer addCompletedHandler:^(id) { + Complete(frame_index); + }]; + + [m_mtl_cmd_buffer commit]; + m_mtl_cmd_buffer = nil; +} + +CommandQueueMT& ParallelRenderCommandListMT::GetCommandQueueMT() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(*m_sp_command_queue); +} + +RenderPassMT& ParallelRenderCommandListMT::GetPassMT() +{ + ITT_FUNCTION_TASK(); + return static_cast(GetPass()); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh index 16a7f4cfb..a8e8ca554 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh @@ -40,6 +40,7 @@ class RenderCommandListMT final : public RenderCommandListBase { public: RenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass); + RenderCommandListMT(ParallelRenderCommandListBase& parallel_render_command_list); // CommandList interface void PushDebugGroup(const std::string& name) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm index 18f5a3482..8a78237d6 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm @@ -22,12 +22,12 @@ ******************************************************************************/ #include "RenderCommandListMT.hh" +#include "ParallelRenderCommandListMT.hh" #include "RenderStateMT.hh" #include "RenderPassMT.hh" #include "CommandQueueMT.hh" #include "ContextMT.hh" #include "BufferMT.hh" -#include "TypesMT.hh" #include #include @@ -57,6 +57,12 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit return std::make_shared(static_cast(command_queue), static_cast(render_pass)); } +RenderCommandList::Ptr RenderCommandList::Create(ParallelRenderCommandList& parallel_render_command_list) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(parallel_render_command_list)); +} + RenderCommandListMT::RenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass) : RenderCommandListBase(command_queue, render_pass) , m_mtl_cmd_buffer(nil) @@ -66,6 +72,12 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit ITT_FUNCTION_TASK(); } +RenderCommandListMT::RenderCommandListMT(ParallelRenderCommandListBase& parallel_render_command_list) + : RenderCommandListBase(parallel_render_command_list) +{ + ITT_FUNCTION_TASK(); +} + void RenderCommandListMT::Reset(RenderState& render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp index 51edcf9f4..f2abf80b3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp @@ -22,6 +22,7 @@ Base implementation of the parallel render command list interface. ******************************************************************************/ #include "ParallelRenderCommandListBase.h" +#include "RenderCommandListBase.h" #include "RenderPassBase.h" #include "RenderStateBase.h" #include "BufferBase.h" @@ -48,4 +49,15 @@ RenderPassBase& ParallelRenderCommandListBase::GetPass() return static_cast(*m_sp_pass); } +RenderCommandList::Ptrs ParallelRenderCommandListBase::CreateRenderCommandLists(uint32_t count) +{ + ITT_FUNCTION_TASK(); + RenderCommandList::Ptrs render_command_lists(count); + for(RenderCommandList::Ptr& sp_render_command_list : render_command_lists) + { + sp_render_command_list = RenderCommandList::Create(*this); + } + return render_command_lists; +} + } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h index b1229328f..f7b5668a2 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h @@ -44,14 +44,20 @@ class ParallelRenderCommandListBase ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& render_pass); + // CommandList interface + void PushDebugGroup(const std::string& name) override { throw std::logic_error("Not available for parallel render command list."); } + void PopDebugGroup() override { throw std::logic_error("Not available for parallel render command list."); } + + // CommandListBase interface + void SetResourceBarriers(const ResourceBase::Barriers&) override { } + // ParallelRenderCommandList interface - const std::vector& GetParallelCommandLists() const override { return m_parallel_command_lists; } + RenderCommandList::Ptrs CreateRenderCommandLists(uint32_t count) override; RenderPassBase& GetPass(); protected: - const RenderPass::Ptr m_sp_pass; - std::vector m_parallel_command_lists; + const RenderPass::Ptr m_sp_pass; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp index 9aebdbbd0..444dd91a0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp @@ -22,6 +22,8 @@ Base implementation of the render command list interface. ******************************************************************************/ #include "RenderCommandListBase.h" +#include "ParallelRenderCommandListBase.h" +#include "CommandQueueBase.h" #include "RenderPassBase.h" #include "RenderStateBase.h" #include "BufferBase.h" @@ -41,6 +43,13 @@ RenderCommandListBase::RenderCommandListBase(CommandQueueBase& command_queue, Re ITT_FUNCTION_TASK(); } +RenderCommandListBase::RenderCommandListBase(ParallelRenderCommandListBase& parallel_render_command_list) + : CommandListBase(static_cast(parallel_render_command_list.GetCommandQueue())) + , m_sp_pass(static_cast(parallel_render_command_list.GetPass()).GetPtr()) +{ + ITT_FUNCTION_TASK(); +} + void RenderCommandListBase::DrawingState::Reset() { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h index 955314a69..8f1e14caa 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h @@ -36,6 +36,7 @@ namespace Methane::Graphics { struct RenderState; +class ParallelRenderCommandListBase; class RenderCommandListBase : public RenderCommandList @@ -45,6 +46,7 @@ class RenderCommandListBase using Ptr = std::shared_ptr; RenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& render_pass); + RenderCommandListBase(ParallelRenderCommandListBase& parallel_render_command_list); // RenderCommandList interface void Reset(RenderState& render_state, const std::string& debug_group = "") override; From 407773bf5501cda6c164117d24de3d70633eaa24 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 14 Dec 2019 13:37:10 +0300 Subject: [PATCH 009/129] Parallel render command list initial stub for DirectX12 (WIP). Fixed build. --- Modules/Graphics/Core/CMakeLists.txt | 28 ++--- .../Graphics/ParallelRenderCommandList.h | 2 +- .../DirectX12/ParallelRenderCommandListDX.cpp | 101 ++++++++++++++++++ .../DirectX12/ParallelRenderCommandListDX.h | 66 ++++++++++++ .../DirectX12/RenderCommandListDX.cpp | 20 ++++ .../Graphics/DirectX12/RenderCommandListDX.h | 3 + .../Metal/ParallelRenderCommandListMT.hh | 2 +- .../Metal/ParallelRenderCommandListMT.mm | 4 +- 8 files changed, 209 insertions(+), 17 deletions(-) create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h diff --git a/Modules/Graphics/Core/CMakeLists.txt b/Modules/Graphics/Core/CMakeLists.txt index 73e355824..c5a3afcb1 100644 --- a/Modules/Graphics/Core/CMakeLists.txt +++ b/Modules/Graphics/Core/CMakeLists.txt @@ -17,6 +17,8 @@ if (WIN32) ${SOURCES_GRAPHICS_DIR}/ShaderDX.cpp ${SOURCES_GRAPHICS_DIR}/ProgramDX.h ${SOURCES_GRAPHICS_DIR}/ProgramDX.cpp + ${SOURCES_GRAPHICS_DIR}/RenderStateDX.h + ${SOURCES_GRAPHICS_DIR}/RenderStateDX.cpp ${SOURCES_GRAPHICS_DIR}/ResourceDX.h ${SOURCES_GRAPHICS_DIR}/ResourceDX.cpp ${SOURCES_GRAPHICS_DIR}/DescriptorHeapDX.h @@ -27,14 +29,14 @@ if (WIN32) ${SOURCES_GRAPHICS_DIR}/TextureDX.cpp ${SOURCES_GRAPHICS_DIR}/SamplerDX.h ${SOURCES_GRAPHICS_DIR}/SamplerDX.cpp + ${SOURCES_GRAPHICS_DIR}/RenderPassDX.h + ${SOURCES_GRAPHICS_DIR}/RenderPassDX.cpp ${SOURCES_GRAPHICS_DIR}/CommandQueueDX.h ${SOURCES_GRAPHICS_DIR}/CommandQueueDX.cpp ${SOURCES_GRAPHICS_DIR}/RenderCommandListDX.h ${SOURCES_GRAPHICS_DIR}/RenderCommandListDX.cpp - ${SOURCES_GRAPHICS_DIR}/RenderPassDX.h - ${SOURCES_GRAPHICS_DIR}/RenderPassDX.cpp - ${SOURCES_GRAPHICS_DIR}/RenderStateDX.h - ${SOURCES_GRAPHICS_DIR}/RenderStateDX.cpp + ${SOURCES_GRAPHICS_DIR}/ParallelRenderCommandListDX.h + ${SOURCES_GRAPHICS_DIR}/ParallelRenderCommandListDX.cpp ) set(PLATFORM_LIBRARIES @@ -109,21 +111,21 @@ set(LIBRARIES ${PLATFORM_LIBRARIES} ) set(HEADERS + ${INCLUDE_DIR}/Types.h ${INCLUDE_DIR}/Device.h ${INCLUDE_DIR}/Context.h ${INCLUDE_DIR}/Shader.h ${INCLUDE_DIR}/Program.h + ${INCLUDE_DIR}/RenderState.h ${INCLUDE_DIR}/Resource.h ${INCLUDE_DIR}/Buffer.h ${INCLUDE_DIR}/Texture.h ${INCLUDE_DIR}/Sampler.h + ${INCLUDE_DIR}/RenderPass.h ${INCLUDE_DIR}/CommandQueue.h ${INCLUDE_DIR}/CommandList.h ${INCLUDE_DIR}/RenderCommandList.h ${INCLUDE_DIR}/ParallelRenderCommandList.h - ${INCLUDE_DIR}/RenderState.h - ${INCLUDE_DIR}/RenderPass.h - ${INCLUDE_DIR}/Types.h ) set(SOURCES ${PLATFORM_SOURCES} @@ -132,15 +134,15 @@ set(SOURCES ${PLATFORM_SOURCES} ${SOURCES_DIR}/Native/ContextNT.h ${SOURCES_DIR}/Native/ShaderNT.h ${SOURCES_DIR}/Native/ProgramNT.h + ${SOURCES_DIR}/Native/RenderStateNT.h ${SOURCES_DIR}/Native/ResourceNT.h ${SOURCES_DIR}/Native/DescriptorHeapNT.h ${SOURCES_DIR}/Native/BufferNT.h ${SOURCES_DIR}/Native/TextureNT.h ${SOURCES_DIR}/Native/SamplerNT.h + ${SOURCES_DIR}/Native/RenderPassNT.h ${SOURCES_DIR}/Native/CommandQueueNT.h ${SOURCES_DIR}/Native/RenderCommandListNT.h - ${SOURCES_DIR}/Native/RenderStateNT.h - ${SOURCES_DIR}/Native/RenderPassNT.h # Base implementation ${SOURCES_DIR}/ObjectBase.h @@ -152,6 +154,8 @@ set(SOURCES ${PLATFORM_SOURCES} ${SOURCES_DIR}/ShaderBase.cpp ${SOURCES_DIR}/ProgramBase.h ${SOURCES_DIR}/ProgramBase.cpp + ${SOURCES_DIR}/RenderStateBase.h + ${SOURCES_DIR}/RenderStateBase.cpp ${SOURCES_DIR}/ResourceBase.h ${SOURCES_DIR}/ResourceBase.cpp ${SOURCES_DIR}/BufferBase.h @@ -160,6 +164,8 @@ set(SOURCES ${PLATFORM_SOURCES} ${SOURCES_DIR}/TextureBase.cpp ${SOURCES_DIR}/SamplerBase.h ${SOURCES_DIR}/SamplerBase.cpp + ${SOURCES_DIR}/RenderPassBase.h + ${SOURCES_DIR}/RenderPassBase.cpp ${SOURCES_DIR}/CommandQueueBase.h ${SOURCES_DIR}/CommandQueueBase.cpp ${SOURCES_DIR}/CommandListBase.h @@ -168,10 +174,6 @@ set(SOURCES ${PLATFORM_SOURCES} ${SOURCES_DIR}/RenderCommandListBase.cpp ${SOURCES_DIR}/ParallelRenderCommandListBase.h ${SOURCES_DIR}/ParallelRenderCommandListBase.cpp - ${SOURCES_DIR}/RenderPassBase.h - ${SOURCES_DIR}/RenderPassBase.cpp - ${SOURCES_DIR}/RenderStateBase.h - ${SOURCES_DIR}/RenderStateBase.cpp # Other sources ${SOURCES_DIR}/DescriptorHeap.h diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h index 4779f4554..995f82eb2 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h @@ -40,7 +40,7 @@ struct ParallelRenderCommandList : virtual CommandList static Ptr Create(CommandQueue& command_queue, RenderPass& render_pass); // ParallelRenderCommandList interface - virtual void Reset() = 0; + virtual void Reset(RenderState& render_state) = 0; virtual RenderCommandList::Ptrs CreateRenderCommandLists(uint32_t count) = 0; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp new file mode 100644 index 000000000..a94eec4d8 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp @@ -0,0 +1,101 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp +DirectX 12 implementation of the parallel render command list interface. + +******************************************************************************/ + +#include "ParallelRenderCommandListDX.h" +#include "RenderStateDX.h" +#include "RenderPassDX.h" +#include "CommandQueueDX.h" +#include "ContextDX.h" +#include "DeviceDX.h" + +#include + +#include +#include + +namespace Methane::Graphics +{ + +ParallelRenderCommandList::Ptr ParallelRenderCommandList::Create(CommandQueue& cmd_queue, RenderPass& render_pass) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(cmd_queue), static_cast(render_pass)); +} + +ParallelRenderCommandListDX::ParallelRenderCommandListDX(CommandQueueBase& cmd_buffer, RenderPassBase& render_pass) + : ParallelRenderCommandListBase(cmd_buffer, render_pass) +{ + ITT_FUNCTION_TASK(); + + const wrl::ComPtr& cp_device = GetCommandQueueDX().GetContextDX().GetDeviceDX().GetNativeDevice(); + assert(!!cp_device); +} + +void ParallelRenderCommandListDX::Reset(RenderState& render_state) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::Reset(render_state); + + // Reset pre-command list +} + +void ParallelRenderCommandListDX::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::SetName(name); +} + +void ParallelRenderCommandListDX::Commit(bool present_drawable) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::Commit(present_drawable); + + m_is_committed = true; +} + +CommandQueueDX& ParallelRenderCommandListDX::GetCommandQueueDX() +{ + ITT_FUNCTION_TASK(); + return static_cast(GetCommandQueueBase()); +} + +RenderPassDX& ParallelRenderCommandListDX::GetPassDX() +{ + ITT_FUNCTION_TASK(); + return static_cast(GetPass()); +} + +void ParallelRenderCommandListDX::Execute(uint32_t frame_index) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::Execute(frame_index); + + // NOTE: In DirectX there's no need for tracking command list completion, so it's completed right away + Complete(frame_index); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h new file mode 100644 index 000000000..f740fe1cb --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h @@ -0,0 +1,66 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h +DirectX 12 implementation of the render command list interface. + +******************************************************************************/ + +#pragma once + +#include "RenderPassDX.h" + +#include + +#include +#include + +namespace Methane::Graphics +{ + +namespace wrl = Microsoft::WRL; + +class CommandQueueDX; +class RenderPassDX; + +class ParallelRenderCommandListDX final : public ParallelRenderCommandListBase +{ +public: + ParallelRenderCommandListDX(CommandQueueBase& cmd_buffer, RenderPassBase& render_pass); + + // ParallelRenderCommandList interface + void Reset(RenderState& render_state) override; + + // CommandList interface + void Commit(bool present_drawable) override; + + // CommandListBase interface + void Execute(uint32_t frame_index) override; + + // Object interface + void SetName(const std::string& name) override; + +protected: + CommandQueueDX& GetCommandQueueDX(); + RenderPassDX& GetPassDX(); + + wrl::ComPtr m_cp_command_allocator; + bool m_is_committed = false; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp index 9301854b2..e88a63a0b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp @@ -22,6 +22,7 @@ DirectX 12 implementation of the render command list interface. ******************************************************************************/ #include "RenderCommandListDX.h" +#include "ParallelRenderCommandListDX.h" #include "RenderStateDX.h" #include "RenderPassDX.h" #include "CommandQueueDX.h" @@ -64,8 +65,27 @@ RenderCommandList::Ptr RenderCommandList::Create(CommandQueue& cmd_queue, Render return std::make_shared(static_cast(cmd_queue), static_cast(render_pass)); } +RenderCommandList::Ptr RenderCommandList::Create(ParallelRenderCommandList& parallel_render_command_list) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(parallel_render_command_list)); +} + RenderCommandListDX::RenderCommandListDX(CommandQueueBase& cmd_buffer, RenderPassBase& render_pass) : RenderCommandListBase(cmd_buffer, render_pass) +{ + ITT_FUNCTION_TASK(); + Initialize(); +} + +RenderCommandListDX::RenderCommandListDX(ParallelRenderCommandListBase& parallel_render_command_list) + : RenderCommandListBase(parallel_render_command_list) +{ + ITT_FUNCTION_TASK(); + Initialize(); +} + +void RenderCommandListDX::Initialize() { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h index 9a12e3671..93684a12b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h @@ -42,6 +42,7 @@ class RenderCommandListDX final : public RenderCommandListBase { public: RenderCommandListDX(CommandQueueBase& cmd_buffer, RenderPassBase& render_pass); + RenderCommandListDX(ParallelRenderCommandListBase& parallel_render_command_list); // CommandList interface void PushDebugGroup(const std::string& name) override; @@ -68,6 +69,8 @@ class RenderCommandListDX final : public RenderCommandListBase wrl::ComPtr& GetNativeCommandList4() { return m_cp_command_list_4; } protected: + void Initialize(); + CommandQueueDX& GetCommandQueueDX(); RenderPassDX& GetPassDX(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh index c1f498dee..b867fbf81 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh @@ -42,7 +42,7 @@ public: ParallelRenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass); // ParallelRenderCommandList interface - void Reset() override; + void Reset(RenderState& render_state) override; // CommandList interface void Commit(bool present_drawable) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm index bfea8247b..71f9fa77f 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm @@ -65,7 +65,7 @@ } } -void ParallelRenderCommandListMT::Reset() +void ParallelRenderCommandListMT::Reset(RenderState& render_state) { ITT_FUNCTION_TASK(); if (m_mtl_parallel_render_encoder != nil) @@ -91,7 +91,7 @@ assert(m_mtl_parallel_render_encoder != nil); m_mtl_parallel_render_encoder.label = MacOS::ConvertToNSType(GetName()); - ParallelRenderCommandListBase::Reset(); + ParallelRenderCommandListBase::Reset(render_state); } void ParallelRenderCommandListMT::Commit(bool present_drawable) From 9a870fc7638e30dfe860083c5305931f413b6e2d Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 14 Dec 2019 14:36:02 +0300 Subject: [PATCH 010/129] Parallel render command list interface changes (WIP). --- .../Graphics/ParallelRenderCommandList.h | 3 +- .../Methane/Graphics/RenderCommandList.h | 5 +- .../ParallelRenderCommandListBase.cpp | 48 +++++++++++++++---- .../Graphics/ParallelRenderCommandListBase.h | 11 +++-- .../Graphics/RenderCommandListBase.cpp | 1 + .../Methane/Graphics/RenderCommandListBase.h | 1 + 6 files changed, 55 insertions(+), 14 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h index 995f82eb2..32107c2ec 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h @@ -41,7 +41,8 @@ struct ParallelRenderCommandList : virtual CommandList // ParallelRenderCommandList interface virtual void Reset(RenderState& render_state) = 0; - virtual RenderCommandList::Ptrs CreateRenderCommandLists(uint32_t count) = 0; + virtual void SetParallelCommandListsCount(uint32_t count) = 0; + virtual const RenderCommandList::Ptrs& GetParallelCommandLists() const = 0; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h index f7010d819..817c34687 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h @@ -35,8 +35,9 @@ struct ParallelRenderCommandList; struct RenderCommandList : virtual CommandList { - using Ptr = std::shared_ptr; - using Ptrs = std::vector; + using Ptr = std::shared_ptr; + using Ptrs = std::vector; + using ConstPtrs = std::vector; enum class Primitive { diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp index f2abf80b3..00ab9452c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp @@ -29,6 +29,7 @@ Base implementation of the parallel render command list interface. #include "ProgramBase.h" #include +#include #include @@ -42,22 +43,53 @@ ParallelRenderCommandListBase::ParallelRenderCommandListBase(CommandQueueBase& c ITT_FUNCTION_TASK(); } -RenderPassBase& ParallelRenderCommandListBase::GetPass() +void ParallelRenderCommandListBase::Reset(RenderState& render_state) { ITT_FUNCTION_TASK(); - assert(!!m_sp_pass); - return static_cast(*m_sp_pass); + + Data::ParallelFor(m_parallel_comand_lists.begin(), m_parallel_comand_lists.end(), + [&render_state](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) + { + assert(sp_render_command_list); + sp_render_command_list->Reset(render_state); + }); +} + +void ParallelRenderCommandListBase::Commit(bool present_drawable) +{ + ITT_FUNCTION_TASK(); + + Data::ParallelFor(m_parallel_comand_lists.begin(), m_parallel_comand_lists.end(), + [present_drawable](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) + { + assert(sp_render_command_list); + sp_render_command_list->Commit(present_drawable); + }); } -RenderCommandList::Ptrs ParallelRenderCommandListBase::CreateRenderCommandLists(uint32_t count) +void ParallelRenderCommandListBase::SetParallelCommandListsCount(uint32_t count) { ITT_FUNCTION_TASK(); - RenderCommandList::Ptrs render_command_lists(count); - for(RenderCommandList::Ptr& sp_render_command_list : render_command_lists) + + uint32_t initial_count = static_cast(m_parallel_comand_lists.size()); + if (count < initial_count) { - sp_render_command_list = RenderCommandList::Create(*this); + m_parallel_comand_lists.resize(count); + return; } - return render_command_lists; + + m_parallel_comand_lists.reserve(count); + for(uint32_t cl_index = initial_count; cl_index < count; ++cl_index) + { + m_parallel_comand_lists.emplace_back(RenderCommandList::Create(*this)); + } +} + +RenderPassBase& ParallelRenderCommandListBase::GetPass() +{ + ITT_FUNCTION_TASK(); + assert(!!m_sp_pass); + return static_cast(*m_sp_pass); } } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h index f7b5668a2..897b8296c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h @@ -40,24 +40,29 @@ class ParallelRenderCommandListBase , public CommandListBase { public: - using Ptr = std::shared_ptr; + using Ptr = std::shared_ptr; + using WeakPtr = std::weak_ptr; ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& render_pass); // CommandList interface void PushDebugGroup(const std::string& name) override { throw std::logic_error("Not available for parallel render command list."); } void PopDebugGroup() override { throw std::logic_error("Not available for parallel render command list."); } + void Commit(bool present_drawable) override; // CommandListBase interface void SetResourceBarriers(const ResourceBase::Barriers&) override { } // ParallelRenderCommandList interface - RenderCommandList::Ptrs CreateRenderCommandLists(uint32_t count) override; + void Reset(RenderState& render_state) override; + void SetParallelCommandListsCount(uint32_t count) override; + const RenderCommandList::Ptrs& GetParallelCommandLists() const override { return m_parallel_comand_lists; } RenderPassBase& GetPass(); protected: - const RenderPass::Ptr m_sp_pass; + const RenderPass::Ptr m_sp_pass; + RenderCommandList::Ptrs m_parallel_comand_lists; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp index 444dd91a0..0da5e660f 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp @@ -46,6 +46,7 @@ RenderCommandListBase::RenderCommandListBase(CommandQueueBase& command_queue, Re RenderCommandListBase::RenderCommandListBase(ParallelRenderCommandListBase& parallel_render_command_list) : CommandListBase(static_cast(parallel_render_command_list.GetCommandQueue())) , m_sp_pass(static_cast(parallel_render_command_list.GetPass()).GetPtr()) + , m_wp_parallel_render_command_list(std::static_pointer_cast(parallel_render_command_list.GetPtr())) { ITT_FUNCTION_TASK(); } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h index 8f1e14caa..0b9d11be6 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h @@ -82,6 +82,7 @@ class RenderCommandListBase const RenderPass::Ptr m_sp_pass; DrawingState m_draw_state; + std::weak_ptr m_wp_parallel_render_command_list; }; } // namespace Methane::Graphics From 7797720fcac8acb64882f704984cdef0553a5223 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 14 Dec 2019 20:15:27 +0300 Subject: [PATCH 011/129] Parallel render command list implemented with Metal API, parallel rendering in Asteroids sample enabled on MacOS. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 32 +++++++- Apps/Samples/Asteroids/AsteroidsApp.h | 12 +-- Apps/Samples/Asteroids/AsteroidsArray.cpp | 19 ++++- Apps/Samples/Asteroids/AsteroidsArray.h | 1 + .../Include/Methane/Data/Parallel.hpp | 15 ++++ .../Core/Include/Methane/Graphics/Core.h | 5 +- .../Metal/ParallelRenderCommandListMT.hh | 6 +- .../Metal/ParallelRenderCommandListMT.mm | 2 - .../Graphics/Metal/RenderCommandListMT.hh | 6 +- .../Graphics/Metal/RenderCommandListMT.mm | 36 +++++--- .../ParallelRenderCommandListBase.cpp | 82 ++++++++++++++++--- .../Graphics/ParallelRenderCommandListBase.h | 19 +++-- .../Graphics/RenderCommandListBase.cpp | 2 + .../Methane/Graphics/RenderCommandListBase.h | 2 + .../Include/Methane/Graphics/MeshBuffers.hpp | 31 ++++++- 15 files changed, 217 insertions(+), 53 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 6e3629a9b..09d3543a0 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -27,9 +27,15 @@ Sample demonstrating parallel rendering of the distinct asteroids massive #include #include -#include #include #include +#include + +#ifdef __APPLE__ +#define PARALLEL_RENDERING_ENABLED 1 +#else +#define PARALLEL_RENDERING_ENABLED 0 +#endif namespace Methane::Samples { @@ -170,6 +176,17 @@ void AsteroidsApp::Init() frame.sp_cmd_list = gfx::RenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_screen_pass); frame.sp_cmd_list->SetName(IndexedName("Scene Rendering", frame.index)); +#if PARALLEL_RENDERING_ENABLED + gfx::RenderPass::Settings asteroids_render_pass_settings = frame.sp_screen_pass->GetSettings(); + asteroids_render_pass_settings.color_attachments[0].load_action = gfx::RenderPass::Attachment::LoadAction::Load; + asteroids_render_pass_settings.depth_attachment.load_action = gfx::RenderPass::Attachment::LoadAction::Load; + frame.sp_asteroids_render_pass = gfx::RenderPass::Create(*m_sp_context, asteroids_render_pass_settings); + + frame.sp_parallel_cmd_list = gfx::ParallelRenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_asteroids_render_pass); + frame.sp_parallel_cmd_list->SetParallelCommandListsCount(std::thread::hardware_concurrency()); + frame.sp_parallel_cmd_list->SetName(IndexedName("Parallel Asteroids Rendering", frame.index)); +#endif + // Create uniforms buffer with volatile parameters for the whole scene rendering frame.sp_scene_uniforms_buffer = gfx::Buffer::CreateConstantBuffer(context, scene_uniforms_data_size); frame.sp_scene_uniforms_buffer->SetName(IndexedName("Scene Uniforms Buffer", frame.index)); @@ -267,13 +284,24 @@ void AsteroidsApp::Render() // Asteroids rendering assert(!!m_sp_asteroids_array); - m_sp_asteroids_array->Draw(*frame.sp_cmd_list, frame.asteroids); +#if PARALLEL_RENDERING_ENABLED + frame.sp_cmd_list->Commit(false); + + assert(!!frame.sp_parallel_cmd_list); + m_sp_asteroids_array->Draw(*frame.sp_parallel_cmd_list, frame.asteroids); + frame.sp_parallel_cmd_list->Commit(true); +#else + m_sp_asteroids_array->Draw(*frame.sp_cmd_list, frame.asteroids); frame.sp_cmd_list->Commit(true); +#endif // Execute rendering commands and present frame to screen m_sp_context->GetRenderCommandQueue().Execute({ *frame.sp_cmd_list, +#if PARALLEL_RENDERING_ENABLED + *frame.sp_parallel_cmd_list, +#endif }); m_sp_context->Present(); diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 3a602ec76..311a33bf8 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -36,11 +36,13 @@ namespace pal = Platform; struct AsteroidsFrame final : gfx::AppFrame { - gfx::RenderCommandList::Ptr sp_cmd_list; - gfx::Buffer::Ptr sp_scene_uniforms_buffer; - gfx::MeshBufferBindings skybox; - gfx::MeshBufferBindings planet; - gfx::MeshBufferBindings asteroids; + gfx::RenderPass::Ptr sp_asteroids_render_pass; + gfx::RenderCommandList::Ptr sp_cmd_list; + gfx::ParallelRenderCommandList::Ptr sp_parallel_cmd_list; + gfx::Buffer::Ptr sp_scene_uniforms_buffer; + gfx::MeshBufferBindings skybox; + gfx::MeshBufferBindings planet; + gfx::MeshBufferBindings asteroids; using gfx::AppFrame::AppFrame; }; diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index c6e2a42b8..93e3f01e9 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -350,13 +350,28 @@ void AsteroidsArray::Draw(gfx::RenderCommandList &cmd_list, gfx::MeshBufferBindi assert(buffer_bindings.sp_uniforms_buffer); assert(buffer_bindings.sp_uniforms_buffer->GetDataSize() >= uniforms_buffer_size); buffer_bindings.sp_uniforms_buffer->SetData({ { reinterpret_cast(&GetFinalPassUniforms()), uniforms_buffer_size } }); - + cmd_list.Reset(*m_sp_render_state, "Asteroids rendering"); - + assert(buffer_bindings.resource_bindings_per_instance.size() == m_settings.instance_count); BaseBuffers::Draw(cmd_list, buffer_bindings.resource_bindings_per_instance); } +void AsteroidsArray::Draw(gfx::ParallelRenderCommandList& parallel_cmd_list, gfx::MeshBufferBindings& buffer_bindings) +{ + ITT_FUNCTION_TASK(); + + const Data::Size uniforms_buffer_size = GetUniformsBufferSize(); + assert(buffer_bindings.sp_uniforms_buffer); + assert(buffer_bindings.sp_uniforms_buffer->GetDataSize() >= uniforms_buffer_size); + buffer_bindings.sp_uniforms_buffer->SetData({ { reinterpret_cast(&GetFinalPassUniforms()), uniforms_buffer_size } }); + + parallel_cmd_list.Reset(*m_sp_render_state); + + assert(buffer_bindings.resource_bindings_per_instance.size() == m_settings.instance_count); + BaseBuffers::Draw(parallel_cmd_list, buffer_bindings.resource_bindings_per_instance); +} + uint32_t AsteroidsArray::GetSubsetByInstanceIndex(uint32_t instance_index) const { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index c28d1591c..6579961ff 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -108,6 +108,7 @@ class AsteroidsArray final : protected gfx::TexturedMeshBuffers::value>> +T DivCeilUnsigned(T numerator, T denominator) +{ + return numerator > 0 ? (1 + ((numerator - 1) / denominator)): 0; +} + +template::value>> +T DivCeilSigned(T numerator, T denominator) +{ + std::div_t res = std::div(static_cast(numerator), static_cast(denominator)); + return res.rem ? (res.quot >= 0 ? (res.quot + 1) + : (res.quot - 1)) + : res.quot; +} + } // namespace Methane::Data \ No newline at end of file diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Core.h b/Modules/Graphics/Core/Include/Methane/Graphics/Core.h index a2b677a53..3a03018b9 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Core.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Core.h @@ -28,6 +28,8 @@ Methane graphics core interfaces: all headers under one umbrella. #include "Context.h" #include "Shader.h" #include "Program.h" +#include "RenderState.h" +#include "RenderPass.h" #include "Resource.h" #include "Buffer.h" #include "Texture.h" @@ -35,5 +37,4 @@ Methane graphics core interfaces: all headers under one umbrella. #include "CommandQueue.h" #include "CommandList.h" #include "RenderCommandList.h" -#include "RenderPass.h" -#include "RenderState.h" +#include "ParallelRenderCommandList.h" diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh index b867fbf81..8bf2f8111 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh @@ -39,6 +39,8 @@ class RenderPassMT; class ParallelRenderCommandListMT final : public ParallelRenderCommandListBase { public: + using Ptr = std::shared_ptr; + ParallelRenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass); // ParallelRenderCommandList interface @@ -60,8 +62,8 @@ protected: CommandQueueMT& GetCommandQueueMT() noexcept; RenderPassMT& GetPassMT(); - id m_mtl_cmd_buffer; - id m_mtl_parallel_render_encoder; + id m_mtl_cmd_buffer = nil; + id m_mtl_parallel_render_encoder = nil; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm index 71f9fa77f..37534f985 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm @@ -40,8 +40,6 @@ ParallelRenderCommandListMT::ParallelRenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass) : ParallelRenderCommandListBase(command_queue, render_pass) - , m_mtl_cmd_buffer(nil) - , m_mtl_parallel_render_encoder(nil) { ITT_FUNCTION_TASK(); } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh index a8e8ca554..0036de151 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh @@ -81,9 +81,9 @@ protected: CommandQueueMT& GetCommandQueueMT() noexcept; RenderPassMT& GetPassMT(); - id m_mtl_cmd_buffer; - id m_mtl_render_encoder; - id m_mtl_blit_encoder; + id m_mtl_cmd_buffer = nil; + id m_mtl_render_encoder = nil; + id m_mtl_blit_encoder = nil; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm index 8a78237d6..671883c1d 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm @@ -65,9 +65,6 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit RenderCommandListMT::RenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass) : RenderCommandListBase(command_queue, render_pass) - , m_mtl_cmd_buffer(nil) - , m_mtl_render_encoder(nil) - , m_mtl_blit_encoder(nil) { ITT_FUNCTION_TASK(); } @@ -202,12 +199,12 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit assert(!IsCommitted()); RenderCommandListBase::Commit(present_drawable); - - if (!m_mtl_cmd_buffer || (!m_mtl_render_encoder && !m_mtl_blit_encoder)) - return; - + EndBlitEncoding(); EndRenderEncoding(); + + if (!m_mtl_cmd_buffer || m_is_parallel) + return; if (present_drawable) { @@ -223,6 +220,10 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit RenderCommandListBase::Execute(frame_index); + if (m_is_parallel) + return; + + assert(!!m_mtl_cmd_buffer); [m_mtl_cmd_buffer addCompletedHandler:^(id) { Complete(frame_index); }]; @@ -234,7 +235,7 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit void RenderCommandListMT::InitializeCommandBuffer() { ITT_FUNCTION_TASK(); - if (m_mtl_cmd_buffer != nil) + if (m_is_parallel || m_mtl_cmd_buffer != nil) return; m_mtl_cmd_buffer = [GetCommandQueueMT().GetNativeCommandQueue() commandBuffer]; @@ -253,13 +254,22 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit // NOTE: If command buffer was not created for current frame yet, // then render pass descriptor should be reset with new frame drawable - RenderPassMT& render_pass = GetPassMT(); - MTLRenderPassDescriptor* mtl_render_pass = render_pass.GetNativeDescriptor(m_mtl_cmd_buffer == nil); + MTLRenderPassDescriptor* mtl_render_pass = GetPassMT().GetNativeDescriptor(!m_is_parallel && m_mtl_cmd_buffer == nil); InitializeCommandBuffer(); - - assert(!!mtl_render_pass); - m_mtl_render_encoder = [m_mtl_cmd_buffer renderCommandEncoderWithDescriptor: mtl_render_pass]; + + if (m_is_parallel) + { + ParallelRenderCommandListMT::Ptr sp_parallel_render_cmd_list = std::static_pointer_cast(m_wp_parallel_render_command_list.lock()); + assert(!!sp_parallel_render_cmd_list); + id& mtl_parallel_render_command_encoder = sp_parallel_render_cmd_list->GetNativeParallelRenderEncoder(); + m_mtl_render_encoder = [mtl_parallel_render_command_encoder renderCommandEncoder]; + } + else + { + assert(!!mtl_render_pass); + m_mtl_render_encoder = [m_mtl_cmd_buffer renderCommandEncoderWithDescriptor:mtl_render_pass]; + } assert(m_mtl_render_encoder != nil); m_mtl_render_encoder.label = MacOS::ConvertToNSType(GetName()); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp index 00ab9452c..4761857be 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp @@ -36,6 +36,11 @@ Base implementation of the parallel render command list interface. namespace Methane::Graphics { +inline std::string GetThreadCommandListName(const std::string& name, uint32_t index) +{ + return name + " [Thread " + std::to_string(index) + "]"; +} + ParallelRenderCommandListBase::ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& pass) : CommandListBase(command_queue) , m_sp_pass(pass.GetPtr()) @@ -47,24 +52,24 @@ void ParallelRenderCommandListBase::Reset(RenderState& render_state) { ITT_FUNCTION_TASK(); - Data::ParallelFor(m_parallel_comand_lists.begin(), m_parallel_comand_lists.end(), - [&render_state](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) - { - assert(sp_render_command_list); - sp_render_command_list->Reset(render_state); - }); + for(const RenderCommandList::Ptr& sp_render_command_list : m_parallel_comand_lists) + { + assert(sp_render_command_list); + sp_render_command_list->Reset(render_state); + } } void ParallelRenderCommandListBase::Commit(bool present_drawable) { ITT_FUNCTION_TASK(); - Data::ParallelFor(m_parallel_comand_lists.begin(), m_parallel_comand_lists.end(), - [present_drawable](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) - { - assert(sp_render_command_list); - sp_render_command_list->Commit(present_drawable); - }); + for(const RenderCommandList::Ptr& sp_render_command_list : m_parallel_comand_lists) + { + assert(!!sp_render_command_list); + sp_render_command_list->Commit(false); + } + + CommandListBase::Commit(present_drawable); } void ParallelRenderCommandListBase::SetParallelCommandListsCount(uint32_t count) @@ -78,10 +83,61 @@ void ParallelRenderCommandListBase::SetParallelCommandListsCount(uint32_t count) return; } + const std::string& name = GetName(); m_parallel_comand_lists.reserve(count); - for(uint32_t cl_index = initial_count; cl_index < count; ++cl_index) + for(uint32_t cmd_list_index = initial_count; cmd_list_index < count; ++cmd_list_index) { m_parallel_comand_lists.emplace_back(RenderCommandList::Create(*this)); + if (!name.empty()) + { + m_parallel_comand_lists.back()->SetName(GetThreadCommandListName(name, cmd_list_index)); + } + } +} + +void ParallelRenderCommandListBase::Execute(uint32_t frame_index) +{ + ITT_FUNCTION_TASK(); + + for(const RenderCommandList::Ptr& sp_render_command_list : m_parallel_comand_lists) + { + assert(!!sp_render_command_list); + RenderCommandListBase& metal_render_command_list = static_cast(*sp_render_command_list); + metal_render_command_list.Execute(frame_index); + } + + CommandListBase::Execute(frame_index); +} + +void ParallelRenderCommandListBase::Complete(uint32_t frame_index) +{ + ITT_FUNCTION_TASK(); + + for(const RenderCommandList::Ptr& sp_render_command_list : m_parallel_comand_lists) + { + assert(!!sp_render_command_list); + RenderCommandListBase& metal_render_command_list = static_cast(*sp_render_command_list); + metal_render_command_list.Complete(frame_index); + } + + CommandListBase::Complete(frame_index); +} + +void ParallelRenderCommandListBase::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + CommandListBase::SetName(name); + + if (name.empty()) + return; + + uint32_t render_cmd_list_index = 0; + for(const RenderCommandList::Ptr& sp_render_cmd_list : m_parallel_comand_lists) + { + assert(!!sp_render_cmd_list); + sp_render_cmd_list->SetName(GetThreadCommandListName(name, render_cmd_list_index)); + render_cmd_list_index++; } } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h index 897b8296c..1fdee6c90 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h @@ -45,18 +45,23 @@ class ParallelRenderCommandListBase ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& render_pass); + // ParallelRenderCommandList interface + void Reset(RenderState& render_state) override; + void SetParallelCommandListsCount(uint32_t count) override; + const RenderCommandList::Ptrs& GetParallelCommandLists() const override { return m_parallel_comand_lists; } + + // CommandListBase interface + void SetResourceBarriers(const ResourceBase::Barriers&) override { } + void Execute(uint32_t frame_index) override; + void Complete(uint32_t frame_index) override; + // CommandList interface void PushDebugGroup(const std::string& name) override { throw std::logic_error("Not available for parallel render command list."); } void PopDebugGroup() override { throw std::logic_error("Not available for parallel render command list."); } void Commit(bool present_drawable) override; - // CommandListBase interface - void SetResourceBarriers(const ResourceBase::Barriers&) override { } - - // ParallelRenderCommandList interface - void Reset(RenderState& render_state) override; - void SetParallelCommandListsCount(uint32_t count) override; - const RenderCommandList::Ptrs& GetParallelCommandLists() const override { return m_parallel_comand_lists; } + // Object interface + void SetName(const std::string& name) override; RenderPassBase& GetPass(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp index 0da5e660f..f9ec908f7 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp @@ -38,6 +38,7 @@ namespace Methane::Graphics RenderCommandListBase::RenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& pass) : CommandListBase(command_queue) + , m_is_parallel(false) , m_sp_pass(pass.GetPtr()) { ITT_FUNCTION_TASK(); @@ -45,6 +46,7 @@ RenderCommandListBase::RenderCommandListBase(CommandQueueBase& command_queue, Re RenderCommandListBase::RenderCommandListBase(ParallelRenderCommandListBase& parallel_render_command_list) : CommandListBase(static_cast(parallel_render_command_list.GetCommandQueue())) + , m_is_parallel(true) , m_sp_pass(static_cast(parallel_render_command_list.GetPass()).GetPtr()) , m_wp_parallel_render_command_list(std::static_pointer_cast(parallel_render_command_list.GetPtr())) { diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h index 0b9d11be6..09bf81cd5 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h @@ -80,8 +80,10 @@ class RenderCommandListBase void Reset(); }; + const bool m_is_parallel; const RenderPass::Ptr m_sp_pass; DrawingState m_draw_state; + std::weak_ptr m_wp_parallel_render_command_list; }; diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp index 3fcdab28b..c55fa02e1 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp @@ -30,9 +30,11 @@ Mesh buffers with texture extension structure. #include #include #include +#include #include #include #include +#include #include #include @@ -113,14 +115,14 @@ class MeshBuffers instance_count, start_instance); } - void Draw(RenderCommandList& cmd_list, const MeshBufferBindings::ResourceBindingsArray& instance_resource_bindings) + void Draw(RenderCommandList& cmd_list, const MeshBufferBindings::ResourceBindingsArray& instance_resource_bindings, uint32_t first_instance_index = 0) { ITT_FUNCTION_TASK(); cmd_list.SetVertexBuffers({ GetVertexBuffer() }); Buffer& index_buffer = GetIndexBuffer(); - uint32_t instance_index = 0; + uint32_t instance_index = first_instance_index; for (const Program::ResourceBindings::Ptr& sp_resource_bindings : instance_resource_bindings) { if (!sp_resource_bindings) @@ -141,6 +143,31 @@ class MeshBuffers } } + void Draw(ParallelRenderCommandList& parallel_cmd_list, const MeshBufferBindings::ResourceBindingsArray& instance_resource_bindings) + { + ITT_FUNCTION_TASK(); + + const RenderCommandList::Ptrs& render_cmd_lists = parallel_cmd_list.GetParallelCommandLists(); + const uint32_t instances_count_per_command_list = static_cast(Data::DivCeilUnsigned(instance_resource_bindings.size(), render_cmd_lists.size())); + + Data::ParallelFor(render_cmd_lists.begin(), render_cmd_lists.end(), + [this, &instance_resource_bindings, &instances_count_per_command_list](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) + { + const uint32_t begin_instance_index = instances_count_per_command_list * cl_index; + const uint32_t end_instance_index = std::min(begin_instance_index + instances_count_per_command_list, + static_cast(instance_resource_bindings.size())); + + // TODO: eliminate copying of bindings array slice, pass iterators range instead + const MeshBufferBindings::ResourceBindingsArray instance_resource_bindings_slice( + instance_resource_bindings.begin() + begin_instance_index, + instance_resource_bindings.begin() + end_instance_index + ); + + assert(!!sp_render_command_list); + Draw(*sp_render_command_list, instance_resource_bindings_slice, begin_instance_index); + }); + } + const std::string& GetMeshName() const { return m_mesh_name; } uint32_t GetSubsetsCount() const { return static_cast(m_mesh_subsets.size()); } uint32_t GetInstanceCount() const { return static_cast(m_final_pass_instance_uniforms.size()); } From f3aa680f90046442ad92b1101be4dd2e4665b647 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 15 Dec 2019 17:15:31 +0300 Subject: [PATCH 012/129] Parallel render command list implemented with DirectX 12 API, parallel rendering in Asteroids sample enabled on Windows (not working correctly in Debug build yet). --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 4 -- .../Include/Methane/Graphics/CommandList.h | 7 ++ .../Methane/Graphics/CommandListBase.cpp | 9 ++- .../Methane/Graphics/CommandListBase.h | 4 +- .../Graphics/DirectX12/CommandQueueDX.cpp | 17 ++++- .../Methane/Graphics/DirectX12/DeviceDX.cpp | 2 + .../DirectX12/ParallelRenderCommandListDX.cpp | 64 +++++++++++++++---- .../DirectX12/ParallelRenderCommandListDX.h | 14 ++-- .../DirectX12/RenderCommandListDX.cpp | 27 ++++++-- .../Graphics/DirectX12/RenderCommandListDX.h | 9 ++- .../Graphics/DirectX12/RenderPassDX.cpp | 39 ++++++++--- .../Methane/Graphics/DirectX12/RenderPassDX.h | 8 ++- .../ParallelRenderCommandListBase.cpp | 2 +- .../Graphics/RenderCommandListBase.cpp | 4 +- .../Include/Methane/Graphics/MeshBuffers.hpp | 29 +++++---- 15 files changed, 175 insertions(+), 64 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 09d3543a0..5dbc5924f 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -31,11 +31,7 @@ Sample demonstrating parallel rendering of the distinct asteroids massive #include #include -#ifdef __APPLE__ #define PARALLEL_RENDERING_ENABLED 1 -#else -#define PARALLEL_RENDERING_ENABLED 0 -#endif namespace Methane::Samples { diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/CommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/CommandList.h index ca02c632a..f2db9fdb7 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/CommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/CommandList.h @@ -44,7 +44,14 @@ struct CommandList : virtual Object using Ref = std::reference_wrapper; using Refs = std::vector; + enum class Type : uint32_t + { + RenderCommandList = 0u, + ParallelRenderCommandList, + }; + // CommandList interface + virtual Type GetType() const = 0; virtual void PushDebugGroup(const std::string& name) = 0; virtual void PopDebugGroup() = 0; virtual void SetResourceBindings(Program::ResourceBindings& resource_bindings) = 0; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.cpp index 99724d3de..4755aaebe 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.cpp @@ -48,8 +48,9 @@ std::string CommandListBase::GetStateName(State state) return "Undefined"; } -CommandListBase::CommandListBase(CommandQueueBase& command_queue) +CommandListBase::CommandListBase(CommandQueueBase& command_queue, Type type) : m_sp_command_queue(command_queue.GetPtr()) + , m_type(type) { ITT_FUNCTION_TASK(); } @@ -78,7 +79,11 @@ void CommandListBase::Commit(bool /*present_drawable*/) } // Keep command list from destruction until it's execution is completed - m_sp_self = shared_from_this(); + // if weak_from_this is expired, the command list was created explicitly, without make_shared + if (!weak_from_this().expired()) + { + m_sp_self = shared_from_this(); + } } void CommandListBase::Execute(uint32_t frame_index) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h index d96f192da..c12231be3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h @@ -61,9 +61,10 @@ class CommandListBase Program::ResourceBindings::Ptr sp_resource_bindings; }; - CommandListBase(CommandQueueBase& command_queue); + CommandListBase(CommandQueueBase& command_queue, Type type); // CommandList interface + Type GetType() const override { return m_type; } void SetResourceBindings(Program::ResourceBindings& resource_bindings) override; void Commit(bool present_drawable) override; CommandQueue& GetCommandQueue() override; @@ -97,6 +98,7 @@ class CommandListBase using ExecutingOnFrame = std::map; + const Type m_type; Ptr m_sp_self; uint32_t m_committed_frame_index = 0; State m_state = State::Pending; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/CommandQueueDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/CommandQueueDX.cpp index f1a91dc6d..c6e7bc113 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/CommandQueueDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/CommandQueueDX.cpp @@ -25,6 +25,7 @@ DirectX 12 implementation of the command queue interface. #include "ContextDX.h" #include "DeviceDX.h" #include "RenderCommandListDX.h" +#include "ParallelRenderCommandListDX.h" #include #include @@ -85,8 +86,20 @@ CommandQueueDX::D3D12CommandLists CommandQueueDX::GetNativeCommandLists(const Co dx_command_lists.reserve(command_list_refs.size()); for (const CommandList::Ref& command_list_ref : command_list_refs) { - RenderCommandListDX& dx_command_list = dynamic_cast(command_list_ref.get()); - dx_command_lists.push_back(dx_command_list.GetNativeCommandList().Get()); + CommandListBase& command_list = dynamic_cast(command_list_ref.get()); + switch (command_list.GetType()) + { + case CommandList::Type::RenderCommandList: + { + dx_command_lists.push_back(static_cast(command_list).GetNativeCommandList().Get()); + } break; + + case CommandList::Type::ParallelRenderCommandList: + { + const D3D12CommandLists dx_parallel_command_lists = static_cast(command_list).GetNativeCommandLists(); + dx_command_lists.insert(dx_command_lists.end(), dx_parallel_command_lists.begin(), dx_parallel_command_lists.end()); + } break; + } } return dx_command_lists; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp index 6cb7a5404..452488f89 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp @@ -173,6 +173,7 @@ void SystemDX::RegisterAdapterChangeEvent() ThrowIfFailed(HRESULT_FROM_WIN32(GetLastError())); } + assert(!!cp_factory7); ThrowIfFailed(cp_factory7->RegisterAdaptersChangedEvent(m_adapter_change_event, &m_adapter_change_registration_cookie)); } @@ -185,6 +186,7 @@ void SystemDX::UnregisterAdapterChangeEvent() !SUCCEEDED(m_cp_factory->QueryInterface(IID_PPV_ARGS(&cp_factory7)))) return; + assert(!!cp_factory7); ThrowIfFailed(cp_factory7->UnregisterAdaptersChangedEvent(m_adapter_change_registration_cookie)); m_adapter_change_registration_cookie = 0; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp index a94eec4d8..fa23e16a7 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp @@ -44,9 +44,15 @@ ParallelRenderCommandList::Ptr ParallelRenderCommandList::Create(CommandQueue& c ParallelRenderCommandListDX::ParallelRenderCommandListDX(CommandQueueBase& cmd_buffer, RenderPassBase& render_pass) : ParallelRenderCommandListBase(cmd_buffer, render_pass) + , m_begining_command_list(cmd_buffer, render_pass) + , m_ending_command_list(cmd_buffer, render_pass) { ITT_FUNCTION_TASK(); + // Native D3D12 render-pass usage is disabled to do the render target setup and clears + // in "begin" command list once before parallel rendering + GetPassDX().SetNativeRenderPassUsage(false); + const wrl::ComPtr& cp_device = GetCommandQueueDX().GetContextDX().GetDeviceDX().GetNativeDevice(); assert(!!cp_device); } @@ -55,15 +61,21 @@ void ParallelRenderCommandListDX::Reset(RenderState& render_state) { ITT_FUNCTION_TASK(); - ParallelRenderCommandListBase::Reset(render_state); + // Render pass is begun in "beginning" command list only, + // but it will be ended in the "ending" command list on commit of the parallel CL + m_begining_command_list.Reset(render_state, ""); // begins render pass + m_ending_command_list.ResetNative(render_state); // only resets native command lists - // Reset pre-command list + ParallelRenderCommandListBase::Reset(render_state); } void ParallelRenderCommandListDX::SetName(const std::string& name) { ITT_FUNCTION_TASK(); + m_begining_command_list.SetName(name + " [Beginning]"); + m_ending_command_list.SetName(name + " [Ending]"); + ParallelRenderCommandListBase::SetName(name); } @@ -71,31 +83,57 @@ void ParallelRenderCommandListDX::Commit(bool present_drawable) { ITT_FUNCTION_TASK(); - ParallelRenderCommandListBase::Commit(present_drawable); + // Render pass was begun in "beginning" command list, + // but it is ended in "ending" command list only + m_ending_command_list.Commit(false); // ends render pass + m_begining_command_list.Commit(false); - m_is_committed = true; + ParallelRenderCommandListBase::Commit(present_drawable); } -CommandQueueDX& ParallelRenderCommandListDX::GetCommandQueueDX() +void ParallelRenderCommandListDX::Execute(uint32_t frame_index) { ITT_FUNCTION_TASK(); - return static_cast(GetCommandQueueBase()); + + m_begining_command_list.Execute(frame_index); + + ParallelRenderCommandListBase::Execute(frame_index); + + m_ending_command_list.Execute(frame_index); + + // NOTE: In DirectX there's no need for tracking command list completion, so it's completed right away + CommandListBase::Complete(frame_index); } -RenderPassDX& ParallelRenderCommandListDX::GetPassDX() +ParallelRenderCommandListDX::D3D12CommandLists ParallelRenderCommandListDX::GetNativeCommandLists() const { ITT_FUNCTION_TASK(); - return static_cast(GetPass()); + + D3D12CommandLists dx_command_lists; + dx_command_lists.reserve(m_parallel_comand_lists.size() + 2); // 2 command lists reserved for beginning and ending + dx_command_lists.push_back(m_begining_command_list.GetNativeCommandList().Get()); + + for (const RenderCommandList::Ptr& sp_command_list : m_parallel_comand_lists) + { + assert(!!sp_command_list); + RenderCommandListDX& dx_command_list = static_cast(*sp_command_list); + dx_command_lists.push_back(dx_command_list.GetNativeCommandList().Get()); + } + + dx_command_lists.push_back(m_ending_command_list.GetNativeCommandList().Get()); + return dx_command_lists; } -void ParallelRenderCommandListDX::Execute(uint32_t frame_index) +CommandQueueDX& ParallelRenderCommandListDX::GetCommandQueueDX() { ITT_FUNCTION_TASK(); - - ParallelRenderCommandListBase::Execute(frame_index); + return static_cast(GetCommandQueueBase()); +} - // NOTE: In DirectX there's no need for tracking command list completion, so it's completed right away - Complete(frame_index); +RenderPassDX& ParallelRenderCommandListDX::GetPassDX() +{ + ITT_FUNCTION_TASK(); + return static_cast(GetPass()); } } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h index f740fe1cb..4b6e774a4 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h @@ -24,19 +24,14 @@ DirectX 12 implementation of the render command list interface. #pragma once #include "RenderPassDX.h" +#include "RenderCommandListDX.h" #include -#include -#include - namespace Methane::Graphics { -namespace wrl = Microsoft::WRL; - class CommandQueueDX; -class RenderPassDX; class ParallelRenderCommandListDX final : public ParallelRenderCommandListBase { @@ -55,12 +50,15 @@ class ParallelRenderCommandListDX final : public ParallelRenderCommandListBase // Object interface void SetName(const std::string& name) override; + using D3D12CommandLists = std::vector; + D3D12CommandLists GetNativeCommandLists() const; + protected: CommandQueueDX& GetCommandQueueDX(); RenderPassDX& GetPassDX(); - wrl::ComPtr m_cp_command_allocator; - bool m_is_committed = false; + RenderCommandListDX m_begining_command_list; + RenderCommandListDX m_ending_command_list; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp index e88a63a0b..d890ae419 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp @@ -97,10 +97,8 @@ void RenderCommandListDX::Initialize() m_cp_command_list.As(&m_cp_command_list_4); } -void RenderCommandListDX::Reset(RenderState& render_state, const std::string& debug_group) +void RenderCommandListDX::ResetNative(RenderState& render_state) { - ITT_FUNCTION_TASK(); - assert(m_cp_command_list); RenderStateDX& dx_state = static_cast(render_state); @@ -111,11 +109,23 @@ void RenderCommandListDX::Reset(RenderState& render_state, const std::string& de ThrowIfFailed(m_cp_command_allocator->Reset()); ThrowIfFailed(m_cp_command_list->Reset(m_cp_command_allocator.Get(), dx_state.GetNativePipelineState().Get())); } +} + +void RenderCommandListDX::Reset(RenderState& render_state, const std::string& debug_group) +{ + ITT_FUNCTION_TASK(); + + ResetNative(render_state); RenderCommandListBase::Reset(render_state, debug_group); RenderPassDX& pass_dx = GetPassDX(); - if (!pass_dx.IsBegun()) + if (m_is_parallel) + { + pass_dx.SetNativeDescriptorHeaps(*this); + pass_dx.SetNativeRenderTargets(*this); + } + else if (!pass_dx.IsBegun()) { pass_dx.Begin(*this); } @@ -234,10 +244,13 @@ void RenderCommandListDX::Commit(bool present_drawable) { ITT_FUNCTION_TASK(); - RenderPassDX& pass_dx = GetPassDX(); - if (pass_dx.IsBegun()) + if (!m_is_parallel) { - pass_dx.End(*this); + RenderPassDX& pass_dx = GetPassDX(); + if (pass_dx.IsBegun()) + { + pass_dx.End(*this); + } } RenderCommandListBase::Commit(present_drawable); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h index 93684a12b..3dfac6e33 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h @@ -53,6 +53,8 @@ class RenderCommandListDX final : public RenderCommandListBase void SetResourceBarriers(const ResourceBase::Barriers& resource_barriers) override; void Execute(uint32_t frame_index) override; + void ResetNative(RenderState& render_state); + // RenderCommandList interface void Reset(RenderState& render_state, const std::string& debug_group) override; void SetVertexBuffers(const Buffer::Refs& vertex_buffers) override; @@ -65,8 +67,11 @@ class RenderCommandListDX final : public RenderCommandListBase // Object interface void SetName(const std::string& name) override; - wrl::ComPtr& GetNativeCommandList() { return m_cp_command_list; } - wrl::ComPtr& GetNativeCommandList4() { return m_cp_command_list_4; } + const wrl::ComPtr& GetNativeCommandList() const { return m_cp_command_list; } + wrl::ComPtr& GetNativeCommandList() { return m_cp_command_list; } + + const wrl::ComPtr& GetNativeCommandList4() const { return m_cp_command_list_4; } + wrl::ComPtr& GetNativeCommandList4() { return m_cp_command_list_4; } protected: void Initialize(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp index b68d3a586..ed91e6b1b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp @@ -288,18 +288,16 @@ void RenderPassDX::Begin(RenderCommandListBase& command_list) RenderCommandListDX& command_list_dx = static_cast(command_list); wrl::ComPtr& cp_dx_command_list = command_list_dx.GetNativeCommandList(); - // Set descriptor heaps - const std::vector descritor_heaps = GetNativeDescriptorHeaps(); - if (!descritor_heaps.empty()) - { - cp_dx_command_list->SetDescriptorHeaps(static_cast(descritor_heaps.size()), descritor_heaps.data()); - } + SetNativeDescriptorHeaps(command_list_dx); // Set RT transition barriers command_list.SetResourceTransitionBarriers(GetColorAttachmentResources(), ResourceBase::State::Present, ResourceBase::State::RenderTarget); wrl::ComPtr& cp_dx_command_list_4 = command_list_dx.GetNativeCommandList4(); - m_is_native_render_pass_available = !!cp_dx_command_list_4; + if (!m_is_native_render_pass_available.has_value() || m_is_native_render_pass_available.value()) + { + m_is_native_render_pass_available = !!cp_dx_command_list_4; + } if (m_is_native_render_pass_available.value()) { @@ -313,9 +311,7 @@ void RenderPassDX::Begin(RenderCommandListBase& command_list) else { // Set render targets - const std::vector rt_cpu_handles = GetNativeRenderTargetCPUHandles(); - const D3D12_CPU_DESCRIPTOR_HANDLE* p_depth_stencil_cpu_handle = GetNativeDepthStencilCPUHandle(); - cp_dx_command_list->OMSetRenderTargets(static_cast(rt_cpu_handles.size()), rt_cpu_handles.data(), FALSE, p_depth_stencil_cpu_handle); + SetNativeRenderTargets(command_list_dx); // Clear render targets for (const RenderPassDX::RTClearInfo& rt_clear : m_rt_clear_infos) @@ -348,6 +344,29 @@ void RenderPassDX::End(RenderCommandListBase& command_list) RenderPassBase::End(command_list); } +void RenderPassDX::SetNativeRenderPassUsage(bool use_native_render_pass) +{ + ITT_FUNCTION_TASK(); + + m_is_native_render_pass_available = use_native_render_pass; +} + +void RenderPassDX::SetNativeDescriptorHeaps(RenderCommandListDX& dx_command_list) const +{ + const std::vector descritor_heaps = GetNativeDescriptorHeaps(); + if (descritor_heaps.empty()) + return; + + dx_command_list.GetNativeCommandList()->SetDescriptorHeaps(static_cast(descritor_heaps.size()), descritor_heaps.data()); +} + +void RenderPassDX::SetNativeRenderTargets(RenderCommandListDX& dx_command_list) +{ + const std::vector rt_cpu_handles = GetNativeRenderTargetCPUHandles(); + const D3D12_CPU_DESCRIPTOR_HANDLE* p_depth_stencil_cpu_handle = GetNativeDepthStencilCPUHandle(); + dx_command_list.GetNativeCommandList()->OMSetRenderTargets(static_cast(rt_cpu_handles.size()), rt_cpu_handles.data(), FALSE, p_depth_stencil_cpu_handle); +} + std::vector RenderPassDX::GetNativeDescriptorHeaps() const { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h index 5212d8e6b..266ed0a2e 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h @@ -47,6 +47,12 @@ class RenderPassDX : public RenderPassBase void Begin(RenderCommandListBase& command_list) override; void End(RenderCommandListBase& command_list) override; + // Allows to disable native D3D12 render-pass feature usage, + // but enabling does not guarantee that it will be used (it depends on OS version and API availability) + void SetNativeRenderPassUsage(bool use_native_render_pass); + void SetNativeDescriptorHeaps(RenderCommandListDX& dx_command_list) const; + void SetNativeRenderTargets(RenderCommandListDX& dx_command_list); + std::vector GetNativeDescriptorHeaps() const; std::vector GetNativeRenderTargetCPUHandles() const; const D3D12_CPU_DESCRIPTOR_HANDLE* GetNativeDepthStencilCPUHandle(); @@ -96,7 +102,7 @@ class RenderPassDX : public RenderPassBase std::optional m_depth_stencil_desc; D3D12_RENDER_PASS_FLAGS m_pass_flags = D3D12_RENDER_PASS_FLAG_NONE; - // Fallback to input assember setup + // Fallback to input assembler setup std::vector m_rt_clear_infos; DSClearInfo m_ds_clear_info; D3D12_CPU_DESCRIPTOR_HANDLE m_depth_stencil_cpu_handle = {}; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp index 4761857be..595ff57ee 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp @@ -42,7 +42,7 @@ inline std::string GetThreadCommandListName(const std::string& name, uint32_t in } ParallelRenderCommandListBase::ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& pass) - : CommandListBase(command_queue) + : CommandListBase(command_queue, Type::ParallelRenderCommandList) , m_sp_pass(pass.GetPtr()) { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp index f9ec908f7..5b1e77450 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp @@ -37,7 +37,7 @@ namespace Methane::Graphics { RenderCommandListBase::RenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& pass) - : CommandListBase(command_queue) + : CommandListBase(command_queue, Type::RenderCommandList) , m_is_parallel(false) , m_sp_pass(pass.GetPtr()) { @@ -45,7 +45,7 @@ RenderCommandListBase::RenderCommandListBase(CommandQueueBase& command_queue, Re } RenderCommandListBase::RenderCommandListBase(ParallelRenderCommandListBase& parallel_render_command_list) - : CommandListBase(static_cast(parallel_render_command_list.GetCommandQueue())) + : CommandListBase(static_cast(parallel_render_command_list.GetCommandQueue()), Type::RenderCommandList) , m_is_parallel(true) , m_sp_pass(static_cast(parallel_render_command_list.GetPass()).GetPtr()) , m_wp_parallel_render_command_list(std::static_pointer_cast(parallel_render_command_list.GetPtr())) diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp index c55fa02e1..f514c1fee 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp @@ -116,18 +116,30 @@ class MeshBuffers } void Draw(RenderCommandList& cmd_list, const MeshBufferBindings::ResourceBindingsArray& instance_resource_bindings, uint32_t first_instance_index = 0) + { + Draw(cmd_list, instance_resource_bindings.begin(), instance_resource_bindings.end(), first_instance_index); + } + + void Draw(RenderCommandList& cmd_list, + const MeshBufferBindings::ResourceBindingsArray::const_iterator& instance_resource_bindings_begin, + const MeshBufferBindings::ResourceBindingsArray::const_iterator& instance_resource_bindings_end, + uint32_t first_instance_index = 0) { ITT_FUNCTION_TASK(); cmd_list.SetVertexBuffers({ GetVertexBuffer() }); Buffer& index_buffer = GetIndexBuffer(); - uint32_t instance_index = first_instance_index; - for (const Program::ResourceBindings::Ptr& sp_resource_bindings : instance_resource_bindings) + for (MeshBufferBindings::ResourceBindingsArray::const_iterator instance_resource_bindings_it = instance_resource_bindings_begin; + instance_resource_bindings_it != instance_resource_bindings_end; + ++instance_resource_bindings_it) { + const Program::ResourceBindings::Ptr& sp_resource_bindings = *instance_resource_bindings_it; + if (!sp_resource_bindings) throw std::invalid_argument("Can not set Null resource bindings"); + const uint32_t instance_index = first_instance_index + std::distance(instance_resource_bindings_begin, instance_resource_bindings_it); const uint32_t subset_index = GetSubsetByInstanceIndex(instance_index); assert(subset_index < m_mesh_subsets.size()); @@ -138,8 +150,6 @@ class MeshBuffers mesh_subset.indices.count, mesh_subset.indices.offset, mesh_subset.indices_adjusted ? 0 : mesh_subset.vertices.offset, 1, 0); - - instance_index++; } } @@ -157,14 +167,11 @@ class MeshBuffers const uint32_t end_instance_index = std::min(begin_instance_index + instances_count_per_command_list, static_cast(instance_resource_bindings.size())); - // TODO: eliminate copying of bindings array slice, pass iterators range instead - const MeshBufferBindings::ResourceBindingsArray instance_resource_bindings_slice( - instance_resource_bindings.begin() + begin_instance_index, - instance_resource_bindings.begin() + end_instance_index - ); - assert(!!sp_render_command_list); - Draw(*sp_render_command_list, instance_resource_bindings_slice, begin_instance_index); + Draw(*sp_render_command_list, + instance_resource_bindings.begin() + begin_instance_index, + instance_resource_bindings.begin() + end_instance_index, + begin_instance_index); }); } From 28d8b015922f00cd7ac16a80ecf70b05d07a0697 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 15 Dec 2019 20:08:35 +0300 Subject: [PATCH 013/129] Improved ParallelFor implementation and parallized asteroid updates. Increased number of asteroids in sample. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 10 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 58 +++++---- .../Include/Methane/Data/Parallel.hpp | 115 +++++++++++------- .../Include/Methane/Graphics/MeshBuffers.hpp | 6 +- .../Sources/Methane/Graphics/ImageLoader.cpp | 2 +- 5 files changed, 110 insertions(+), 81 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 5dbc5924f..418aa2008 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -74,16 +74,16 @@ AsteroidsApp::AsteroidsApp() { // ================ m_view_camera, // - view_camera m_scene_scale, // - scale - 2000u, // - instance_count - 300u, // - unique_mesh_count + 10000u, // - instance_count + 700u, // - unique_mesh_count 3u, // - subdivisions_count - 10u, // - textures_count + 30u, // - textures_count { 256u, 256u }, // - texture_dimensions 1123u, // - random_seed 13.f, // - orbit_radius_ratio 4.f, // - disc_radius_ratio - 0.05f, // - min_asteroid_scale_ratio - 0.5f, // - max_asteroid_scale_ratio + 0.03f, // - min_asteroid_scale_ratio + 0.3f, // - max_asteroid_scale_ratio }) { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 93e3f01e9..078e5def7 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -140,7 +140,7 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) std::uniform_int_distribution colors_distribution(0, static_cast(Asteroid::color_schema_size - 1)); std::uniform_real_distribution scale_proportion_distribution(0.8f, 1.2f); std::uniform_real_distribution spin_velocity_distribution(-2.f, 2.f); - std::uniform_real_distribution orbit_velocity_distribution(10.f, 30.f); + std::uniform_real_distribution orbit_velocity_distribution(3.f, 10.f); std::normal_distribution orbit_radius_distribution(orbit_radius, 0.6f * disc_radius); std::normal_distribution orbit_height_distribution(0.0f, 0.4f * disc_radius); @@ -306,38 +306,42 @@ void AsteroidsArray::Resize(const gfx::FrameSize &frame_size) m_sp_render_state->SetScissorRects({ gfx::GetFrameScissorRect(frame_size) }); } -bool AsteroidsArray::Update(double elapsed_seconds, double delta_seconds) +bool AsteroidsArray::Update(double /*elapsed_seconds*/, double delta_seconds) { ITT_FUNCTION_TASK(); gfx::Matrix44f scene_view_matrix, scene_proj_matrix; m_settings.view_camera.GetViewProjMatrices(scene_view_matrix, scene_proj_matrix); - for(Asteroid::Parameters& asteroid_parameters : m_sp_content_state->parameters) - { - asteroid_parameters.spin_angle_rad += cml::constants::pi() * asteroid_parameters.spin_speed * static_cast(delta_seconds); - asteroid_parameters.orbit_angle_rad += cml::constants::pi() * asteroid_parameters.orbit_speed * static_cast(delta_seconds); - - gfx::Matrix44f spin_rotation_matrix; - cml::matrix_rotation_axis_angle(spin_rotation_matrix, asteroid_parameters.spin_axis, asteroid_parameters.spin_angle_rad); - - gfx::Matrix44f orbit_rotation_matrix; - cml::matrix_rotation_world_y(orbit_rotation_matrix, asteroid_parameters.orbit_angle_rad); - - gfx::Matrix44f model_matrix = asteroid_parameters.scale_matrix * spin_rotation_matrix * asteroid_parameters.translation_matrix * orbit_rotation_matrix; - - SetFinalPassUniforms( - AsteroidUniforms - { - std::move(model_matrix), - model_matrix * scene_view_matrix * scene_proj_matrix, - asteroid_parameters.colors.deep, - asteroid_parameters.colors.shallow, - asteroid_parameters.depth_range - }, - asteroid_parameters.index - ); - } + Data::ParallelFor(m_sp_content_state->parameters.begin(), m_sp_content_state->parameters.end(), + [&](Asteroid::Parameters& asteroid_parameters, Data::Index) + { + ITT_FUNCTION_TASK(); + + asteroid_parameters.spin_angle_rad += cml::constants::pi() * asteroid_parameters.spin_speed * static_cast(delta_seconds); + asteroid_parameters.orbit_angle_rad += cml::constants::pi() * asteroid_parameters.orbit_speed * static_cast(delta_seconds); + + gfx::Matrix44f spin_rotation_matrix; + cml::matrix_rotation_axis_angle(spin_rotation_matrix, asteroid_parameters.spin_axis, asteroid_parameters.spin_angle_rad); + + gfx::Matrix44f orbit_rotation_matrix; + cml::matrix_rotation_world_y(orbit_rotation_matrix, asteroid_parameters.orbit_angle_rad); + + gfx::Matrix44f model_matrix = asteroid_parameters.scale_matrix * spin_rotation_matrix * asteroid_parameters.translation_matrix * orbit_rotation_matrix; + + SetFinalPassUniforms( + AsteroidUniforms + { + std::move(model_matrix), + model_matrix * scene_view_matrix * scene_proj_matrix, + asteroid_parameters.colors.deep, + asteroid_parameters.colors.shallow, + asteroid_parameters.depth_range + }, + asteroid_parameters.index + ); + } + ); return true; } diff --git a/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp b/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp index 1faf3f1ce..6cdc9bc72 100644 --- a/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp +++ b/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp @@ -32,62 +32,102 @@ Data parallel processing primitives. namespace Methane::Data { -template::value_type> -void ParallelFor(const Iterator& begin_it, const Iterator& end_it, - std::function&& body_function) +template +std::enable_if_t::value, T> DivCeil(T numerator, T denominator) { - ITT_FUNCTION_TASK(); + return numerator > 0 ? (1 + ((numerator - 1) / denominator)) : 0; +} - std::vector> futures; - futures.reserve(std::distance(begin_it, end_it)); +template +std::enable_if_t::value, T> DivCeil(T numerator, T denominator) +{ + std::div_t res = std::div(static_cast(numerator), static_cast(denominator)); + return res.rem ? (res.quot >= 0 ? (res.quot + 1) : (res.quot - 1)) + : res.quot; +} - for (Iterator it = begin_it; it != end_it; ++it) - { - const Index item_index = static_cast(std::distance(begin_it, it)); - futures.emplace_back(std::async(std::launch::async, body_function, std::ref(*it), item_index)); - } +template +struct IteratorFunction +{ + using type = std::function; +}; - for(const std::future& future : futures) - { - future.wait(); - }; -} +#if 0 // TODO: fix or remove experimental code + +template::iterator_category>> +struct is_const_iterator +{ + static constexpr bool value = std::is_const::value_type>::value; +}; + +template +struct IteratorFunction::value, const typename std::iterator_traits::value_type>>; + +template +struct IteratorFunction::value, typename std::iterator_traits::value_type>>; -template::value_type> -void ParallelFor(const ConstIterator& begin_it, const ConstIterator& end_it, - std::function&& body_function) +#endif + +template +void ParallelFor(const Iterator& begin_it, const Iterator& end_it, + typename IteratorFunction::type&& body_function) { ITT_FUNCTION_TASK(); + const size_t items_count = std::distance(begin_it, end_it); + const size_t hw_theads_count = std::thread::hardware_concurrency(); + const size_t chunk_size = Data::DivCeil(items_count, hw_theads_count); + std::vector> futures; - futures.reserve(std::distance(begin_it, end_it)); + futures.reserve(items_count); - for (ConstIterator it = begin_it; it != end_it; ++it) + for (size_t chunk_begin_index = 0; chunk_begin_index < items_count; chunk_begin_index += chunk_size) { - const Index item_index = static_cast(std::distance(begin_it, it)); - futures.emplace_back(std::async(std::launch::async, body_function, std::cref(*it), item_index)); + const size_t chunk_end_index = std::min(chunk_begin_index + chunk_size, items_count); + futures.emplace_back( + std::async(std::launch::async, + [&begin_it, chunk_begin_index, chunk_end_index, body_function]() + { + for(size_t index = chunk_begin_index; index < chunk_end_index; ++index) + { + body_function(*(begin_it + index), static_cast(index)); + } + } + ) + ); } - for (const std::future& future : futures) + for(const std::future& future : futures) { future.wait(); }; } -template +template::value>> void ParallelFor(IndexType start_index, IndexType count, std::function&& body_function) { ITT_FUNCTION_TASK(); + const IndexType hw_theads_count = static_cast(std::thread::hardware_concurrency()); + const IndexType chunk_size = Data::DivCeil(count, hw_theads_count); + std::vector> futures; futures.reserve(static_cast(count)); - const IndexType end_index = start_index + count; - for (IndexType index = start_index; index < end_index; ++index) + for (IndexType chunk_begin_index = start_index; chunk_begin_index < count; chunk_begin_index += chunk_size) { - futures.emplace_back(std::async(std::launch::async, body_function, index)); + const IndexType chunk_end_index = std::min(chunk_begin_index + chunk_size, start_index + count); + futures.emplace_back( + std::async(std::launch::async, + [chunk_begin_index, chunk_end_index, body_function]() + { + for (IndexType index = chunk_begin_index; index < chunk_end_index; ++index) + { + body_function(index); + } + } + ) + ); } for (const std::future& future : futures) @@ -96,19 +136,4 @@ void ParallelFor(IndexType start_index, IndexType count, std::function::value>> -T DivCeilUnsigned(T numerator, T denominator) -{ - return numerator > 0 ? (1 + ((numerator - 1) / denominator)): 0; -} - -template::value>> -T DivCeilSigned(T numerator, T denominator) -{ - std::div_t res = std::div(static_cast(numerator), static_cast(denominator)); - return res.rem ? (res.quot >= 0 ? (res.quot + 1) - : (res.quot - 1)) - : res.quot; -} - } // namespace Methane::Data \ No newline at end of file diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp index f514c1fee..029547be1 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp @@ -139,7 +139,7 @@ class MeshBuffers if (!sp_resource_bindings) throw std::invalid_argument("Can not set Null resource bindings"); - const uint32_t instance_index = first_instance_index + std::distance(instance_resource_bindings_begin, instance_resource_bindings_it); + const uint32_t instance_index = first_instance_index + static_cast(std::distance(instance_resource_bindings_begin, instance_resource_bindings_it)); const uint32_t subset_index = GetSubsetByInstanceIndex(instance_index); assert(subset_index < m_mesh_subsets.size()); @@ -158,9 +158,9 @@ class MeshBuffers ITT_FUNCTION_TASK(); const RenderCommandList::Ptrs& render_cmd_lists = parallel_cmd_list.GetParallelCommandLists(); - const uint32_t instances_count_per_command_list = static_cast(Data::DivCeilUnsigned(instance_resource_bindings.size(), render_cmd_lists.size())); + const uint32_t instances_count_per_command_list = static_cast(Data::DivCeil(instance_resource_bindings.size(), render_cmd_lists.size())); - Data::ParallelFor(render_cmd_lists.begin(), render_cmd_lists.end(), + Data::ParallelFor(render_cmd_lists.begin(), render_cmd_lists.end(), [this, &instance_resource_bindings, &instances_count_per_command_list](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) { const uint32_t begin_instance_index = instances_count_per_command_list * cl_index; diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp index b83890e99..5d4febf1e 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp @@ -169,7 +169,7 @@ Texture::Ptr ImageLoader::LoadImagesToTextureCube(Context& context, const CubeFa std::mutex data_mutex; std::vector> face_images_data; face_images_data.reserve(image_paths.size()); - Data::ParallelFor(image_paths.begin(), image_paths.end(), + Data::ParallelFor(image_paths.begin(), image_paths.end(), [&](const std::string& face_image_path, Data::Index face_index) -> void { // NOTE: From 684ec7beba3919f67ff870c3c0d675e4384c1de0 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 16 Dec 2019 21:50:21 +0300 Subject: [PATCH 014/129] Variadic parameters of Asteroids sample depending on HW cores count on target machine for reasonable performance. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 66 +++++++++++++++++-------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 418aa2008..368ad9c55 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -29,6 +29,7 @@ Sample demonstrating parallel rendering of the distinct asteroids massive #include #include +#include #include #define PARALLEL_RENDERING_ENABLED 1 @@ -36,6 +37,31 @@ Sample demonstrating parallel rendering of the distinct asteroids massive namespace Methane::Samples { +template +using ParamValueByCoresCount = std::array; + +template +inline ValueT GetParamValueByCoresCount(const ParamValueByCoresCount& param_values_by_cores_count) +{ + const size_t cores_count = std::thread::hardware_concurrency() / 2; + return param_values_by_cores_count[std::min(cores_count, N - 1)]; +} + +constexpr size_t g_max_cores_count = 11; +static const ParamValueByCoresCount g_instaces_count = { +// [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] + 500u, 1000u, 2000u, 3000u, 4000u, 5000u, 10000u, 15000u, 20000u, 35000u, 50000u, +}; +static const ParamValueByCoresCount g_mesh_count = { + 50u, 70u, 100u, 150u, 200u, 400u, 600u, 800u, 1000u, 1500u, 2000u, +}; +static const ParamValueByCoresCount g_textures_count = { + 5u, 10u, 20u, 30u, 40u, 50u, 60u, 70u, 80u, 90u, 100u +}; +static const ParamValueByCoresCount g_scale_ratio = { + 0.6f, 0.55f, 0.5f, 0.45f, 0.4f, 0.35f, 0.3f, 0.25f, 0.2f, 0.15f, 0.1f +}; + // Common application settings static const std::string g_app_help_text = "Asteroids sample demonstrates parallel rendering of the asteroids field observable with interactive camera."; static const GraphicsApp::Settings g_app_settings = // Application settings: @@ -63,27 +89,27 @@ AsteroidsApp::AsteroidsApp() , m_view_camera(m_animations, gfx::ActionCamera::Pivot::Aim) , m_light_camera(m_view_camera, m_animations, gfx::ActionCamera::Pivot::Aim) , m_scene_scale(15.f) - , m_scene_constants( // Shader constants: - { // ================ - gfx::Color4f(1.f, 1.f, 1.f, 1.f), // - light_color - 1.25f, // - light_power - 0.1f, // - light_ambient_factor - 4.f // - light_specular_factor + , m_scene_constants( // Shader constants: + { // ================ + gfx::Color4f(1.f, 1.f, 1.f, 1.f), // - light_color + 1.25f, // - light_power + 0.1f, // - light_ambient_factor + 4.f // - light_specular_factor }) - , m_asteroids_array_settings( // Asteroids array settings: - { // ================ - m_view_camera, // - view_camera - m_scene_scale, // - scale - 10000u, // - instance_count - 700u, // - unique_mesh_count - 3u, // - subdivisions_count - 30u, // - textures_count - { 256u, 256u }, // - texture_dimensions - 1123u, // - random_seed - 13.f, // - orbit_radius_ratio - 4.f, // - disc_radius_ratio - 0.03f, // - min_asteroid_scale_ratio - 0.3f, // - max_asteroid_scale_ratio + , m_asteroids_array_settings( // Asteroids array settings: + { // ================ + m_view_camera, // - view_camera + m_scene_scale, // - scale + GetParamValueByCoresCount(g_instaces_count), // - instance_count + GetParamValueByCoresCount(g_mesh_count), // - unique_mesh_count + 3u, // - subdivisions_count + GetParamValueByCoresCount(g_textures_count), // - textures_count + { 256u, 256u }, // - texture_dimensions + 1123u, // - random_seed + 13.f, // - orbit_radius_ratio + 4.f, // - disc_radius_ratio + GetParamValueByCoresCount(g_scale_ratio) / 10.f,// - min_asteroid_scale_ratio + GetParamValueByCoresCount(g_scale_ratio), // - max_asteroid_scale_ratio }) { ITT_FUNCTION_TASK(); From 782a9fdcdf0ff3d16a608d17c3f37c89e04bfa5a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 16 Dec 2019 21:50:53 +0300 Subject: [PATCH 015/129] Fixed unused function warning in Release builds on MacOS. --- .../Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm index 7d4246f7e..3714fd547 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm @@ -59,6 +59,7 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept return "Unknown"; } +#ifndef NDEBUG static std::string GetMetalArgumentAccessName(MTLArgumentAccess mtl_arg_access) noexcept { ITT_FUNCTION_TASK(); @@ -71,7 +72,8 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept } return "Unknown"; } - +#endif + Shader::ResourceBinding::Ptr Shader::ResourceBinding::CreateCopy(const ResourceBinding& other_resource_binging) { ITT_FUNCTION_TASK(); From aa7eff430c2524c7f4cc25ace2729b8154eb860b Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 17 Dec 2019 19:43:20 +0300 Subject: [PATCH 016/129] Optimised asteroids rendering on GPU by reduced overdraw via near to far drawing order and reversed depth. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 72 ++++++++++--------- Apps/Samples/Asteroids/AsteroidsApp.h | 1 - Apps/Samples/Asteroids/AsteroidsArray.cpp | 1 + Apps/Samples/Asteroids/AsteroidsArray.h | 1 + Apps/Samples/Asteroids/Planet.cpp | 1 + Apps/Samples/Asteroids/Planet.h | 1 + .../Include/Methane/Graphics/SkyBox.h | 2 + .../Sources/Methane/Graphics/SkyBox.cpp | 3 +- .../Sources/Methane/Graphics/Camera.cpp | 4 +- 9 files changed, 48 insertions(+), 38 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 368ad9c55..dec0481a7 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -76,7 +76,7 @@ static const GraphicsApp::Settings g_app_settings = // Application settings: gfx::PixelFormat::BGRA8Unorm, // - color_format gfx::PixelFormat::Depth32Float, // - depth_stencil_format gfx::Color4f(0.0f, 0.0f, 0.0f, 1.0f), // - clear_color - 1.f, // - clear_depth + 0.f, // - clear_depth 0, // - clear_stencil 3, // - frame_buffers_count true, // - vsync_enabled @@ -107,15 +107,19 @@ AsteroidsApp::AsteroidsApp() { 256u, 256u }, // - texture_dimensions 1123u, // - random_seed 13.f, // - orbit_radius_ratio - 4.f, // - disc_radius_ratio + 4.f, // - disc_radius_ratio GetParamValueByCoresCount(g_scale_ratio) / 10.f,// - min_asteroid_scale_ratio GetParamValueByCoresCount(g_scale_ratio), // - max_asteroid_scale_ratio + true // - depth_reversed }) { ITT_FUNCTION_TASK(); + // NOTE: Near and Far values are swapped in camera parameters (1st value is near = max depth, 2nd value is far = min depth) + // for Reversed-Z buffer values range [ near: 1, far 0], instead of [ near 0, far 1] + // which is used for "from near to far" drawing order for reducing pixels overdraw m_view_camera.SetOrientation({ { 0.f, 60.f, 250.f }, { 0.f, 0.f, 0.f }, { 0.f, 1.f, 0.f } }); - m_view_camera.SetParamters({ 0.01f, 600.f, 90.f }); + m_view_camera.SetParamters({ 600.f /* near = max depth */, 0.01f /*far = min depth*/, 90.f /* FOV */ }); m_view_camera.SetZoomDistanceRange({ 60.f , 400.f }); m_light_camera.SetOrientation({ { -100.f, 120.f, 0.f }, { 0.f, 0.f, 0.f }, { 0.f, 1.f, 0.f } }); @@ -163,18 +167,21 @@ void AsteroidsApp::Init() "Textures/SkyBox/Galaxy/PositiveZ.jpg", "Textures/SkyBox/Galaxy/NegativeZ.jpg" }, - m_scene_scale * 100.f + m_scene_scale * 100.f, + true, true // depth enabled and reversed }); // Create planet m_sp_planet = std::make_shared(context, m_image_loader, Planet::Settings{ m_view_camera, m_light_camera, - "Textures/Planet/Mars.jpg", - gfx::Vector3f(0.f, 0.f, 0.f), - m_scene_scale * 3.f, - 0.1f, - true + "Textures/Planet/Mars.jpg", // texture_path + gfx::Vector3f(0.f, 0.f, 0.f), // position + m_scene_scale * 3.f, // scale + 0.1f, // spin_velocity_rps + true, // depth_reversed + true, // mipmapped + -1.f, // lod_bias }); // Create asteroids array @@ -194,19 +201,14 @@ void AsteroidsApp::Init() // ========= Per-Frame Data ========= for(AsteroidsFrame& frame : m_frames) { +#if PARALLEL_RENDERING_ENABLED + frame.sp_parallel_cmd_list = gfx::ParallelRenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_screen_pass); + frame.sp_parallel_cmd_list->SetParallelCommandListsCount(std::thread::hardware_concurrency()); + frame.sp_parallel_cmd_list->SetName(IndexedName("Parallel Rendering", frame.index)); +#else // Create command list for final FB rendering frame.sp_cmd_list = gfx::RenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_screen_pass); frame.sp_cmd_list->SetName(IndexedName("Scene Rendering", frame.index)); - -#if PARALLEL_RENDERING_ENABLED - gfx::RenderPass::Settings asteroids_render_pass_settings = frame.sp_screen_pass->GetSettings(); - asteroids_render_pass_settings.color_attachments[0].load_action = gfx::RenderPass::Attachment::LoadAction::Load; - asteroids_render_pass_settings.depth_attachment.load_action = gfx::RenderPass::Attachment::LoadAction::Load; - frame.sp_asteroids_render_pass = gfx::RenderPass::Create(*m_sp_context, asteroids_render_pass_settings); - - frame.sp_parallel_cmd_list = gfx::ParallelRenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_asteroids_render_pass); - frame.sp_parallel_cmd_list->SetParallelCommandListsCount(std::thread::hardware_concurrency()); - frame.sp_parallel_cmd_list->SetName(IndexedName("Parallel Asteroids Rendering", frame.index)); #endif // Create uniforms buffer with volatile parameters for the whole scene rendering @@ -294,35 +296,37 @@ void AsteroidsApp::Render() // Upload uniform buffers to GPU frame.sp_scene_uniforms_buffer->SetData({ { reinterpret_cast(&m_scene_uniforms), sizeof(SceneUniforms) } }); - assert(!!frame.sp_cmd_list); - - // Sky-box rendering - assert(!!m_sp_sky_box); - m_sp_sky_box->Draw(*frame.sp_cmd_list, frame.skybox); - - // Planet rendering - assert(!!m_sp_planet); - m_sp_planet->Draw(*frame.sp_cmd_list, frame.planet); - // Asteroids rendering assert(!!m_sp_asteroids_array); #if PARALLEL_RENDERING_ENABLED - frame.sp_cmd_list->Commit(false); - assert(!!frame.sp_parallel_cmd_list); m_sp_asteroids_array->Draw(*frame.sp_parallel_cmd_list, frame.asteroids); - frame.sp_parallel_cmd_list->Commit(true); + gfx::RenderCommandList& render_cmd_list = *frame.sp_parallel_cmd_list->GetParallelCommandLists().back(); + gfx::CommandList& commit_cmd_list = *frame.sp_parallel_cmd_list; #else + assert(!!frame.sp_cmd_list); m_sp_asteroids_array->Draw(*frame.sp_cmd_list, frame.asteroids); - frame.sp_cmd_list->Commit(true); + gfx::RenderCommandList& render_cmd_list = *frame.sp_cmd_list; + gfx::CommandList& commit_cmd_list = *frame.sp_cmd_list; #endif + + // Planet rendering + assert(!!m_sp_planet); + m_sp_planet->Draw(render_cmd_list, frame.planet); + + // Sky-box rendering + assert(!!m_sp_sky_box); + m_sp_sky_box->Draw(render_cmd_list, frame.skybox); + + commit_cmd_list.Commit(true); // Execute rendering commands and present frame to screen m_sp_context->GetRenderCommandQueue().Execute({ - *frame.sp_cmd_list, #if PARALLEL_RENDERING_ENABLED *frame.sp_parallel_cmd_list, +#else + *frame.sp_cmd_list, #endif }); m_sp_context->Present(); diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 311a33bf8..9799713f8 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -36,7 +36,6 @@ namespace pal = Platform; struct AsteroidsFrame final : gfx::AppFrame { - gfx::RenderPass::Ptr sp_asteroids_render_pass; gfx::RenderCommandList::Ptr sp_cmd_list; gfx::ParallelRenderCommandList::Ptr sp_parallel_cmd_list; gfx::Buffer::Ptr sp_scene_uniforms_buffer; diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 078e5def7..84cee67cc 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -235,6 +235,7 @@ AsteroidsArray::AsteroidsArray(gfx::Context& context, Settings settings, Content state_settings.viewports = { gfx::GetFrameViewport(context_settings.frame_size) }; state_settings.scissor_rects = { gfx::GetFrameScissorRect(context_settings.frame_size) }; state_settings.depth.enabled = true; + state_settings.depth.compare = m_settings.depth_reversed ? gfx::Compare::GreaterEqual : gfx::Compare::Less; m_sp_render_state = gfx::RenderState::Create(context, state_settings); m_sp_render_state->SetName("Asteroids Render State"); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index 6579961ff..dce50179d 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -57,6 +57,7 @@ class AsteroidsArray final : protected gfx::TexturedMeshBuffers diff --git a/Apps/Samples/Asteroids/Planet.cpp b/Apps/Samples/Asteroids/Planet.cpp index 3e2ac6919..f044f3d4a 100644 --- a/Apps/Samples/Asteroids/Planet.cpp +++ b/Apps/Samples/Asteroids/Planet.cpp @@ -75,6 +75,7 @@ Planet::Planet(gfx::Context& context, gfx::ImageLoader& image_loader, const Sett state_settings.viewports = { gfx::GetFrameViewport(context_settings.frame_size) }; state_settings.scissor_rects = { gfx::GetFrameScissorRect(context_settings.frame_size) }; state_settings.depth.enabled = true; + state_settings.depth.compare = m_settings.depth_reversed ? gfx::Compare::GreaterEqual : gfx::Compare::Less; m_sp_state = gfx::RenderState::Create(context, state_settings); m_sp_state->SetName("Planet Render State"); diff --git a/Apps/Samples/Asteroids/Planet.h b/Apps/Samples/Asteroids/Planet.h index 0b60d68df..ed4d0cc7f 100644 --- a/Apps/Samples/Asteroids/Planet.h +++ b/Apps/Samples/Asteroids/Planet.h @@ -53,6 +53,7 @@ class Planet gfx::Vector3f position; float scale; float spin_velocity_rps = 0.3f; // (rps = radians per second) + bool depth_reversed = false; bool mipmapped = false; float lod_bias = 0.f; }; diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h index 8e9f44e53..4410c83b9 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h @@ -50,6 +50,8 @@ class SkyBox const Camera& view_camera; ImageLoader::CubeFaceResources face_resources; float scale; + bool depth_enabled = false; + bool depth_reversed = false; bool mipmapped = false; float lod_bias = 0.f; }; diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp index b8abeeb21..056d76e8b 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp @@ -68,7 +68,8 @@ SkyBox::SkyBox(Context& context, ImageLoader& image_loader, const Settings& sett state_settings.sp_program->SetName("Sky-box shading"); state_settings.viewports = { GetFrameViewport(context_settings.frame_size) }; state_settings.scissor_rects = { GetFrameScissorRect(context_settings.frame_size) }; - state_settings.depth.enabled = false; + state_settings.depth.enabled = m_settings.depth_enabled; + state_settings.depth.compare = m_settings.depth_reversed ? Compare::GreaterEqual : Compare::Less; state_settings.rasterizer.is_front_counter_clockwise = true; m_sp_state = RenderState::Create(context, state_settings); diff --git a/Modules/Graphics/Helpers/Sources/Methane/Graphics/Camera.cpp b/Modules/Graphics/Helpers/Sources/Methane/Graphics/Camera.cpp index aac2995e9..b74540a47 100644 --- a/Modules/Graphics/Helpers/Sources/Methane/Graphics/Camera.cpp +++ b/Modules/Graphics/Helpers/Sources/Methane/Graphics/Camera.cpp @@ -79,10 +79,10 @@ void Camera::GetProjMatrix(Matrix44f& out_proj) const noexcept switch (m_projection) { case Projection::Perspective: - cml::matrix_perspective_yfov(out_proj, GetFOVAngleY(), m_aspect_ratio, m_parameters.near_depth, m_parameters.far_depth, m_axis_orientation, cml::ZClip::z_clip_neg_one); + cml::matrix_perspective_yfov(out_proj, GetFOVAngleY(), m_aspect_ratio, m_parameters.near_depth, m_parameters.far_depth, m_axis_orientation, cml::ZClip::z_clip_zero); break; case Projection::Orthogonal: - cml::matrix_orthographic(out_proj, m_screen_size.x(), m_screen_size.y(), m_parameters.near_depth, m_parameters.far_depth, m_axis_orientation, cml::ZClip::z_clip_neg_one); + cml::matrix_orthographic(out_proj, m_screen_size.x(), m_screen_size.y(), m_parameters.near_depth, m_parameters.far_depth, m_axis_orientation, cml::ZClip::z_clip_zero); break; } } From 233514df26cf5003e834c15fe9402485fd158674 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 17 Dec 2019 21:53:17 +0300 Subject: [PATCH 017/129] Depth-write state added. --- .../Graphics/Core/Include/Methane/Graphics/RenderState.h | 1 + .../Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp | 2 +- .../Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm | 2 +- .../Extensions/Sources/Methane/Graphics/SkyBox.cpp | 9 +++++---- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h index 9a6aeac87..a05704ae8 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h @@ -68,6 +68,7 @@ struct RenderState : virtual Object struct Depth { bool enabled = false; + bool write_enabled = true; Compare compare = Compare::Less; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp index 509111c43..4c226de77 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp @@ -156,7 +156,7 @@ void RenderStateDX::Reset(const Settings& settings) // Set depth and stencil state descriptor CD3DX12_DEPTH_STENCIL_DESC depth_stencil_desc(D3D12_DEFAULT); depth_stencil_desc.DepthEnable = m_settings.depth.enabled; - depth_stencil_desc.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; + depth_stencil_desc.DepthWriteMask = m_settings.depth.write_enabled ? D3D12_DEPTH_WRITE_MASK_ALL : D3D12_DEPTH_WRITE_MASK_ZERO; depth_stencil_desc.DepthFunc = TypeConverterDX::CompareFunctionToDX(m_settings.depth.compare); depth_stencil_desc.StencilEnable = m_settings.stencil.enabled; depth_stencil_desc.StencilReadMask = m_settings.stencil.read_mask; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm index 4d407efd3..1634c31c4 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm @@ -175,7 +175,7 @@ static MTLWinding ConvertRasterizerFrontWindingToMetal(bool is_front_counter_clo // Depth-stencil state m_mtl_depth_stencil_state_desc = [[MTLDepthStencilDescriptor alloc] init]; - m_mtl_depth_stencil_state_desc.depthWriteEnabled = m_settings.depth.enabled ? YES : NO; + m_mtl_depth_stencil_state_desc.depthWriteEnabled = m_settings.depth.write_enabled ? YES : NO; m_mtl_depth_stencil_state_desc.depthCompareFunction = TypeConverterMT::CompareFunctionToMetal(m_settings.depth.compare); m_mtl_depth_stencil_state_desc.backFaceStencil = ConvertStencilDescriptorToMetal(m_settings.stencil, false); m_mtl_depth_stencil_state_desc.frontFaceStencil = ConvertStencilDescriptorToMetal(m_settings.stencil, true); diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp index 056d76e8b..5b529f768 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp @@ -66,10 +66,11 @@ SkyBox::SkyBox(Context& context, ImageLoader& image_loader, const Settings& sett context_settings.depth_stencil_format }); state_settings.sp_program->SetName("Sky-box shading"); - state_settings.viewports = { GetFrameViewport(context_settings.frame_size) }; - state_settings.scissor_rects = { GetFrameScissorRect(context_settings.frame_size) }; - state_settings.depth.enabled = m_settings.depth_enabled; - state_settings.depth.compare = m_settings.depth_reversed ? Compare::GreaterEqual : Compare::Less; + state_settings.viewports = { GetFrameViewport(context_settings.frame_size) }; + state_settings.scissor_rects = { GetFrameScissorRect(context_settings.frame_size) }; + state_settings.depth.enabled = m_settings.depth_enabled; + state_settings.depth.write_enabled = false; + state_settings.depth.compare = m_settings.depth_reversed ? Compare::GreaterEqual : Compare::Less; state_settings.rasterizer.is_front_counter_clockwise = true; m_sp_state = RenderState::Create(context, state_settings); From 3eac69e651e613834099b1125b43ae03deb8761f Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 17 Dec 2019 22:16:48 +0300 Subject: [PATCH 018/129] Optional debug group argument added to reset of parallel render command list. --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 +- .../Include/Methane/Graphics/ParallelRenderCommandList.h | 2 +- .../Graphics/DirectX12/ParallelRenderCommandListDX.cpp | 4 ++-- .../Graphics/DirectX12/ParallelRenderCommandListDX.h | 2 +- .../Methane/Graphics/Metal/ParallelRenderCommandListMT.hh | 2 +- .../Methane/Graphics/Metal/ParallelRenderCommandListMT.mm | 4 ++-- .../Methane/Graphics/ParallelRenderCommandListBase.cpp | 6 ++++-- .../Methane/Graphics/ParallelRenderCommandListBase.h | 2 +- 8 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 84cee67cc..a5e047da9 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -371,7 +371,7 @@ void AsteroidsArray::Draw(gfx::ParallelRenderCommandList& parallel_cmd_list, gfx assert(buffer_bindings.sp_uniforms_buffer->GetDataSize() >= uniforms_buffer_size); buffer_bindings.sp_uniforms_buffer->SetData({ { reinterpret_cast(&GetFinalPassUniforms()), uniforms_buffer_size } }); - parallel_cmd_list.Reset(*m_sp_render_state); + parallel_cmd_list.Reset(*m_sp_render_state, "Asteroids Rendering"); assert(buffer_bindings.resource_bindings_per_instance.size() == m_settings.instance_count); BaseBuffers::Draw(parallel_cmd_list, buffer_bindings.resource_bindings_per_instance); diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h index 32107c2ec..1339989c2 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h @@ -40,7 +40,7 @@ struct ParallelRenderCommandList : virtual CommandList static Ptr Create(CommandQueue& command_queue, RenderPass& render_pass); // ParallelRenderCommandList interface - virtual void Reset(RenderState& render_state) = 0; + virtual void Reset(RenderState& render_state, const std::string& debug_group = "") = 0; virtual void SetParallelCommandListsCount(uint32_t count) = 0; virtual const RenderCommandList::Ptrs& GetParallelCommandLists() const = 0; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp index fa23e16a7..f707bf489 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp @@ -57,7 +57,7 @@ ParallelRenderCommandListDX::ParallelRenderCommandListDX(CommandQueueBase& cmd_b assert(!!cp_device); } -void ParallelRenderCommandListDX::Reset(RenderState& render_state) +void ParallelRenderCommandListDX::Reset(RenderState& render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); @@ -66,7 +66,7 @@ void ParallelRenderCommandListDX::Reset(RenderState& render_state) m_begining_command_list.Reset(render_state, ""); // begins render pass m_ending_command_list.ResetNative(render_state); // only resets native command lists - ParallelRenderCommandListBase::Reset(render_state); + ParallelRenderCommandListBase::Reset(render_state, debug_group); } void ParallelRenderCommandListDX::SetName(const std::string& name) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h index 4b6e774a4..20e6d4c20 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h @@ -39,7 +39,7 @@ class ParallelRenderCommandListDX final : public ParallelRenderCommandListBase ParallelRenderCommandListDX(CommandQueueBase& cmd_buffer, RenderPassBase& render_pass); // ParallelRenderCommandList interface - void Reset(RenderState& render_state) override; + void Reset(RenderState& render_state, const std::string& debug_group = "") override; // CommandList interface void Commit(bool present_drawable) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh index 8bf2f8111..d4d8c01c2 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh @@ -44,7 +44,7 @@ public: ParallelRenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass); // ParallelRenderCommandList interface - void Reset(RenderState& render_state) override; + void Reset(RenderState& render_state, const std::string& debug_group = "") override; // CommandList interface void Commit(bool present_drawable) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm index 37534f985..287698b0f 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm @@ -63,7 +63,7 @@ } } -void ParallelRenderCommandListMT::Reset(RenderState& render_state) +void ParallelRenderCommandListMT::Reset(RenderState& render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); if (m_mtl_parallel_render_encoder != nil) @@ -89,7 +89,7 @@ assert(m_mtl_parallel_render_encoder != nil); m_mtl_parallel_render_encoder.label = MacOS::ConvertToNSType(GetName()); - ParallelRenderCommandListBase::Reset(render_state); + ParallelRenderCommandListBase::Reset(render_state, debug_group); } void ParallelRenderCommandListMT::Commit(bool present_drawable) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp index 595ff57ee..c717b9407 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp @@ -48,14 +48,16 @@ ParallelRenderCommandListBase::ParallelRenderCommandListBase(CommandQueueBase& c ITT_FUNCTION_TASK(); } -void ParallelRenderCommandListBase::Reset(RenderState& render_state) +void ParallelRenderCommandListBase::Reset(RenderState& render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); + uint32_t render_command_list_index = 0; for(const RenderCommandList::Ptr& sp_render_command_list : m_parallel_comand_lists) { assert(sp_render_command_list); - sp_render_command_list->Reset(render_state); + const std::string render_debug_group = GetThreadCommandListName(debug_group, render_command_list_index++); + sp_render_command_list->Reset(render_state, render_debug_group); } } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h index 1fdee6c90..0cf10ad70 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h @@ -46,7 +46,7 @@ class ParallelRenderCommandListBase ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& render_pass); // ParallelRenderCommandList interface - void Reset(RenderState& render_state) override; + void Reset(RenderState& render_state, const std::string& debug_group = "") override; void SetParallelCommandListsCount(uint32_t count) override; const RenderCommandList::Ptrs& GetParallelCommandLists() const override { return m_parallel_comand_lists; } From 5d39e87d10562ef83550876d6d7a5550c457a88c Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 17 Dec 2019 23:24:04 +0300 Subject: [PATCH 019/129] Optional color and depth-stencil clearing is supported in Context settings level. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 9 ++++---- .../01-HelloTriangle/HelloTriangleApp.cpp | 3 +-- .../02-TexturedCube/TexturedCubeApp.cpp | 3 +-- .../Tutorials/03-ShadowCube/ShadowCubeApp.cpp | 5 ++--- .../App/Include/Methane/Graphics/App.hpp | 20 +++++++++++------- .../Core/Include/Methane/Graphics/Context.h | 20 +++++++++--------- .../Core/Include/Methane/Graphics/Types.h | 1 + .../Methane/Graphics/DirectX12/TextureDX.cpp | 21 ++++++++++++------- .../Methane/Graphics/DirectX12/TextureDX.h | 2 +- 9 files changed, 48 insertions(+), 36 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index dec0481a7..da9f901e8 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -75,10 +75,9 @@ static const GraphicsApp::Settings g_app_settings = // Application settings: gfx::FrameSize(), // - frame_size gfx::PixelFormat::BGRA8Unorm, // - color_format gfx::PixelFormat::Depth32Float, // - depth_stencil_format - gfx::Color4f(0.0f, 0.0f, 0.0f, 1.0f), // - clear_color - 0.f, // - clear_depth - 0, // - clear_stencil - 3, // - frame_buffers_count + { /* color clearing disabled */ }, // - clear_color + gfx::DepthStencil{ 0.f, 0u }, // - clear_depth_stencil + 3u, // - frame_buffers_count true, // - vsync_enabled }, // true // show_hud_in_window_title @@ -311,6 +310,8 @@ void AsteroidsApp::Render() gfx::CommandList& commit_cmd_list = *frame.sp_cmd_list; #endif + render_cmd_list.PopDebugGroup(); + // Planet rendering assert(!!m_sp_planet); m_sp_planet->Draw(render_cmd_list, frame.planet); diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp index e583651f5..fff52090d 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp @@ -41,8 +41,7 @@ static const GraphicsApp::Settings g_app_settings = // Application settings gfx::PixelFormat::BGRA8Unorm, // - color_format gfx::PixelFormat::Unknown, // - depth_stencil_format gfx::Color4f(0.0f, 0.2f, 0.4f, 1.0f), // - clear_color - 1.f, // - clear_depth - 0, // - clear_stencil + { /* no depth-stencil clearing */ }, // - clear_depth_stencil 3, // - frame_buffers_count true, // - vsync_enabled }, // diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp index 8ffff394b..f3d7f8274 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp @@ -44,8 +44,7 @@ static const GraphicsApp::Settings g_app_settings = // Application settings gfx::PixelFormat::BGRA8Unorm, // - color_format gfx::PixelFormat::Depth32Float, // - depth_stencil_format gfx::Color4f(0.0f, 0.2f, 0.4f, 1.0f), // - clear_color - 1.f, // - clear_depth - 0, // - clear_stencil + gfx::DepthStencil{ 1.f, 0u }, // - clear_depth_stencil 3, // - frame_buffers_count true, // - vsync_enabled }, // diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp index c7f004af0..8300589cc 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp @@ -46,8 +46,7 @@ static const GraphicsApp::Settings g_app_settings = // Application settings gfx::PixelFormat::BGRA8Unorm, // - color_format gfx::PixelFormat::Depth32Float, // - depth_stencil_format gfx::Color4f(0.0f, 0.2f, 0.4f, 1.0f), // - clear_color - 1.f, // - clear_depth - 0, // - clear_stencil + gfx::DepthStencil{ 1.f, 0u }, // - clear_depth_stencil 3, // - frame_buffers_count true, // - vsync_enabled }, // @@ -240,7 +239,7 @@ void ShadowCubeApp::Init() gfx::RenderPass::Attachment::LoadAction::Clear, gfx::RenderPass::Attachment::StoreAction::Store, }, - context_settings.clear_depth + context_settings.clear_depth_stencil->first ), gfx::RenderPass::StencilAttachment(), gfx::RenderPass::Access::ShaderResources diff --git a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp index a3dedbb1f..078bf800f 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp +++ b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp @@ -151,22 +151,28 @@ class App { RenderPass::ColorAttachment( { - frame.sp_screen_texture, - 0, 0, 0, - RenderPass::Attachment::LoadAction::Clear, + frame.sp_screen_texture, 0, 0, 0, + context_settings.clear_color.has_value() + ? RenderPass::Attachment::LoadAction::Clear + : RenderPass::Attachment::LoadAction::DontCare, RenderPass::Attachment::StoreAction::Store, }, context_settings.clear_color + ? context_settings.clear_color.value() + : Color4f() ) }, RenderPass::DepthAttachment( { - m_sp_depth_texture, - 0, 0, 0, - RenderPass::Attachment::LoadAction::Clear, + m_sp_depth_texture, 0, 0, 0, + context_settings.clear_depth_stencil.has_value() + ? RenderPass::Attachment::LoadAction::Clear + : RenderPass::Attachment::LoadAction::DontCare, RenderPass::Attachment::StoreAction::DontCare, }, - context_settings.clear_depth + context_settings.clear_depth_stencil.has_value() + ? context_settings.clear_depth_stencil->first + : 1.f ), RenderPass::StencilAttachment(), m_screen_pass_access diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Context.h b/Modules/Graphics/Core/Include/Methane/Graphics/Context.h index ee8aa4d49..6d7ae5d78 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Context.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Context.h @@ -31,6 +31,7 @@ provides basic multi-frame rendering synchronization and frame presenting APIs. #include #include +#include namespace Methane::Graphics { @@ -46,16 +47,15 @@ struct Context : virtual Object struct Settings { - FrameSize frame_size; - PixelFormat color_format = PixelFormat::BGRA8Unorm; - PixelFormat depth_stencil_format = PixelFormat::Unknown; - Color4f clear_color; - Depth clear_depth = 1.f; - Stencil clear_stencil = 0; - uint32_t frame_buffers_count = 3; - bool vsync_enabled = true; - bool is_full_screen = false; - uint32_t unsync_max_fps = 1000; // MacOS only + FrameSize frame_size; + PixelFormat color_format = PixelFormat::BGRA8Unorm; + PixelFormat depth_stencil_format = PixelFormat::Unknown; + std::optional clear_color; + std::optional clear_depth_stencil; + uint32_t frame_buffers_count = 3; + bool vsync_enabled = true; + bool is_full_screen = false; + uint32_t unsync_max_fps = 1000; // MacOS only }; enum class WaitFor diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h index 3a4b22d77..44ff20d53 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h @@ -170,6 +170,7 @@ class Color4f : public Vector4f using Depth = float; using Stencil = uint8_t; +using DepthStencil = std::pair; enum class PixelFormat { diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp index 83d99167e..b6a3e5e56 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp @@ -63,7 +63,7 @@ Texture::Ptr Texture::CreateRenderTarget(Context& context, const Settings& setti switch (settings.type) { case Texture::Type::FrameBuffer: throw std::logic_error("Frame buffer texture must be created with static method Texture::CreateFrameBuffer."); - case Texture::Type::DepthStencilBuffer: return std::make_shared(static_cast(context), settings, descriptor_by_usage, context.GetSettings().clear_depth, context.GetSettings().clear_stencil); + case Texture::Type::DepthStencilBuffer: return std::make_shared(static_cast(context), settings, descriptor_by_usage, context.GetSettings().clear_depth_stencil); default: return std::make_shared(static_cast(context), settings, descriptor_by_usage); } } @@ -83,7 +83,7 @@ Texture::Ptr Texture::CreateDepthStencilBuffer(Context& context, const Descripto const Context::Settings& context_settings = context.GetSettings(); const Settings texture_settings = Settings::DepthStencilBuffer(context_settings.frame_size, context_settings.depth_stencil_format); - return std::make_shared(static_cast(context), texture_settings, descriptor_by_usage, context_settings.clear_depth, context_settings.clear_stencil); + return std::make_shared(static_cast(context), texture_settings, descriptor_by_usage, context_settings.clear_depth_stencil); } Texture::Ptr Texture::CreateImage(Context& context, const Dimensions& dimensions, uint32_t array_length, PixelFormat pixel_format, bool mipmapped, const DescriptorByUsage& descriptor_by_usage) @@ -135,7 +135,7 @@ void FrameBufferTextureDX::Initialize(uint32_t frame_buffer_index) } template<> -void DepthStencilBufferTextureDX::Initialize(Depth depth_clear_value, Stencil stencil_clear_value) +void DepthStencilBufferTextureDX::Initialize(const std::optional& clear_depth_stencil) { ITT_FUNCTION_TASK(); @@ -155,10 +155,17 @@ void DepthStencilBufferTextureDX::Initialize(Depth depth_clear_value, Stencil st tex_desc.Flags |= D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE; } - // Performance tip: Tell the runtime at resource creation the desired clear value - const DXGI_FORMAT view_write_format = TypeConverterDX::DataFormatToDXGI(m_settings.pixel_format, TypeConverterDX::ResourceFormatType::ViewWrite); - CD3DX12_CLEAR_VALUE clear_value(view_write_format, depth_clear_value, stencil_clear_value); - InitializeCommittedResource(tex_desc, D3D12_HEAP_TYPE_DEFAULT, D3D12_RESOURCE_STATE_DEPTH_WRITE, &clear_value); + if (clear_depth_stencil) + { + // Performance tip: Tell the runtime at resource creation the desired clear value + const DXGI_FORMAT view_write_format = TypeConverterDX::DataFormatToDXGI(m_settings.pixel_format, TypeConverterDX::ResourceFormatType::ViewWrite); + CD3DX12_CLEAR_VALUE clear_value(view_write_format, depth_clear_value, stencil_clear_value); + InitializeCommittedResource(tex_desc, D3D12_HEAP_TYPE_DEFAULT, D3D12_RESOURCE_STATE_DEPTH_WRITE, &clear_value); + } + else + { + InitializeCommittedResource(tex_desc, D3D12_HEAP_TYPE_DEFAULT, D3D12_RESOURCE_STATE_DEPTH_WRITE); + } const wrl::ComPtr& cp_device = GetContextDX().GetDeviceDX().GetNativeDevice(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.h index 08bf491e5..c54b71053 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.h @@ -96,7 +96,7 @@ class TextureDX : public TextureBase using RenderTargetTextureDX = TextureDX<>; using FrameBufferTextureDX = TextureDX; -using DepthStencilBufferTextureDX = TextureDX; +using DepthStencilBufferTextureDX = TextureDX&>; using ImageTextureDX = TextureDX; } // namespace Methane::Graphics From 36216fe12dcb663a4d015dcb99ca47df8591b060 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 17 Dec 2019 23:37:19 +0300 Subject: [PATCH 020/129] Fix build. --- Modules/Graphics/App/Include/Methane/Graphics/App.hpp | 4 ++-- .../Core/Sources/Methane/Graphics/DirectX12/TextureDX.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp index 078bf800f..a10e25254 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp +++ b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp @@ -158,7 +158,7 @@ class App RenderPass::Attachment::StoreAction::Store, }, context_settings.clear_color - ? context_settings.clear_color.value() + ? *context_settings.clear_color : Color4f() ) }, @@ -170,7 +170,7 @@ class App : RenderPass::Attachment::LoadAction::DontCare, RenderPass::Attachment::StoreAction::DontCare, }, - context_settings.clear_depth_stencil.has_value() + context_settings.clear_depth_stencil ? context_settings.clear_depth_stencil->first : 1.f ), diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.h index c54b71053..e65d284a1 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.h @@ -25,10 +25,13 @@ DirectX 12 implementation of the texture interface. #include #include +#include #include #include #include + +#include #include namespace DirectX From 7514b21b0f4e287dab0c4a4bc95837928e12482e Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 17 Dec 2019 23:46:41 +0300 Subject: [PATCH 021/129] Fixed Windows build. --- .../Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp index b6a3e5e56..8eb49ca31 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TextureDX.cpp @@ -155,11 +155,12 @@ void DepthStencilBufferTextureDX::Initialize(const std::optional& tex_desc.Flags |= D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE; } + const DXGI_FORMAT view_write_format = TypeConverterDX::DataFormatToDXGI(m_settings.pixel_format, TypeConverterDX::ResourceFormatType::ViewWrite); + if (clear_depth_stencil) { // Performance tip: Tell the runtime at resource creation the desired clear value - const DXGI_FORMAT view_write_format = TypeConverterDX::DataFormatToDXGI(m_settings.pixel_format, TypeConverterDX::ResourceFormatType::ViewWrite); - CD3DX12_CLEAR_VALUE clear_value(view_write_format, depth_clear_value, stencil_clear_value); + CD3DX12_CLEAR_VALUE clear_value(view_write_format, clear_depth_stencil->first, clear_depth_stencil->second); InitializeCommittedResource(tex_desc, D3D12_HEAP_TYPE_DEFAULT, D3D12_RESOURCE_STATE_DEPTH_WRITE, &clear_value); } else From f990d0b464a868326a322989c8267282a1fe586a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 18 Dec 2019 14:24:27 +0300 Subject: [PATCH 022/129] Added debug groups for beginning and ending of parallel command list. --- .../DirectX12/ParallelRenderCommandListDX.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp index f707bf489..9eac23384 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp @@ -36,6 +36,16 @@ DirectX 12 implementation of the parallel render command list interface. namespace Methane::Graphics { +static std::string GetParallelCommandListDebugName(const std::string& base_name, const std::string& suffix) +{ + return base_name.empty() ? std::string() : base_name + " " + suffix; +} + +static std::string GetTrailingCommandListDebugName(const std::string& base_name, bool is_beginning) +{ + return GetParallelCommandListDebugName(base_name, is_beginning ? "[Beginning]" : "[Ending]"); +} + ParallelRenderCommandList::Ptr ParallelRenderCommandList::Create(CommandQueue& cmd_queue, RenderPass& render_pass) { ITT_FUNCTION_TASK(); @@ -63,8 +73,9 @@ void ParallelRenderCommandListDX::Reset(RenderState& render_state, const std::st // Render pass is begun in "beginning" command list only, // but it will be ended in the "ending" command list on commit of the parallel CL - m_begining_command_list.Reset(render_state, ""); // begins render pass + m_begining_command_list.Reset(render_state, GetTrailingCommandListDebugName(debug_group, true)); // begins render pass m_ending_command_list.ResetNative(render_state); // only resets native command lists + m_ending_command_list.PushDebugGroup(GetTrailingCommandListDebugName(debug_group, false)); ParallelRenderCommandListBase::Reset(render_state, debug_group); } @@ -73,8 +84,8 @@ void ParallelRenderCommandListDX::SetName(const std::string& name) { ITT_FUNCTION_TASK(); - m_begining_command_list.SetName(name + " [Beginning]"); - m_ending_command_list.SetName(name + " [Ending]"); + m_begining_command_list.SetName(GetTrailingCommandListDebugName(name, true)); + m_ending_command_list.SetName(GetTrailingCommandListDebugName(name, false)); ParallelRenderCommandListBase::SetName(name); } From d7f093d8c830926877ac71ca95a547a5704e66e1 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 18 Dec 2019 23:35:01 +0300 Subject: [PATCH 023/129] VS Code workspace settings file with CMake configuration is added. --- .vscode/settings.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..f190b376c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "cmake.configureOnOpen": true, + "cmake.buildDirectory": "${workspaceRoot}/Build/Output/VSCode/Build", + "cmake.installPrefix": "${workspaceRoot}/Build/Output/VSCode/Install", + "cmake.configureArgs": [ + "-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON", + "-DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON" + ], + + "C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools", + "C_Cpp.default.cppStandard": "c++17", + "C_Cpp.default.cStandard": "c11", + "C_Cpp.default.intelliSenseMode": "clang-x64", +} \ No newline at end of file From f360d9ca651b859457cb3467cbaf50a9c355b98e Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 19 Dec 2019 18:46:31 +0300 Subject: [PATCH 024/129] Correctly typed number literals usage. --- .../Core/Include/Methane/Graphics/Device.h | 8 ++--- .../Include/Methane/Graphics/RenderPass.h | 26 ++++++++-------- .../Core/Include/Methane/Graphics/Resource.h | 30 +++++++++---------- .../Input/Include/Methane/Platform/Keyboard.h | 30 +++++++++---------- .../Input/Include/Methane/Platform/Mouse.h | 12 ++++---- 5 files changed, 53 insertions(+), 53 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Device.h b/Modules/Graphics/Core/Include/Methane/Graphics/Device.h index 21841c488..027617582 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Device.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Device.h @@ -51,10 +51,10 @@ struct Device : virtual Object using Mask = uint32_t; enum Value : Mask { - Unknown = 0u, - BasicRendering = 1u << 0u, - TextureAndSamplerArrays = 1u << 1u, - All = ~0u, + Unknown = 0u, + BasicRendering = 1u << 0u, + TextureAndSamplerArrays = 1u << 1u, + All = ~0u, }; using Values = std::array; diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h index 64dede672..0efcd133f 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h @@ -43,22 +43,22 @@ struct RenderPass { enum class LoadAction : uint32_t { - DontCare = 0, + DontCare = 0u, Load, Clear, }; enum class StoreAction : uint32_t { - DontCare = 0, + DontCare = 0u, Store, Resolve, }; Texture::WeakPtr wp_texture; - uint32_t level = 0; - uint32_t slice = 0; - uint32_t depth_plane = 0; + uint32_t level = 0u; + uint32_t slice = 0u; + uint32_t depth_plane = 0u; LoadAction load_action = LoadAction::DontCare; StoreAction store_action = StoreAction::DontCare; @@ -88,10 +88,10 @@ struct RenderPass struct StencilAttachment : Attachment { - Stencil clear_value = 0; + Stencil clear_value = 0ui8; StencilAttachment() = default; - StencilAttachment(const Attachment&& attach, Stencil in_clear_value = 0) : Attachment(attach), clear_value(in_clear_value) { } + StencilAttachment(const Attachment&& attach, Stencil in_clear_value = 0ui8) : Attachment(attach), clear_value(in_clear_value) { } bool operator==(const StencilAttachment& other) const; }; @@ -101,12 +101,12 @@ struct RenderPass using Mask = uint32_t; enum Value : Mask { - None = 0, - ShaderResources = 1 << 0, - Samplers = 1 << 1, - RenderTargets = 1 << 2, - DepthStencil = 1 << 3, - All = static_cast(~0), + None = 0u, + ShaderResources = 1u << 0u, + Samplers = 1u << 1u, + RenderTargets = 1u << 2u, + DepthStencil = 1u << 3u, + All = ~0u, }; using Values = std::array; diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h index 39c3d8098..4680c29f6 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h @@ -57,14 +57,14 @@ struct Resource : virtual Object using Mask = uint32_t; enum Value : Mask { - Unknown = 0, + Unknown = 0u, // Primary usages - ShaderRead = 1 << 0, - ShaderWrite = 1 << 1, - RenderTarget = 1 << 2, + ShaderRead = 1u << 0u, + ShaderWrite = 1u << 1u, + RenderTarget = 1u << 2u, // Secondary usages - Addressable = 1 << 3, - All = static_cast(~0), + Addressable = 1u << 3u, + All = ~0u, }; using BaseValues = std::array; @@ -93,7 +93,7 @@ struct Resource : virtual Object struct Location { Ptr sp_resource; - Data::Size offset = 0; + Data::Size offset = 0u; bool operator==(const Location& other) const; }; @@ -102,21 +102,21 @@ struct Resource : virtual Object { struct Index { - uint32_t depth_slice = 0; - uint32_t array_index = 0; - uint32_t mip_level = 0; + uint32_t depth_slice = 0u; + uint32_t array_index = 0u; + uint32_t mip_level = 0u; }; Data::Bytes data_storage; Data::ConstRawPtr p_data = nullptr; - Data::Size data_size = 0; - Index index = { 0, 0, 0 }; + Data::Size data_size = 0u; + Index index; SubResource() = default; - SubResource(Data::Bytes&& data, Index in_index = { 0, 0, 0 }); - SubResource(Data::ConstRawPtr in_p_data, Data::Size in_data_size, Index in_index = { 0, 0, 0 }); + SubResource(Data::Bytes&& data, Index in_index = { 0u, 0u, 0u }); + SubResource(Data::ConstRawPtr in_p_data, Data::Size in_data_size, Index in_index = { 0u, 0u, 0u }); - uint32_t GetRawIndex(uint32_t depth = 1, uint32_t mip_levels_count = 1) const + uint32_t GetRawIndex(uint32_t depth = 1u, uint32_t mip_levels_count = 1u) const { return ComputeRawIndex(index, depth, mip_levels_count); } static uint32_t ComputeRawIndex(const Index& index, uint32_t depth = 1, uint32_t mip_levels_count = 1) diff --git a/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h b/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h index 151b93bc8..cfdfbfb80 100644 --- a/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h +++ b/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h @@ -105,14 +105,14 @@ struct Modifier using Mask = uint32_t; enum Value : Mask { - None = 0, - Shift = 1 << 0, - Control = 1 << 1, - Alt = 1 << 2, - Super = 1 << 3, - CapsLock = 1 << 4, - NumLock = 1 << 5, - All = static_cast(~0), + None = 0u, + Shift = 1u << 0u, + Control = 1u << 1u, + Alt = 1u << 2u, + Super = 1u << 3u, + CapsLock = 1u << 4u, + NumLock = 1u << 5u, + All = ~0u, }; using Values = std::array; @@ -125,9 +125,9 @@ struct Modifier ~Modifier() = delete; }; -enum class KeyType +enum class KeyType : uint32_t { - Common = 0, + Common = 0u, Modifier, }; @@ -156,7 +156,7 @@ class KeyConverter enum class KeyState : uint8_t { - Released = 0, + Released = 0ui8, Pressed, }; @@ -170,10 +170,10 @@ class State using Mask = uint32_t; enum Value : Mask { - None = 0, - KeyStates = 1 << 0, - Modifiers = 1 << 1, - All = static_cast(~0), + None = 0u, + KeyStates = 1u << 0u, + Modifiers = 1u << 1u, + All = ~0u, }; using Values = std::array; diff --git a/Modules/Platform/Input/Include/Methane/Platform/Mouse.h b/Modules/Platform/Input/Include/Methane/Platform/Mouse.h index a1aa3fc1e..21f109450 100644 --- a/Modules/Platform/Input/Include/Methane/Platform/Mouse.h +++ b/Modules/Platform/Input/Include/Methane/Platform/Mouse.h @@ -92,12 +92,12 @@ class State using Mask = uint32_t; enum Value : Mask { - None = 0, - Buttons = 1 << 0, - Position = 1 << 1, - Scroll = 1 << 2, - InWindow = 1 << 3, - All = static_cast(~0), + None = 0u, + Buttons = 1u << 0u, + Position = 1u << 1u, + Scroll = 1u << 2u, + InWindow = 1u << 3u, + All = ~0u, }; using Values = std::array; From 31645aeb25b4e9a24bded9f3240a50b6bac2c406 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 19 Dec 2019 20:39:30 +0300 Subject: [PATCH 025/129] Fixed MacOS build. --- Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h | 4 ++-- Modules/Platform/Input/Include/Methane/Platform/Keyboard.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h index 0efcd133f..3990d5e49 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h @@ -88,10 +88,10 @@ struct RenderPass struct StencilAttachment : Attachment { - Stencil clear_value = 0ui8; + Stencil clear_value = 0u; StencilAttachment() = default; - StencilAttachment(const Attachment&& attach, Stencil in_clear_value = 0ui8) : Attachment(attach), clear_value(in_clear_value) { } + StencilAttachment(const Attachment&& attach, Stencil in_clear_value = 0u) : Attachment(attach), clear_value(in_clear_value) { } bool operator==(const StencilAttachment& other) const; }; diff --git a/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h b/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h index cfdfbfb80..47052146a 100644 --- a/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h +++ b/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h @@ -156,7 +156,7 @@ class KeyConverter enum class KeyState : uint8_t { - Released = 0ui8, + Released = 0u, Pressed, }; From 7ef5cae7e6a82c687955ed4869a79ccfb76e1235 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 19 Dec 2019 23:19:47 +0300 Subject: [PATCH 026/129] Suspend rendering when window is minimised on MacOS. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 20 +++++++-------- Apps/Samples/Asteroids/AsteroidsApp.h | 4 +-- .../01-HelloTriangle/HelloTriangleApp.cpp | 8 +++--- .../01-HelloTriangle/HelloTriangleApp.h | 2 +- .../HelloTriangleAppSimple.cpp | 8 +++--- .../02-TexturedCube/TexturedCubeApp.cpp | 15 ++++++----- .../02-TexturedCube/TexturedCubeApp.h | 4 +-- .../Tutorials/03-ShadowCube/ShadowCubeApp.cpp | 25 +++++++++++-------- Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h | 4 +-- .../App/Include/Methane/Graphics/App.hpp | 21 ++++++++++++---- .../Graphics/Metal/RenderCommandListMT.mm | 3 +-- .../App/Include/Methane/Platform/AppBase.h | 12 ++++++--- .../Include/Methane/Platform/MacOS/AppMac.hh | 2 +- .../App/Sources/Methane/Platform/AppBase.cpp | 15 +++++++++++ .../Methane/Platform/MacOS/WindowDelegate.mm | 19 +++++++++++++- 15 files changed, 107 insertions(+), 55 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index da9f901e8..5bcf84412 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -252,11 +252,9 @@ bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) { ITT_FUNCTION_TASK(); - if (!m_initialized || GetInitialContextSettings().frame_size == frame_size) - return false; - // Resize screen color and depth textures - GraphicsApp::Resize(frame_size, is_minimized); + if (!GraphicsApp::Resize(frame_size, is_minimized)) + return false; m_sp_sky_box->Resize(frame_size); m_sp_planet->Resize(frame_size); @@ -266,27 +264,29 @@ bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) return true; } -void AsteroidsApp::Update() +bool AsteroidsApp::Update() { ITT_FUNCTION_TASK(); - GraphicsApp::Update(); + if (!GraphicsApp::Update()) + return false; // Update scene uniforms m_scene_uniforms.eye_position = gfx::Vector4f(m_view_camera.GetOrientation().eye, 1.f); m_scene_uniforms.light_position = m_light_camera.GetOrientation().eye; m_sp_sky_box->Update(); + return true; } -void AsteroidsApp::Render() +bool AsteroidsApp::Render() { ITT_FUNCTION_TASK(); // Render only when context is ready assert(!!m_sp_context); - if (!m_sp_context->ReadyToRender()) - return; + if (!m_sp_context->ReadyToRender() || !GraphicsApp::Render()) + return false; // Wait for previous frame rendering is completed and switch to next frame m_sp_context->WaitForGpu(gfx::Context::WaitFor::FramePresented); @@ -332,7 +332,7 @@ void AsteroidsApp::Render() }); m_sp_context->Present(); - GraphicsApp::Render(); + return true; } void AsteroidsApp::OnContextReleased() diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 9799713f8..59ecc569a 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -56,8 +56,8 @@ class AsteroidsApp final : public GraphicsApp // NativeApp void Init() override; bool Resize(const gfx::FrameSize& frame_size, bool is_minimized) override; - void Update() override; - void Render() override; + bool Update() override; + bool Render() override; // Context::Callback interface void OnContextReleased() override; diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp index fff52090d..f7e350386 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp @@ -134,12 +134,12 @@ bool HelloTriangleApp::Resize(const gfx::FrameSize& frame_size, bool is_minimize return true; } -void HelloTriangleApp::Render() +bool HelloTriangleApp::Render() { // Render only when context is ready assert(!!m_sp_context); - if (!m_sp_context->ReadyToRender()) - return; + if (!m_sp_context->ReadyToRender() || !GraphicsApp::Render()) + return false; // Wait for previous frame rendering is completed and switch to next frame m_sp_context->WaitForGpu(gfx::Context::WaitFor::FramePresented); @@ -159,7 +159,7 @@ void HelloTriangleApp::Render() m_sp_context->GetRenderCommandQueue().Execute({ *frame.sp_cmd_list }); m_sp_context->Present(); - GraphicsApp::Render(); + return true; } void HelloTriangleApp::OnContextReleased() diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h index e22747627..cfbc635a4 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h @@ -51,7 +51,7 @@ class HelloTriangleApp final : public GraphicsApp // App interface void Init() override; bool Resize(const gfx::FrameSize& frame_size, bool is_minimized) override; - void Render() override; + bool Render() override; // Context::Callback interface void OnContextReleased() override; diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp index 96648ef27..6066f28aa 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp @@ -113,10 +113,10 @@ class HelloTriangleApp final : public GraphicsApp return true; } - void Render() override + bool Render() override { - if (!m_sp_context->ReadyToRender()) - return; + if (!m_sp_context->ReadyToRender() || !GraphicsApp::Render()) + return false; m_sp_context->WaitForGpu(Context::WaitFor::FramePresented); HelloTriangleFrame& frame = GetCurrentFrame(); @@ -129,7 +129,7 @@ class HelloTriangleApp final : public GraphicsApp m_sp_context->GetRenderCommandQueue().Execute({ *frame.sp_cmd_list }); m_sp_context->Present(); - GraphicsApp::Render(); + return true; } void OnContextReleased() override diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp index f3d7f8274..87f79ec61 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp @@ -201,9 +201,10 @@ bool TexturedCubeApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized return true; } -void TexturedCubeApp::Update() +bool TexturedCubeApp::Update() { - GraphicsApp::Update(); + if (!GraphicsApp::Update()) + return false; // Update Model, View, Projection matrices based on camera location gfx::Matrix44f model_matrix, view_matrix, proj_matrix; @@ -214,14 +215,16 @@ void TexturedCubeApp::Update() m_shader_uniforms.mvp_matrix = mv_matrix * proj_matrix; m_shader_uniforms.model_matrix = model_matrix; m_shader_uniforms.eye_position = gfx::Vector4f(m_camera.GetOrientation().eye, 1.f); + + return true; } -void TexturedCubeApp::Render() +bool TexturedCubeApp::Render() { // Render only when context is ready assert(!!m_sp_context); - if (!m_sp_context->ReadyToRender()) - return; + if (!m_sp_context->ReadyToRender() || !GraphicsApp::Render()) + return false; // Wait for previous frame rendering is completed and switch to next frame m_sp_context->WaitForGpu(gfx::Context::WaitFor::FramePresented); @@ -248,7 +251,7 @@ void TexturedCubeApp::Render() m_sp_context->GetRenderCommandQueue().Execute({ *frame.sp_cmd_list }); m_sp_context->Present(); - GraphicsApp::Render(); + return true; } void TexturedCubeApp::OnContextReleased() diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h index 0ef329c47..34ac44f7d 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h @@ -55,8 +55,8 @@ class TexturedCubeApp final : public GraphicsApp // App interface void Init() override; bool Resize(const gfx::FrameSize& frame_size, bool is_minimized) override; - void Update() override; - void Render() override; + bool Update() override; + bool Render() override; // Context::Callback interface void OnContextReleased() override; diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp index 8300589cc..b138c93b1 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp @@ -309,17 +309,17 @@ void ShadowCubeApp::RenderPass::Release() bool ShadowCubeApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) { - if (!m_initialized || GetInitialContextSettings().frame_size == frame_size) - return false; - // Resize screen color and depth textures for (ShadowCubeFrame& frame : m_frames) frame.final_pass.sp_rt_texture.reset(); - GraphicsApp::Resize(frame_size, is_minimized); + const bool is_resized = GraphicsApp::Resize(frame_size, is_minimized); for (ShadowCubeFrame& frame : m_frames) frame.final_pass.sp_rt_texture = frame.sp_screen_texture; + + if (!is_resized) + return false; // Update viewports and scissor rects state assert(m_final_pass.sp_state); @@ -330,9 +330,10 @@ bool ShadowCubeApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) return true; } -void ShadowCubeApp::Update() +bool ShadowCubeApp::Update() { - GraphicsApp::Update(); + if (!GraphicsApp::Update()) + return false; // Update Model, View, Projection matrices based on scene camera location gfx::Matrix44f scale_matrix, scene_view_matrix, scene_proj_matrix; @@ -384,14 +385,16 @@ void ShadowCubeApp::Update() scale_matrix* light_view_matrix * light_proj_matrix, gfx::Matrix44f() }); + + return true; } -void ShadowCubeApp::Render() +bool ShadowCubeApp::Render() { // Render only when context is ready assert(!!m_sp_context); - if (!m_sp_context->ReadyToRender()) - return; + if (!m_sp_context->ReadyToRender() || !GraphicsApp::Render()) + return false; // Wait for previous frame rendering is completed and switch to next frame m_sp_context->WaitForGpu(gfx::Context::WaitFor::FramePresented); @@ -414,8 +417,8 @@ void ShadowCubeApp::Render() *frame.final_pass.sp_cmd_list }); m_sp_context->Present(); - - GraphicsApp::Render(); + + return true; } void ShadowCubeApp::RenderScene(const RenderPass &render_pass, ShadowCubeFrame::PassResources &render_pass_resources, gfx::Texture &shadow_texture) diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h index 9db88548e..c61aba385 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h @@ -65,8 +65,8 @@ class ShadowCubeApp final : public GraphicsApp // NativeApp void Init() override; bool Resize(const gfx::FrameSize& frame_size, bool is_minimized) override; - void Update() override; - void Render() override; + bool Update() override; + bool Render() override; // Context::Callback interface void OnContextReleased() override; diff --git a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp index a10e25254..b55f42450 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp +++ b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp @@ -184,16 +184,17 @@ class App Platform::App::Init(); } - bool Resize(const FrameSize& frame_size, bool /*is_minimized*/) override + bool Resize(const FrameSize& frame_size, bool is_minimized) override { ITT_FUNCTION_TASK(); + struct ResourceInfo { Resource::DescriptorByUsage descriptor_by_usage; std::string name; }; - if (!m_initialized || m_initial_context_settings.frame_size == frame_size) + if (!AppBase::Resize(frame_size, is_minimized)) return false; m_initial_context_settings.frame_size = frame_size; @@ -246,21 +247,29 @@ class App return true; } - void Update() override + bool Update() override { ITT_FUNCTION_TASK(); + if (m_is_minimized) + return false; + System::Get().CheckForChanges(); m_animations.Update(); + + return true; } - void Render() override + bool Render() override { ITT_FUNCTION_TASK(); + + if (m_is_minimized) + return false; // Update HUD info in window title if (!m_show_hud_in_window_title || m_title_update_timer.GetElapsedSecondsD() < g_title_update_interval_sec) - return; + return true; if (!m_sp_context) { @@ -286,6 +295,8 @@ class App // Keep window full-screen mode in sync with the context SetFullScreen(context_settings.is_full_screen); + + return true; } bool SetFullScreen(bool is_full_screen) override diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm index 671883c1d..d58e89bf6 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm @@ -220,10 +220,9 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit RenderCommandListBase::Execute(frame_index); - if (m_is_parallel) + if (m_is_parallel || !m_mtl_cmd_buffer) return; - assert(!!m_mtl_cmd_buffer); [m_mtl_cmd_buffer addCompletedHandler:^(id) { Complete(frame_index); }]; diff --git a/Modules/Platform/App/Include/Methane/Platform/AppBase.h b/Modules/Platform/App/Include/Methane/Platform/AppBase.h index 41a295bf7..dfdcba2d0 100644 --- a/Modules/Platform/App/Include/Methane/Platform/AppBase.h +++ b/Modules/Platform/App/Include/Methane/Platform/AppBase.h @@ -78,10 +78,10 @@ class AppBase virtual int Run(const RunArgs& args); virtual void InitContext(const Platform::AppEnvironment& env, const Data::FrameSize& frame_size) = 0; virtual void Init(); - virtual bool Resize(const Data::FrameSize& frame, bool is_minimized) = 0; virtual void ChangeWindowBounds(const Data::FrameRect& window_bounds); - virtual void Update() = 0; - virtual void Render() = 0; + virtual bool Resize(const Data::FrameSize& frame_size, bool is_minimized); + virtual bool Update() = 0; + virtual bool Render() = 0; virtual void Alert(const Message& msg, bool deferred = false); virtual void SetWindowTitle(const std::string& title_text) = 0; virtual bool SetFullScreen(bool is_full_screen); @@ -92,6 +92,8 @@ class AppBase const Settings& GetSettings() const { return m_settings; } const Input::State& GetInputState() const { return m_input_state; } + const Data::FrameSize& GetFrameSize() const { return m_frame_size; } + bool IsMinimized() const { return m_is_minimized; } const cxxopts::Options& GetCmdOptions() const { return m_cmd_options; } // Entry point for user input handling from platform-specific implementation @@ -104,8 +106,10 @@ class AppBase virtual void ShowAlert(const Message& msg); Settings m_settings; - Data::FrameRect m_window_bounds; cxxopts::Options m_cmd_options; + Data::FrameRect m_window_bounds; + Data::FrameSize m_frame_size; + bool m_is_minimized = false; bool m_initialized = false; Message::Ptr m_sp_deferred_message; Input::State m_input_state; diff --git a/Modules/Platform/App/Include/Methane/Platform/MacOS/AppMac.hh b/Modules/Platform/App/Include/Methane/Platform/MacOS/AppMac.hh index aa92ad96d..b3af97f11 100644 --- a/Modules/Platform/App/Include/Methane/Platform/MacOS/AppMac.hh +++ b/Modules/Platform/App/Include/Methane/Platform/MacOS/AppMac.hh @@ -54,7 +54,7 @@ public: // AppBase interface void InitContext(const Platform::AppEnvironment& env, const Data::FrameSize& frame_size) override; - int Run(const RunArgs& args) override; + int Run(const RunArgs& args) override; void Alert(const Message& msg, bool deferred = false) override; void SetWindowTitle(const std::string& title_text) override; bool SetFullScreen(bool is_full_screen) override; diff --git a/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp b/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp index bc06ae16f..da3c4c780 100644 --- a/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp +++ b/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp @@ -134,6 +134,21 @@ void AppBase::ChangeWindowBounds(const Data::FrameRect& window_bounds) ITT_FUNCTION_TASK(); m_window_bounds = window_bounds; } + +bool AppBase::Resize(const Data::FrameSize& frame_size, bool is_minimized) +{ + ITT_FUNCTION_TASK(); + + const bool is_resizing = !is_minimized && m_frame_size != frame_size; + + m_is_minimized = is_minimized; + if (!m_is_minimized) + { + m_frame_size = frame_size; + } + + return m_initialized && is_resizing; +} void AppBase::Alert(const Message& msg, bool deferred) { diff --git a/Modules/Platform/App/Sources/Methane/Platform/MacOS/WindowDelegate.mm b/Modules/Platform/App/Sources/Methane/Platform/MacOS/WindowDelegate.mm index 459cdd2cd..ff692b624 100644 --- a/Modules/Platform/App/Sources/Methane/Platform/MacOS/WindowDelegate.mm +++ b/Modules/Platform/App/Sources/Methane/Platform/MacOS/WindowDelegate.mm @@ -33,7 +33,8 @@ @implementation WindowDelegate { - AppMac* m_p_app; + AppMac* m_p_app; + Data::FrameSize m_frame_size; } - (id) initWithApp : (AppMac*) p_app @@ -65,4 +66,20 @@ - (void) windowDidExitFullScreen:(NSNotification *)notification m_p_app->SetFullScreen(false); } +- (void) windowDidMiniaturize:(NSNotification *)notification +{ + ITT_FUNCTION_TASK(); + assert(!!m_p_app); + + m_p_app->Resize(m_p_app->GetFrameSize(), true); +} + +- (void) windowDidDeminiaturize:(NSNotification *)notification +{ + ITT_FUNCTION_TASK(); + assert(!!m_p_app); + + m_p_app->Resize(m_p_app->GetFrameSize(), false); +} + @end From 7c6f485dc31fa3442cae183bd31f36d6307f509a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Fri, 20 Dec 2019 12:24:11 +0300 Subject: [PATCH 027/129] Added F1 help hotkey notice in application header. --- Modules/Graphics/App/Include/Methane/Graphics/App.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp index b55f42450..b972d3f9d 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp +++ b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp @@ -286,9 +286,10 @@ class App title_ss << m_settings.name << " " << average_fps << " FPS (" << std::fixed << average_frame_time_ms << " ms)" << ", " << context_settings.frame_size.width << " x " << context_settings.frame_size.height - << ", " << std::to_string(context_settings.frame_buffers_count) << " FBs" + << ", " << std::to_string(context_settings.frame_buffers_count) << " FB" << ", VSync: " << (context_settings.vsync_enabled ? "ON" : "OFF") - << ", GPU: " << m_sp_context->GetDevice().GetAdapterName(); + << ", GPU: " << m_sp_context->GetDevice().GetAdapterName() + << " (F1 - help)"; SetWindowTitle(title_ss.str()); m_title_update_timer.Reset(); From cc7c8a5c931c677afffe7cfaa0f6f432b4527202 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetskiy Date: Fri, 20 Dec 2019 23:20:01 +0300 Subject: [PATCH 028/129] Fixed CMake generation and some compilation errors on Linux. --- CMake/MethaneApplications.cmake | 6 + .../Include/Methane/Graphics/Helpers.h | 4 + .../Include/Methane/Graphics/Linux/Helpers.h | 28 +++ .../Methane/Graphics/Linux/MathTypes.h | 29 +++ .../Methane/Graphics/MacOS/MathTypes.h | 21 +-- .../Include/Methane/Graphics/MathTypes.h | 30 ++- .../Helpers/Include/Methane/Graphics/Mesh.h | 172 +++++++++--------- .../Methane/Graphics/Windows/MathTypes.h | 19 -- .../Methane/Graphics/ArcBallCamera.cpp | 12 +- .../Helpers/Test/ArcBallCameraTest.cpp | 33 ++-- .../App/Sources/Methane/Platform/AppBase.cpp | 4 +- Modules/Platform/Input/CMakeLists.txt | 26 +-- .../Input/Include/Methane/Platform/Keyboard.h | 8 +- .../Include/Methane/Platform/Linux/Keyboard.h | 37 ++++ .../MacOS/{KeyboardMac.hh => Keyboard.h} | 2 +- .../Input/Include/Methane/Platform/Mouse.h | 5 +- .../Windows/{KeyboardWin.h => Keyboard.h} | 2 +- .../Methane/Platform/Linux/Keyboard.cpp | 166 +++++++++++++++++ .../MacOS/{KeyboardMac.mm => Keyboard.mm} | 2 +- .../Windows/{KeyboardWin.cpp => Keyboard.cpp} | 2 +- .../Include/Methane/Platform/Linux/Utils.h | 32 ++++ .../Utils/Include/Methane/Platform/Utils.h | 5 +- .../Sources/Methane/Platform/Linux/Utils.cpp | 57 ++++++ 23 files changed, 523 insertions(+), 179 deletions(-) create mode 100644 Modules/Graphics/Helpers/Include/Methane/Graphics/Linux/Helpers.h create mode 100644 Modules/Graphics/Helpers/Include/Methane/Graphics/Linux/MathTypes.h create mode 100644 Modules/Platform/Input/Include/Methane/Platform/Linux/Keyboard.h rename Modules/Platform/Input/Include/Methane/Platform/MacOS/{KeyboardMac.hh => Keyboard.h} (96%) rename Modules/Platform/Input/Include/Methane/Platform/Windows/{KeyboardWin.h => Keyboard.h} (95%) create mode 100644 Modules/Platform/Input/Sources/Methane/Platform/Linux/Keyboard.cpp rename Modules/Platform/Input/Sources/Methane/Platform/MacOS/{KeyboardMac.mm => Keyboard.mm} (99%) rename Modules/Platform/Input/Sources/Methane/Platform/Windows/{KeyboardWin.cpp => Keyboard.cpp} (99%) create mode 100644 Modules/Platform/Utils/Include/Methane/Platform/Linux/Utils.h create mode 100644 Modules/Platform/Utils/Sources/Methane/Platform/Linux/Utils.cpp diff --git a/CMake/MethaneApplications.cmake b/CMake/MethaneApplications.cmake index d401023d1..4d42a6fc9 100644 --- a/CMake/MethaneApplications.cmake +++ b/CMake/MethaneApplications.cmake @@ -104,6 +104,12 @@ function(add_methane_application TARGET SOURCES RESOURCES_DIR INSTALL_DIR APP_NA source_group("Resources" FILES ${PLIST_FILE_PATH} ${ICON_FILE_PATH}) + else() # Linux + + add_executable(${TARGET} + ${SOURCES} + ) + endif() source_group("Source Files" FILES ${SOURCES}) diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h index 37cff2a47..1934e4f3f 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h @@ -31,6 +31,10 @@ Methane graphics helpers: all headers under one umbrella. #include "MacOS/Helpers.h" +#else //Linux + +#include "Linux/MathTypes.h" + #endif #include "MathTypes.h" diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Linux/Helpers.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Linux/Helpers.h new file mode 100644 index 000000000..e7e5b1680 --- /dev/null +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Linux/Helpers.h @@ -0,0 +1,28 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Linux/Helpers.h +Linux platform graphics helpers. + +******************************************************************************/ + +#pragma once + +namespace Methane::Graphics +{ +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Linux/MathTypes.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Linux/MathTypes.h new file mode 100644 index 000000000..bc27aabe6 --- /dev/null +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Linux/MathTypes.h @@ -0,0 +1,29 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Linux/MathTypes.h +Linux specific math types aliases. + +******************************************************************************/ + +#pragma once + +namespace Methane::Graphics +{ + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/MacOS/MathTypes.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/MacOS/MathTypes.h index 0b278e505..7b3a86d8b 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/MacOS/MathTypes.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/MacOS/MathTypes.h @@ -23,26 +23,7 @@ MacOS specific math types aliases. #pragma once -#include -#include - -#define SHADER_STRUCT_ALIGNMENT 256 -#define SHADER_STRUCT_ALIGN alignas(SHADER_STRUCT_ALIGNMENT) -#define SHADER_FIELD_ALIGN alignas(16) -#define SHADER_FIELD_PACK alignas(4) - namespace Methane::Graphics { -// Use row-major order matrices for Metal -using Matrix22i = cml::matrix22i_r; -using Matrix33i = cml::matrix33i_r; -using Matrix44i = cml::matrix44i_r; -using Matrix22f = cml::matrix22f_r; -using Matrix33f = cml::matrix33f_r; -using Matrix44f = cml::matrix44f_r; - -// Axis orientation used by Metal -constexpr cml::AxisOrientation g_axis_orientation = cml::AxisOrientation::left_handed; - -} +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h index 276004605..ded69da80 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h @@ -23,10 +23,6 @@ Math types aliases. #pragma once -#include -#include -#include - #if defined _WIN32 #include "Windows/MathTypes.h" @@ -35,11 +31,37 @@ Math types aliases. #include "MacOS/MathTypes.h" +#else //Linux + +#include "Linux/MathTypes.h" + #endif +#include +#include +#include +#include + +#include + +#define SHADER_STRUCT_ALIGNMENT 256 +#define SHADER_STRUCT_ALIGN alignas(SHADER_STRUCT_ALIGNMENT) +#define SHADER_FIELD_ALIGN alignas(16) +#define SHADER_FIELD_PACK alignas(4) + namespace Methane::Graphics { +constexpr cml::AxisOrientation g_axis_orientation = cml::AxisOrientation::left_handed; + +// Use row-major order matrices for DirectX +using Matrix22i = cml::matrix22i_r; +using Matrix33i = cml::matrix33i_r; +using Matrix44i = cml::matrix44i_r; +using Matrix22f = cml::matrix22f_r; +using Matrix33f = cml::matrix33f_r; +using Matrix44f = cml::matrix44f_r; + using Vector2i = cml::vector2i; using Vector3i = cml::vector3i; using Vector4i = cml::vector4i; diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h index 7f86cca79..0447c3a0c 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h @@ -295,28 +295,28 @@ template class UberMesh : public BaseMesh { public: - using BaseMesh = BaseMesh; + using BaseMeshT = BaseMesh; UberMesh(const Mesh::VertexLayout& vertex_layout) - : BaseMesh(Mesh::Type::Uber, vertex_layout) + : BaseMeshT(Mesh::Type::Uber, vertex_layout) { ITT_FUNCTION_TASK(); } - void AddSubMesh(const BaseMesh& sub_mesh, bool adjust_indices) + void AddSubMesh(const BaseMeshT& sub_mesh, bool adjust_indices) { ITT_FUNCTION_TASK(); - const typename BaseMesh::Vertices& sub_vertices = sub_mesh.GetVertices(); + const typename BaseMeshT::Vertices& sub_vertices = sub_mesh.GetVertices(); const Mesh::Indices& sub_indices = sub_mesh.GetIndices(); m_subsets.emplace_back(sub_mesh.GetType(), - Mesh::Subset::Slice(static_cast(BaseMesh::m_vertices.size()), static_cast(sub_vertices.size())), + Mesh::Subset::Slice(static_cast(BaseMeshT::m_vertices.size()), static_cast(sub_vertices.size())), Mesh::Subset::Slice(static_cast(Mesh::m_indices.size()), static_cast(sub_indices.size())), adjust_indices); if (adjust_indices) { - const Mesh::Index index_offset = static_cast(BaseMesh::GetVertexCount()); + const Mesh::Index index_offset = static_cast(BaseMeshT::GetVertexCount()); std::transform(sub_indices.begin(), sub_indices.end(), std::back_inserter(Mesh::m_indices), [index_offset](const Mesh::Index& index) { return index_offset + index; }); } @@ -325,7 +325,7 @@ class UberMesh : public BaseMesh Mesh::m_indices.insert(Mesh::m_indices.end(), sub_indices.begin(), sub_indices.end()); } - BaseMesh::m_vertices.insert(BaseMesh::m_vertices.end(), sub_vertices.begin(), sub_vertices.end()); + BaseMeshT::m_vertices.insert(BaseMeshT::m_vertices.end(), sub_vertices.begin(), sub_vertices.end()); } const Mesh::Subsets& GetSubsets() const { return m_subsets; } @@ -343,7 +343,7 @@ class UberMesh : public BaseMesh { ITT_FUNCTION_TASK(); const Mesh::Subset& subset = GetSubset(subset_index); - return { BaseMesh::GetVertices().data() + subset.vertices.offset, subset.vertices.count }; + return { BaseMeshT::GetVertices().data() + subset.vertices.offset, subset.vertices.count }; } std::pair GetSubsetIndices(size_t subset_index) const @@ -361,6 +361,8 @@ template class RectMesh : public BaseMesh { public: + using BaseMeshT = BaseMesh; + enum class FaceType { XY, @@ -369,7 +371,7 @@ class RectMesh : public BaseMesh }; RectMesh(const Mesh::VertexLayout& vertex_layout, float width = 1.f, float height = 1.f, float depth_pos = 0.f, size_t color_index = 0, FaceType face_type = FaceType::XY, Mesh::Type type = Mesh::Type::Rect) - : BaseMesh(type, vertex_layout) + : BaseMeshT(type, vertex_layout) , m_width(width) , m_height(height) , m_depth_pos(depth_pos) @@ -385,7 +387,7 @@ class RectMesh : public BaseMesh VType vertex = {}; { const Mesh::Position2D& pos_2d = Mesh::g_face_positions_2d[face_vertex_idx]; - Mesh::Position& vertex_position = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Position); + Mesh::Position& vertex_position = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Position); switch (face_type) { case FaceType::XY: vertex_position = Mesh::Position(pos_2d[0] * m_width, pos_2d[1] * m_height, m_depth_pos); break; @@ -395,7 +397,7 @@ class RectMesh : public BaseMesh } if (has_normals) { - Mesh::Normal& vertex_normal = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Normal); + Mesh::Normal& vertex_normal = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Normal); const float depth_norm = m_depth_pos ? m_depth_pos / std::abs(m_depth_pos) : 1.f; switch (face_type) { @@ -406,12 +408,12 @@ class RectMesh : public BaseMesh } if (has_colors) { - Mesh::Color& vertex_color = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Color); + Mesh::Color& vertex_color = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Color); vertex_color = Mesh::g_colors[color_index % Mesh::g_colors.size()]; } if (has_texcoord) { - Mesh::TexCoord& vertex_texcoord = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::TexCoord); + Mesh::TexCoord& vertex_texcoord = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::TexCoord); vertex_texcoord = Mesh::g_face_texcoords[face_vertex_idx]; } RectMesh::m_vertices.push_back(vertex); @@ -439,30 +441,32 @@ template class BoxMesh : public RectMesh { using Positions = std::vector; + using BaseMeshT = BaseMesh; + using RectMeshT = RectMesh; public: BoxMesh(const Mesh::VertexLayout& vertex_layout, float width = 1.f, float height = 1.f, float depth = 1.f) - : RectMesh(vertex_layout, width, height, depth / 2.f, 0, RectMesh::FaceType::XY, Mesh::Type::Box) + : RectMeshT(vertex_layout, width, height, depth / 2.f, 0, RectMeshT::FaceType::XY, Mesh::Type::Box) , m_depth(depth) { ITT_FUNCTION_TASK(); - AddFace(RectMesh(vertex_layout, width, height, -depth / 2.f, 1, RectMesh::FaceType::XY)); - AddFace(RectMesh(vertex_layout, width, depth, height / 2.f, 2, RectMesh::FaceType::XZ)); - AddFace(RectMesh(vertex_layout, width, depth, -height / 2.f, 3, RectMesh::FaceType::XZ)); - AddFace(RectMesh(vertex_layout, height, depth, width / 2.f, 4, RectMesh::FaceType::YZ)); - AddFace(RectMesh(vertex_layout, height, depth, -width / 2.f, 5, RectMesh::FaceType::YZ)); + AddFace(RectMeshT(vertex_layout, width, height, -depth / 2.f, 1, RectMeshT::FaceType::XY)); + AddFace(RectMeshT(vertex_layout, width, depth, height / 2.f, 2, RectMeshT::FaceType::XZ)); + AddFace(RectMeshT(vertex_layout, width, depth, -height / 2.f, 3, RectMeshT::FaceType::XZ)); + AddFace(RectMeshT(vertex_layout, height, depth, width / 2.f, 4, RectMeshT::FaceType::YZ)); + AddFace(RectMeshT(vertex_layout, height, depth, -width / 2.f, 5, RectMeshT::FaceType::YZ)); } float GetDepth() const noexcept { return m_depth; } protected: - void AddFace(const RectMesh& face_mesh) noexcept + void AddFace(const RectMeshT& face_mesh) noexcept { ITT_FUNCTION_TASK(); - const size_t initial_vertices_count = BaseMesh::m_vertices.size(); + const size_t initial_vertices_count = BaseMeshT::m_vertices.size(); - const typename BaseMesh::Vertices& face_vertices = face_mesh.GetVertices(); - BoxMesh::m_vertices.insert(BaseMesh::m_vertices.end(), face_vertices.begin(), face_vertices.end()); + const typename BaseMeshT::Vertices& face_vertices = face_mesh.GetVertices(); + BaseMeshT::m_vertices.insert(BaseMeshT::m_vertices.end(), face_vertices.begin(), face_vertices.end()); const Mesh::Indices& face_indices = face_mesh.GetIndices(); std::transform(face_indices.begin(), face_indices.end(), std::back_inserter(Mesh::m_indices), @@ -477,10 +481,10 @@ template class SphereMesh : public BaseMesh { public: - using BaseMesh = BaseMesh; + using BaseMeshT = BaseMesh; SphereMesh(const Mesh::VertexLayout& vertex_layout, float radius = 1.f, uint32_t lat_lines_count = 10, uint32_t long_lines_count = 16) - : BaseMesh(Mesh::Type::Sphere, vertex_layout) + : BaseMeshT(Mesh::Type::Sphere, vertex_layout) , m_radius(radius) , m_lat_lines_count(lat_lines_count) , m_long_lines_count(long_lines_count) @@ -525,20 +529,20 @@ class SphereMesh : public BaseMesh const uint32_t actual_long_lines_count = GetActualLongLinesCount(); const uint32_t cap_vertex_count = 2 * (has_texcoord ? actual_long_lines_count : 1); - BaseMesh::m_vertices.resize((m_lat_lines_count - 2) * actual_long_lines_count + cap_vertex_count, {}); + BaseMeshT::m_vertices.resize((m_lat_lines_count - 2) * actual_long_lines_count + cap_vertex_count, {}); if (!has_texcoord) { - Mesh::Position& first_vertex_position = BaseMesh::template GetVertexField(BaseMesh::m_vertices.front(), Mesh::VertexField::Position); - Mesh::Position& last_vertex_position = BaseMesh::template GetVertexField(BaseMesh::m_vertices.back(), Mesh::VertexField::Position); + Mesh::Position& first_vertex_position = BaseMeshT::template GetVertexField(BaseMeshT::m_vertices.front(), Mesh::VertexField::Position); + Mesh::Position& last_vertex_position = BaseMeshT::template GetVertexField(BaseMeshT::m_vertices.back(), Mesh::VertexField::Position); first_vertex_position = Mesh::Position(0.f, m_radius, 0.f); last_vertex_position = Mesh::Position(0.f, -m_radius, 0.f); if (has_normals) { - Mesh::Normal& first_vertex_normal = BaseMesh::template GetVertexField(BaseMesh::m_vertices.front(), Mesh::VertexField::Normal); - Mesh::Normal& last_vertex_normal = BaseMesh::template GetVertexField(BaseMesh::m_vertices.back(), Mesh::VertexField::Normal); + Mesh::Normal& first_vertex_normal = BaseMeshT::template GetVertexField(BaseMeshT::m_vertices.front(), Mesh::VertexField::Normal); + Mesh::Normal& last_vertex_normal = BaseMeshT::template GetVertexField(BaseMeshT::m_vertices.back(), Mesh::VertexField::Normal); first_vertex_normal = Mesh::Normal(0.f, 1.f, 0.f); last_vertex_normal = Mesh::Normal(0.f, -1.f, 0.f); @@ -569,19 +573,19 @@ class SphereMesh : public BaseMesh const cml::matrix33f rotation_matrix = pitch_matrix * yaw_matrix; const uint32_t vertex_index = (lat_line_index - first_lat_line_index) * actual_long_lines_count + long_line_index + first_vertex_index; - VType& vertex = BaseMesh::m_vertices[vertex_index]; + VType& vertex = BaseMeshT::m_vertices[vertex_index]; { - Mesh::Position& vertex_position = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Position); + Mesh::Position& vertex_position = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Position); vertex_position = Mesh::Position(0.f, m_radius, 0.f) * rotation_matrix; } if (has_normals) { - Mesh::Normal& vertex_normal = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Normal); + Mesh::Normal& vertex_normal = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Normal); vertex_normal = Mesh::Normal(0.f, 1.f, 0.f) * rotation_matrix; } if (has_texcoord) { - Mesh::TexCoord& vertex_texcoord = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::TexCoord); + Mesh::TexCoord& vertex_texcoord = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::TexCoord); vertex_texcoord = Mesh::TexCoord(texcoord_long_spacing * long_line_index, texcoord_lat_spacing * lat_line_index); } @@ -600,7 +604,7 @@ class SphereMesh : public BaseMesh const uint32_t actual_long_lines_count = GetActualLongLinesCount(); const uint32_t sphere_faces_count = GetSphereFacesCount(); - BaseMesh::m_indices.resize(sphere_faces_count * 3, 0); + BaseMeshT::m_indices.resize(sphere_faces_count * 3, 0); uint32_t index_offset = 0; @@ -610,21 +614,21 @@ class SphereMesh : public BaseMesh for (Mesh::Index long_line_index = 0; long_line_index < actual_long_lines_count - 1; ++long_line_index) { - BaseMesh::m_indices[index_offset] = 0; - BaseMesh::m_indices[index_offset + 1] = long_line_index + 2; - BaseMesh::m_indices[index_offset + 2] = long_line_index + 1; + BaseMeshT::m_indices[index_offset] = 0; + BaseMeshT::m_indices[index_offset + 1] = long_line_index + 2; + BaseMeshT::m_indices[index_offset + 2] = long_line_index + 1; index_offset += 3; } - BaseMesh::m_indices[index_offset] = 0; - BaseMesh::m_indices[index_offset + 1] = 1; - BaseMesh::m_indices[index_offset + 2] = m_long_lines_count; + BaseMeshT::m_indices[index_offset] = 0; + BaseMeshT::m_indices[index_offset + 1] = 1; + BaseMeshT::m_indices[index_offset + 2] = m_long_lines_count; index_offset += 3; } - const uint32_t vertices_count = static_cast(BaseMesh::m_vertices.size()); + const uint32_t vertices_count = static_cast(BaseMeshT::m_vertices.size()); const uint32_t index_lat_lines_count = has_texcoord ? m_lat_lines_count - 1 : m_lat_lines_count - 3; const uint32_t index_long_lines_count = has_texcoord ? m_long_lines_count + 1 : m_long_lines_count - 1; const uint32_t first_vertex_index = has_texcoord ? 0 : 1; @@ -633,26 +637,26 @@ class SphereMesh : public BaseMesh { for (uint32_t long_line_index = 0; long_line_index < index_long_lines_count; ++long_line_index) { - BaseMesh::m_indices[index_offset] = (lat_line_index * actual_long_lines_count) + long_line_index + first_vertex_index; - BaseMesh::m_indices[index_offset + 1] = (lat_line_index * actual_long_lines_count) + long_line_index + first_vertex_index + 1; - BaseMesh::m_indices[index_offset + 2] = (lat_line_index + 1) * actual_long_lines_count + long_line_index + first_vertex_index; + BaseMeshT::m_indices[index_offset] = (lat_line_index * actual_long_lines_count) + long_line_index + first_vertex_index; + BaseMeshT::m_indices[index_offset + 1] = (lat_line_index * actual_long_lines_count) + long_line_index + first_vertex_index + 1; + BaseMeshT::m_indices[index_offset + 2] = (lat_line_index + 1) * actual_long_lines_count + long_line_index + first_vertex_index; - BaseMesh::m_indices[index_offset + 3] = (lat_line_index + 1) * actual_long_lines_count + long_line_index + first_vertex_index; - BaseMesh::m_indices[index_offset + 4] = (lat_line_index * actual_long_lines_count) + long_line_index + first_vertex_index + 1; - BaseMesh::m_indices[index_offset + 5] = (lat_line_index + 1) * actual_long_lines_count + long_line_index + first_vertex_index + 1; + BaseMeshT::m_indices[index_offset + 3] = (lat_line_index + 1) * actual_long_lines_count + long_line_index + first_vertex_index; + BaseMeshT::m_indices[index_offset + 4] = (lat_line_index * actual_long_lines_count) + long_line_index + first_vertex_index + 1; + BaseMeshT::m_indices[index_offset + 5] = (lat_line_index + 1) * actual_long_lines_count + long_line_index + first_vertex_index + 1; index_offset += 6; } if (!has_texcoord) { - BaseMesh::m_indices[index_offset] = (lat_line_index * actual_long_lines_count) + actual_long_lines_count; - BaseMesh::m_indices[index_offset + 1] = (lat_line_index * actual_long_lines_count) + 1; - BaseMesh::m_indices[index_offset + 2] = (lat_line_index + 1) * actual_long_lines_count + actual_long_lines_count; + BaseMeshT::m_indices[index_offset] = (lat_line_index * actual_long_lines_count) + actual_long_lines_count; + BaseMeshT::m_indices[index_offset + 1] = (lat_line_index * actual_long_lines_count) + 1; + BaseMeshT::m_indices[index_offset + 2] = (lat_line_index + 1) * actual_long_lines_count + actual_long_lines_count; - BaseMesh::m_indices[index_offset + 3] = (lat_line_index + 1) * actual_long_lines_count + actual_long_lines_count; - BaseMesh::m_indices[index_offset + 4] = (lat_line_index * actual_long_lines_count) + 1; - BaseMesh::m_indices[index_offset + 5] = (lat_line_index + 1) * actual_long_lines_count + 1; + BaseMeshT::m_indices[index_offset + 3] = (lat_line_index + 1) * actual_long_lines_count + actual_long_lines_count; + BaseMeshT::m_indices[index_offset + 4] = (lat_line_index * actual_long_lines_count) + 1; + BaseMeshT::m_indices[index_offset + 5] = (lat_line_index + 1) * actual_long_lines_count + 1; index_offset += 6; } @@ -664,16 +668,16 @@ class SphereMesh : public BaseMesh for (uint32_t long_line_index = 0; long_line_index < index_long_lines_count; ++long_line_index) { - BaseMesh::m_indices[index_offset] = (vertices_count - 1); - BaseMesh::m_indices[index_offset + 1] = (vertices_count - 1) - (long_line_index + 2); - BaseMesh::m_indices[index_offset + 2] = (vertices_count - 1) - (long_line_index + 1); + BaseMeshT::m_indices[index_offset] = (vertices_count - 1); + BaseMeshT::m_indices[index_offset + 1] = (vertices_count - 1) - (long_line_index + 2); + BaseMeshT::m_indices[index_offset + 2] = (vertices_count - 1) - (long_line_index + 1); index_offset += 3; } - BaseMesh::m_indices[index_offset] = (vertices_count - 1); - BaseMesh::m_indices[index_offset + 1] = (vertices_count - 2); - BaseMesh::m_indices[index_offset + 2] = (vertices_count - 1) - actual_long_lines_count; + BaseMeshT::m_indices[index_offset] = (vertices_count - 1); + BaseMeshT::m_indices[index_offset + 1] = (vertices_count - 2); + BaseMeshT::m_indices[index_offset + 2] = (vertices_count - 1) - actual_long_lines_count; } } @@ -686,10 +690,10 @@ template class IcosahedronMesh : public BaseMesh { public: - using BaseMesh = BaseMesh; + using BaseMeshT = BaseMesh; IcosahedronMesh(const Mesh::VertexLayout& vertex_layout, float radius = 1.f, uint32_t subdivisions_count = 0, bool spherify = false) - : BaseMesh(Mesh::Type::Icosahedron, vertex_layout) + : BaseMeshT(Mesh::Type::Icosahedron, vertex_layout) , m_radius(radius) { ITT_FUNCTION_TASK(); @@ -703,7 +707,7 @@ class IcosahedronMesh : public BaseMesh throw std::invalid_argument("Colored vertices are not supported for icosahedron mesh."); } - const float a = (radius + std::sqrtf(radius * 5.f)) / 2.f; + const float a = (radius + std::sqrt(radius * 5.f)) / 2.f; const float b = radius; const std::array vertex_positions = {{ {-b, a, 0 }, @@ -720,23 +724,23 @@ class IcosahedronMesh : public BaseMesh {-a, 0, b }, }}; - BaseMesh::m_vertices.resize(vertex_positions.size()); + BaseMeshT::m_vertices.resize(vertex_positions.size()); for(size_t vertex_index = 0; vertex_index < vertex_positions.size(); ++vertex_index) { - VType& vertex = BaseMesh::m_vertices[vertex_index]; + VType& vertex = BaseMeshT::m_vertices[vertex_index]; - Mesh::Position& vertex_position = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Position); + Mesh::Position& vertex_position = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Position); vertex_position = vertex_positions[vertex_index]; if (has_normals) { - Mesh::Normal& vertex_normal = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Normal); + Mesh::Normal& vertex_normal = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Normal); vertex_normal = cml::normalize(vertex_position); } if (has_texcoord) { - Mesh::TexCoord& vertex_texcoord = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::TexCoord); + Mesh::TexCoord& vertex_texcoord = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::TexCoord); const Mesh::Position vertex_direction = cml::normalize(vertex_position); vertex_texcoord[0] = std::atan2(vertex_direction[2], vertex_direction[0]) / (2.f * cml::constants::pi()) + 0.5f; @@ -747,7 +751,7 @@ class IcosahedronMesh : public BaseMesh } } - BaseMesh::m_indices = { + BaseMeshT::m_indices = { 5, 0, 11, 1, 0, 5, 7, 0, 1, @@ -786,25 +790,25 @@ class IcosahedronMesh : public BaseMesh void Subdivide() { ITT_FUNCTION_TASK(); - if (BaseMesh::m_indices.size() % 3 != 0) + if (BaseMeshT::m_indices.size() % 3 != 0) throw std::logic_error("Icosahedron indices count should be a multiple of three representing triangles list."); Mesh::Indices new_indices; - new_indices.reserve(BaseMesh::m_indices.size() * 4); - BaseMesh::m_vertices.reserve(BaseMesh::m_vertices.size() * 2); + new_indices.reserve(BaseMeshT::m_indices.size() * 4); + BaseMeshT::m_vertices.reserve(BaseMeshT::m_vertices.size() * 2); - typename BaseMesh::EdgeMidpoints edge_midpoints; + typename BaseMeshT::EdgeMidpoints edge_midpoints; - const size_t triangles_count = BaseMesh::m_indices.size() / 3; + const size_t triangles_count = BaseMeshT::m_indices.size() / 3; for (size_t triangle_index = 0; triangle_index < triangles_count; ++triangle_index) { - const Mesh::Index vi1 = BaseMesh::m_indices[triangle_index * 3]; - const Mesh::Index vi2 = BaseMesh::m_indices[triangle_index * 3 + 1]; - const Mesh::Index vi3 = BaseMesh::m_indices[triangle_index * 3 + 2]; + const Mesh::Index vi1 = BaseMeshT::m_indices[triangle_index * 3]; + const Mesh::Index vi2 = BaseMeshT::m_indices[triangle_index * 3 + 1]; + const Mesh::Index vi3 = BaseMeshT::m_indices[triangle_index * 3 + 2]; - const Mesh::Index vm1 = BaseMesh::AddEdgeMidpoint(Mesh::Edge(vi1, vi2), edge_midpoints); - const Mesh::Index vm2 = BaseMesh::AddEdgeMidpoint(Mesh::Edge(vi2, vi3), edge_midpoints); - const Mesh::Index vm3 = BaseMesh::AddEdgeMidpoint(Mesh::Edge(vi3, vi1), edge_midpoints); + const Mesh::Index vm1 = BaseMeshT::AddEdgeMidpoint(Mesh::Edge(vi1, vi2), edge_midpoints); + const Mesh::Index vm2 = BaseMeshT::AddEdgeMidpoint(Mesh::Edge(vi2, vi3), edge_midpoints); + const Mesh::Index vm3 = BaseMeshT::AddEdgeMidpoint(Mesh::Edge(vi3, vi1), edge_midpoints); std::array indices = { vi1, vm1, vm3, @@ -815,7 +819,7 @@ class IcosahedronMesh : public BaseMesh new_indices.insert(new_indices.end(), indices.begin(), indices.end()); } - std::swap(BaseMesh::m_indices, new_indices); + std::swap(BaseMeshT::m_indices, new_indices); } void Spherify() @@ -824,14 +828,14 @@ class IcosahedronMesh : public BaseMesh const bool has_normals = Mesh::HasVertexField(Mesh::VertexField::Normal); - for(VType& vertex : BaseMesh::m_vertices) + for(VType& vertex : BaseMeshT::m_vertices) { - Mesh::Position& vertex_position = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Position); + Mesh::Position& vertex_position = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Position); vertex_position = cml::normalize(vertex_position) * m_radius; if (has_normals) { - Mesh::Normal& vertex_normal = BaseMesh::template GetVertexField(vertex, Mesh::VertexField::Normal); + Mesh::Normal& vertex_normal = BaseMeshT::template GetVertexField(vertex, Mesh::VertexField::Normal); vertex_normal = cml::normalize(vertex_position); } } diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Windows/MathTypes.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Windows/MathTypes.h index 2807c9138..3c94509a6 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Windows/MathTypes.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Windows/MathTypes.h @@ -23,26 +23,7 @@ Windows specific math types aliases. #pragma once -#include -#include - -#define SHADER_STRUCT_ALIGNMENT 256 -#define SHADER_STRUCT_ALIGN alignas(SHADER_STRUCT_ALIGNMENT) -#define SHADER_FIELD_ALIGN alignas(16) -#define SHADER_FIELD_PACK alignas(4) - namespace Methane::Graphics { -// Use row-major order matrices for DirectX -using Matrix22i = cml::matrix22i_r; -using Matrix33i = cml::matrix33i_r; -using Matrix44i = cml::matrix44i_r; -using Matrix22f = cml::matrix22f_r; -using Matrix33f = cml::matrix33f_r; -using Matrix44f = cml::matrix44f_r; - -// Axis orientation used by Metal -constexpr cml::AxisOrientation g_axis_orientation = cml::AxisOrientation::left_handed; - } // namespace Methane::Graphics diff --git a/Modules/Graphics/Helpers/Sources/Methane/Graphics/ArcBallCamera.cpp b/Modules/Graphics/Helpers/Sources/Methane/Graphics/ArcBallCamera.cpp index 984484348..725d27a06 100644 --- a/Modules/Graphics/Helpers/Sources/Methane/Graphics/ArcBallCamera.cpp +++ b/Modules/Graphics/Helpers/Sources/Methane/Graphics/ArcBallCamera.cpp @@ -25,6 +25,8 @@ Arc-ball camera rotation with mouse handling. #include #include + +#include #include using namespace Methane::Data; @@ -33,7 +35,7 @@ namespace Methane::Graphics { static inline float square(float x) { return x * x; } -static inline float unitSign(float x) { return x / std::fabsf(x); } +static inline float unitSign(float x) { return x / std::fabs(x); } ArcBallCamera::ArcBallCamera(Pivot pivot, cml::AxisOrientation axis_orientation) : Camera(axis_orientation) @@ -66,7 +68,7 @@ void ArcBallCamera::OnMouseDragged(const Point2i& mouse_screen_pos) const Vector3f mouse_current_on_sphere = GetNormalizedSphereProjection(mouse_screen_pos, false); const Vector3f vectors_cross = cml::cross(m_mouse_pressed_on_sphere, mouse_current_on_sphere); const Vector3f rotation_axis = vectors_cross.normalize(); - const float rotation_angle = std::atan2f(vectors_cross.length(), cml::dot(m_mouse_pressed_on_sphere, mouse_current_on_sphere)); + const float rotation_angle = std::atan2(vectors_cross.length(), cml::dot(m_mouse_pressed_on_sphere, mouse_current_on_sphere)); Rotate(rotation_axis, rotation_angle, m_mouse_pressed_orientation); @@ -105,12 +107,12 @@ Vector3f ArcBallCamera::GetNormalizedSphereProjection(const Point2i& mouse_scree float z_sign = 1.f; if (!is_primary && inside_sphere && screen_radius > sphere_radius) { - const uint32_t radius_mult = static_cast(std::floorf(screen_radius / sphere_radius)); + const uint32_t radius_mult = static_cast(std::floor(screen_radius / sphere_radius)); if (radius_mult < 2) { const float vector_radius = sphere_radius * (radius_mult + 1) - screen_radius; screen_vector = screen_vector.normalize() * vector_radius; - z_sign = std::powf(-1.f, static_cast(radius_mult)); + z_sign = std::pow(-1.f, static_cast(radius_mult)); } else { @@ -119,7 +121,7 @@ Vector3f ArcBallCamera::GetNormalizedSphereProjection(const Point2i& mouse_scree } } - return cml::normalize(Vector3f(screen_vector, inside_sphere ? z_sign * std::sqrtf(square(sphere_radius) - screen_vector.length_squared()) : 0.f)); + return cml::normalize(Vector3f(screen_vector, inside_sphere ? z_sign * std::sqrt(square(sphere_radius) - screen_vector.length_squared()) : 0.f)); } void ArcBallCamera::ApplyLookDirection(const Vector3f& look_dir) diff --git a/Modules/Graphics/Helpers/Test/ArcBallCameraTest.cpp b/Modules/Graphics/Helpers/Test/ArcBallCameraTest.cpp index b1d6efb10..58d5e7b40 100644 --- a/Modules/Graphics/Helpers/Test/ArcBallCameraTest.cpp +++ b/Modules/Graphics/Helpers/Test/ArcBallCameraTest.cpp @@ -25,6 +25,7 @@ Arc-Ball camera unit tests #include #include +#include using namespace Methane::Graphics; using namespace Methane::Data; @@ -45,7 +46,7 @@ inline bool operator==(const Vector3f& left, const Vector3f& right) { for(int i = 0; i < 3; ++i) { - if (std::fabsf(left[i] - right[i]) > vectors_equal_epsilon) + if (std::fabs(left[i] - right[i]) > vectors_equal_epsilon) return false; } return true; @@ -169,7 +170,7 @@ TEST_CASE("View arc-ball camera rotation around Aim pivot < 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, static_cast(g_test_screen_center), - static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sinf(test_angle_rad))), + static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sin(test_angle_rad))), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_x, test_angle_deg), test_equality_epsilon); } @@ -177,7 +178,7 @@ TEST_CASE("View arc-ball camera rotation around Aim pivot < 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, static_cast(g_test_screen_center), - static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cosf(test_angle_rad), 0.f)), + static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cos(test_angle_rad), 0.f)), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_y, test_angle_deg), test_equality_epsilon); } @@ -185,7 +186,7 @@ TEST_CASE("View arc-ball camera rotation around Aim pivot < 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, Point2i(static_cast(g_test_screen_center.x()), 0), - static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cosf(test_angle_rad), g_test_radius_pixels * std::sinf(test_angle_rad))), + static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cos(test_angle_rad), g_test_radius_pixels * std::sin(test_angle_rad))), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_z, test_angle_deg), test_equality_epsilon); } } @@ -233,7 +234,7 @@ TEST_CASE("View arc-ball camera rotation around Aim pivot > 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, static_cast(g_test_screen_center - Point2f(0.f, g_test_radius_pixels)), - static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sinf(test_angle_rad))), + static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sin(test_angle_rad))), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_x, test_angle_deg), test_equality_epsilon); } @@ -241,7 +242,7 @@ TEST_CASE("View arc-ball camera rotation around Aim pivot > 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, static_cast(g_test_screen_center - Point2f(g_test_radius_pixels, 0.f)), - static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cosf(test_angle_rad), 0.f)), + static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cos(test_angle_rad), 0.f)), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_y, test_angle_deg), test_equality_epsilon); } @@ -249,7 +250,7 @@ TEST_CASE("View arc-ball camera rotation around Aim pivot > 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, Point2i(static_cast(g_test_screen_size.x()), static_cast(g_test_screen_center.y())), - Point2i(g_test_screen_center + Point2f(g_test_screen_center.y() * std::cosf(test_angle_rad), -1.f * g_test_screen_center.y() * std::sinf(test_angle_rad))), + Point2i(g_test_screen_center + Point2f(g_test_screen_center.y() * std::cos(test_angle_rad), -1.f * g_test_screen_center.y() * std::sin(test_angle_rad))), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_z, test_angle_deg), test_equality_epsilon); } } @@ -297,7 +298,7 @@ TEST_CASE("View arc-ball camera rotation around Eye pivot < 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, static_cast(g_test_screen_center), - static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sinf(test_angle_rad))), + static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sin(test_angle_rad))), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_x, test_angle_deg), test_equality_epsilon); } @@ -305,7 +306,7 @@ TEST_CASE("View arc-ball camera rotation around Eye pivot < 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, static_cast(g_test_screen_center), - static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cosf(test_angle_rad), 0.f)), + static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cos(test_angle_rad), 0.f)), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_y, test_angle_deg), test_equality_epsilon); } @@ -313,7 +314,7 @@ TEST_CASE("View arc-ball camera rotation around Eye pivot < 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, Point2i(static_cast(g_test_screen_center.x()), 0), - static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cosf(test_angle_rad), g_test_radius_pixels * std::sinf(test_angle_rad))), + static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cos(test_angle_rad), g_test_radius_pixels * std::sin(test_angle_rad))), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_z, test_angle_deg), test_equality_epsilon); } } @@ -361,7 +362,7 @@ TEST_CASE("View arc-ball camera rotation around Eye pivot > 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, static_cast(g_test_screen_center - Point2f(0.f, g_test_radius_pixels)), - static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sinf(test_angle_rad))), + static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sin(test_angle_rad))), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_x, test_angle_deg), test_equality_epsilon); } @@ -369,7 +370,7 @@ TEST_CASE("View arc-ball camera rotation around Eye pivot > 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, static_cast(g_test_screen_center - Point2f(g_test_radius_pixels, 0.f)), - static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cosf(test_angle_rad), 0.f)), + static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cos(test_angle_rad), 0.f)), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_y, test_angle_deg), test_equality_epsilon); } @@ -377,7 +378,7 @@ TEST_CASE("View arc-ball camera rotation around Eye pivot > 90 degrees", "[camer { TestViewCameraRotation(test_pivot, g_test_view_orientation, Point2i(static_cast(g_test_screen_size.x()), static_cast(g_test_screen_center.y())), - Point2i(g_test_screen_center + Point2f(g_test_screen_center.y() * std::cosf(test_angle_rad), -1.f * g_test_screen_center.y() * std::sinf(test_angle_rad))), + Point2i(g_test_screen_center + Point2f(g_test_screen_center.y() * std::cos(test_angle_rad), -1.f * g_test_screen_center.y() * std::sin(test_angle_rad))), RotateOrientation(g_test_view_orientation, test_pivot, g_axis_z, test_angle_deg), test_equality_epsilon); } } @@ -427,7 +428,7 @@ TEST_CASE("Dependent arc-ball camera rotation around Aim pivot < 90 degrees", "[ { TestDependentCameraRotation(test_pivot, g_test_view_orientation, test_pivot, g_test_dept_orientation, static_cast(g_test_screen_center), - static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sinf(test_angle_rad))), + static_cast(g_test_screen_center + Point2f(0.f, g_test_radius_pixels * std::sin(test_angle_rad))), RotateOrientation(g_test_dept_orientation, test_pivot, g_axis_x, test_angle_deg), test_equality_epsilon); } @@ -435,7 +436,7 @@ TEST_CASE("Dependent arc-ball camera rotation around Aim pivot < 90 degrees", "[ { TestDependentCameraRotation(test_pivot, g_test_view_orientation, test_pivot, g_test_dept_orientation, static_cast(g_test_screen_center), - static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cosf(test_angle_rad), 0.f)), + static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cos(test_angle_rad), 0.f)), RotateOrientation(g_test_dept_orientation, test_pivot, g_axis_y, test_angle_deg), test_equality_epsilon); } @@ -443,7 +444,7 @@ TEST_CASE("Dependent arc-ball camera rotation around Aim pivot < 90 degrees", "[ { TestDependentCameraRotation(test_pivot, g_test_view_orientation, test_pivot, g_test_dept_orientation, Point2i(static_cast(g_test_screen_center.x()), 0), - static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cosf(test_angle_rad), g_test_radius_pixels * std::sinf(test_angle_rad))), + static_cast(g_test_screen_center - Point2f(g_test_radius_pixels * std::cos(test_angle_rad), g_test_radius_pixels * std::sin(test_angle_rad))), RotateOrientation(g_test_dept_orientation, test_pivot, g_axis_z, test_angle_deg), test_equality_epsilon); } } diff --git a/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp b/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp index da3c4c780..283e1d6b7 100644 --- a/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp +++ b/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp @@ -89,8 +89,10 @@ int AppBase::Run(const RunArgs& args) mutable_arg_values[mutable_args_count] = new char[arg_value_size]; #ifdef _WIN32 strcpy_s(mutable_arg_values[argi], arg_value_size, args.cmd_arg_values[argi]); -#else +#elif defined __APPLE__ strlcpy(mutable_arg_values[argi], args.cmd_arg_values[argi], arg_value_size); +#else // Linux + strcpy(mutable_arg_values[argi], args.cmd_arg_values[argi]); #endif mutable_args_count++; }; diff --git a/Modules/Platform/Input/CMakeLists.txt b/Modules/Platform/Input/CMakeLists.txt index 3d51077c9..a43ed5b48 100644 --- a/Modules/Platform/Input/CMakeLists.txt +++ b/Modules/Platform/Input/CMakeLists.txt @@ -4,25 +4,7 @@ include(MethaneModules) get_module_dirs("Methane/Platform") -if (WIN32) - - set(PLATFORM_HEADERS - ${INCLUDE_PLATFORM_DIR}/KeyboardWin.h - ) - - set(PLATFORM_SOURCES - ${SOURCES_PLATFORM_DIR}/KeyboardWin.cpp - ) - -elseif(APPLE) - - set(PLATFORM_HEADERS - ${INCLUDE_PLATFORM_DIR}/KeyboardMac.hh - ) - - set(PLATFORM_SOURCES - ${SOURCES_PLATFORM_DIR}/KeyboardMac.mm - ) +if(APPLE) set(LIBRARIES "-framework AppKit" @@ -36,7 +18,8 @@ set(LIBRARIES ${LIBRARIES} MethaneDataInstrumentation ) -set(HEADERS ${PLATFORM_HEADERS} +set(HEADERS + ${INCLUDE_PLATFORM_DIR}/Keyboard.h ${INCLUDE_DIR}/Keyboard.h ${INCLUDE_DIR}/Mouse.h ${INCLUDE_DIR}/KeyboardActionControllerBase.hpp @@ -47,7 +30,8 @@ set(HEADERS ${PLATFORM_HEADERS} ${INCLUDE_DIR}/Input/State.h ) -set(SOURCES ${PLATFORM_SOURCES} +set(SOURCES + ${SOURCES_PLATFORM_DIR}/Keyboard.${CPP_EXT} ${SOURCES_DIR}/Keyboard.cpp ${SOURCES_DIR}/Mouse.cpp ${SOURCES_DIR}/Input/ControllersPool.cpp diff --git a/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h b/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h index 47052146a..7a221a254 100644 --- a/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h +++ b/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h @@ -25,11 +25,15 @@ Platform abstraction of keyboard events. #if defined _WIN32 -#include "Windows/KeyboardWin.h" +#include "Windows/Keyboard.h" #elif defined __APPLE__ -#include "MacOS/KeyboardMac.hh" +#include "MacOS/Keyboard.h" + +#else // Linux + +#include "Linux/Keyboard.h" #endif diff --git a/Modules/Platform/Input/Include/Methane/Platform/Linux/Keyboard.h b/Modules/Platform/Input/Include/Methane/Platform/Linux/Keyboard.h new file mode 100644 index 000000000..329f5bd04 --- /dev/null +++ b/Modules/Platform/Input/Include/Methane/Platform/Linux/Keyboard.h @@ -0,0 +1,37 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Platform/Linux/Keyboard.h +Linux platform specific types and implementation of Keyboard abstractions. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Platform::Keyboard +{ + +struct NativeKey +{ + unsigned int code; + unsigned long flags; +}; + +} // namespace Methane::Platform::Keyboard diff --git a/Modules/Platform/Input/Include/Methane/Platform/MacOS/KeyboardMac.hh b/Modules/Platform/Input/Include/Methane/Platform/MacOS/Keyboard.h similarity index 96% rename from Modules/Platform/Input/Include/Methane/Platform/MacOS/KeyboardMac.hh rename to Modules/Platform/Input/Include/Methane/Platform/MacOS/Keyboard.h index 4f98c9784..87ee49652 100644 --- a/Modules/Platform/Input/Include/Methane/Platform/MacOS/KeyboardMac.hh +++ b/Modules/Platform/Input/Include/Methane/Platform/MacOS/Keyboard.h @@ -16,7 +16,7 @@ limitations under the License. ******************************************************************************* -FILE: Methane/Platform/MacOS/KeyboardMac.h +FILE: Methane/Platform/MacOS/Keyboard.h MacOS platform specific types and implementation of Keyboard abstractions. ******************************************************************************/ diff --git a/Modules/Platform/Input/Include/Methane/Platform/Mouse.h b/Modules/Platform/Input/Include/Methane/Platform/Mouse.h index 21f109450..571b365b0 100644 --- a/Modules/Platform/Input/Include/Methane/Platform/Mouse.h +++ b/Modules/Platform/Input/Include/Methane/Platform/Mouse.h @@ -25,6 +25,7 @@ Platform abstraction of mouse events. #include +#include #include #include #include @@ -79,8 +80,8 @@ using MouseButtonAndDelta = std::pair; inline MouseButtonAndDelta GetScrollButtonAndDelta(const Scroll& scroll_delta) { const float min_scroll_delta = 0.00001f; - return std::fabsf(scroll_delta.y()) > min_scroll_delta ? MouseButtonAndDelta(Button::VScroll, scroll_delta.y()) - : (std::fabsf(scroll_delta.x()) > min_scroll_delta ? MouseButtonAndDelta(Button::HScroll, scroll_delta.x()) + return std::fabs(scroll_delta.y()) > min_scroll_delta ? MouseButtonAndDelta(Button::VScroll, scroll_delta.y()) + : (std::fabs(scroll_delta.x()) > min_scroll_delta ? MouseButtonAndDelta(Button::HScroll, scroll_delta.x()) : MouseButtonAndDelta(Button::Unknonwn, 0.f ) ); } diff --git a/Modules/Platform/Input/Include/Methane/Platform/Windows/KeyboardWin.h b/Modules/Platform/Input/Include/Methane/Platform/Windows/Keyboard.h similarity index 95% rename from Modules/Platform/Input/Include/Methane/Platform/Windows/KeyboardWin.h rename to Modules/Platform/Input/Include/Methane/Platform/Windows/Keyboard.h index ef4b1d13d..f3003ef15 100644 --- a/Modules/Platform/Input/Include/Methane/Platform/Windows/KeyboardWin.h +++ b/Modules/Platform/Input/Include/Methane/Platform/Windows/Keyboard.h @@ -16,7 +16,7 @@ limitations under the License. ******************************************************************************* -FILE: Methane/Platform/Windows/KeyboardWin.h +FILE: Methane/Platform/Windows/Keyboard.h Windows platform specific types and implementation of Keyboard abstractions. ******************************************************************************/ diff --git a/Modules/Platform/Input/Sources/Methane/Platform/Linux/Keyboard.cpp b/Modules/Platform/Input/Sources/Methane/Platform/Linux/Keyboard.cpp new file mode 100644 index 000000000..676de498c --- /dev/null +++ b/Modules/Platform/Input/Sources/Methane/Platform/Linux/Keyboard.cpp @@ -0,0 +1,166 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Platform/Linux/Keyboard.cpp +Linux platform specific types and implementation of Keyboard abstractions. + +******************************************************************************/ + +#include +#include + +#include + +namespace Methane::Platform::Keyboard +{ + +Key KeyConverter::GetKeyByNativeCode(const NativeKey& native_key) +{ + ITT_FUNCTION_TASK(); + static const std::map s_key_by_native_code = { + { 0x1D, Key::Num0 }, + { 0x12, Key::Num1 }, + { 0x13, Key::Num2 }, + { 0x14, Key::Num3 }, + { 0x15, Key::Num4 }, + { 0x17, Key::Num5 }, + { 0x16, Key::Num6 }, + { 0x1A, Key::Num7 }, + { 0x1C, Key::Num8 }, + { 0x19, Key::Num9 }, + + { 0x00, Key::A }, + { 0x0B, Key::B }, + { 0x08, Key::C }, + { 0x02, Key::D }, + { 0x0E, Key::E }, + { 0x03, Key::F }, + { 0x05, Key::G }, + { 0x04, Key::H }, + { 0x22, Key::I }, + { 0x26, Key::J }, + { 0x28, Key::K }, + { 0x25, Key::L }, + { 0x2E, Key::M }, + { 0x2D, Key::N }, + { 0x1F, Key::O }, + { 0x23, Key::P }, + { 0x0C, Key::Q }, + { 0x0F, Key::R }, + { 0x01, Key::S }, + { 0x11, Key::T }, + { 0x20, Key::U }, + { 0x09, Key::V }, + { 0x0D, Key::W }, + { 0x07, Key::X }, + { 0x10, Key::Y }, + { 0x06, Key::Z }, + + { 0x27, Key::Apostrophe }, + { 0x2A, Key::BackSlash }, + { 0x2B, Key::Comma }, + { 0x18, Key::Equal }, + { 0x32, Key::GraveAccent }, + { 0x21, Key::LeftBracket }, + { 0x1B, Key::Minus }, + { 0x2F, Key::Period }, + { 0x1E, Key::RightBracket }, + { 0x29, Key::Semicolon }, + { 0x2C, Key::Slash }, + { 0x0A, Key::World1 }, + + { 0x7B, Key::Left }, + { 0x7C, Key::Right }, + { 0x7E, Key::Up }, + { 0x7D, Key::Down }, + + { 0x73, Key::Home }, + { 0x77, Key::End }, + { 0x74, Key::PageUp }, + { 0x79, Key::PageDown }, + { 0x72, Key::Insert }, + { 0x75, Key::Delete }, + { 0x24, Key::Enter }, + { 0x35, Key::Escape }, + { 0x31, Key::Space }, + { 0x30, Key::Tab }, + + { 0x7A, Key::F1 }, + { 0x78, Key::F2 }, + { 0x63, Key::F3 }, + { 0x76, Key::F4 }, + { 0x60, Key::F5 }, + { 0x61, Key::F6 }, + { 0x62, Key::F7 }, + { 0x64, Key::F8 }, + { 0x65, Key::F9 }, + { 0x6D, Key::F10 }, + { 0x67, Key::F11 }, + { 0x6F, Key::F12 }, + { 0x69, Key::F13 }, + { 0x6B, Key::F14 }, + { 0x71, Key::F15 }, + { 0x6A, Key::F16 }, + { 0x40, Key::F17 }, + { 0x4F, Key::F18 }, + { 0x50, Key::F19 }, + { 0x5A, Key::F20 }, + + { 0x3A, Key::LeftAlt }, + { 0x3B, Key::LeftControl }, + { 0x38, Key::LeftShift }, + { 0x37, Key::LeftSuper }, + { 0x3D, Key::RightAlt }, + { 0x3E, Key::RightControl }, + { 0x3C, Key::RightShift }, + { 0x36, Key::RightSuper }, + { 0x6E, Key::Menu }, + { 0x47, Key::NumLock }, + + { 0x52, Key::KeyPad0 }, + { 0x53, Key::KeyPad1 }, + { 0x54, Key::KeyPad2 }, + { 0x55, Key::KeyPad3 }, + { 0x56, Key::KeyPad4 }, + { 0x57, Key::KeyPad5 }, + { 0x58, Key::KeyPad6 }, + { 0x59, Key::KeyPad7 }, + { 0x5B, Key::KeyPad8 }, + { 0x5C, Key::KeyPad9 }, + { 0x45, Key::KeyPadAdd }, + { 0x41, Key::KeyPadDecimal }, + { 0x4B, Key::KeyPadDivide }, + { 0x4C, Key::KeyPadEnter }, + { 0x51, Key::KeyPadEqual }, + { 0x43, Key::KeyPadMultiply }, + { 0x4E, Key::KeyPadSubtract }, + }; + + auto native_code_and_key_it = s_key_by_native_code.find(native_key.code); + return native_code_and_key_it == s_key_by_native_code.end() ? Key::Unknown : native_code_and_key_it->second; +} + +Modifier::Mask KeyConverter::GetModifiersByNativeCode(const NativeKey& native_key) +{ + ITT_FUNCTION_TASK(); + + Modifier::Mask modifiers_mask = Modifier::Value::None; + return modifiers_mask; +} + +} // namespace Methane::Platform::Keyboard \ No newline at end of file diff --git a/Modules/Platform/Input/Sources/Methane/Platform/MacOS/KeyboardMac.mm b/Modules/Platform/Input/Sources/Methane/Platform/MacOS/Keyboard.mm similarity index 99% rename from Modules/Platform/Input/Sources/Methane/Platform/MacOS/KeyboardMac.mm rename to Modules/Platform/Input/Sources/Methane/Platform/MacOS/Keyboard.mm index 9305141ee..a41ca3291 100644 --- a/Modules/Platform/Input/Sources/Methane/Platform/MacOS/KeyboardMac.mm +++ b/Modules/Platform/Input/Sources/Methane/Platform/MacOS/Keyboard.mm @@ -16,7 +16,7 @@ ******************************************************************************* -FILE: Methane/Platform/MacOS/KeyboardMac.h +FILE: Methane/Platform/MacOS/Keyboard.mm MacOS platform specific types and implementation of Keyboard abstractions. ******************************************************************************/ diff --git a/Modules/Platform/Input/Sources/Methane/Platform/Windows/KeyboardWin.cpp b/Modules/Platform/Input/Sources/Methane/Platform/Windows/Keyboard.cpp similarity index 99% rename from Modules/Platform/Input/Sources/Methane/Platform/Windows/KeyboardWin.cpp rename to Modules/Platform/Input/Sources/Methane/Platform/Windows/Keyboard.cpp index 223a1d40e..a79d555fc 100644 --- a/Modules/Platform/Input/Sources/Methane/Platform/Windows/KeyboardWin.cpp +++ b/Modules/Platform/Input/Sources/Methane/Platform/Windows/Keyboard.cpp @@ -16,7 +16,7 @@ limitations under the License. ******************************************************************************* -FILE: Methane/Platform/Windows/KeyboardWin.h +FILE: Methane/Platform/Windows/Keyboard.h Windows platform specific types and implementation of Keyboard abstractions. ******************************************************************************/ diff --git a/Modules/Platform/Utils/Include/Methane/Platform/Linux/Utils.h b/Modules/Platform/Utils/Include/Methane/Platform/Linux/Utils.h new file mode 100644 index 000000000..3b1bbb21f --- /dev/null +++ b/Modules/Platform/Utils/Include/Methane/Platform/Linux/Utils.h @@ -0,0 +1,32 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Platform/MacOS/Utils.h +MacOS platform utilitary functions. + +******************************************************************************/ + +#pragma once + +#include +#include + +namespace Methane::Linux +{ + +} // namespace Methane::Linux diff --git a/Modules/Platform/Utils/Include/Methane/Platform/Utils.h b/Modules/Platform/Utils/Include/Methane/Platform/Utils.h index c2a13b427..755b08b17 100644 --- a/Modules/Platform/Utils/Include/Methane/Platform/Utils.h +++ b/Modules/Platform/Utils/Include/Methane/Platform/Utils.h @@ -31,6 +31,10 @@ Methane platform utilitary functions #include "MacOS/Utils.hh" +#else // Linux + +#include "Linux/Utils.h" + #endif #include @@ -44,5 +48,4 @@ std::string GetExecutableDir(); std::string GetExecutableFileName(); std::string GetResourceDir(); - } // namespace Methane::Platform diff --git a/Modules/Platform/Utils/Sources/Methane/Platform/Linux/Utils.cpp b/Modules/Platform/Utils/Sources/Methane/Platform/Linux/Utils.cpp new file mode 100644 index 000000000..36ecee991 --- /dev/null +++ b/Modules/Platform/Utils/Sources/Methane/Platform/Linux/Utils.cpp @@ -0,0 +1,57 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Platform/MacOS/Utils.mm +MacOS platform utilitary functions. + +******************************************************************************/ + +#include +#include + +#include +#include + +namespace Methane::Platform +{ + +void PrintToDebugOutput(const std::string& msg) +{ + ITT_FUNCTION_TASK(); + throw std::runtime_error("Method is not implemented yet."); +} + +std::string GetExecutableDir() +{ + ITT_FUNCTION_TASK(); + throw std::runtime_error("Method is not implemented yet."); +} + +std::string GetExecutableFileName() +{ + ITT_FUNCTION_TASK(); + throw std::runtime_error("Method is not implemented yet."); +} + +std::string GetResourceDir() +{ + ITT_FUNCTION_TASK(); + throw std::runtime_error("Method is not implemented yet."); +} + +} // namespace Methane::Platform From 1a14fe05bbabfd7fbdd3d20af5580fd09f7abae7 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 21 Dec 2019 13:44:20 +0300 Subject: [PATCH 029/129] Added Linux build configurations to VS CMakeSettings config. --- .gitignore | 1 + CMakeSettings.json | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/.gitignore b/.gitignore index bd0384d39..3da20be35 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ /.idea/workspace.xml /.scannerwork /.sonarqube +/out /Folder.DotSettings /CMakeLists.txt.user diff --git a/CMakeSettings.json b/CMakeSettings.json index 2a3e3af33..42ce071d7 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -47,6 +47,52 @@ "buildCommandArgs": "-v", "ctestCommandArgs": "", "variables": [] + }, + { + "name": "Linux-Debug", + "generator": "Unix Makefiles", + "configurationType": "Debug", + "buildRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Build", + "installRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Install", + "cmakeExecutable": "/usr/bin/cmake", + "remoteCopySourcesExclusionList": [ ".vs", ".git", "Build/Output" ], + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "linux_x64" ], + "remoteMachineName": "${defaultRemoteMachineName}", + "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/src", + "remoteBuildRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/build/${name}", + "remoteInstallRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/install/${name}", + "remoteCopySources": true, + "rsyncCommandArgs": "-t --delete --delete-excluded", + "remoteCopyBuildOutput": false, + "remoteCopySourcesMethod": "rsync", + "addressSanitizerRuntimeFlags": "detect_leaks=0", + "variables": [] + }, + { + "name": "Linux-Release", + "generator": "Unix Makefiles", + "configurationType": "RelWithDebInfo", + "buildRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Build", + "installRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Install", + "cmakeExecutable": "/usr/bin/cmake", + "remoteCopySourcesExclusionList": [ ".vs", ".git", "Build/Output" ], + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "linux_x64" ], + "remoteMachineName": "${defaultRemoteMachineName}", + "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/src", + "remoteBuildRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/build/${name}", + "remoteInstallRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/install/${name}", + "remoteCopySources": true, + "rsyncCommandArgs": "-t --delete --delete-excluded", + "remoteCopyBuildOutput": false, + "remoteCopySourcesMethod": "rsync", + "addressSanitizerRuntimeFlags": "detect_leaks=0", + "variables": [] } ] } \ No newline at end of file From d4b524ab321edeb51eb44197d1c6e94c7f11eb7d Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 21 Dec 2019 16:13:19 +0300 Subject: [PATCH 030/129] Added dummy classes for Vulkan implementation in the Graphics Core. --- Modules/Graphics/Core/CMakeLists.txt | 35 ++++ .../Methane/Graphics/Metal/ContextMT.hh | 3 +- .../Methane/Graphics/Metal/ContextMT.mm | 1 - .../Methane/Graphics/Metal/TextureMT.hh | 2 +- .../Methane/Graphics/Native/BufferNT.h | 8 + .../Methane/Graphics/Native/CommandQueueNT.h | 8 + .../Methane/Graphics/Native/ContextNT.h | 12 +- .../Graphics/Native/DescriptorHeapNT.h | 8 + .../Methane/Graphics/Native/ProgramNT.h | 8 + .../Graphics/Native/RenderCommandListNT.h | 8 + .../Methane/Graphics/Native/RenderPassNT.h | 8 + .../Methane/Graphics/Native/RenderStateNT.h | 8 + .../Methane/Graphics/Native/ResourceNT.h | 8 + .../Methane/Graphics/Native/SamplerNT.h | 8 + .../Methane/Graphics/Native/ShaderNT.h | 8 + .../Methane/Graphics/Native/TextureNT.h | 8 + .../Methane/Graphics/Vulkan/BufferVK.cpp | 119 ++++++++++++++ .../Methane/Graphics/Vulkan/BufferVK.h | 55 +++++++ .../Graphics/Vulkan/CommandQueueVK.cpp | 63 +++++++ .../Methane/Graphics/Vulkan/CommandQueueVK.h | 49 ++++++ .../Methane/Graphics/Vulkan/ContextVK.cpp | 120 ++++++++++++++ .../Methane/Graphics/Vulkan/ContextVK.h | 59 +++++++ .../Graphics/Vulkan/DescriptorHeapVK.cpp | 48 ++++++ .../Graphics/Vulkan/DescriptorHeapVK.h | 40 +++++ .../Methane/Graphics/Vulkan/DeviceVK.cpp | 64 ++++++++ .../Methane/Graphics/Vulkan/DeviceVK.h | 47 ++++++ .../Vulkan/ParallelRenderCommandListVK.cpp | 88 ++++++++++ .../Vulkan/ParallelRenderCommandListVK.h | 59 +++++++ .../Methane/Graphics/Vulkan/ProgramVK.cpp | 127 +++++++++++++++ .../Methane/Graphics/Vulkan/ProgramVK.h | 59 +++++++ .../Graphics/Vulkan/RenderCommandListVK.cpp | 154 ++++++++++++++++++ .../Graphics/Vulkan/RenderCommandListVK.h | 69 ++++++++ .../Methane/Graphics/Vulkan/RenderPassVK.cpp | 94 +++++++++++ .../Methane/Graphics/Vulkan/RenderPassVK.h | 47 ++++++ .../Methane/Graphics/Vulkan/RenderStateVK.cpp | 117 +++++++++++++ .../Methane/Graphics/Vulkan/RenderStateVK.h | 58 +++++++ .../Methane/Graphics/Vulkan/ResourceVK.cpp | 72 ++++++++ .../Methane/Graphics/Vulkan/ResourceVK.h | 60 +++++++ .../Methane/Graphics/Vulkan/SamplerVK.cpp | 73 +++++++++ .../Methane/Graphics/Vulkan/SamplerVK.h | 48 ++++++ .../Methane/Graphics/Vulkan/ShaderVK.cpp | 99 +++++++++++ .../Methane/Graphics/Vulkan/ShaderVK.h | 75 +++++++++ .../Methane/Graphics/Vulkan/TextureVK.cpp | 134 +++++++++++++++ .../Methane/Graphics/Vulkan/TextureVK.h | 52 ++++++ .../Methane/Graphics/Vulkan/TypesVK.cpp | 33 ++++ .../Sources/Methane/Graphics/Vulkan/TypesVK.h | 39 +++++ Modules/Platform/AppView/CMakeLists.txt | 6 + .../Include/Methane/Platform/AppEnvironment.h | 4 + .../Methane/Platform/Linux/AppEnvironment.h | 33 ++++ 49 files changed, 2399 insertions(+), 6 deletions(-) create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/BufferVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/BufferVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/CommandQueueVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/CommandQueueVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DescriptorHeapVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DescriptorHeapVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DeviceVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DeviceVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ResourceVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ResourceVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/SamplerVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/SamplerVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TextureVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TextureVK.h create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.cpp create mode 100644 Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.h create mode 100644 Modules/Platform/AppView/Include/Methane/Platform/Linux/AppEnvironment.h diff --git a/Modules/Graphics/Core/CMakeLists.txt b/Modules/Graphics/Core/CMakeLists.txt index c5a3afcb1..948453388 100644 --- a/Modules/Graphics/Core/CMakeLists.txt +++ b/Modules/Graphics/Core/CMakeLists.txt @@ -99,6 +99,41 @@ elseif(APPLE) COMPILE_FLAGS -fobjc-weak ) +else() # Linux + + set(PLATFORM_SOURCES + ${SOURCES_GRAPHICS_DIR}/TypesVK.h + ${SOURCES_GRAPHICS_DIR}/TypesVK.cpp + ${SOURCES_GRAPHICS_DIR}/DeviceVK.h + ${SOURCES_GRAPHICS_DIR}/DeviceVK.cpp + ${SOURCES_GRAPHICS_DIR}/ContextVK.h + ${SOURCES_GRAPHICS_DIR}/ContextVK.cpp + ${SOURCES_GRAPHICS_DIR}/ShaderVK.h + ${SOURCES_GRAPHICS_DIR}/ShaderVK.cpp + ${SOURCES_GRAPHICS_DIR}/ProgramVK.h + ${SOURCES_GRAPHICS_DIR}/ProgramVK.cpp + ${SOURCES_GRAPHICS_DIR}/RenderStateVK.h + ${SOURCES_GRAPHICS_DIR}/RenderStateVK.cpp + ${SOURCES_GRAPHICS_DIR}/ResourceVK.h + ${SOURCES_GRAPHICS_DIR}/ResourceVK.cpp + ${SOURCES_GRAPHICS_DIR}/DescriptorHeapVK.h + ${SOURCES_GRAPHICS_DIR}/DescriptorHeapVK.cpp + ${SOURCES_GRAPHICS_DIR}/BufferVK.h + ${SOURCES_GRAPHICS_DIR}/BufferVK.cpp + ${SOURCES_GRAPHICS_DIR}/TextureVK.h + ${SOURCES_GRAPHICS_DIR}/TextureVK.cpp + ${SOURCES_GRAPHICS_DIR}/SamplerVK.h + ${SOURCES_GRAPHICS_DIR}/SamplerVK.cpp + ${SOURCES_GRAPHICS_DIR}/RenderPassVK.h + ${SOURCES_GRAPHICS_DIR}/RenderPassVK.cpp + ${SOURCES_GRAPHICS_DIR}/CommandQueueVK.h + ${SOURCES_GRAPHICS_DIR}/CommandQueueVK.cpp + ${SOURCES_GRAPHICS_DIR}/RenderCommandListVK.h + ${SOURCES_GRAPHICS_DIR}/RenderCommandListVK.cpp + ${SOURCES_GRAPHICS_DIR}/ParallelRenderCommandListVK.h + ${SOURCES_GRAPHICS_DIR}/ParallelRenderCommandListVK.cpp + ) + endif() set(LIBRARIES ${PLATFORM_LIBRARIES} diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh index 5e6125658..835db3607 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh @@ -23,10 +23,9 @@ Metal implementation of the context interface. #pragma once -#include "../ContextBase.h" +#include #import - #import #include diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm index 810887cc0..53d873bf8 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm @@ -30,7 +30,6 @@ #include #include -#include namespace Methane::Graphics { diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/TextureMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/TextureMT.hh index d711ffcd6..b6c40c8da 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/TextureMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/TextureMT.hh @@ -24,7 +24,7 @@ Metal implementation of the texture interface. #pragma once #include -#include "../../../../../../Data/Primitives/Include/Methane/Data/Types.h" +#include #import diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h index b6d7fcfe8..9f4fc2518 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h @@ -31,6 +31,10 @@ Native implementation alias of the buffer interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using BufferNT = BufferDX; using BufferNT = BufferMT; +#else // Linux + +using BufferNT = BufferVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/CommandQueueNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/CommandQueueNT.h index ade8aaff3..9a4574c0f 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/CommandQueueNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/CommandQueueNT.h @@ -31,6 +31,10 @@ Native implementation alias of the command queue interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using CommandQueueNT = CommandQueueDX; using CommandQueueNT = CommandQueueMT; +#else // Linux + +using CommandQueueNT = CommandQueueVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h index 67389804b..5a8c0ae5a 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h @@ -31,6 +31,10 @@ Native implementation alias of the context interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -38,11 +42,15 @@ namespace Methane::Graphics #if defined _WIN32 -using ContextNative = ContextDX; +using ContextNT = ContextDX; #elif defined __APPLE__ -using ContextNative = ContextMT; +using ContextNT = ContextMT; + +#else // Linux + +using ContextNT = ContextVK; #endif diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h index a18848609..f84d71477 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h @@ -31,6 +31,10 @@ Native implementation alias of the descriptor heap. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using DescriptorHeapNT = DescriptorHeapDX; using DescriptorHeapNT = DescriptorHeapMT; +#else // Linux + +using DescriptorHeapNT = DescriptorHeapVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h index 919b6e81a..cc86c5ee3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h @@ -31,6 +31,10 @@ Native implementation alias of the program interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using ProgramNT = ProgramDX; using ProgramNT = ProgramMT; +#else // Linux + +#include + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderCommandListNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderCommandListNT.h index 6c9370737..d8b29dbab 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderCommandListNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderCommandListNT.h @@ -31,6 +31,10 @@ Native implementation alias of the render command list interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using RenderCommandListNT = RenderCommandListDX; using RenderCommandListNT = RenderCommandListMT; +#else // Linux + +using RenderCommandListNT = RenderCommandListVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h index b98e02755..d32d9d40a 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h @@ -31,6 +31,10 @@ Native implementation alias of the render pass interface. #include +#elif // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using RenderPassNT = RenderPassDX; using RenderPassNT = RenderPassMT; +#else // Linux + +using RenderPassNT = RenderPassVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderStateNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderStateNT.h index db16ee7e2..965bd1ead 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderStateNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderStateNT.h @@ -31,6 +31,10 @@ Native implementation alias of the render state interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using RenderStateNT = RenderStateDX; using RenderStateNT = RenderStateMT; +#else // Linux + +using RenderStateNT = RenderStateVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ResourceNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ResourceNT.h index 01620e0a5..2f7bb4c15 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ResourceNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ResourceNT.h @@ -31,6 +31,10 @@ Native implementation alias of the resource interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using ResourceNT = ResourceDX; using ResourceNT = ResourceMT; +#else // Linux + +using ResourceNT = ResourceVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h index 405268fe2..894c1c98c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h @@ -31,6 +31,10 @@ Native implementation alias of the sampler interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using SamplerNT = SamplerDX; using SamplerNT = SamplerMT; +#else // Linux + +using SamplerNT = SamplerVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h index 64f3dd347..4c4c0bd16 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h @@ -31,6 +31,10 @@ Native implementation alias of the shader interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using ShaderNT = ShaderDX; using ShaderNT = ShaderMT; +#else // Linux + +using ShaderNT = ShaderVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h index f12804c8f..134a6dafc 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h @@ -31,6 +31,10 @@ Native implementation alias of the texture interface. #include +#else // Linux + +#include + #endif namespace Methane::Graphics @@ -44,6 +48,10 @@ using TextureNT = TextureDX; using TextureNT = TextureMT; +#else // Linux + +using TextureNT = TextureVK; + #endif } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/BufferVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/BufferVK.cpp new file mode 100644 index 000000000..6f144cd2b --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/BufferVK.cpp @@ -0,0 +1,119 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/BufferVK.mm +Vulkan implementation of the buffer interface. + +******************************************************************************/ + +#include "BufferVK.h" +#include "ContextVK.h" + +#include + +#include +#include + +namespace Methane::Graphics +{ + +Buffer::Ptr Buffer::CreateVertexBuffer(Context& context, Data::Size size, Data::Size stride) +{ + ITT_FUNCTION_TASK(); + const Buffer::Settings settings = { Buffer::Type::Vertex, Usage::Unknown, size }; + return std::make_shared(static_cast(context), settings, stride, PixelFormat::Unknown); +} + +Buffer::Ptr Buffer::CreateIndexBuffer(Context& context, Data::Size size, PixelFormat format) +{ + ITT_FUNCTION_TASK(); + const Buffer::Settings settings = { Buffer::Type::Index, Usage::Unknown, size }; + return std::make_shared(static_cast(context), settings, 0, format); +} + +Buffer::Ptr Buffer::CreateConstantBuffer(Context& context, Data::Size size, bool addressable, const DescriptorByUsage& descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + Usage::Mask usage_mask = Usage::ShaderRead; + if (addressable) + usage_mask |= Usage::Addressable; + + const Buffer::Settings settings = { Buffer::Type::Constant, usage_mask, size }; + return std::make_shared(static_cast(context), settings, descriptor_by_usage); +} + +Data::Size Buffer::GetAlignedBufferSize(Data::Size size) noexcept +{ + ITT_FUNCTION_TASK(); + return size; +} + +BufferVK::BufferVK(ContextBase& context, const Settings& settings, const DescriptorByUsage& descriptor_by_usage) + : BufferBase(context, settings, descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + + InitializeDefaultDescriptors(); +} + +BufferVK::BufferVK(ContextBase& context, const Settings& settings, Data::Size stride, PixelFormat format, const DescriptorByUsage& descriptor_by_usage) + : BufferVK(context, settings, descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + + m_stride = stride; + m_format = format; +} + +BufferVK::~BufferVK() +{ + ITT_FUNCTION_TASK(); + m_context.GetResourceManager().GetReleasePool().AddResource(*this); +} + +void BufferVK::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + BufferBase::SetName(name); +} + +void BufferVK::SetData(const SubResources& sub_resources) +{ + ITT_FUNCTION_TASK(); + + BufferBase::SetData(sub_resources); +} + +uint32_t BufferVK::GetFormattedItemsCount() const +{ + ITT_FUNCTION_TASK(); + + const Data::Size data_size = GetDataSize(); + if (m_stride > 0) + { + return data_size / m_stride; + } + else + { + const Data::Size element_size = GetPixelSize(m_format); + return element_size > 0 ? data_size / element_size : 0; + } +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/BufferVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/BufferVK.h new file mode 100644 index 000000000..9afa3c56c --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/BufferVK.h @@ -0,0 +1,55 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/BufferVK.h +Vulkan implementation of the buffer interface. + +******************************************************************************/ + +#pragma once + +#include +#include + +namespace Methane::Graphics +{ + +class BufferVK : public BufferBase +{ +public: + using Ptr = std::shared_ptr; + + BufferVK(ContextBase& context, const Settings& settings, const DescriptorByUsage& descriptor_by_usage = DescriptorByUsage()); + BufferVK(ContextBase& context, const Settings& settings, Data::Size stride, PixelFormat format, const DescriptorByUsage& descriptor_by_usage = DescriptorByUsage()); + ~BufferVK() override; + + // Resource interface + void SetData(const SubResources& sub_resources) override; + + // Buffer interface + uint32_t GetFormattedItemsCount() const override; + + // Object interface + void SetName(const std::string& name) override; + +protected: + Data::Size m_stride = 0; + PixelFormat m_format = PixelFormat::Unknown; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/CommandQueueVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/CommandQueueVK.cpp new file mode 100644 index 000000000..17060eb42 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/CommandQueueVK.cpp @@ -0,0 +1,63 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/CommandQueueVK.mm +Vulkan implementation of the command queue interface. + +******************************************************************************/ + +#include "CommandQueueVK.h" +#include "ContextVK.h" + +#include + +namespace Methane::Graphics +{ + +CommandQueue::Ptr CommandQueue::Create(Context& context) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(context)); +} + +CommandQueueVK::CommandQueueVK(ContextBase& context) + : CommandQueueBase(context, true) +{ + ITT_FUNCTION_TASK(); +} + +CommandQueueVK::~CommandQueueVK() +{ + ITT_FUNCTION_TASK(); + assert(!IsExecuting()); +} + +void CommandQueueVK::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + CommandQueueBase::SetName(name); +} + +ContextVK& CommandQueueVK::GetContextVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(m_context); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/CommandQueueVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/CommandQueueVK.h new file mode 100644 index 000000000..6557b5250 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/CommandQueueVK.h @@ -0,0 +1,49 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/CommandQueueVK.h +Vulkan implementation of the command queue interface. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class RenderPassVK; +class ContextVK; + +class CommandQueueVK final : public CommandQueueBase +{ +public: + CommandQueueVK(ContextBase& context); + ~CommandQueueVK() override; + + // Object interface + void SetName(const std::string& name) override; + + ContextVK& GetContextVK() noexcept; + +protected: + void Reset(); +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp new file mode 100644 index 000000000..150b6a8c4 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp @@ -0,0 +1,120 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ContextVK.mm +Vulkan implementation of the context interface. + +******************************************************************************/ + +#include "ContextVK.h" +#include "DeviceVK.h" +#include "CommandQueueVK.h" +#include "TypesVK.h" + +#include + +namespace Methane::Graphics +{ + +Context::Ptr Context::Create(const Platform::AppEnvironment& env, Device& device, const Context::Settings& settings) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(env, static_cast(device), settings); +} + +ContextVK::ContextVK(const Platform::AppEnvironment& env, DeviceBase& device, const Context::Settings& settings) + : ContextBase(device, settings) +{ + ITT_FUNCTION_TASK(); + m_resource_manager.Initialize({ true }); +} + +ContextVK::~ContextVK() +{ + ITT_FUNCTION_TASK(); +} + +void ContextVK::Release() +{ + ITT_FUNCTION_TASK(); + + ContextBase::Release(); +} + +void ContextVK::Initialize(Device& device, bool deferred_heap_allocation) +{ + ITT_FUNCTION_TASK(); + + ContextBase::Initialize(device, deferred_heap_allocation); +} + +bool ContextVK::ReadyToRender() const +{ + ITT_FUNCTION_TASK(); + return true; +} + +void ContextVK::OnCommandQueueCompleted(CommandQueue& /*cmd_queue*/, uint32_t /*frame_index*/) +{ + ITT_FUNCTION_TASK(); +} + +void ContextVK::WaitForGpu(WaitFor wait_for) +{ + ITT_FUNCTION_TASK(); + + const bool switch_to_next_frame = (wait_for == WaitFor::FramePresented); + ContextBase::WaitForGpu(wait_for); + + if (switch_to_next_frame) + { + m_frame_buffer_index = (m_frame_buffer_index + 1) % m_settings.frame_buffers_count; + } +} + +void ContextVK::Resize(const FrameSize& frame_size) +{ + ITT_FUNCTION_TASK(); + ContextBase::Resize(frame_size); +} + +void ContextVK::Present() +{ + ITT_FUNCTION_TASK(); + OnPresentComplete(); +} + +bool ContextVK::SetVSyncEnabled(bool vsync_enabled) +{ + ITT_FUNCTION_TASK(); + return ContextBase::SetVSyncEnabled(vsync_enabled); +} + +bool ContextVK::SetFrameBuffersCount(uint32_t frame_buffers_count) +{ + ITT_FUNCTION_TASK(); + return ContextBase::SetFrameBuffersCount(frame_buffers_count); +} + +DeviceVK& ContextVK::GetDeviceVK() +{ + ITT_FUNCTION_TASK(); + return static_cast(GetDevice()); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h new file mode 100644 index 000000000..7da9e0fa7 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h @@ -0,0 +1,59 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ContextVK.h +Vulkan implementation of the context interface. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +struct CommandQueue; +class RenderPassVK; +class DeviceVK; + +class ContextVK : public ContextBase +{ +public: + ContextVK(const Platform::AppEnvironment& env, DeviceBase& device, const Settings& settings); + ~ContextVK() override; + + // Context interface + bool ReadyToRender() const override; + void OnCommandQueueCompleted(CommandQueue& cmd_queue, uint32_t frame_index) override; + void WaitForGpu(WaitFor wait_for) override; + void Resize(const FrameSize& frame_size) override; + void Present() override; + bool SetVSyncEnabled(bool vsync_enabled) override; + bool SetFrameBuffersCount(uint32_t frame_buffers_count) override; + Platform::AppView GetAppView() const override { return { nullptr }; } + + DeviceVK& GetDeviceVK(); + +protected: + // ContextBase overrides + void Release() override; + void Initialize(Device& device, bool deferred_heap_allocation) override; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DescriptorHeapVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DescriptorHeapVK.cpp new file mode 100644 index 000000000..ddad37911 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DescriptorHeapVK.cpp @@ -0,0 +1,48 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/DescriptorHeapVK.mm +Vulkan "dummy" implementation of the descriptor heap. + +******************************************************************************/ + +#include "DescriptorHeapVK.h" + +#include + +namespace Methane::Graphics +{ + +DescriptorHeap::Ptr DescriptorHeap::Create(ContextBase& context, const Settings& settings) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(context, settings); +} + +DescriptorHeapVK::DescriptorHeapVK(ContextBase& context, const Settings& settings) + : DescriptorHeap(context, settings) +{ + ITT_FUNCTION_TASK(); +} + +DescriptorHeapVK::~DescriptorHeapVK() +{ + ITT_FUNCTION_TASK(); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DescriptorHeapVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DescriptorHeapVK.h new file mode 100644 index 000000000..82e156418 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DescriptorHeapVK.h @@ -0,0 +1,40 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/DescriptorHeapVK.h +Vulkan "dummy" implementation of the descriptor heap. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class ContextBase; + +class DescriptorHeapVK : public DescriptorHeap +{ +public: + DescriptorHeapVK(ContextBase& context, const Settings& settings); + ~DescriptorHeapVK() override; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DeviceVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DeviceVK.cpp new file mode 100644 index 000000000..ec15927a1 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DeviceVK.cpp @@ -0,0 +1,64 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/DeviceVK.mm +Vulkan implementation of the device interface. + +******************************************************************************/ + +#include "DeviceVK.h" + +#include + +namespace Methane::Graphics +{ + +DeviceVK::DeviceVK() + : DeviceBase("", false, Device::Feature::Value::BasicRendering) +{ + ITT_FUNCTION_TASK(); +} + +DeviceVK::~DeviceVK() +{ + ITT_FUNCTION_TASK(); +} + +System& System::Get() +{ + ITT_FUNCTION_TASK(); + static SystemVK s_system; + return s_system; +} + +SystemVK::~SystemVK() +{ + ITT_FUNCTION_TASK(); +} + +const Devices& SystemVK::UpdateGpuDevices(Device::Feature::Mask supported_features) +{ + ITT_FUNCTION_TASK(); + + m_supported_features = supported_features; + m_devices.clear(); + + return m_devices; +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DeviceVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DeviceVK.h new file mode 100644 index 000000000..4dbee7106 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/DeviceVK.h @@ -0,0 +1,47 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/DeviceVK.h +Vulkan implementation of the device interface. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class DeviceVK final : public DeviceBase +{ +public: + DeviceVK(); + ~DeviceVK() override; +}; + +class SystemVK final : public SystemBase +{ +public: + ~SystemVK() override; + + void CheckForChanges() override {} + const Devices& UpdateGpuDevices(Device::Feature::Mask supported_features) override; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.cpp new file mode 100644 index 000000000..756fcf03c --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.cpp @@ -0,0 +1,88 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ParallelRenderCommandListVK.mm +Vulkan implementation of the render command list interface. + +******************************************************************************/ + +#include "ParallelRenderCommandListVK.h" +#include "RenderPassVK.h" +#include "CommandQueueVK.h" +#include "ContextVK.h" + +#include + +namespace Methane::Graphics +{ + +ParallelRenderCommandList::Ptr ParallelRenderCommandList::Create(CommandQueue& command_queue, RenderPass& render_pass) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(command_queue), static_cast(render_pass)); +} + +ParallelRenderCommandListVK::ParallelRenderCommandListVK(CommandQueueBase& command_queue, RenderPassBase& render_pass) + : ParallelRenderCommandListBase(command_queue, render_pass) +{ + ITT_FUNCTION_TASK(); +} + +void ParallelRenderCommandListVK::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::SetName(name); +} + +void ParallelRenderCommandListVK::Reset(RenderState& render_state, const std::string& debug_group) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::Reset(render_state, debug_group); +} + +void ParallelRenderCommandListVK::Commit(bool present_drawable) +{ + ITT_FUNCTION_TASK(); + + assert(!IsCommitted()); + + ParallelRenderCommandListBase::Commit(present_drawable); +} + +void ParallelRenderCommandListVK::Execute(uint32_t frame_index) +{ + ITT_FUNCTION_TASK(); + + ParallelRenderCommandListBase::Execute(frame_index); +} + +CommandQueueVK& ParallelRenderCommandListVK::GetCommandQueueVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(*m_sp_command_queue); +} + +RenderPassVK& ParallelRenderCommandListVK::GetPassVK() +{ + ITT_FUNCTION_TASK(); + return static_cast(GetPass()); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h new file mode 100644 index 000000000..a3ec6ee9a --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h @@ -0,0 +1,59 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h +Vulkan implementation of the parallel render command list interface. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class CommandQueueVK; +class BufferVK; +class RenderPassVK; + +class ParallelRenderCommandListVK final : public ParallelRenderCommandListBase +{ +public: + using Ptr = std::shared_ptr; + + ParallelRenderCommandListVK(CommandQueueBase& command_queue, RenderPassBase& render_pass); + + // ParallelRenderCommandList interface + void Reset(RenderState& render_state, const std::string& debug_group = "") override; + + // CommandList interface + void Commit(bool present_drawable) override; + + // CommandListBase interface + void Execute(uint32_t frame_index) override; + + // Object interface + void SetName(const std::string& label) override; + +protected: + CommandQueueVK& GetCommandQueueVK() noexcept; + RenderPassVK& GetPassVK(); +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp new file mode 100644 index 000000000..79b24c27e --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp @@ -0,0 +1,127 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ProgramVK.h +Vulkan implementation of the program interface. + +******************************************************************************/ + +#include "ProgramVK.h" +#include "ShaderVK.h" +#include "BufferVK.h" +#include "ContextVK.h" +#include "RenderCommandListVK.h" + +#include + +#include + +namespace Methane::Graphics +{ + +Program::ResourceBindings::Ptr Program::ResourceBindings::Create(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(sp_program, resource_location_by_argument); +} + +Program::ResourceBindings::Ptr Program::ResourceBindings::CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationByArgument& replace_resource_location_by_argument) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(other_resource_bingings), replace_resource_location_by_argument); +} + +ProgramVK::ResourceBindingsVK::ResourceBindingsVK(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) + : ResourceBindingsBase(sp_program, resource_location_by_argument) +{ + ITT_FUNCTION_TASK(); +} + +ProgramVK::ResourceBindingsVK::ResourceBindingsVK(const ResourceBindingsVK& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument) + : ResourceBindingsBase(other_resource_bindings, replace_resource_location_by_argument) +{ + ITT_FUNCTION_TASK(); +} + +void ProgramVK::ResourceBindingsVK::Apply(CommandList& command_list) const +{ + ITT_FUNCTION_TASK(); + + RenderCommandListVK& vulkan_command_list = dynamic_cast(command_list); + const CommandListBase::CommandState& command_state = vulkan_command_list.GetCommandState(); + + for(const auto& resource_binding_by_argument : m_resource_binding_by_argument) + { + const Argument& program_argument = resource_binding_by_argument.first; + const ShaderVK::ResourceBindingVK& vulkan_resource_binding = static_cast(*resource_binding_by_argument.second); + const Resource::Location& bound_resource_location = vulkan_resource_binding.GetResourceLocation(); + if (!bound_resource_location.sp_resource) + { +#ifndef PROGRAM_IGNORE_MISSING_ARGUMENTS + throw std::runtime_error( + "Can not apply resource binding for argument \"" + program_argument.argument_name + + "\" of \"" + Shader::GetTypeName(program_argument.shader_type) + + "\" shader because it is not bound to any resource."); +#else + continue; +#endif + } + + if (vulkan_resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state)) + continue; + } +} + +Program::Ptr Program::Create(Context& context, const Settings& settings) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(context), settings); +} + +ProgramVK::ProgramVK(ContextBase& context, const Settings& settings) + : ProgramBase(context, settings) +{ + ITT_FUNCTION_TASK(); + + // In case if RT pixel formats are not set, we assume it renders to frame buffer + // NOTE: even when program has no pixel shaders render, render state must have at least one color format to be valid + std::vector color_formats = settings.color_formats; + if (color_formats.empty()) + { + color_formats.push_back(context.GetSettings().color_format); + } +} + +ProgramVK::~ProgramVK() +{ + ITT_FUNCTION_TASK(); +} + +ContextVK& ProgramVK::GetContextVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(m_context); +} + +ShaderVK& ProgramVK::GetShaderVK(Shader::Type shader_type) noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(GetShaderRef(shader_type)); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h new file mode 100644 index 000000000..230ffda2a --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h @@ -0,0 +1,59 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ProgramVK.h +Vulkan implementation of the program interface. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class ContextVK; +class ShaderVK; + +class ProgramVK : public ProgramBase +{ +public: + class ResourceBindingsVK : public ResourceBindingsBase + { + public: + ResourceBindingsVK(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument); + ResourceBindingsVK(const ResourceBindingsVK& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument); + + // ResourceBindings interface + void Apply(CommandList& command_list) const override; + + // ResourceBindingsBase interface + void CompleteInitialization() override { } + }; + + ProgramVK(ContextBase& context, const Settings& settings); + ~ProgramVK() override; + + ShaderVK& GetShaderVK(Shader::Type shader_type) noexcept; + +protected: + ContextVK& GetContextVK() noexcept; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp new file mode 100644 index 000000000..4a9d0a8a1 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp @@ -0,0 +1,154 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/RenderCommandListVK.mm +Vulkan implementation of the render command list interface. + +******************************************************************************/ + +#include "RenderCommandListVK.h" +#include "ParallelRenderCommandListVK.h" +#include "RenderStateVK.h" +#include "RenderPassVK.h" +#include "CommandQueueVK.h" +#include "ContextVK.h" +#include "BufferVK.h" + +#include + +namespace Methane::Graphics +{ + +RenderCommandList::Ptr RenderCommandList::Create(CommandQueue& command_queue, RenderPass& render_pass) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(command_queue), static_cast(render_pass)); +} + +RenderCommandList::Ptr RenderCommandList::Create(ParallelRenderCommandList& parallel_render_command_list) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(parallel_render_command_list)); +} + +RenderCommandListVK::RenderCommandListVK(CommandQueueBase& command_queue, RenderPassBase& render_pass) + : RenderCommandListBase(command_queue, render_pass) +{ + ITT_FUNCTION_TASK(); +} + +RenderCommandListVK::RenderCommandListVK(ParallelRenderCommandListBase& parallel_render_command_list) + : RenderCommandListBase(parallel_render_command_list) +{ + ITT_FUNCTION_TASK(); +} + +void RenderCommandListVK::Reset(RenderState& render_state, const std::string& debug_group) +{ + ITT_FUNCTION_TASK(); + + RenderCommandListBase::Reset(render_state, debug_group); +} + +void RenderCommandListVK::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + RenderCommandListBase::SetName(name); +} + +void RenderCommandListVK::PushDebugGroup(const std::string& name) +{ + ITT_FUNCTION_TASK(); +} + +void RenderCommandListVK::PopDebugGroup() +{ + ITT_FUNCTION_TASK(); +} + +void RenderCommandListVK::SetVertexBuffers(const Buffer::Refs& vertex_buffers) +{ + ITT_FUNCTION_TASK(); + + RenderCommandListBase::SetVertexBuffers(vertex_buffers); + + if (!m_draw_state.flags.vertex_buffers_changed) + return; + + uint32_t vb_index = 0; + for (auto vertex_buffer_ref : vertex_buffers) + { + assert(vertex_buffer_ref.get().GetBufferType() == Buffer::Type::Vertex); + const BufferVK& vulkan_buffer = static_cast(vertex_buffer_ref.get()); + vb_index++; + } +} + +void RenderCommandListVK::DrawIndexed(Primitive primitive, Buffer& index_buffer, + uint32_t index_count, uint32_t start_index, uint32_t start_vertex, + uint32_t instance_count, uint32_t start_instance) +{ + ITT_FUNCTION_TASK(); + + const BufferVK& vulkan_index_buffer = static_cast(index_buffer); + if (index_count == 0) + { + index_count = vulkan_index_buffer.GetFormattedItemsCount(); + } + + RenderCommandListBase::DrawIndexed(primitive, index_buffer, index_count, start_index, start_vertex, instance_count, start_instance); +} + +void RenderCommandListVK::Draw(Primitive primitive, uint32_t vertex_count, uint32_t start_vertex, + uint32_t instance_count, uint32_t start_instance) +{ + ITT_FUNCTION_TASK(); + + RenderCommandListBase::Draw(primitive, vertex_count, start_vertex, instance_count, start_instance); +} + +void RenderCommandListVK::Commit(bool present_drawable) +{ + ITT_FUNCTION_TASK(); + + assert(!IsCommitted()); + + RenderCommandListBase::Commit(present_drawable); +} + +void RenderCommandListVK::Execute(uint32_t frame_index) +{ + ITT_FUNCTION_TASK(); + + RenderCommandListBase::Execute(frame_index); +} + +CommandQueueVK& RenderCommandListVK::GetCommandQueueVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(*m_sp_command_queue); +} + +RenderPassVK& RenderCommandListVK::GetPassVK() +{ + ITT_FUNCTION_TASK(); + return static_cast(GetPass()); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.h new file mode 100644 index 000000000..bcc283601 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.h @@ -0,0 +1,69 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/RenderCommandListVK.h +Vulkan implementation of the render command list interface. + +******************************************************************************/ + +#pragma once + +#include + +#include + +namespace Methane::Graphics +{ + +class CommandQueueVK; +class BufferVK; +class RenderPassVK; + +class RenderCommandListVK final : public RenderCommandListBase +{ +public: + RenderCommandListVK(CommandQueueBase& command_queue, RenderPassBase& render_pass); + RenderCommandListVK(ParallelRenderCommandListBase& parallel_render_command_list); + + // CommandList interface + void PushDebugGroup(const std::string& name) override; + void PopDebugGroup() override; + void Commit(bool present_drawable) override; + + // CommandListBase interface + void SetResourceBarriers(const ResourceBase::Barriers&) override { } + void Execute(uint32_t frame_index) override; + + // RenderCommandList interface + void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void SetVertexBuffers(const Buffer::Refs& vertex_buffers) override; + void DrawIndexed(Primitive primitive, Buffer& index_buffer, + uint32_t index_count, uint32_t start_index, uint32_t start_vertex, + uint32_t instance_count, uint32_t start_instance) override; + void Draw(Primitive primitive, uint32_t vertex_count, uint32_t start_vertex, + uint32_t instance_count, uint32_t start_instance) override; + + // Object interface + void SetName(const std::string& label) override; + +protected: + CommandQueueVK& GetCommandQueueVK() noexcept; + RenderPassVK& GetPassVK(); +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.cpp new file mode 100644 index 000000000..8bc8ab35a --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.cpp @@ -0,0 +1,94 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/RenderPassVK.mm +Vulkan implementation of the render pass interface. + +******************************************************************************/ + +#include "RenderPassVK.h" +#include "ContextVK.h" +#include "TextureVK.h" + +#include + +namespace Methane::Graphics +{ + +RenderPass::Ptr RenderPass::Create(Context& context, const Settings& settings) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(context), settings); +} + +RenderPassVK::RenderPassVK(ContextBase& context, const Settings& settings) + : RenderPassBase(context, settings) +{ + ITT_FUNCTION_TASK(); + + Reset(); +} + +void RenderPassVK::Update(const Settings& settings) +{ + ITT_FUNCTION_TASK(); + + m_settings = settings; + + Reset(); +} + +void RenderPassVK::Reset() +{ + ITT_FUNCTION_TASK(); + + uint32_t color_attach_index = 0; + for(ColorAttachment& color_attach : m_settings.color_attachments) + { + if (color_attach.wp_texture.expired()) + { + throw std::invalid_argument("Can not use color attachment without texture."); + } + + TextureVK& color_texture = static_cast(*color_attach.wp_texture.lock()); + if (color_texture.GetSettings().type == Texture::Type::FrameBuffer) + { + color_texture.UpdateFrameBuffer(); + } + + color_attach_index++; + } + + if (!m_settings.depth_attachment.wp_texture.expired()) + { + const TextureVK& depth_texture = static_cast(*m_settings.depth_attachment.wp_texture.lock()); + } + + if (!m_settings.stencil_attachment.wp_texture.expired()) + { + const TextureVK& stencil_texture = static_cast(*m_settings.stencil_attachment.wp_texture.lock()); + } +} + +ContextVK& RenderPassVK::GetContextVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(m_context); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.h new file mode 100644 index 000000000..a689f5890 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.h @@ -0,0 +1,47 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/RenderPassVK.h +Vulkan implementation of the render pass interface. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class ContextVK; + +class RenderPassVK : public RenderPassBase +{ +public: + RenderPassVK(ContextBase& context, const Settings& settings); + + // RenderPass interface + void Update(const Settings& settings) override; + + void Reset(); + +protected: + ContextVK& GetContextVK() noexcept; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp new file mode 100644 index 000000000..303af2f01 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp @@ -0,0 +1,117 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/RenderStateVK.mm +Vulkan implementation of the render state interface. + +******************************************************************************/ + +#include "RenderStateVK.h" +#include "ContextVK.h" +#include "DeviceVK.h" +#include "RenderCommandListVK.h" +#include "ProgramVK.h" +#include "ShaderVK.h" +#include "TypesVK.h" + +#include + +#include + +namespace Methane::Graphics +{ + +RenderState::Ptr RenderState::Create(Context& context, const RenderState::Settings& state_settings) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(context), state_settings); +} + +RenderStateVK::RenderStateVK(ContextBase& context, const Settings& settings) + : RenderStateBase(context, settings) +{ + ITT_FUNCTION_TASK(); + Reset(settings); +} + +RenderStateVK::~RenderStateVK() +{ + ITT_FUNCTION_TASK(); +} + +void RenderStateVK::Reset(const Settings& settings) +{ + ITT_FUNCTION_TASK(); + if (!settings.sp_program) + { + throw std::invalid_argument("Can not create state with empty program."); + } + + RenderStateBase::Reset(settings); + + ProgramVK& vulkan_program = static_cast(*m_settings.sp_program); + + if (!m_settings.viewports.empty()) + { + SetViewports(m_settings.viewports); + } + if (!m_settings.scissor_rects.empty()) + { + SetScissorRects(m_settings.scissor_rects); + } + + ResetNativeState(); +} + +void RenderStateVK::Apply(RenderCommandListBase& command_list) +{ + ITT_FUNCTION_TASK(); + + RenderCommandListVK& vulkan_command_list = static_cast(command_list); +} + +void RenderStateVK::SetViewports(const Viewports& viewports) +{ + ITT_FUNCTION_TASK(); + + RenderStateBase::SetViewports(viewports); +} + +void RenderStateVK::SetScissorRects(const ScissorRects& scissor_rects) +{ + ITT_FUNCTION_TASK(); + + RenderStateBase::SetScissorRects(scissor_rects); +} + +void RenderStateVK::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + RenderStateBase::SetName(name); + + ResetNativeState(); +} + +ContextVK& RenderStateVK::GetContextVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(m_context); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.h new file mode 100644 index 000000000..60bb9ab56 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.h @@ -0,0 +1,58 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/RenderStateVK.h +Vulkan implementation of the render state interface. + +******************************************************************************/ + +#pragma once + +#include + +#include + +namespace Methane::Graphics +{ + +class ContextVK; + +class RenderStateVK : public RenderStateBase +{ +public: + RenderStateVK(ContextBase& context, const Settings& settings); + ~RenderStateVK() override; + + // RenderState interface + void Reset(const Settings& settings) override; + void SetViewports(const Viewports& viewports) override; + void SetScissorRects(const ScissorRects& scissor_rects) override; + + // RenderStateBase interface + void Apply(RenderCommandListBase& command_list) override; + + // Object interface + void SetName(const std::string& name) override; + +protected: + ContextVK& GetContextVK() noexcept; + + void ResetNativeState(); +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ResourceVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ResourceVK.cpp new file mode 100644 index 000000000..98ce7102a --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ResourceVK.cpp @@ -0,0 +1,72 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ResourceVK.mm +Vulkan implementation of the resource interface. + +******************************************************************************/ + +#include "ResourceVK.h" +#include "ContextVK.h" + +#include + +namespace Methane::Graphics +{ + +struct ResourceContainerVK +{ +}; + +ResourceBase::ReleasePool::Ptr ResourceBase::ReleasePool::Create() +{ + ITT_FUNCTION_TASK(); + return std::make_shared(); +} + +ResourceVK::ReleasePoolVK::ReleasePoolVK() + : ResourceBase::ReleasePool() + , m_sp_vk_resources(new ResourceContainerVK()) +{ + ITT_FUNCTION_TASK(); +} + +void ResourceVK::ReleasePoolVK::AddResource(ResourceBase& resource) +{ + ITT_FUNCTION_TASK(); +} + +void ResourceVK::ReleasePoolVK::ReleaseResources() +{ + ITT_FUNCTION_TASK(); + m_sp_vk_resources.reset(new ResourceContainerVK()); +} + +ResourceVK::ResourceVK(Type type, Usage::Mask usage_mask, ContextBase& context, const DescriptorByUsage& descriptor_by_usage) + : ResourceBase(type, usage_mask, context, descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); +} + +ContextVK& ResourceVK::GetContextVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(m_context); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ResourceVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ResourceVK.h new file mode 100644 index 000000000..08ad2a281 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ResourceVK.h @@ -0,0 +1,60 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ResourceVK.h +Vulkan implementation of the resource interface. + +******************************************************************************/ + +#pragma once + +#include + +#include + +namespace Methane::Graphics +{ + +class ContextVK; +struct ResourceContainerVK; + +class ResourceVK : public ResourceBase +{ +public: + using Ptr = std::shared_ptr; + + class ReleasePoolVK : public ReleasePool + { + public: + ReleasePoolVK(); + + // ReleasePool interface + void AddResource(ResourceBase& resource) override; + void ReleaseResources() override; + + private: + std::unique_ptr m_sp_vk_resources; + }; + + ResourceVK(Type type, Usage::Mask usage_mask, ContextBase& context, const DescriptorByUsage& descriptor_by_usage); + +protected: + ContextVK& GetContextVK() noexcept; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/SamplerVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/SamplerVK.cpp new file mode 100644 index 000000000..bb1ffb9ee --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/SamplerVK.cpp @@ -0,0 +1,73 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/SamplerVK.mm +Vulkan implementation of the sampler interface. + +******************************************************************************/ + +#include "SamplerVK.h" +#include "ContextVK.h" + +#include + +namespace Methane::Graphics +{ + +Sampler::Ptr Sampler::Create(Context& context, const Sampler::Settings& settings, const DescriptorByUsage& descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(context), settings, descriptor_by_usage); +} + +SamplerVK::SamplerVK(ContextBase& context, const Settings& settings, const DescriptorByUsage& descriptor_by_usage) + : SamplerBase(context, settings, descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + + InitializeDefaultDescriptors(); + + ResetSampletState(); +} + +SamplerVK::~SamplerVK() +{ + ITT_FUNCTION_TASK(); +} + +void SamplerVK::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + SamplerBase::SetName(name); + + ResetSampletState(); +} + +void SamplerVK::ResetSampletState() +{ + ITT_FUNCTION_TASK(); +} + +ContextVK& SamplerVK::GetContextVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(m_context); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/SamplerVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/SamplerVK.h new file mode 100644 index 000000000..5c2165c21 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/SamplerVK.h @@ -0,0 +1,48 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/SamplerVK.h +Vulkan implementation of the sampler interface. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class ContextVK; + +class SamplerVK : public SamplerBase +{ +public: + SamplerVK(ContextBase& context, const Settings& settings, const DescriptorByUsage& descriptor_by_usage); + ~SamplerVK() override; + + // Object interface + void SetName(const std::string& name) override; + +protected: + void ResetSampletState(); + + ContextVK& GetContextVK() noexcept; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.cpp new file mode 100644 index 000000000..896602aad --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.cpp @@ -0,0 +1,99 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ShaderVK.mm +Vulkan implementation of the shader interface. + +******************************************************************************/ + +#include "ShaderVK.h" +#include "ContextVK.h" + +#include + +namespace Methane::Graphics +{ + +Shader::ResourceBinding::Ptr Shader::ResourceBinding::CreateCopy(const ResourceBinding& other_resource_binging) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(other_resource_binging)); +} + +ShaderVK::ResourceBindingVK::ResourceBindingVK(ContextBase& context, const Settings& settings) + : ResourceBindingBase(context, settings.base) + , m_settings(settings) +{ + ITT_FUNCTION_TASK(); +} + +void ShaderVK::ResourceBindingVK::SetResourceLocation(Resource::Location resource_location) +{ + ITT_FUNCTION_TASK(); + + if (!resource_location.sp_resource) + { + throw std::invalid_argument("Can not set resource location with Null resource pointer."); + } + + const Resource::Type resource_type = resource_location.sp_resource->GetResourceType(); + + ShaderBase::ResourceBindingBase::SetResourceLocation(std::move(resource_location)); +} + +DescriptorHeap::Type ShaderVK::ResourceBindingVK::GetDescriptorHeapType() const +{ + ITT_FUNCTION_TASK(); + return DescriptorHeap::Type::Undefined; +} + +Shader::Ptr Shader::Create(Shader::Type shader_type, Context& context, const Settings& settings) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(shader_type, static_cast(context), settings); +} + +ShaderVK::ShaderVK(Shader::Type shader_type, ContextVK& context, const Settings& settings) + : ShaderBase(shader_type, context, settings) +{ + ITT_FUNCTION_TASK(); +} + +ShaderVK::~ShaderVK() +{ + ITT_FUNCTION_TASK(); +} + +ShaderBase::ResourceBindings ShaderVK::GetResourceBindings(const std::set& constant_argument_names, + const std::set& addressable_argument_names) const +{ + ITT_FUNCTION_TASK(); + + ShaderBase::ResourceBindings resource_bindings; + return resource_bindings; + + return resource_bindings; +} + +ContextVK& ShaderVK::GetContextVK() noexcept +{ + ITT_FUNCTION_TASK(); + return static_cast(m_context); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.h new file mode 100644 index 000000000..dbedbf899 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.h @@ -0,0 +1,75 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/ShaderVK.h +Vulkan implementation of the shader interface. + +******************************************************************************/ + +#pragma once + +#include + +#include +#include + +namespace Methane::Graphics +{ + +class ContextVK; +class ProgramVK; + +class ShaderVK : public ShaderBase +{ +public: + class ResourceBindingVK : public ResourceBindingBase + { + public: + struct Settings + { + ResourceBindingBase::Settings base; + }; + + ResourceBindingVK(ContextBase& context, const Settings& settings); + ResourceBindingVK(const ResourceBindingVK& other) = default; + + // ResourceBinding interface + void SetResourceLocation(Resource::Location resource_location) override; + uint32_t GetResourceCount() const override { return 1; } + + // ResourceBindingBase interface + DescriptorHeap::Type GetDescriptorHeapType() const override; + + const Settings& GetSettings() const noexcept { return m_settings; } + + protected: + const Settings m_settings; + }; + + ShaderVK(Shader::Type shader_type, ContextVK& context, const Settings& settings); + ~ShaderVK() override; + + // ShaderBase interface + ResourceBindings GetResourceBindings(const std::set& constant_argument_names, + const std::set& addressable_argument_names) const override; + +protected: + ContextVK& GetContextVK() noexcept; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TextureVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TextureVK.cpp new file mode 100644 index 000000000..b0f8bfb6c --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TextureVK.cpp @@ -0,0 +1,134 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/TextureVK.mm +Vulkan implementation of the texture interface. + +******************************************************************************/ + +#include "TextureVK.h" +#include "ContextVK.h" +#include "RenderCommandListVK.h" +#include "TypesVK.h" + +#include + +#include +#include + +namespace Methane::Graphics +{ + +Texture::Ptr Texture::CreateRenderTarget(Context& context, const Settings& settings, const DescriptorByUsage& descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + return std::make_shared(static_cast(context), settings, descriptor_by_usage); +} + +Texture::Ptr Texture::CreateFrameBuffer(Context& context, uint32_t /*frame_buffer_index*/, const DescriptorByUsage& descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + const Context::Settings& context_settings = context.GetSettings(); + const Settings texture_settings = Settings::FrameBuffer(context_settings.frame_size, context_settings.color_format); + return std::make_shared(static_cast(context), texture_settings, descriptor_by_usage); +} + +Texture::Ptr Texture::CreateDepthStencilBuffer(Context& context, const DescriptorByUsage& descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + const Context::Settings& context_settings = context.GetSettings(); + const Settings texture_settings = Settings::DepthStencilBuffer(context_settings.frame_size, context_settings.depth_stencil_format); + return std::make_shared(static_cast(context), texture_settings, descriptor_by_usage); +} + +Texture::Ptr Texture::CreateImage(Context& context, const Dimensions& dimensions, uint32_t array_length, PixelFormat pixel_format, bool mipmapped, const DescriptorByUsage& descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + const Settings texture_settings = Settings::Image(dimensions, array_length, pixel_format, mipmapped, Usage::ShaderRead); + return std::make_shared(static_cast(context), texture_settings, descriptor_by_usage); +} + +Texture::Ptr Texture::CreateCube(Context& context, uint32_t dimension_size, uint32_t array_length, PixelFormat pixel_format, bool mipmapped, const DescriptorByUsage& descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + const Settings texture_settings = Settings::Cube(dimension_size, array_length, pixel_format, mipmapped, Usage::ShaderRead); + return std::make_shared(static_cast(context), texture_settings, descriptor_by_usage); +} + +TextureVK::TextureVK(ContextBase& context, const Settings& settings, const DescriptorByUsage& descriptor_by_usage) + : TextureBase(context, settings, descriptor_by_usage) +{ + ITT_FUNCTION_TASK(); + + InitializeDefaultDescriptors(); +} + +TextureVK::~TextureVK() +{ + ITT_FUNCTION_TASK(); + + if (m_settings.type != Texture::Type::FrameBuffer) + { + m_context.GetResourceManager().GetReleasePool().AddResource(*this); + } +} + +void TextureVK::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + TextureBase::SetName(name); +} + +void TextureVK::SetData(const SubResources& sub_resources) +{ + ITT_FUNCTION_TASK(); + + if (sub_resources.empty()) + { + throw std::invalid_argument("Can not set texture data from empty sub-resources."); + } + + if (m_settings.mipmapped && sub_resources.size() < GetRequiredSubresourceCount()) + { + GenerateMipLevels(); + } +} + +Data::Size TextureVK::GetDataSize() const +{ + ITT_FUNCTION_TASK(); + throw std::logic_error("Getting of texture data size is not implemented."); +} + +void TextureVK::UpdateFrameBuffer() +{ + ITT_FUNCTION_TASK(); + + if (m_settings.type != Texture::Type::FrameBuffer) + { + throw std::logic_error("Unable to update frame buffer on non-FB texture."); + } +} + +void TextureVK::GenerateMipLevels() +{ + ITT_FUNCTION_TASK(); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TextureVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TextureVK.h new file mode 100644 index 000000000..a25f9322f --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TextureVK.h @@ -0,0 +1,52 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/TextureVK.h +Vulkan implementation of the texture interface. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class TextureVK : public TextureBase +{ +public: + using Ptr = std::shared_ptr; + + TextureVK(ContextBase& context, const Settings& settings, const DescriptorByUsage& descriptor_by_usage = DescriptorByUsage()); + ~TextureVK() override; + + // Resource interface + void SetData(const SubResources& sub_resources) override; + Data::Size GetDataSize() const override; + + // Object interface + void SetName(const std::string& name) override; + + void UpdateFrameBuffer(); + +protected: + void GenerateMipLevels(); +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.cpp new file mode 100644 index 000000000..a7612d6ba --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.cpp @@ -0,0 +1,33 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/TypesVK.mm +Methane graphics types convertors to Vulkan native types. + +******************************************************************************/ + +#include "TypesVK.h" + +#include + +#include + +namespace Methane::Graphics +{ + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.h new file mode 100644 index 000000000..0f9c6f097 --- /dev/null +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.h @@ -0,0 +1,39 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/Vulkan/TypesVK.h +Methane graphics types convertors to Vulkan native types. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Graphics +{ + +class TypeConverterVK +{ +public: + +private: + TypeConverterVK() = default; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Platform/AppView/CMakeLists.txt b/Modules/Platform/AppView/CMakeLists.txt index c56a963b7..cc935ffbe 100644 --- a/Modules/Platform/AppView/CMakeLists.txt +++ b/Modules/Platform/AppView/CMakeLists.txt @@ -34,6 +34,12 @@ elseif(APPLE) COMPILE_FLAGS -fobjc-weak ) +elseif() # Linux + + set(PLATFORM_HEADERS + ${INCLUDE_PLATFORM_DIR}/AppEnvironment.h + ) + endif() set(HEADERS ${PLATFORM_HEADERS} diff --git a/Modules/Platform/AppView/Include/Methane/Platform/AppEnvironment.h b/Modules/Platform/AppView/Include/Methane/Platform/AppEnvironment.h index 795b251f1..4a200d6c8 100644 --- a/Modules/Platform/AppView/Include/Methane/Platform/AppEnvironment.h +++ b/Modules/Platform/AppView/Include/Methane/Platform/AppEnvironment.h @@ -31,4 +31,8 @@ Methane application environment. #include "MacOS/AppEnvironment.hh" +#else // Linux + +#include "Linux/AppEnvironment.h" + #endif diff --git a/Modules/Platform/AppView/Include/Methane/Platform/Linux/AppEnvironment.h b/Modules/Platform/AppView/Include/Methane/Platform/Linux/AppEnvironment.h new file mode 100644 index 000000000..ed215efc5 --- /dev/null +++ b/Modules/Platform/AppView/Include/Methane/Platform/Linux/AppEnvironment.h @@ -0,0 +1,33 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Platform/Linux/AppEnvironment.h +Linux application environment. + +******************************************************************************/ + +#pragma once + +namespace Methane::Platform +{ + +struct AppEnvironment +{ +}; + +} // namespace Methane::Platform \ No newline at end of file From f3815e0749fb15b4a92965e55793e9f643a389aa Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 11:31:13 +0300 Subject: [PATCH 031/129] Fixed MacOS build. --- .../Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm index 53d873bf8..810887cc0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm @@ -30,6 +30,7 @@ #include #include +#include namespace Methane::Graphics { From 82d6a3ff1cae03a26f23e4625fb563091f97373a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 13:33:20 +0300 Subject: [PATCH 032/129] Linux application dummy added. Fixed Linux build. --- Apps/Samples/Asteroids/Asteroid.cpp | 3 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 +- Modules/Data/Primitives/CMakeLists.txt | 8 ++ .../Methane/Graphics/Vulkan/RenderStateVK.cpp | 5 ++ .../Include/Methane/Graphics/SkyBox.h | 4 +- Modules/Platform/App/CMakeLists.txt | 10 +++ .../App/Include/Methane/Platform/App.h | 8 ++ .../Include/Methane/Platform/Linux/AppLin.h | 56 +++++++++++++ .../Sources/Methane/Platform/Linux/AppLin.cpp | 78 +++++++++++++++++++ 9 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 Modules/Platform/App/Include/Methane/Platform/Linux/AppLin.h create mode 100644 Modules/Platform/App/Sources/Methane/Platform/Linux/AppLin.cpp diff --git a/Apps/Samples/Asteroids/Asteroid.cpp b/Apps/Samples/Asteroids/Asteroid.cpp index f70abd593..8f5c4dbcd 100644 --- a/Apps/Samples/Asteroids/Asteroid.cpp +++ b/Apps/Samples/Asteroids/Asteroid.cpp @@ -26,6 +26,7 @@ Random generated asteroid model with mesh and texture ready for rendering #include #include +#include #include namespace Methane::Samples @@ -40,7 +41,7 @@ static gfx::Color3f TransformSRGBToLinear(const gfx::Color3f& srgb_color) gfx::Color3f linear_color = {}; for (int c = 0; c < 3; ++c) { - linear_color[c] = std::powf(srgb_color[c] / 255.f, 2.2f); + linear_color[c] = std::pow(srgb_color[c] / 255.f, 2.2f); } return linear_color; } diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index a5e047da9..56992d8c2 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -114,7 +114,7 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) [&](gfx::Resource::SubResources& sub_resources, Data::Index) { Asteroid::TextureNoiseParameters noise_parameters = { - rng(), + static_cast(rng()), noise_persistence_distribution(rng), noise_scale_distribution(rng), 1.5f diff --git a/Modules/Data/Primitives/CMakeLists.txt b/Modules/Data/Primitives/CMakeLists.txt index 04bedde2c..00dc35b9f 100644 --- a/Modules/Data/Primitives/CMakeLists.txt +++ b/Modules/Data/Primitives/CMakeLists.txt @@ -36,6 +36,14 @@ target_link_libraries(${TARGET} CML ) +if (UNIX) + + target_link_libraries(${TARGET} + pthread + ) + +endif() + source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${HEADERS} ${SOURCES}) set_target_properties(${TARGET} diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp index 303af2f01..3d0830b0e 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp @@ -108,6 +108,11 @@ void RenderStateVK::SetName(const std::string& name) ResetNativeState(); } +void RenderStateVK::ResetNativeState() +{ + ITT_FUNCTION_TASK(); +} + ContextVK& RenderStateVK::GetContextVK() noexcept { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h index 4410c83b9..6b4443f53 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h @@ -69,11 +69,11 @@ class SkyBox void Draw(RenderCommandList& cmd_list, MeshBufferBindings& buffer_bindings); private: - using TexturedMeshBuffers = TexturedMeshBuffers; + using TheTexturedMeshBuffers = TexturedMeshBuffers; Settings m_settings; Context& m_context; - TexturedMeshBuffers m_mesh_buffers; + TheTexturedMeshBuffers m_mesh_buffers; Sampler::Ptr m_sp_texture_sampler; RenderState::Ptr m_sp_state; RenderCommandList::Ptr m_sp_command_list; diff --git a/Modules/Platform/App/CMakeLists.txt b/Modules/Platform/App/CMakeLists.txt index 476da85fd..a83398285 100644 --- a/Modules/Platform/App/CMakeLists.txt +++ b/Modules/Platform/App/CMakeLists.txt @@ -34,6 +34,16 @@ elseif(APPLE) "-framework AppKit" ) +else() # Linux + + set(PLATFORM_HEADERS + ${INCLUDE_PLATFORM_DIR}/AppLin.h + ) + + set(PLATFORM_SOURCES + ${SOURCES_PLATFORM_DIR}/AppLin.cpp + ) + endif() set(LIBRARIES ${LIBRARIES} diff --git a/Modules/Platform/App/Include/Methane/Platform/App.h b/Modules/Platform/App/Include/Methane/Platform/App.h index 4dafe27ab..e1ef2db3c 100644 --- a/Modules/Platform/App/Include/Methane/Platform/App.h +++ b/Modules/Platform/App/Include/Methane/Platform/App.h @@ -31,6 +31,10 @@ Methane platform application alias. #include +#else //Linux + +#include + #endif namespace Methane::Platform @@ -44,6 +48,10 @@ using App = AppWin; using App = AppMac; +#else // Linux + +using App = AppLin; + #endif } // namespace Methane::Platform diff --git a/Modules/Platform/App/Include/Methane/Platform/Linux/AppLin.h b/Modules/Platform/App/Include/Methane/Platform/Linux/AppLin.h new file mode 100644 index 000000000..44b517783 --- /dev/null +++ b/Modules/Platform/App/Include/Methane/Platform/Linux/AppLin.h @@ -0,0 +1,56 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Platform/Linux/AppLin.h +Linux application implementation. + +******************************************************************************/ + +#pragma once + +#include +#include +#include + +#include +#include + +namespace Methane::Platform +{ + +class AppLin : public AppBase +{ +public: + AppLin(const Settings& settings); + + // AppBase interface + int Run(const RunArgs& args) override; + void Alert(const Message& msg, bool deferred = false) override; + void SetWindowTitle(const std::string& title_text) override; + bool SetFullScreen(bool is_full_screen) override; + void Close() override; + +protected: + // AppBase interface + void ParseCommandLine(const cxxopts::ParseResult& cmd_parse_result) override; + void ShowAlert(const Message& msg) override; + + AppEnvironment m_env; +}; + +} // namespace Methane::Platform diff --git a/Modules/Platform/App/Sources/Methane/Platform/Linux/AppLin.cpp b/Modules/Platform/App/Sources/Methane/Platform/Linux/AppLin.cpp new file mode 100644 index 000000000..17b6c263b --- /dev/null +++ b/Modules/Platform/App/Sources/Methane/Platform/Linux/AppLin.cpp @@ -0,0 +1,78 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Platform/Linux/AppLin.cpp +Linux application implementation. + +******************************************************************************/ + +#include +#include +#include + +namespace Methane::Platform +{ + +AppLin::AppLin(const AppBase::Settings& settings) + : AppBase(settings) +{ + ITT_FUNCTION_TASK(); +} + +void AppLin::ParseCommandLine(const cxxopts::ParseResult& cmd_parse_result) +{ + ITT_FUNCTION_TASK(); + AppBase::ParseCommandLine(cmd_parse_result); +} + +int AppLin::Run(const RunArgs& args) +{ + return 0; +} + +void AppLin::Alert(const Message& msg, bool deferred) +{ + ITT_FUNCTION_TASK(); + AppBase::Alert(msg, deferred); +} + +void AppLin::ShowAlert(const Message& msg) +{ + ITT_FUNCTION_TASK(); +} + +void AppLin::SetWindowTitle(const std::string& title_text) +{ + ITT_FUNCTION_TASK(); +} + +bool AppLin::SetFullScreen(bool is_full_screen) +{ + ITT_FUNCTION_TASK(); + if (!AppBase::SetFullScreen(is_full_screen)) + return false; + + return true; +} + +void AppLin::Close() +{ + ITT_FUNCTION_TASK(); +} + +} // namespace Methane::Platform \ No newline at end of file From 5df261a182b808b57db1d36018fbbb2950af8db9 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 13:52:42 +0300 Subject: [PATCH 033/129] Strict linux macro-guard used. --- .../Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h | 4 ++-- .../Core/Sources/Methane/Graphics/Native/CommandQueueNT.h | 4 ++-- .../Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h | 4 ++-- .../Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h | 4 ++-- .../Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h | 4 ++-- .../Sources/Methane/Graphics/Native/RenderCommandListNT.h | 4 ++-- .../Core/Sources/Methane/Graphics/Native/RenderPassNT.h | 2 +- .../Core/Sources/Methane/Graphics/Native/RenderStateNT.h | 4 ++-- .../Core/Sources/Methane/Graphics/Native/ResourceNT.h | 4 ++-- .../Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h | 4 ++-- .../Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h | 4 ++-- .../Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h | 4 ++-- Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h | 2 +- Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h | 2 +- Modules/Platform/App/Include/Methane/Platform/App.h | 4 ++-- Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp | 2 +- .../AppView/Include/Methane/Platform/AppEnvironment.h | 2 +- Modules/Platform/Input/Include/Methane/Platform/Keyboard.h | 2 +- Modules/Platform/Utils/Include/Methane/Platform/Utils.h | 2 +- 19 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h index 9f4fc2518..9dc552068 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/BufferNT.h @@ -31,7 +31,7 @@ Native implementation alias of the buffer interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using BufferNT = BufferDX; using BufferNT = BufferMT; -#else // Linux +#elif defined __linux__ using BufferNT = BufferVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/CommandQueueNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/CommandQueueNT.h index 9a4574c0f..aa5914deb 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/CommandQueueNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/CommandQueueNT.h @@ -31,7 +31,7 @@ Native implementation alias of the command queue interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using CommandQueueNT = CommandQueueDX; using CommandQueueNT = CommandQueueMT; -#else // Linux +#elif defined __linux__ using CommandQueueNT = CommandQueueVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h index 5a8c0ae5a..c14ef1472 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ContextNT.h @@ -31,7 +31,7 @@ Native implementation alias of the context interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using ContextNT = ContextDX; using ContextNT = ContextMT; -#else // Linux +#elif defined __linux__ using ContextNT = ContextVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h index f84d71477..413813abd 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/DescriptorHeapNT.h @@ -31,7 +31,7 @@ Native implementation alias of the descriptor heap. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using DescriptorHeapNT = DescriptorHeapDX; using DescriptorHeapNT = DescriptorHeapMT; -#else // Linux +#elif defined __linux__ using DescriptorHeapNT = DescriptorHeapVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h index cc86c5ee3..f21a34abc 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ProgramNT.h @@ -31,7 +31,7 @@ Native implementation alias of the program interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using ProgramNT = ProgramDX; using ProgramNT = ProgramMT; -#else // Linux +#elif defined __linux__ #include diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderCommandListNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderCommandListNT.h index d8b29dbab..73b9be5b0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderCommandListNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderCommandListNT.h @@ -31,7 +31,7 @@ Native implementation alias of the render command list interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using RenderCommandListNT = RenderCommandListDX; using RenderCommandListNT = RenderCommandListMT; -#else // Linux +#elif defined __linux__ using RenderCommandListNT = RenderCommandListVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h index d32d9d40a..979ef1f89 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h @@ -48,7 +48,7 @@ using RenderPassNT = RenderPassDX; using RenderPassNT = RenderPassMT; -#else // Linux +#elif defined __linux__ using RenderPassNT = RenderPassVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderStateNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderStateNT.h index 965bd1ead..e7c2e8468 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderStateNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderStateNT.h @@ -31,7 +31,7 @@ Native implementation alias of the render state interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using RenderStateNT = RenderStateDX; using RenderStateNT = RenderStateMT; -#else // Linux +#elif defined __linux__ using RenderStateNT = RenderStateVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ResourceNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ResourceNT.h index 2f7bb4c15..1497580bf 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ResourceNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ResourceNT.h @@ -31,7 +31,7 @@ Native implementation alias of the resource interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using ResourceNT = ResourceDX; using ResourceNT = ResourceMT; -#else // Linux +#elif defined __linux__ using ResourceNT = ResourceVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h index 894c1c98c..ed6fc82fb 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/SamplerNT.h @@ -31,7 +31,7 @@ Native implementation alias of the sampler interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using SamplerNT = SamplerDX; using SamplerNT = SamplerMT; -#else // Linux +#elif defined __linux__ using SamplerNT = SamplerVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h index 4c4c0bd16..f460c4d51 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/ShaderNT.h @@ -31,7 +31,7 @@ Native implementation alias of the shader interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using ShaderNT = ShaderDX; using ShaderNT = ShaderMT; -#else // Linux +#elif defined __linux__ using ShaderNT = ShaderVK; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h index 134a6dafc..7fbbda7bb 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/TextureNT.h @@ -31,7 +31,7 @@ Native implementation alias of the texture interface. #include -#else // Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using TextureNT = TextureDX; using TextureNT = TextureMT; -#else // Linux +#elif defined __linux__ using TextureNT = TextureVK; diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h index 1934e4f3f..bfafdeb3c 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h @@ -31,7 +31,7 @@ Methane graphics helpers: all headers under one umbrella. #include "MacOS/Helpers.h" -#else //Linux +#elif defined __linux__ #include "Linux/MathTypes.h" diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h index ded69da80..b7d805207 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/MathTypes.h @@ -31,7 +31,7 @@ Math types aliases. #include "MacOS/MathTypes.h" -#else //Linux +#elif defined __linux__ #include "Linux/MathTypes.h" diff --git a/Modules/Platform/App/Include/Methane/Platform/App.h b/Modules/Platform/App/Include/Methane/Platform/App.h index e1ef2db3c..91a02ecc3 100644 --- a/Modules/Platform/App/Include/Methane/Platform/App.h +++ b/Modules/Platform/App/Include/Methane/Platform/App.h @@ -31,7 +31,7 @@ Methane platform application alias. #include -#else //Linux +#elif defined __linux__ #include @@ -48,7 +48,7 @@ using App = AppWin; using App = AppMac; -#else // Linux +#elif defined __linux__ using App = AppLin; diff --git a/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp b/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp index 283e1d6b7..136dff147 100644 --- a/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp +++ b/Modules/Platform/App/Sources/Methane/Platform/AppBase.cpp @@ -91,7 +91,7 @@ int AppBase::Run(const RunArgs& args) strcpy_s(mutable_arg_values[argi], arg_value_size, args.cmd_arg_values[argi]); #elif defined __APPLE__ strlcpy(mutable_arg_values[argi], args.cmd_arg_values[argi], arg_value_size); -#else // Linux +#elif defined __linux__ strcpy(mutable_arg_values[argi], args.cmd_arg_values[argi]); #endif mutable_args_count++; diff --git a/Modules/Platform/AppView/Include/Methane/Platform/AppEnvironment.h b/Modules/Platform/AppView/Include/Methane/Platform/AppEnvironment.h index 4a200d6c8..c4ab8eec6 100644 --- a/Modules/Platform/AppView/Include/Methane/Platform/AppEnvironment.h +++ b/Modules/Platform/AppView/Include/Methane/Platform/AppEnvironment.h @@ -31,7 +31,7 @@ Methane application environment. #include "MacOS/AppEnvironment.hh" -#else // Linux +#elif defined __linux__ #include "Linux/AppEnvironment.h" diff --git a/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h b/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h index 7a221a254..231c61456 100644 --- a/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h +++ b/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h @@ -31,7 +31,7 @@ Platform abstraction of keyboard events. #include "MacOS/Keyboard.h" -#else // Linux +#elif defined __linux__ #include "Linux/Keyboard.h" diff --git a/Modules/Platform/Utils/Include/Methane/Platform/Utils.h b/Modules/Platform/Utils/Include/Methane/Platform/Utils.h index 755b08b17..7e09c08d9 100644 --- a/Modules/Platform/Utils/Include/Methane/Platform/Utils.h +++ b/Modules/Platform/Utils/Include/Methane/Platform/Utils.h @@ -31,7 +31,7 @@ Methane platform utilitary functions #include "MacOS/Utils.hh" -#else // Linux +#elif defined __linux__ #include "Linux/Utils.h" From 02a4b478f718e4f439d460bedad9578e4681e721 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 13:53:17 +0300 Subject: [PATCH 034/129] Parallel compilation option added to Linux build configurations. --- CMakeSettings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index 42ce071d7..b4264c426 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -57,7 +57,7 @@ "cmakeExecutable": "/usr/bin/cmake", "remoteCopySourcesExclusionList": [ ".vs", ".git", "Build/Output" ], "cmakeCommandArgs": "", - "buildCommandArgs": "", + "buildCommandArgs": "-j 4", "ctestCommandArgs": "", "inheritEnvironments": [ "linux_x64" ], "remoteMachineName": "${defaultRemoteMachineName}", @@ -80,7 +80,7 @@ "cmakeExecutable": "/usr/bin/cmake", "remoteCopySourcesExclusionList": [ ".vs", ".git", "Build/Output" ], "cmakeCommandArgs": "", - "buildCommandArgs": "", + "buildCommandArgs": "-j 4", "ctestCommandArgs": "", "inheritEnvironments": [ "linux_x64" ], "remoteMachineName": "${defaultRemoteMachineName}", From 8f4823b163812c8e090b97275bd6459508d91dce Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 14:15:26 +0300 Subject: [PATCH 035/129] Added Ubuntu build job to CI configuration. --- Build/MacOS/Env.sh | 6 ---- Build/{MacOS => Posix}/AzureBuild.yml | 0 Build/{MacOS => Posix}/Build.sh | 0 README.md | 3 +- Resources/Images/Platforms/Ubuntu.png | Bin 0 -> 1618 bytes azure-pipelines.yml | 39 ++++++++++++++++++++------ 6 files changed, 33 insertions(+), 15 deletions(-) delete mode 100755 Build/MacOS/Env.sh rename Build/{MacOS => Posix}/AzureBuild.yml (100%) rename Build/{MacOS => Posix}/Build.sh (100%) mode change 100755 => 100644 create mode 100644 Resources/Images/Platforms/Ubuntu.png diff --git a/Build/MacOS/Env.sh b/Build/MacOS/Env.sh deleted file mode 100755 index fd4422776..000000000 --- a/Build/MacOS/Env.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -echo "To Setup build aliases execute 'source Build/MacOS/Env.sh' in terminal from Methane root" - -alias init="cmake -H. -B ./Build/Output/XCode -G Xcode -DCMAKE_BUILD_TYPE=Debug" -alias build="cmake --build ./Build/Output/XCode" -alias run="open ./Build/Output/XCode/Apps/Tutorials/03-ShadowCube/Debug/MethaneShadowCube.app" diff --git a/Build/MacOS/AzureBuild.yml b/Build/Posix/AzureBuild.yml similarity index 100% rename from Build/MacOS/AzureBuild.yml rename to Build/Posix/AzureBuild.yml diff --git a/Build/MacOS/Build.sh b/Build/Posix/Build.sh old mode 100755 new mode 100644 similarity index 100% rename from Build/MacOS/Build.sh rename to Build/Posix/Build.sh diff --git a/README.md b/README.md index 6bdf54cd9..1e2737f18 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,8 @@ Note that project is in **Alpha / [MVP](https://en.wikipedia.org/wiki/Minimum_vi | ---------------- | --------------------- | --------------------- | | **Windows x64** | [![Windows x64 Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=Windows_x64)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![Windows x64 Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=Windows_x64)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | | **Windows x86** | [![Windows x86 Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=Windows_x86)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![Windows x86 Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=Windows_x86)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | -| **MacOS** | [![MacOS Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=macOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![MacOS Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=macOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | +| **MacOS** | [![MacOS Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=MacOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![MacOS Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=MacOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | +| **Ubuntu Linux** | [![Ubuntu Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=Ubuntu)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![Ubuntu Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=Ubuntu)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=alert_status)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) diff --git a/Resources/Images/Platforms/Ubuntu.png b/Resources/Images/Platforms/Ubuntu.png new file mode 100644 index 0000000000000000000000000000000000000000..b49ceca3bf99b7599f2836612ddd2bdfb0d352fc GIT binary patch literal 1618 zcmV-Y2CeytP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA1?NdbK~z{rrI&eZ z)I}7>zw`TTceizW(9$hON|!?g1V!-#q)1WGC;@>$ASy-zDtMp)6a_SZL8Jnvi6%sY zAtI&JnqUH6J%|uU1WObJ1Zio39`vy79^GqvGdtaF`Tgh-K7Z`a`@Wf-nKy5aW#}b* z$@sY1#>Oe&d@5OYljH(eG6QEEXa++CY2}QwVyBi+$_oDS%Z5GB;{a;r56#em{0+|e zVldWU$vx4)!N2r{_%>J3rK?Ia<%R>`*|5~5yH;?Hb&SEGsDBgOnhN4nVBA4Es&Y zJaO>`=mT9~35jq#w+4FpVC9Lx7#m`<>IFPI+oGh{07Sy|X3e#fbi_aLJd#)Bq2I_e?I(VLuVg=xUj0PY^A_(z>*sGPZ&xTgJh~-xYx>@*D>4FNpLf@}n6;R#t}EEBjkm2yB{ zEL{*`2h(U>r-E7Hq!u`Pf)a}k#~$#NeT%^9W3nvT+9%GCWiu!j#)%}PTTP*9NLs!X z>AO!OEw2>8%D)l1dQrN>?0Sp0Q{A|c_o|W+S_T&lfF&y%*0B>|&z>zkx-%0AvzEbk z_&e#73D-;ffBXvfzHM;t%|-k1LrOJ)BSjPUxiXDNk2=#0XL~nLRUQn;q(vy8L?cv< zY4p*oY#R9y_>LT)eIAw>?J4>U_J?OmpV(@>MMToEU={74)v!%`TB$~8e$5(vikD0T z>bPb5Yp8$r4m2#I%VEe!=!1qym)PgM#XcogH*n^JDjA{JSBNAmkC-vI-$x%|w4W@N zp%jQi#y(|^EO&=}(hOL~Oo$j1ei_jlK+!MP#2Zf82Et8s@cyt{SwPa#59uC=97<-0 z&J$nxSXs0ie$J=Es+$)X4;M2&ceJ&Rd#;d~7E!yx>zN^P&)H@fAoILtcGecUt5-^o30glVQr7OK4$s0}umfqi zw6*l;l^(@+xCq{ZU&&<)H`XHD(x5yhaBR;gtXLrjP%&%Bz<5pjhZ6D@=`=w^LSDy9 zHqqTMU8ynrCrc>gdyw?{4tbJ#f82xCo$o2H0gpcvxIMGzaW0+ zmCVlQAtatjwds{*B*Yf7kEDKd0G456A_nC~!}7@p)m2CADEzpy-ZiP?nJynB0wIW} zGgYWmQlDx4Vm(4NmEfKhwC&kq)_IkV(Cp6t5uy?3pmtv7aPfK-4@f2T9lA+HoV&uS zn66E8=3hLg1W7ak9f)_k7UmDqHaV)KzGLkCIL-W_>pK@11|SgsU^42nvKi;^(m>4L zRK3GPV_7fOy#M~{%S!8lVF|9Metza4`GDkDM72|u+%4jep})+#{NX^Z*lJ2PrN;qu zaBlhtTS`J8C&X9|H5w-#6Vy`*bw))ri;IQI<>GkFa9e-U4xMjTO}hd3AN~zR2HoNo QKmY&$07*qoM6N<$g2^`euK)l5 literal 0 HcmV?d00001 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2c1c454f3..1a702b92a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -28,6 +28,10 @@ resources: checkoutOptions: submodules: recursive +variables: + buildConfiguration: 'Release' + buildCmakeFlags: '-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF -DMETHANE_BUILD_NUMBER=$(Build.BuildNumber)' + jobs: - job: Windows_x64 @@ -37,10 +41,10 @@ jobs: variables: platform: 'Win64' - configuration: 'Release' + configuration: $(buildConfiguration) vcVarsBatFile: 'vcvars64.bat' generatorName: '"Visual Studio 15 2017 Win64"' - cmakeFlags: '-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF -DMETHANE_BUILD_NUMBER=$(Build.BuildNumber)' + cmakeFlags: $(buildCmakeFlags) buildName: '$(platform)-$(configuration)' buildDir: 'Build\Output\$(buildName)\Build' installDir: 'Build\Output\$(buildName)\Install' @@ -57,10 +61,10 @@ jobs: variables: platform: 'Win32' - configuration: 'Release' + configuration: $(buildConfiguration) vcVarsBatFile: 'vcvars32.bat' generatorName: '"Visual Studio 15 2017"' - cmakeFlags: '-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF -DMETHANE_BUILD_NUMBER=$(Build.BuildNumber)' + cmakeFlags: $(buildCmakeFlags) buildName: '$(platform)-$(configuration)' buildDir: 'Build\Output\$(buildName)\Build' installDir: 'Build\Output\$(buildName)\Install' @@ -70,16 +74,35 @@ jobs: steps: - template: Build/Windows/AzureBuild.yml -- job: macOS +- job: MacOS pool: vmImage: 'macOS-10.13' variables: platform: 'MacOS' - configuration: 'Release' + configuration: $(buildConfiguration) generatorName: 'Xcode' - cmakeFlags: '-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF -DMETHANE_BUILD_NUMBER=$(Build.BuildNumber)' + cmakeFlags: $(buildCmakeFlags) + buildName: '$(platform)-$(configuration)' + buildDir: 'Build/Output/$(buildName)/Build' + installDir: 'Build/Output/$(buildName)/Install' + buildInstallDir: '../Install' + rootDir: '../../../..' + + steps: + - template: Build/Posix/AzureBuild.yml + + - job: Ubuntu + + pool: + vmImage: 'ubuntu-18.04' + + variables: + platform: 'Ubuntu' + configuration: $(buildConfiguration) + generatorName: '"Unix Makefiles"' + cmakeFlags: $(buildCmakeFlags) buildName: '$(platform)-$(configuration)' buildDir: 'Build/Output/$(buildName)/Build' installDir: 'Build/Output/$(buildName)/Install' @@ -87,4 +110,4 @@ jobs: rootDir: '../../../..' steps: - - template: Build/MacOS/AzureBuild.yml \ No newline at end of file + - template: Build/Posix/AzureBuild.yml \ No newline at end of file From 03a5d0d190a1f8d75bd5655afa7025e1b62cbe4e Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 14:30:35 +0300 Subject: [PATCH 036/129] Fixed CI yaml and 'macOS' job name in ReadMe. --- README.md | 2 +- azure-pipelines.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1e2737f18..2e525f599 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Note that project is in **Alpha / [MVP](https://en.wikipedia.org/wiki/Minimum_vi | ---------------- | --------------------- | --------------------- | | **Windows x64** | [![Windows x64 Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=Windows_x64)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![Windows x64 Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=Windows_x64)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | | **Windows x86** | [![Windows x86 Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=Windows_x86)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![Windows x86 Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=Windows_x86)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | -| **MacOS** | [![MacOS Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=MacOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![MacOS Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=MacOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | +| **MacOS** | [![MacOS Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=macOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![MacOS Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=macOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | | **Ubuntu Linux** | [![Ubuntu Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=Ubuntu)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![Ubuntu Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=Ubuntu)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=alert_status)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1a702b92a..f559f03b9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -74,7 +74,7 @@ jobs: steps: - template: Build/Windows/AzureBuild.yml -- job: MacOS +- job: macOS pool: vmImage: 'macOS-10.13' @@ -93,7 +93,7 @@ jobs: steps: - template: Build/Posix/AzureBuild.yml - - job: Ubuntu +- job: Ubuntu pool: vmImage: 'ubuntu-18.04' From fdab9999b2be6d03328593b162cf636d71065186 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetskiy Date: Sun, 22 Dec 2019 13:34:39 +0000 Subject: [PATCH 037/129] GitPod cloud-IDE configuration added. --- .gitpod.yml | 7 +++++++ .vscode/c_cpp_properties.json | 29 ++++++++++++++++++++++++++ .vscode/settings.json | 7 +++++-- CMakeLists.txt | 4 ++-- Modules/Data/RangeSet/Test/Main.cpp | 1 + Modules/Graphics/Helpers/Test/Main.cpp | 1 + Modules/Platform/Input/Test/Main.cpp | 1 + 7 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 .gitpod.yml create mode 100644 .vscode/c_cpp_properties.json diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..e99d86758 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,7 @@ +vscode: + extensions: + - ms-vscode.cmake-tools@1.2.3:qLtqI3aUcEBX9EpuK0ZCyw== + - twxs.cmake@0.0.17:9s7m9CWOr6i6NZ7CNNF4kw== + - ms-vscode.cpptools@0.26.2:Pq/tmf2WN3SanVzB4xZc1g== + - hbenl.vscode-test-explorer@2.15.0:koqDUMWDPJzELp/hdS/lWw== + - matepek.vscode-catch2-test-adapter@2.7.11:d0fFTjhYEi0j4Yd2SYZdbQ== \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 000000000..73483f6cd --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,29 @@ +{ + "env": { + "defaultIncludePath": [ + "${workspaceFolder}/Externals/**", + "${workspaceFolder}/Modules/**", + "${workspaceFolder}/Apps/**" + ], + "defaultDefines": [ + "ITT_INSTRUMENTATION_ENABLED" + ], + "defaultCStandard": "c11", + "defaultCppStandard": "c++17" + }, + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${defaultIncludePath}" + ], + "defines": [], + "cStandard": "${defaultCStandard}", + "cppStandard": "${defaultCppStandard}", + "compilerPath": "/usr/bin/gcc", + "configurationProvider": "vector-of-bool.cmake-tools", + "compileCommands": "${workspaceFolder}/Build/Output/VSCode/Build/compile_commands.json" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index f190b376c..e84351aec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,11 +4,14 @@ "cmake.installPrefix": "${workspaceRoot}/Build/Output/VSCode/Install", "cmake.configureArgs": [ "-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON", - "-DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON" + "-DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON", + "-DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF" ], - "C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools", "C_Cpp.default.cppStandard": "c++17", "C_Cpp.default.cStandard": "c11", "C_Cpp.default.intelliSenseMode": "clang-x64", + "files.exclude": { + "Build/Output": true + } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index bca34ffd3..7106e493d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,8 @@ if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") set(WINDOWS_SDK_BIN_PATH $ENV{WindowsSdkVerBinPath}x64) + add_definitions(-DUNICODE -D_UNICODE -DNOMINMAX -DWIN32_LEAN_AND_MEAN -DUSE_PIX) + elseif(APPLE) set(CMAKE_BUILD_WITH_INSTALL_RPATH true) @@ -43,8 +45,6 @@ elseif(APPLE) endif() -add_definitions(-DUNICODE -D_UNICODE -DNOMINMAX -DWIN32_LEAN_AND_MEAN -DUSE_PIX) - if(METHANE_ITT_INSTRUMENTATION_ENABLED) add_definitions(-DITT_INSTRUMENTATION_ENABLED) endif() diff --git a/Modules/Data/RangeSet/Test/Main.cpp b/Modules/Data/RangeSet/Test/Main.cpp index c78b1c4ca..b3ff3427d 100644 --- a/Modules/Data/RangeSet/Test/Main.cpp +++ b/Modules/Data/RangeSet/Test/Main.cpp @@ -20,5 +20,6 @@ FILE: Test/Main.cpp ******************************************************************************/ +#define CATCH_CONFIG_CONSOLE_WIDTH 300 #define CATCH_CONFIG_MAIN #include \ No newline at end of file diff --git a/Modules/Graphics/Helpers/Test/Main.cpp b/Modules/Graphics/Helpers/Test/Main.cpp index c78b1c4ca..1db56dbf4 100644 --- a/Modules/Graphics/Helpers/Test/Main.cpp +++ b/Modules/Graphics/Helpers/Test/Main.cpp @@ -20,5 +20,6 @@ FILE: Test/Main.cpp ******************************************************************************/ +#define CATCH_CONFIG_CONSOLE_WIDTH 300 // Required for VS Code Test Explorer to work #define CATCH_CONFIG_MAIN #include \ No newline at end of file diff --git a/Modules/Platform/Input/Test/Main.cpp b/Modules/Platform/Input/Test/Main.cpp index c78b1c4ca..b3ff3427d 100644 --- a/Modules/Platform/Input/Test/Main.cpp +++ b/Modules/Platform/Input/Test/Main.cpp @@ -20,5 +20,6 @@ FILE: Test/Main.cpp ******************************************************************************/ +#define CATCH_CONFIG_CONSOLE_WIDTH 300 #define CATCH_CONFIG_MAIN #include \ No newline at end of file From 5f78d9415fd18b8172e2af387e88d15e0df7cd69 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetskiy Date: Sun, 22 Dec 2019 13:54:18 +0000 Subject: [PATCH 038/129] "Open in Gitpod" button added to README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e525f599..472960e09 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,10 @@ - **Simplifies modern graphics programming** with object-oriented graphics API inspired by simplicity of Apple's Metal. - **Provides cross-platform application infrastructure** from CMake-based toolchain to application and user input classes. -Note that project is in **Alpha / [MVP](https://en.wikipedia.org/wiki/Minimum_viable_product)** stage and is under active development. +Note that project is in Alpha stage and is under active development. +You can check out Methane Kit right away in a familiar "VS Code" like IDE environment in your web-browser with the "Open in Gitpod" button. + +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/theia-ide/theia) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) [![LoC](https://tokei.rs/b1/github/egorodet/MethaneKit)](https://github.com/egorodet/MethaneKit) From f7f09690037db1210c16e111da47b47610822ce0 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetskiy Date: Sun, 22 Dec 2019 14:01:15 +0000 Subject: [PATCH 039/129] Rearranged badges on ReadME.md --- README.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 472960e09..649b539f8 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,18 @@ # Methane Kit +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/theia-ide/theia) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) +[![Contributions Welcome](https://img.shields.io/badge/contributions-welcome-purple.svg?style=flat)](https://github.com/egorodet/MethaneKit/issues) +[![Join the chat at https://gitter.im/MethaneKit/community](https://badges.gitter.im/MethaneKit/community.svg)](https://gitter.im/MethaneKit/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Total lines](https://tokei.rs/b1/github/egorodet/MethaneKit)](https://github.com/egorodet/MethaneKit) + **Easy to use modern 3D graphics abstraction API in C++17 for cross-platform applications development:** - **Built on top of modern native 3D graphics APIs**: DirectX 12 on Windows and Metal on MacOS. - **Simplifies modern graphics programming** with object-oriented graphics API inspired by simplicity of Apple's Metal. - **Provides cross-platform application infrastructure** from CMake-based toolchain to application and user input classes. Note that project is in Alpha stage and is under active development. -You can check out Methane Kit right away in a familiar "VS Code" like IDE environment in your web-browser with the "Open in Gitpod" button. - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/theia-ide/theia) - -[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) -[![LoC](https://tokei.rs/b1/github/egorodet/MethaneKit)](https://github.com/egorodet/MethaneKit) -[![Codacy](https://api.codacy.com/project/badge/Grade/25ae34bade994076bf636290791b3e0f)](https://www.codacy.com/app/egorodet/MethaneKit?utm_source=github.com&utm_medium=referral&utm_content=egorodet/MethaneKit&utm_campaign=Badge_Grade) -[![CodeFactor](https://www.codefactor.io/repository/github/egorodet/methanekit/badge)](https://www.codefactor.io/repository/github/egorodet/methanekit) -[![Contributions Welcome](https://img.shields.io/badge/contributions-welcome-purple.svg?style=flat)](https://github.com/egorodet/MethaneKit/issues) -[![Join the chat at https://gitter.im/MethaneKit/community](https://badges.gitter.im/MethaneKit/community.svg)](https://gitter.im/MethaneKit/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![HitCount](http://hits.dwyl.io/egorodet/MethaneKit.svg)](http://hits.dwyl.io/egorodet/MethaneKit) +Check out the codebase right away in a familiar "VS Code" IDE environment in your web-browser using the "Open in Gitpod" button above. | Platform | Master Build Status | Develop Build Status | | ---------------- | --------------------- | --------------------- | @@ -25,9 +21,12 @@ You can check out Methane Kit right away in a familiar "VS Code" like IDE enviro | **MacOS** | [![MacOS Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=macOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![MacOS Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=macOS)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | | **Ubuntu Linux** | [![Ubuntu Master Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=master&jobName=Ubuntu)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=master) | [![Ubuntu Develop Build Status](https://egorodet.visualstudio.com/MethaneKit/_apis/build/status/egorodet.MethaneKit?branchName=develop&jobName=Ubuntu)](https://egorodet.visualstudio.com/MethaneKit/_build/latest?definitionId=5&branchName=develop) | +[![Codacy](https://api.codacy.com/project/badge/Grade/25ae34bade994076bf636290791b3e0f)](https://www.codacy.com/app/egorodet/MethaneKit?utm_source=github.com&utm_medium=referral&utm_content=egorodet/MethaneKit&utm_campaign=Badge_Grade) +[![CodeFactor](https://www.codefactor.io/repository/github/egorodet/methanekit/badge)](https://www.codefactor.io/repository/github/egorodet/methanekit) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=alert_status)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=ncloc)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) +[![HitCount](http://hits.dwyl.io/egorodet/MethaneKit.svg)](http://hits.dwyl.io/egorodet/MethaneKit) ## Features From 1ea42129ed735357add77cd2bac25ea2e15bde8e Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetskiy Date: Sun, 22 Dec 2019 14:15:58 +0000 Subject: [PATCH 040/129] Fixed GitPod URL and Parallel Cmd List support status on README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 649b539f8..4692f85d5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Methane Kit -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/theia-ide/theia) +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/egorodet/MethaneKit) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) [![Contributions Welcome](https://img.shields.io/badge/contributions-welcome-purple.svg?style=flat)](https://github.com/egorodet/MethaneKit/issues) [![Join the chat at https://gitter.im/MethaneKit/community](https://badges.gitter.im/MethaneKit/community.svg)](https://gitter.im/MethaneKit/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -63,7 +63,7 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - [x] Continous integration system - [x] Application user input with mouse and keyboard -- [ ] Parallel command lists +- [x] Parallel command lists - [ ] Text rendering - [ ] User interface library - [ ] Improved shader conversion From 7189901eddc77c433a65e57448f08dba0c4ff1b1 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetskiy Date: Sun, 22 Dec 2019 14:38:55 +0000 Subject: [PATCH 041/129] Updated README.md with git submodules update procedure. --- .../HelloTriangleAppSimple.cpp | 2 +- Build/Posix/Build.sh | 4 +-- Build/Windows/Build.bat | 4 +-- README.md | 27 +++++++++---------- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp index 6066f28aa..62f93258a 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp @@ -53,7 +53,7 @@ class HelloTriangleApp final : public GraphicsApp Color4f(0.0f, 0.2f, 0.4f, 1.0f), // - clear_color }, // true // show_hud_in_window_title - }, + }, RenderPass::Access::None) // screen_pass_access (program access to resources) { } diff --git a/Build/Posix/Build.sh b/Build/Posix/Build.sh index e2bd51a29..3e9a7eb72 100644 --- a/Build/Posix/Build.sh +++ b/Build/Posix/Build.sh @@ -46,8 +46,8 @@ fi rm -rf "$OUTPUT_DIR" mkdir -p "$BUILD_DIR" -echo Pulling latest changes with submodules... -git pull --recurse-submodules +echo Pulling latest changes from submodules... +git submodule update --init --recursive echo --- diff --git a/Build/Windows/Build.bat b/Build/Windows/Build.bat index 14fcd939e..99caea692 100644 --- a/Build/Windows/Build.bat +++ b/Build/Windows/Build.bat @@ -49,8 +49,8 @@ IF "%~1"=="--analyze" ( ECHO ========================================================= ) -ECHO Pulling latest changes with submodules... -git pull --recurse-submodules +ECHO Pulling latest changes from submodules... +git submodule update --init --recursive IF %ERRORLEVEL% NEQ 0 GOTO ERROR RD /S /Q "%BUILD_DIR%" diff --git a/README.md b/README.md index 4692f85d5..a0aef6511 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - **Cross-platform** - Supported platforms: - Windows 10 with DirectX 12 API - - MacOS 10.13 "El Capitan" or later with Metal API + - MacOS 10.13 with Metal API - Application infrastructure: - [Methane CMake modules](/CMake) implement toolchain for cross-platform graphics applications build setup. - [Base application class](/Modules/Platform/App/Include/Methane/Platform/AppBase.h) and platform-specific implementations are completely GLFW free! @@ -50,7 +50,7 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - [Program::ResourceBindings](/Modules/Graphics/Core/Include/Methane/Graphics/Program.h) simplifies binding resources to programs by uniform variable names and enables fast bindings switching at runtime - [RenderState](/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h) and [RenderPass](/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h) used for inputs and outputs configuration of the graphics pipeline - [RenderCommandList](/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h) and [CommandQueue](/Modules/Graphics/Core/Include/Methane/Graphics/CommandQueue.h) for render commands encoding and execution - - [Core interface extensions](/Modules/Graphics/Extensions/Include/Methane/Graphics) like: ImageLoader for loading images to textures from common image formats. + - [Core interface extensions](/Modules/Graphics/Extensions/Include/Methane/Graphics) like: ImageLoader for loading images to textures, SkyBox renderer, etc. - [Common 3D graphics helpers](/Modules/Graphics/Helpers/Include/Methane/Graphics) like: Camera, Timer, Mesh generator, etc. - **Lightweight**: - No heavy external dependencies: almost all libraries are header only. @@ -94,27 +94,25 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - **First time initialization** ```console -mkdir MethaneKit -cd MethaneKit +mkdir MethaneKit && cd MethaneKit git clone --recurse-submodules --depth 1 https://github.com/egorodet/MethaneKit.git ``` - **Update sources to latest version** ```console cd MethaneKit -git pull --recurse-submodules +git pull && git submodule update --init --depth 1 --recursive ``` #### Windows Build Start **"x64 Native Tools Command Prompt for VS2017"** (it initializes environment with VS path to Windows SDK, etc), then go to MethaneKit root directory (see instructions above to initialize repository and get latest code with submodules) and either start auxiliary build script [Build/Windows/Build.bat](Build/Windows/Build.bat) or build with cmake manually: ```console -mkdir Build\Output\VisualStudio\Build -cd Build\Output\VisualStudio\Build +mkdir Build\Output\VisualStudio\Build && cd Build\Output\VisualStudio\Build cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX="%cd%\..\Install" "..\..\..\.." cmake --build . --config Release --target install ``` -Alternatively you can open root [CMakeLists.txt](CMakeLists.txt) directly in Visual Studio 2017 (or any other CMake IDE of your choice) and build it with using "Ninja" and provided configuration file [CMakeSettings.json](CMakeSettings.json). +Alternatively you can open root [CMakeLists.txt](CMakeLists.txt) directly in Visual Studio 2017 (or any other CMake IDE of your choice) and build it using "Ninja" generator and provided configuration file [CMakeSettings.json](CMakeSettings.json). Run applications from the installation directory `Build\Output\VisualStudio\Install\Apps`. @@ -122,8 +120,7 @@ Run applications from the installation directory `Build\Output\VisualStudio\Inst Start terminal, then go to MethaneKit root directory (see instructions above to initialize repository and get latest code with submodules) and either start auxiliary build script [Build/MacOS/Build.sh](Build/MacOS/Build.sh) or build with cmake manually: ```console -mkdir -p Build/Output/XCode/Build -cd Build/Output/XCode/Build +mkdir -p Build/Output/XCode/Build && cd Build/Output/XCode/Build cmake -H../../../.. -B. -G Xcode -DCMAKE_INSTALL_PREFIX="$(pwd)/../Install" cmake --build . --config Release --target install ``` @@ -176,7 +173,7 @@ public: Color4f(0.0f, 0.2f, 0.4f, 1.0f), // - clear_color }, // true // show_hud_in_window_title - }, + }, RenderPass::Access::None) // screen_pass_access (program access to resources) { } @@ -236,10 +233,10 @@ public: return true; } - void Render() override + bool Render() override { - if (!m_sp_context->ReadyToRender()) - return; + if (!m_sp_context->ReadyToRender() || !GraphicsApp::Render()) + return false; m_sp_context->WaitForGpu(Context::WaitFor::FramePresented); HelloTriangleFrame& frame = GetCurrentFrame(); @@ -252,7 +249,7 @@ public: m_sp_context->GetRenderCommandQueue().Execute({ *frame.sp_cmd_list }); m_sp_context->Present(); - GraphicsApp::Render(); + return true; } void OnContextReleased() override From b939d5b45762d894c03001b7320b8876d5c56c2e Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 19:54:58 +0300 Subject: [PATCH 042/129] Program resource bindings apply behavior flags added for optimization purposes. --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 6 ++++-- .../Include/Methane/Graphics/CommandList.h | 3 ++- .../Core/Include/Methane/Graphics/Program.h | 17 +++++++++++++++- .../Methane/Graphics/CommandListBase.cpp | 4 ++-- .../Methane/Graphics/CommandListBase.h | 2 +- .../Methane/Graphics/DirectX12/ProgramDX.cpp | 20 ++++++++++++------- .../Methane/Graphics/DirectX12/ProgramDX.h | 2 +- .../Methane/Graphics/Metal/ProgramMT.hh | 2 +- .../Methane/Graphics/Metal/ProgramMT.mm | 5 +++-- .../Sources/Methane/Graphics/ShaderBase.cpp | 7 ++++++- .../Sources/Methane/Graphics/ShaderBase.h | 4 +++- .../Methane/Graphics/Vulkan/ProgramVK.cpp | 5 +++-- .../Methane/Graphics/Vulkan/ProgramVK.h | 2 +- .../Include/Methane/Graphics/MeshBuffers.hpp | 10 ++++++---- 14 files changed, 62 insertions(+), 27 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 56992d8c2..efcd9f2b0 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -359,7 +359,8 @@ void AsteroidsArray::Draw(gfx::RenderCommandList &cmd_list, gfx::MeshBufferBindi cmd_list.Reset(*m_sp_render_state, "Asteroids rendering"); assert(buffer_bindings.resource_bindings_per_instance.size() == m_settings.instance_count); - BaseBuffers::Draw(cmd_list, buffer_bindings.resource_bindings_per_instance); + BaseBuffers::Draw(cmd_list, buffer_bindings.resource_bindings_per_instance, + gfx::Program::ResourceBindings::ApplyBehavior::ConstantOnce); } void AsteroidsArray::Draw(gfx::ParallelRenderCommandList& parallel_cmd_list, gfx::MeshBufferBindings& buffer_bindings) @@ -374,7 +375,8 @@ void AsteroidsArray::Draw(gfx::ParallelRenderCommandList& parallel_cmd_list, gfx parallel_cmd_list.Reset(*m_sp_render_state, "Asteroids Rendering"); assert(buffer_bindings.resource_bindings_per_instance.size() == m_settings.instance_count); - BaseBuffers::Draw(parallel_cmd_list, buffer_bindings.resource_bindings_per_instance); + BaseBuffers::Draw(parallel_cmd_list, buffer_bindings.resource_bindings_per_instance, + gfx::Program::ResourceBindings::ApplyBehavior::ConstantOnce); } uint32_t AsteroidsArray::GetSubsetByInstanceIndex(uint32_t instance_index) const diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/CommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/CommandList.h index f2db9fdb7..8bb34dcc6 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/CommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/CommandList.h @@ -54,7 +54,8 @@ struct CommandList : virtual Object virtual Type GetType() const = 0; virtual void PushDebugGroup(const std::string& name) = 0; virtual void PopDebugGroup() = 0; - virtual void SetResourceBindings(Program::ResourceBindings& resource_bindings) = 0; + virtual void SetResourceBindings(Program::ResourceBindings& resource_bindings, + Program::ResourceBindings::ApplyBehavior::Mask apply_behavior = Program::ResourceBindings::ApplyBehavior::AllIncremental) = 0; virtual void Commit(bool present_drawable) = 0; virtual CommandQueue& GetCommandQueue() = 0; diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Program.h b/Modules/Graphics/Core/Include/Methane/Graphics/Program.h index 0be2c44f5..90efea084 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Program.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Program.h @@ -94,13 +94,28 @@ struct Program using WeakPtr = std::weak_ptr; using ResourceLocationByArgument = std::unordered_map; + struct ApplyBehavior + { + using Mask = uint32_t; + enum Value : Mask + { + Indifferent = 0u, // All bindings will be applied indifferently of the previous binding values + ConstantOnce = 1u << 0, // Constant program arguments will be applied only once for each command list + ChangesOnly = 1u << 1, // Only changed program argument values will be applied in command sequence + StateBarriers = 1u << 2, // Resource state barriers will be automatically evaluated and set for command list + AllIncremental = ~0u // All binding values will be applied incrementally along with resource state barriers + }; + + ApplyBehavior() = delete; + }; + // Create ResourceBindings instance static Ptr Create(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument); static Ptr CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationByArgument& replace_resource_location_by_argument = {}); // ResourceBindings interface virtual const Shader::ResourceBinding::Ptr& Get(const Argument& shader_argument) const = 0; - virtual void Apply(CommandList& command_list) const = 0; + virtual void Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior = ApplyBehavior::AllIncremental) const = 0; virtual ~ResourceBindings() = default; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.cpp index 4755aaebe..1f3608d3c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.cpp @@ -176,10 +176,10 @@ void CommandListBase::ResetCommandState() m_command_state.sp_resource_bindings.reset(); } -void CommandListBase::SetResourceBindings(Program::ResourceBindings& resource_bindings) +void CommandListBase::SetResourceBindings(Program::ResourceBindings& resource_bindings, Program::ResourceBindings::ApplyBehavior::Mask apply_behavior) { ITT_FUNCTION_TASK(); - resource_bindings.Apply(*this); + resource_bindings.Apply(*this, apply_behavior); m_command_state.sp_resource_bindings = static_cast(resource_bindings).GetPtr(); } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h index c12231be3..be0ee4b9c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h @@ -65,7 +65,7 @@ class CommandListBase // CommandList interface Type GetType() const override { return m_type; } - void SetResourceBindings(Program::ResourceBindings& resource_bindings) override; + void SetResourceBindings(Program::ResourceBindings& resource_bindings, Program::ResourceBindings::ApplyBehavior::Mask apply_behavior) override; void Commit(bool present_drawable) override; CommandQueue& GetCommandQueue() override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp index 00e905927..ddc9f4be7 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp @@ -42,6 +42,7 @@ DirectX 12 implementation of the program interface. #include #include #include +#include "../ResourceBase.h" namespace Methane::Graphics { @@ -151,7 +152,7 @@ void ProgramDX::ResourceBindingsDX::CompleteInitialization() CopyDescriptorsToGpu(); } -void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list) const +void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior) const { ITT_FUNCTION_TASK(); @@ -173,9 +174,12 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list) const ResourceBase::Barriers resource_transition_barriers; std::vector graphics_root_parameter_bindings; + graphics_root_parameter_bindings.reserve(m_resource_binding_by_argument.size()); + ForEachResourceBinding([&](ResourceDX& resource, const Argument& argument, ShaderDX::ResourceBindingDX& resource_binding, const DescriptorHeap::Reservation* p_heap_reservation) { - if (resource_binding.IsAlreadyApplied(*m_sp_program, argument, command_state)) + if ((apply_behavior & ApplyBehavior::ConstantOnce || apply_behavior & ApplyBehavior::ChangesOnly) && + resource_binding.IsAlreadyApplied(*m_sp_program, argument, command_state, apply_behavior & ApplyBehavior::ChangesOnly)) return; const DXBindingType binding_type = resource_binding.GetSettings().type; @@ -205,11 +209,13 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list) const gpu_virtual_address }); - const ResourceBase::State resource_state = resource_binding.GetShaderType() == Shader::Type::Pixel - ? ResourceBase::State::PixelShaderResource - : ResourceBase::State::NonPixelShaderResource; - - resource.SetState(resource_state, resource_transition_barriers); + if (apply_behavior & ApplyBehavior::StateBarriers) + { + const ResourceBase::State resource_state = resource_binding.GetShaderType() == Shader::Type::Pixel + ? ResourceBase::State::PixelShaderResource + : ResourceBase::State::NonPixelShaderResource; + resource.SetState(resource_state, resource_transition_barriers); + } }); // Set resource transition barriers before applying resource bindings diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h index 9bbf36749..d871e31f7 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h @@ -54,7 +54,7 @@ class ProgramDX final : public ProgramBase // ResourceBindings interface void CompleteInitialization() override; - void Apply(CommandList& command_list) const override; + void Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior) const override; protected: using ApplyResourceBindingFunc = std::function; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.hh index efbe3ab25..c96f79633 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.hh @@ -43,7 +43,7 @@ public: ResourceBindingsMT(const ResourceBindingsMT& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument); // ResourceBindings interface - void Apply(CommandList& command_list) const override; + void Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior) const override; // ResourceBindingsBase interface void CompleteInitialization() override { } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm index 8aeb22a24..c1a7cbea9 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm @@ -120,7 +120,7 @@ static void SetMetalResourceForAll(Shader::Type shader_type, Program& program, i ITT_FUNCTION_TASK(); } -void ProgramMT::ResourceBindingsMT::Apply(CommandList& command_list) const +void ProgramMT::ResourceBindingsMT::Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior) const { ITT_FUNCTION_TASK(); @@ -145,7 +145,8 @@ static void SetMetalResourceForAll(Shader::Type shader_type, Program& program, i #endif } - if (metal_resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state)) + if ((apply_behavior & ApplyBehavior::ConstantOnce || apply_behavior & ApplyBehavior::ChangesOnly) && + resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state, apply_behavior & ApplyBehavior::ChangesOnly)) continue; const Resource::Type resource_type = bound_resource_location.sp_resource->GetResourceType(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp index ca91e8b3f..7cd1be992 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp @@ -68,7 +68,9 @@ void ShaderBase::ResourceBindingBase::SetResourceLocation(Resource::Location res m_resource_location = std::move(resource_location); } -bool ShaderBase::ResourceBindingBase::IsAlreadyApplied(const Program& program, const Program::Argument& program_argument, const CommandListBase::CommandState& command_state) const +bool ShaderBase::ResourceBindingBase::IsAlreadyApplied(const Program& program, const Program::Argument& program_argument, + const CommandListBase::CommandState& command_state, + bool check_binding_value_changes) const { ITT_FUNCTION_TASK(); @@ -85,6 +87,9 @@ bool ShaderBase::ResourceBindingBase::IsAlreadyApplied(const Program& program, c if (m_settings.is_constant) return true; + if (!check_binding_value_changes) + return false; + const Shader::ResourceBinding::Ptr& previous_argument_resource_binding = command_state.sp_resource_bindings->Get(program_argument); if (!previous_argument_resource_binding) return false; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.h index f88ee9b0f..edf27d7f0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.h @@ -69,7 +69,9 @@ class ShaderBase Ptr GetPtr() { return shared_from_this(); } bool HasResource() const { return !!m_resource_location.sp_resource; } - bool IsAlreadyApplied(const Program& program, const Program::Argument& program_argument, const CommandListBase::CommandState& command_state) const; + bool IsAlreadyApplied(const Program& program, const Program::Argument& program_argument, + const CommandListBase::CommandState& command_state, + bool check_binding_value_changes) const; protected: ContextBase& m_context; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp index 79b24c27e..a45d1d550 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp @@ -58,7 +58,7 @@ ProgramVK::ResourceBindingsVK::ResourceBindingsVK(const ResourceBindingsVK& othe ITT_FUNCTION_TASK(); } -void ProgramVK::ResourceBindingsVK::Apply(CommandList& command_list) const +void ProgramVK::ResourceBindingsVK::Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior) const { ITT_FUNCTION_TASK(); @@ -82,7 +82,8 @@ void ProgramVK::ResourceBindingsVK::Apply(CommandList& command_list) const #endif } - if (vulkan_resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state)) + if ((apply_behavior & ApplyBehavior::ConstantOnce || apply_behavior & ApplyBehavior::ChangesOnly) && + vulkan_resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state, apply_behavior & ApplyBehavior::ChangesOnly)) continue; } } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h index 230ffda2a..19aca6d57 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h @@ -41,7 +41,7 @@ class ProgramVK : public ProgramBase ResourceBindingsVK(const ResourceBindingsVK& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument); // ResourceBindings interface - void Apply(CommandList& command_list) const override; + void Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior) const override; // ResourceBindingsBase interface void CompleteInitialization() override { } diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp index 029547be1..85bd40b5e 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp @@ -123,6 +123,7 @@ class MeshBuffers void Draw(RenderCommandList& cmd_list, const MeshBufferBindings::ResourceBindingsArray::const_iterator& instance_resource_bindings_begin, const MeshBufferBindings::ResourceBindingsArray::const_iterator& instance_resource_bindings_end, + Program::ResourceBindings::ApplyBehavior::Mask bindings_apply_behavior = Program::ResourceBindings::ApplyBehavior::AllIncremental, uint32_t first_instance_index = 0) { ITT_FUNCTION_TASK(); @@ -145,7 +146,7 @@ class MeshBuffers const Mesh::Subset& mesh_subset = m_mesh_subsets[subset_index]; - cmd_list.SetResourceBindings(*sp_resource_bindings); + cmd_list.SetResourceBindings(*sp_resource_bindings, bindings_apply_behavior); cmd_list.DrawIndexed(RenderCommandList::Primitive::Triangle, index_buffer, mesh_subset.indices.count, mesh_subset.indices.offset, mesh_subset.indices_adjusted ? 0 : mesh_subset.vertices.offset, @@ -153,7 +154,8 @@ class MeshBuffers } } - void Draw(ParallelRenderCommandList& parallel_cmd_list, const MeshBufferBindings::ResourceBindingsArray& instance_resource_bindings) + void Draw(ParallelRenderCommandList& parallel_cmd_list, const MeshBufferBindings::ResourceBindingsArray& instance_resource_bindings, + Program::ResourceBindings::ApplyBehavior::Mask bindings_apply_behavior = Program::ResourceBindings::ApplyBehavior::AllIncremental) { ITT_FUNCTION_TASK(); @@ -161,7 +163,7 @@ class MeshBuffers const uint32_t instances_count_per_command_list = static_cast(Data::DivCeil(instance_resource_bindings.size(), render_cmd_lists.size())); Data::ParallelFor(render_cmd_lists.begin(), render_cmd_lists.end(), - [this, &instance_resource_bindings, &instances_count_per_command_list](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) + [this, &instance_resource_bindings, &instances_count_per_command_list, bindings_apply_behavior](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) { const uint32_t begin_instance_index = instances_count_per_command_list * cl_index; const uint32_t end_instance_index = std::min(begin_instance_index + instances_count_per_command_list, @@ -171,7 +173,7 @@ class MeshBuffers Draw(*sp_render_command_list, instance_resource_bindings.begin() + begin_instance_index, instance_resource_bindings.begin() + end_instance_index, - begin_instance_index); + bindings_apply_behavior, begin_instance_index); }); } From ce549792217a51d9aa69d74d21808751f1331c8c Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 20:01:18 +0300 Subject: [PATCH 043/129] Asteroids array settings extended with minimum-subdivision parameter. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 1 + Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 +- Apps/Samples/Asteroids/AsteroidsArray.h | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 5bcf84412..450dc9d91 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -101,6 +101,7 @@ AsteroidsApp::AsteroidsApp() m_scene_scale, // - scale GetParamValueByCoresCount(g_instaces_count), // - instance_count GetParamValueByCoresCount(g_mesh_count), // - unique_mesh_count + 1u, // - minimum_subdivision 3u, // - subdivisions_count GetParamValueByCoresCount(g_textures_count), // - textures_count { 256u, 256u }, // - texture_dimensions diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index efcd9f2b0..7139c3c88 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -99,7 +99,7 @@ uint32_t AsteroidsArray::UberMesh::GetSubsetSubdivision(uint32_t subset_index) c } AsteroidsArray::ContentState::ContentState(const Settings& settings) - : uber_mesh(settings.unique_mesh_count, settings.subdivisions_count, 1, settings.random_seed) + : uber_mesh(settings.unique_mesh_count, settings.subdivisions_count, settings.minimum_subdivision, settings.random_seed) { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index dce50179d..0b51187eb 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -49,6 +49,7 @@ class AsteroidsArray final : protected gfx::TexturedMeshBuffers Date: Sun, 22 Dec 2019 20:12:55 +0300 Subject: [PATCH 044/129] Fixed MacOS build. --- .../Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm index c1a7cbea9..2c78b68f0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.mm @@ -146,7 +146,7 @@ static void SetMetalResourceForAll(Shader::Type shader_type, Program& program, i } if ((apply_behavior & ApplyBehavior::ConstantOnce || apply_behavior & ApplyBehavior::ChangesOnly) && - resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state, apply_behavior & ApplyBehavior::ChangesOnly)) + metal_resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state, apply_behavior & ApplyBehavior::ChangesOnly)) continue; const Resource::Type resource_type = bound_resource_location.sp_resource->GetResourceType(); From fc3f31616bab174d278f86a90ab47e8c11da5279 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 22 Dec 2019 23:49:17 +0300 Subject: [PATCH 045/129] Asteroids app controller added for runtime parameters switching. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 103 ++++++++++++------ Apps/Samples/Asteroids/AsteroidsApp.h | 14 ++- .../Asteroids/AsteroidsAppController.cpp | 91 ++++++++++++++++ .../Asteroids/AsteroidsAppController.h | 65 +++++++++++ Apps/Samples/Asteroids/CMakeLists.txt | 2 + .../Methane/Graphics/AppContextController.h | 2 +- .../Sources/Methane/Graphics/ContextBase.cpp | 4 +- 7 files changed, 245 insertions(+), 36 deletions(-) create mode 100644 Apps/Samples/Asteroids/AsteroidsAppController.cpp create mode 100644 Apps/Samples/Asteroids/AsteroidsAppController.h diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 450dc9d91..5cad47107 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -22,6 +22,7 @@ Sample demonstrating parallel rendering of the distinct asteroids massive ******************************************************************************/ #include "AsteroidsApp.h" +#include "AsteroidsAppController.h" #include #include @@ -29,8 +30,9 @@ Sample demonstrating parallel rendering of the distinct asteroids massive #include #include -#include #include +#include +#include #define PARALLEL_RENDERING_ENABLED 1 @@ -38,30 +40,46 @@ namespace Methane::Samples { template -using ParamValueByCoresCount = std::array; +using ParamValues = std::array; + +template +inline ValueT GetParamValue(const ParamValues& param_values, size_t param_index) +{ + return param_values[std::min(param_index, N - 1)]; +} + +inline size_t GetCoresCount() +{ + return std::thread::hardware_concurrency() / 2; +} template -inline ValueT GetParamValueByCoresCount(const ParamValueByCoresCount& param_values_by_cores_count) +inline ValueT GetParamValueByCoresCount(const ParamValues& param_values_by_cores_count) { - const size_t cores_count = std::thread::hardware_concurrency() / 2; - return param_values_by_cores_count[std::min(cores_count, N - 1)]; + return GetParamValue(param_values_by_cores_count, GetCoresCount()); } constexpr size_t g_max_cores_count = 11; -static const ParamValueByCoresCount g_instaces_count = { +static const ParamValues g_instaces_count = { // [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 500u, 1000u, 2000u, 3000u, 4000u, 5000u, 10000u, 15000u, 20000u, 35000u, 50000u, }; -static const ParamValueByCoresCount g_mesh_count = { +static const ParamValues g_mesh_count = { 50u, 70u, 100u, 150u, 200u, 400u, 600u, 800u, 1000u, 1500u, 2000u, }; -static const ParamValueByCoresCount g_textures_count = { +static const ParamValues g_textures_count = { 5u, 10u, 20u, 30u, 40u, 50u, 60u, 70u, 80u, 90u, 100u }; -static const ParamValueByCoresCount g_scale_ratio = { +static const ParamValues g_scale_ratio = { 0.6f, 0.55f, 0.5f, 0.45f, 0.4f, 0.35f, 0.3f, 0.25f, 0.2f, 0.15f, 0.1f }; +static const std::map g_asteroids_action_by_keyboard_state = { + { { pal::Keyboard::Key::RightAlt, pal::Keyboard::Key::RightBracket }, AsteroidsAppAction::IncreaseComplexity }, + { { pal::Keyboard::Key::RightAlt, pal::Keyboard::Key::LeftBracket }, AsteroidsAppAction::DecreaseComplexity }, + { { pal::Keyboard::Key::RightAlt, pal::Keyboard::Key::P }, AsteroidsAppAction::SwitchParallelRendering }, +}; + // Common application settings static const std::string g_app_help_text = "Asteroids sample demonstrates parallel rendering of the asteroids field observable with interactive camera."; static const GraphicsApp::Settings g_app_settings = // Application settings: @@ -112,6 +130,7 @@ AsteroidsApp::AsteroidsApp() GetParamValueByCoresCount(g_scale_ratio), // - max_asteroid_scale_ratio true // - depth_reversed }) + , m_asteroids_complexity(GetCoresCount()) { ITT_FUNCTION_TASK(); @@ -128,6 +147,7 @@ AsteroidsApp::AsteroidsApp() m_light_camera.Resize(120.f, 120.f); m_input_state.AddControllers({ + std::make_shared(*this, g_asteroids_action_by_keyboard_state), std::make_shared(m_view_camera, "VIEW CAMERA"), std::make_shared(m_light_camera, "LIGHT SOURCE", gfx::AppCameraController::ActionByMouseButton { { pal::Mouse::Button::Right, gfx::ActionCamera::MouseAction::Rotate } }, @@ -201,15 +221,14 @@ void AsteroidsApp::Init() // ========= Per-Frame Data ========= for(AsteroidsFrame& frame : m_frames) { -#if PARALLEL_RENDERING_ENABLED + // Create parallel rendering command list for final FB rendering frame.sp_parallel_cmd_list = gfx::ParallelRenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_screen_pass); frame.sp_parallel_cmd_list->SetParallelCommandListsCount(std::thread::hardware_concurrency()); frame.sp_parallel_cmd_list->SetName(IndexedName("Parallel Rendering", frame.index)); -#else + // Create command list for final FB rendering frame.sp_cmd_list = gfx::RenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_screen_pass); frame.sp_cmd_list->SetName(IndexedName("Scene Rendering", frame.index)); -#endif // Create uniforms buffer with volatile parameters for the whole scene rendering frame.sp_scene_uniforms_buffer = gfx::Buffer::CreateConstantBuffer(context, scene_uniforms_data_size); @@ -298,18 +317,19 @@ bool AsteroidsApp::Render() // Asteroids rendering assert(!!m_sp_asteroids_array); - -#if PARALLEL_RENDERING_ENABLED - assert(!!frame.sp_parallel_cmd_list); - m_sp_asteroids_array->Draw(*frame.sp_parallel_cmd_list, frame.asteroids); - gfx::RenderCommandList& render_cmd_list = *frame.sp_parallel_cmd_list->GetParallelCommandLists().back(); - gfx::CommandList& commit_cmd_list = *frame.sp_parallel_cmd_list; -#else - assert(!!frame.sp_cmd_list); - m_sp_asteroids_array->Draw(*frame.sp_cmd_list, frame.asteroids); - gfx::RenderCommandList& render_cmd_list = *frame.sp_cmd_list; - gfx::CommandList& commit_cmd_list = *frame.sp_cmd_list; -#endif + if (m_is_parallel_rendering_enabled) + { + assert(!!frame.sp_parallel_cmd_list); + m_sp_asteroids_array->Draw(*frame.sp_parallel_cmd_list, frame.asteroids); + } + else + { + assert(!!frame.sp_cmd_list); + m_sp_asteroids_array->Draw(*frame.sp_cmd_list, frame.asteroids); + } + + gfx::RenderCommandList& render_cmd_list = m_is_parallel_rendering_enabled ? *frame.sp_parallel_cmd_list->GetParallelCommandLists().back() : *frame.sp_cmd_list; + gfx::CommandList& commit_cmd_list = m_is_parallel_rendering_enabled ? static_cast(*frame.sp_parallel_cmd_list) : *frame.sp_cmd_list; render_cmd_list.PopDebugGroup(); @@ -324,13 +344,7 @@ bool AsteroidsApp::Render() commit_cmd_list.Commit(true); // Execute rendering commands and present frame to screen - m_sp_context->GetRenderCommandQueue().Execute({ -#if PARALLEL_RENDERING_ENABLED - *frame.sp_parallel_cmd_list, -#else - *frame.sp_cmd_list, -#endif - }); + m_sp_context->GetRenderCommandQueue().Execute({ commit_cmd_list }); m_sp_context->Present(); return true; @@ -354,6 +368,33 @@ void AsteroidsApp::OnContextReleased() GraphicsApp::OnContextReleased(); } +void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) +{ + ITT_FUNCTION_TASK(); + if (m_asteroids_complexity == asteroids_complexity) + return; + + m_asteroids_complexity = asteroids_complexity; + + m_asteroids_array_settings.instance_count = GetParamValue(g_instaces_count, m_asteroids_complexity); + m_asteroids_array_settings.unique_mesh_count = GetParamValue(g_mesh_count, m_asteroids_complexity); + m_asteroids_array_settings.textures_count = GetParamValue(g_textures_count, m_asteroids_complexity); + m_asteroids_array_settings.min_asteroid_scale_ratio = GetParamValue(g_scale_ratio, m_asteroids_complexity) / 10.f; + m_asteroids_array_settings.max_asteroid_scale_ratio = GetParamValue(g_scale_ratio, m_asteroids_complexity); + + m_sp_asteroids_array.reset(); + m_sp_asteroids_array_state.reset(); + + assert(!!m_sp_context); + m_sp_context->Reset(m_sp_context->GetDevice()); +} + +void AsteroidsApp::SetParallelRnderingEnabled(bool is_parallel_rendering_enabled) +{ + ITT_FUNCTION_TASK(); + m_is_parallel_rendering_enabled = is_parallel_rendering_enabled; +} + } // namespace Methane::Samples int main(int argc, const char* argv[]) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 59ecc569a..0893f3328 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -25,8 +25,10 @@ Sample demonstrating parallel rendering of the distinct asteroids massive #include "Planet.h" #include "AsteroidsArray.h" +#include "AsteroidsAppController.h" #include +#include namespace Methane::Samples { @@ -59,8 +61,14 @@ class AsteroidsApp final : public GraphicsApp bool Update() override; bool Render() override; - // Context::Callback interface + // Context::Callback overrides void OnContextReleased() override; + + uint32_t GetAsteroidsComplexity() const { return m_asteroids_complexity; } + void SetAsteroidsComplexity(uint32_t asteroids_complexity); + + bool IsParallelRenderingEnabled() const { return m_is_parallel_rendering_enabled; } + void SetParallelRnderingEnabled(bool is_parallel_rendering_enabled); private: struct SHADER_STRUCT_ALIGN Constants @@ -81,7 +89,9 @@ class AsteroidsApp final : public GraphicsApp gfx::ActionCamera m_light_camera; const float m_scene_scale; const Constants m_scene_constants; - const AsteroidsArray::Settings m_asteroids_array_settings; + AsteroidsArray::Settings m_asteroids_array_settings; + size_t m_asteroids_complexity = 0; + bool m_is_parallel_rendering_enabled = true; SceneUniforms m_scene_uniforms = { }; gfx::Buffer::Ptr m_sp_const_buffer; diff --git a/Apps/Samples/Asteroids/AsteroidsAppController.cpp b/Apps/Samples/Asteroids/AsteroidsAppController.cpp new file mode 100644 index 000000000..e3b9c9456 --- /dev/null +++ b/Apps/Samples/Asteroids/AsteroidsAppController.cpp @@ -0,0 +1,91 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: AsteroidsAppController.cpp +Asteroids application controller. + +******************************************************************************/ + +#include "AsteroidsAppController.h" +#include "AsteroidsApp.h" + +#include + + +namespace Methane::Samples +{ + +AsteroidsAppController::AsteroidsAppController(AsteroidsApp& asteroids_app, const ActionByKeyboardState& action_by_keyboard_state) + : Controller("ASTEROIDS SETTINGS") + , Platform::Keyboard::ActionControllerBase(action_by_keyboard_state, {}) + , m_asteroids_app(asteroids_app) +{ + ITT_FUNCTION_TASK(); +} + +void AsteroidsAppController::OnKeyboardChanged(Platform::Keyboard::Key key, Platform::Keyboard::KeyState key_state, + const Platform::Keyboard::StateChange& state_change) +{ + ITT_FUNCTION_TASK(); + Platform::Keyboard::ActionControllerBase::OnKeyboardChanged(key, key_state, state_change); +} + +void AsteroidsAppController::OnKeyboardStateAction(AsteroidsAppAction action) +{ + ITT_FUNCTION_TASK(); + + const uint32_t asteroids_complexity = m_asteroids_app.GetAsteroidsComplexity(); + switch(action) + { + case AsteroidsAppAction::IncreaseComplexity: + m_asteroids_app.SetAsteroidsComplexity(asteroids_complexity + 1); + break; + + case AsteroidsAppAction::DecreaseComplexity: + m_asteroids_app.SetAsteroidsComplexity(asteroids_complexity > 1 ? asteroids_complexity - 1 : 0); + break; + + case AsteroidsAppAction::SwitchParallelRendering: + m_asteroids_app.SetParallelRnderingEnabled(!m_asteroids_app.IsParallelRenderingEnabled()); + break; + + default: + assert(0); + } +} + +std::string AsteroidsAppController::GetKeyboardActionName(AsteroidsAppAction action) const +{ + ITT_FUNCTION_TASK(); + switch(action) + { + case AsteroidsAppAction::IncreaseComplexity: return "increase scene complexity"; + case AsteroidsAppAction::DecreaseComplexity: return "decrease scene complexity"; + case AsteroidsAppAction::SwitchParallelRendering: return "switch parallel rendering"; + default: assert(0); + } + return ""; +} + +Platform::Input::IHelpProvider::HelpLines AsteroidsAppController::GetHelp() const +{ + ITT_FUNCTION_TASK(); + return GetKeyboardHelp(); +} + +} // namespace Methane::Graphics diff --git a/Apps/Samples/Asteroids/AsteroidsAppController.h b/Apps/Samples/Asteroids/AsteroidsAppController.h new file mode 100644 index 000000000..efe5511f5 --- /dev/null +++ b/Apps/Samples/Asteroids/AsteroidsAppController.h @@ -0,0 +1,65 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: AsteroidsAppController.h +Asteroids application controller. + +******************************************************************************/ + +#pragma once + +#include +#include + +namespace Methane::Samples +{ + +class AsteroidsApp; + +enum class AsteroidsAppAction : uint32_t +{ + None = 0u, + + IncreaseComplexity, + DecreaseComplexity, + SwitchParallelRendering, + + Count +}; + +class AsteroidsAppController final + : public Platform::Input::Controller + , public Platform::Keyboard::ActionControllerBase +{ +public: + AsteroidsAppController(AsteroidsApp& asteroids_app, const ActionByKeyboardState& action_by_keyboard_state); + + // Input::Controller implementation + void OnKeyboardChanged(Platform::Keyboard::Key, Platform::Keyboard::KeyState, const Platform::Keyboard::StateChange& state_change) override; + HelpLines GetHelp() const override; + +protected: + // Keyboard::ActionControllerBase interface + void OnKeyboardKeyAction(AsteroidsAppAction, Platform::Keyboard::KeyState) override { } + void OnKeyboardStateAction(AsteroidsAppAction action) override; + std::string GetKeyboardActionName(AsteroidsAppAction action) const override; + + AsteroidsApp& m_asteroids_app; +}; + +} // namespace Methane::Graphics diff --git a/Apps/Samples/Asteroids/CMakeLists.txt b/Apps/Samples/Asteroids/CMakeLists.txt index 377c2d10e..23e319c5d 100644 --- a/Apps/Samples/Asteroids/CMakeLists.txt +++ b/Apps/Samples/Asteroids/CMakeLists.txt @@ -7,6 +7,8 @@ include(MethaneResources) set(SOURCES AsteroidsApp.h AsteroidsApp.cpp + AsteroidsAppController.h + AsteroidsAppController.cpp Asteroid.h Asteroid.cpp AsteroidsArray.h diff --git a/Modules/Graphics/App/Include/Methane/Graphics/AppContextController.h b/Modules/Graphics/App/Include/Methane/Graphics/AppContextController.h index fef57b456..1a6ae75be 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/AppContextController.h +++ b/Modules/Graphics/App/Include/Methane/Graphics/AppContextController.h @@ -71,7 +71,7 @@ class AppContextController final void OnKeyboardStateAction(AppContextAction action) override; std::string GetKeyboardActionName(AppContextAction action) const override; - Context& m_context; + Context& m_context; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp index 268684cb2..1303d9cce 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp @@ -100,7 +100,7 @@ void ContextBase::Reset(Device& device) WaitForGpu(WaitFor::RenderComplete); Release(); - Initialize(device, false); + Initialize(device, true); } void ContextBase::Present() @@ -315,4 +315,4 @@ void ContextBase::UploadResources() WaitForGpu(WaitFor::ResourcesUploaded); } -} // namespace Methane::Graphics \ No newline at end of file +} // namespace Methane::Graphics From a07aea2f912923fd04a42bfd346d732a339008c2 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 23 Dec 2019 00:01:57 +0300 Subject: [PATCH 046/129] Fixed CI build configuration setup. --- azure-pipelines.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f559f03b9..05e77c165 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -29,7 +29,6 @@ resources: submodules: recursive variables: - buildConfiguration: 'Release' buildCmakeFlags: '-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF -DMETHANE_BUILD_NUMBER=$(Build.BuildNumber)' jobs: @@ -41,7 +40,7 @@ jobs: variables: platform: 'Win64' - configuration: $(buildConfiguration) + configuration: 'Release' vcVarsBatFile: 'vcvars64.bat' generatorName: '"Visual Studio 15 2017 Win64"' cmakeFlags: $(buildCmakeFlags) @@ -61,7 +60,7 @@ jobs: variables: platform: 'Win32' - configuration: $(buildConfiguration) + configuration: 'Release' vcVarsBatFile: 'vcvars32.bat' generatorName: '"Visual Studio 15 2017"' cmakeFlags: $(buildCmakeFlags) @@ -81,7 +80,7 @@ jobs: variables: platform: 'MacOS' - configuration: $(buildConfiguration) + configuration: 'Release' generatorName: 'Xcode' cmakeFlags: $(buildCmakeFlags) buildName: '$(platform)-$(configuration)' @@ -100,7 +99,7 @@ jobs: variables: platform: 'Ubuntu' - configuration: $(buildConfiguration) + configuration: 'Release' generatorName: '"Unix Makefiles"' cmakeFlags: $(buildCmakeFlags) buildName: '$(platform)-$(configuration)' From 3fdf59a18bbdaceb563f7ffc11e8b7a9020410a1 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 25 Dec 2019 00:12:10 +0300 Subject: [PATCH 047/129] Initial support for texture arrays in shaders implemented with Metal on MacOS. Asteroids sample updated. --- Apps/Samples/Asteroids/Asteroid.h | 2 + Apps/Samples/Asteroids/AsteroidsApp.cpp | 1 + Apps/Samples/Asteroids/AsteroidsArray.cpp | 37 +++++++++++++------ Apps/Samples/Asteroids/AsteroidsArray.h | 1 + Apps/Samples/Asteroids/Shaders/Asteroids.cfg | 26 ++++++++++++- Apps/Samples/Asteroids/Shaders/Asteroids.hlsl | 21 +++++++---- CMake/MethaneShaders.cmake | 3 +- .../Sources/Methane/Graphics/ProgramBase.cpp | 5 ++- 8 files changed, 73 insertions(+), 23 deletions(-) diff --git a/Apps/Samples/Asteroids/Asteroid.h b/Apps/Samples/Asteroids/Asteroid.h index cfa3c1c57..cd514cf47 100644 --- a/Apps/Samples/Asteroids/Asteroid.h +++ b/Apps/Samples/Asteroids/Asteroid.h @@ -39,6 +39,7 @@ struct SHADER_STRUCT_ALIGN AsteroidUniforms SHADER_FIELD_ALIGN gfx::Color3f deep_color; SHADER_FIELD_ALIGN gfx::Color3f shallow_color; SHADER_FIELD_ALIGN gfx::Vector2f depth_range; + SHADER_FIELD_ALIGN uint32_t texture_index; }; class Asteroid final : public gfx::TexturedMeshBuffers @@ -81,6 +82,7 @@ class Asteroid final : public gfx::TexturedMeshBuffers { const uint32_t index; const uint32_t subset_index; + const uint32_t texture_index; const gfx::Vector2f depth_range; const Colors colors; const gfx::Matrix44f scale_matrix; diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 5cad47107..476054b63 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -128,6 +128,7 @@ AsteroidsApp::AsteroidsApp() 4.f, // - disc_radius_ratio GetParamValueByCoresCount(g_scale_ratio) / 10.f,// - min_asteroid_scale_ratio GetParamValueByCoresCount(g_scale_ratio), // - max_asteroid_scale_ratio + false, // - textures_array_enabled true // - depth_reversed }) , m_asteroids_complexity(GetCoresCount()) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 7139c3c88..0e5c03b33 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -187,6 +187,7 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) { asteroid_index, asteroid_subset_index, + settings.textures_array_enabled ? textures_distribution(rng) : 0u, uber_mesh.GetSubsetDepthRange(asteroid_subset_index), std::move(asteroid_colors), std::move(scale_matrix), @@ -215,19 +216,26 @@ AsteroidsArray::AsteroidsArray(gfx::Context& context, Settings settings, Content ITT_FUNCTION_TASK(); const gfx::Context::Settings& context_settings = context.GetSettings(); - + + const size_t textures_array_size = m_settings.textures_array_enabled ? m_settings.textures_count : 1; + const gfx::Shader::MacroDefinitions macro_definitions = { { "TEXTURES_COUNT", std::to_string(textures_array_size) } }; + const std::set addressable_argument_names = { "g_mesh_uniforms" }; + std::set constant_argument_names = { "g_constants", "g_texture_sampler" }; + if (m_settings.textures_array_enabled) + constant_argument_names.insert("g_face_textures"); + gfx::RenderState::Settings state_settings; state_settings.sp_program = gfx::Program::Create(context, { { - gfx::Shader::CreateVertex(context, { Data::ShaderProvider::Get(), { "Asteroids", "AsteroidVS" }, { } }), - gfx::Shader::CreatePixel( context, { Data::ShaderProvider::Get(), { "Asteroids", "AsteroidPS" }, { } }), + gfx::Shader::CreateVertex(context, { Data::ShaderProvider::Get(), { "Asteroids", "AsteroidVS" }, macro_definitions }), + gfx::Shader::CreatePixel( context, { Data::ShaderProvider::Get(), { "Asteroids", "AsteroidPS" }, macro_definitions }), }, { { { { "input_position", "POSITION" }, { "input_normal", "NORMAL" }, } } }, - { "g_constants", "g_texture_sampler" }, - { "g_mesh_uniforms" }, + constant_argument_names, + addressable_argument_names, { context_settings.color_format }, context_settings.depth_stencil_format }); @@ -277,7 +285,7 @@ gfx::MeshBufferBindings::ResourceBindingsArray AsteroidsArray::CreateResourceBin resource_bindings_array.resize(m_settings.instance_count); resource_bindings_array[0] = gfx::Program::ResourceBindings::Create(m_sp_render_state->GetSettings().sp_program, { - { { gfx::Shader::Type::Vertex, "g_mesh_uniforms" }, { sp_asteroids_uniforms_buffer, GetUniformsBufferOffset(0) } }, + { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { sp_asteroids_uniforms_buffer, GetUniformsBufferOffset(0) } }, { { gfx::Shader::Type::Pixel, "g_scene_uniforms" }, { sp_scene_uniforms_buffer } }, { { gfx::Shader::Type::Pixel, "g_constants" }, { sp_constants_buffer } }, { { gfx::Shader::Type::Pixel, "g_face_textures" }, { GetInstanceTexturePtr(0) } }, @@ -288,10 +296,16 @@ gfx::MeshBufferBindings::ResourceBindingsArray AsteroidsArray::CreateResourceBin [&](uint32_t asteroid_index) { const Data::Size asteroid_uniform_offset = GetUniformsBufferOffset(asteroid_index); - resource_bindings_array[asteroid_index] = gfx::Program::ResourceBindings::CreateCopy(*resource_bindings_array[0], { - { { gfx::Shader::Type::Vertex, "g_mesh_uniforms" }, { sp_asteroids_uniforms_buffer, asteroid_uniform_offset } }, - { { gfx::Shader::Type::Pixel, "g_face_textures" }, { GetInstanceTexturePtr(asteroid_index) } }, - }); + gfx::Program::ResourceBindings::ResourceLocationByArgument set_resoure_location_by_argument = { + { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { sp_asteroids_uniforms_buffer, asteroid_uniform_offset } }, + }; + if (!m_settings.textures_array_enabled) + { + set_resoure_location_by_argument.insert( + { { gfx::Shader::Type::Pixel, "g_face_textures" }, { GetInstanceTexturePtr(asteroid_index) } } + ); + } + resource_bindings_array[asteroid_index] = gfx::Program::ResourceBindings::CreateCopy(*resource_bindings_array[0], set_resoure_location_by_argument); } ); @@ -337,7 +351,8 @@ bool AsteroidsArray::Update(double /*elapsed_seconds*/, double delta_seconds) model_matrix * scene_view_matrix * scene_proj_matrix, asteroid_parameters.colors.deep, asteroid_parameters.colors.shallow, - asteroid_parameters.depth_range + asteroid_parameters.depth_range, + asteroid_parameters.texture_index }, asteroid_parameters.index ); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index 0b51187eb..3fc2c2dd7 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -58,6 +58,7 @@ class AsteroidsArray final : protected gfx::TexturedMeshBuffers g_constants : register(b1); -ConstantBuffer g_scene_uniforms : register(b2); -ConstantBuffer g_mesh_uniforms : register(b3); -Texture2DArray g_face_textures : register(t1); -SamplerState g_texture_sampler : register(s1); +ConstantBuffer g_constants : register(b1); +ConstantBuffer g_scene_uniforms : register(b2); +ConstantBuffer g_mesh_uniforms : register(b3); +Texture2DArray g_face_textures[TEXTURES_COUNT] : register(t1); +SamplerState g_texture_sampler : register(s1); float linstep(float min, float max, float s) { @@ -76,9 +80,10 @@ float4 AsteroidPS(PSInput input) : SV_TARGET // Triplanar projection sampling float3 texel_rgb = 0.0; - texel_rgb += input.face_blend_weights.x * g_face_textures.Sample(g_texture_sampler, float3(input.uvw.yz, 0)).xyz; - texel_rgb += input.face_blend_weights.y * g_face_textures.Sample(g_texture_sampler, float3(input.uvw.zx, 1)).xyz; - texel_rgb += input.face_blend_weights.z * g_face_textures.Sample(g_texture_sampler, float3(input.uvw.xy, 2)).xyz; + const uint tex_index = g_mesh_uniforms.texture_index; + texel_rgb += input.face_blend_weights.x * g_face_textures[tex_index].Sample(g_texture_sampler, float3(input.uvw.yz, 0)).xyz; + texel_rgb += input.face_blend_weights.y * g_face_textures[tex_index].Sample(g_texture_sampler, float3(input.uvw.zx, 1)).xyz; + texel_rgb += input.face_blend_weights.z * g_face_textures[tex_index].Sample(g_texture_sampler, float3(input.uvw.xy, 2)).xyz; const float4 texel_color = float4(texel_rgb * input.albedo, 1.0); const float4 ambient_color = texel_color * g_constants.light_ambient_factor; diff --git a/CMake/MethaneShaders.cmake b/CMake/MethaneShaders.cmake index 717cfcb66..cc5aa162f 100644 --- a/CMake/MethaneShaders.cmake +++ b/CMake/MethaneShaders.cmake @@ -91,6 +91,7 @@ function(generate_metal_shaders_from_hlsl FOR_TARGET SHADERS_HLSL OUT_SHADERS_ME set(NEW_ENTRY_POINT "${SHADERS_NAME}_${OLD_ENTRY_POINT}") string(REPLACE " " ";" SHADER_DEFINITIONS "${SHADER_DEFINITIONS}") + set(SHADER_DEFINITION_ARGUMENTS ) foreach(SHADER_DEFINITION ${SHADER_DEFINITIONS}) list(APPEND SHADER_DEFINITION_ARGUMENTS -D${SHADER_DEFINITION}) string(REPLACE "=" "" SHADER_DEFINITION_NAME ${SHADER_DEFINITION}) @@ -110,7 +111,7 @@ function(generate_metal_shaders_from_hlsl FOR_TARGET SHADERS_HLSL OUT_SHADERS_ME DEPENDS ${SHADERS_HLSL} ${SHADERS_CONFIG} COMMAND ${CMAKE_COMMAND} -E make_directory "${TARGET_SHADERS_DIR}" COMMAND ${SPIRV_GEN_EXE} --hlsl-iomap -S ${SHADER_TYPE} -e ${OLD_ENTRY_POINT} ${SHADER_DEFINITION_ARGUMENTS} -o "${SHADER_SPIRV_PATH}" -V -D "${SHADERS_HLSL}" - COMMAND ${SPIRV_CROSS_EXE} --msl --rename-entry-point ${OLD_ENTRY_POINT} ${NEW_ENTRY_POINT} ${SHADER_TYPE} --output "${SHADER_METAL_PATH}" "${SHADER_SPIRV_PATH}" + COMMAND ${SPIRV_CROSS_EXE} --msl --msl-version 020101 --rename-entry-point ${OLD_ENTRY_POINT} ${NEW_ENTRY_POINT} ${SHADER_TYPE} --output "${SHADER_METAL_PATH}" "${SHADER_SPIRV_PATH}" ) set_target_properties(${GENERATE_METAL_TARGET} diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp index 5ad266ff6..e27ab3d51 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp @@ -211,9 +211,12 @@ void ProgramBase::ResourceBindingsBase::SetResourcesForArguments(const ResourceL if (!sp_binding) { #ifndef PROGRAM_IGNORE_MISSING_ARGUMENTS + const Argument all_shaders_argument(Shader::Type::All, argument_and_resource_location.first.argument_name); + const bool all_shaders_argument_found = !!Get(all_shaders_argument); throw std::runtime_error("Program \"" + m_sp_program->GetName() + "\" does not have argument \"" + argument_and_resource_location.first.argument_name + - "\" of " + Shader::GetTypeName(argument_and_resource_location.first.shader_type) + " shader."); + "\" of " + Shader::GetTypeName(argument_and_resource_location.first.shader_type) + " shader." + + (all_shaders_argument_found ? " Instead this argument is used in All shaders." : "") ); #else continue; #endif From 97d0400a5e861ddce94f0785e1c8cf7398d8a4ea Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 25 Dec 2019 11:50:57 +0300 Subject: [PATCH 048/129] Fixed HLSL shader compilation with different macro-definition values. --- CMake/MethaneShaders.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/CMake/MethaneShaders.cmake b/CMake/MethaneShaders.cmake index cc5aa162f..1153aeda6 100644 --- a/CMake/MethaneShaders.cmake +++ b/CMake/MethaneShaders.cmake @@ -206,6 +206,7 @@ function(compile_hlsl_shaders FOR_TARGET SHADERS_HLSL PROFILE_VER OUT_COMPILED_S set(NEW_ENTRY_POINT ${ORIG_ENTRY_POINT}) string(REPLACE " " ";" SHADER_DEFINITIONS "${SHADER_DEFINITIONS}") + set(SHADER_DEFINITION_ARGUMENTS ) foreach(SHADER_DEFINITION ${SHADER_DEFINITIONS}) list(APPEND SHADER_DEFINITION_ARGUMENTS /D ${SHADER_DEFINITION}) string(REPLACE "=" "" SHADER_DEFINITION_NAME ${SHADER_DEFINITION}) From 7f65af35854868b70826a190fa02015c0a04ef09 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 25 Dec 2019 11:51:24 +0300 Subject: [PATCH 049/129] Fixed compilation and tidy warnings on Windows. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 2 +- Apps/Samples/Asteroids/AsteroidsApp.h | 2 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 6 +++--- Modules/Data/Primitives/Include/Methane/Data/Provider.h | 4 ++-- .../Extensions/Include/Methane/Graphics/ImageLoader.h | 4 ++-- .../Extensions/Sources/Methane/Graphics/ImageLoader.cpp | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 476054b63..717998c2b 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -131,7 +131,7 @@ AsteroidsApp::AsteroidsApp() false, // - textures_array_enabled true // - depth_reversed }) - , m_asteroids_complexity(GetCoresCount()) + , m_asteroids_complexity(static_cast(GetCoresCount())) { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 0893f3328..f7fc7c0ec 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -90,7 +90,7 @@ class AsteroidsApp final : public GraphicsApp const float m_scene_scale; const Constants m_scene_constants; AsteroidsArray::Settings m_asteroids_array_settings; - size_t m_asteroids_complexity = 0; + uint32_t m_asteroids_complexity = 0u; bool m_is_parallel_rendering_enabled = true; SceneUniforms m_scene_uniforms = { }; diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 0e5c03b33..e404cea1c 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -55,7 +55,7 @@ AsteroidsArray::UberMesh::UberMesh(uint32_t instance_count, uint32_t subdivision std::mt19937 rng(random_seed); - m_depth_ranges.reserve(m_instance_count * m_subdivisions_count); + m_depth_ranges.reserve(static_cast(m_instance_count) * m_subdivisions_count); for (uint32_t subdivision_index = m_min_subdivision; subdivision_index <= m_subdivisions_count; ++subdivision_index) { Asteroid::Mesh base_mesh(subdivision_index, false); @@ -79,7 +79,7 @@ const gfx::Vector2f& AsteroidsArray::UberMesh::GetSubsetDepthRange(uint32_t subs ITT_FUNCTION_TASK(); if (subset_index >= GetSubsetCount()) - std::invalid_argument("Subset index is out of range."); + throw std::invalid_argument("Subset index is out of range."); assert(subset_index < m_depth_ranges.size()); return m_depth_ranges[subset_index]; @@ -90,7 +90,7 @@ uint32_t AsteroidsArray::UberMesh::GetSubsetSubdivision(uint32_t subset_index) c ITT_FUNCTION_TASK(); if (subset_index >= GetSubsetCount()) - std::invalid_argument("Subset index is out of range."); + throw std::invalid_argument("Subset index is out of range."); const uint32_t subdivision_index = subset_index / m_instance_count; assert(subdivision_index < m_subdivisions_count); diff --git a/Modules/Data/Primitives/Include/Methane/Data/Provider.h b/Modules/Data/Primitives/Include/Methane/Data/Provider.h index a07649ed9..4bdc28245 100644 --- a/Modules/Data/Primitives/Include/Methane/Data/Provider.h +++ b/Modules/Data/Primitives/Include/Methane/Data/Provider.h @@ -37,8 +37,8 @@ struct Chunk Chunk() = default; Chunk(ConstRawPtr in_p_data, Size in_size) : p_data(in_p_data), size(in_size) { } - Chunk(const Bytes&& in_data) : data(std::move(in_data)), p_data(static_cast(data.data())), size(static_cast(data.size())) { } - Chunk(const Chunk&& other) : data(std::move(other.data)), p_data(data.empty() ? other.p_data : data.data()), size(data.empty() ? other.size : static_cast(data.size())) { } + Chunk(const Bytes&& in_data) : data(std::move(in_data)), p_data(static_cast(data.data())), size(static_cast(data.size())) { } + Chunk(Chunk&& other) noexcept : data(std::move(other.data)), p_data(data.empty() ? other.p_data : data.data()), size(data.empty() ? other.size : static_cast(data.size())) { } }; struct Provider diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/ImageLoader.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/ImageLoader.h index 59abbad41..6c8a2167c 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/ImageLoader.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/ImageLoader.h @@ -43,8 +43,8 @@ class ImageLoader final uint32_t channels_count; Data::Chunk pixels; - ImageData(const Dimensions& in_dimensions, uint32_t in_channels_count, const Data::Chunk&& in_pixels); - ImageData(const ImageData&& other); + ImageData(const Dimensions& in_dimensions, uint32_t in_channels_count, Data::Chunk&& in_pixels); + ImageData(ImageData&& other); ~ImageData(); }; diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp index 5d4febf1e..c88be1db1 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp @@ -43,7 +43,7 @@ by decoding them from popular image formats. namespace Methane::Graphics { -ImageLoader::ImageData::ImageData(const Dimensions& in_dimensions, uint32_t in_channels_count, const Data::Chunk&& in_pixels) +ImageLoader::ImageData::ImageData(const Dimensions& in_dimensions, uint32_t in_channels_count, Data::Chunk&& in_pixels) : dimensions(in_dimensions) , channels_count(in_channels_count) , pixels(std::move(in_pixels)) @@ -51,7 +51,7 @@ ImageLoader::ImageData::ImageData(const Dimensions& in_dimensions, uint32_t in_c ITT_FUNCTION_TASK(); } -ImageLoader::ImageData::ImageData(const ImageData&& other) +ImageLoader::ImageData::ImageData(ImageData&& other) : dimensions(std::move(other.dimensions)) , channels_count(other.channels_count) , pixels(std::move(other.pixels)) From 229f702f21910feac95262d4f31b99b09469c54f Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 25 Dec 2019 15:24:11 +0300 Subject: [PATCH 050/129] Asteroids complexity is lowered in debug builds. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 717998c2b..dc14ef68a 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -48,15 +48,19 @@ inline ValueT GetParamValue(const ParamValues& param_values, size_t p return param_values[std::min(param_index, N - 1)]; } -inline size_t GetCoresCount() +inline size_t GetComplexity() { +#ifdef _DEBUG + return 2; +#else return std::thread::hardware_concurrency() / 2; +#endif } template -inline ValueT GetParamValueByCoresCount(const ParamValues& param_values_by_cores_count) +inline ValueT GetParamValueByComplexity(const ParamValues& param_values_by_complexity) { - return GetParamValue(param_values_by_cores_count, GetCoresCount()); + return GetParamValue(param_values_by_complexity, GetComplexity()); } constexpr size_t g_max_cores_count = 11; @@ -117,21 +121,21 @@ AsteroidsApp::AsteroidsApp() { // ================ m_view_camera, // - view_camera m_scene_scale, // - scale - GetParamValueByCoresCount(g_instaces_count), // - instance_count - GetParamValueByCoresCount(g_mesh_count), // - unique_mesh_count + GetParamValueByComplexity(g_instaces_count), // - instance_count + GetParamValueByComplexity(g_mesh_count), // - unique_mesh_count 1u, // - minimum_subdivision 3u, // - subdivisions_count - GetParamValueByCoresCount(g_textures_count), // - textures_count + GetParamValueByComplexity(g_textures_count), // - textures_count { 256u, 256u }, // - texture_dimensions 1123u, // - random_seed 13.f, // - orbit_radius_ratio 4.f, // - disc_radius_ratio - GetParamValueByCoresCount(g_scale_ratio) / 10.f,// - min_asteroid_scale_ratio - GetParamValueByCoresCount(g_scale_ratio), // - max_asteroid_scale_ratio + GetParamValueByComplexity(g_scale_ratio) / 10.f,// - min_asteroid_scale_ratio + GetParamValueByComplexity(g_scale_ratio), // - max_asteroid_scale_ratio false, // - textures_array_enabled true // - depth_reversed }) - , m_asteroids_complexity(static_cast(GetCoresCount())) + , m_asteroids_complexity(static_cast(GetComplexity())) { ITT_FUNCTION_TASK(); @@ -280,8 +284,8 @@ bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) m_sp_sky_box->Resize(frame_size); m_sp_planet->Resize(frame_size); m_sp_asteroids_array->Resize(frame_size); - m_view_camera.Resize(static_cast(frame_size.width), static_cast(frame_size.height)); + return true; } From 3616571c5be728b5ac00e0feec5cc4a7e905cadd Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 25 Dec 2019 15:59:18 +0300 Subject: [PATCH 051/129] Added Methane Kit url-address to application help. --- .../App/Sources/Methane/Platform/AppController.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Modules/Platform/App/Sources/Methane/Platform/AppController.cpp b/Modules/Platform/App/Sources/Methane/Platform/AppController.cpp index 1e94b8411..8bf64a5a9 100644 --- a/Modules/Platform/App/Sources/Methane/Platform/AppController.cpp +++ b/Modules/Platform/App/Sources/Methane/Platform/AppController.cpp @@ -98,7 +98,7 @@ void AppController::ShowHelp() std::string controller_offset; if (!sp_controller->GetControllerName().empty()) { - help_stream << sp_controller->GetControllerName() << std::endl; + help_stream << std::endl << sp_controller->GetControllerName(); controller_offset = single_offset; } @@ -108,7 +108,7 @@ void AppController::ShowHelp() { if (key_description.first.empty()) { - help_stream << std::endl << controller_offset << key_description.second << ":" << std::endl; + help_stream << std::endl << std::endl << controller_offset << key_description.second << ":"; header_present = true; } else @@ -117,7 +117,7 @@ void AppController::ShowHelp() { help_stream << std::endl; } - help_stream << controller_offset; + help_stream << std::endl << controller_offset; if (header_present) { help_stream << single_offset; @@ -127,7 +127,6 @@ void AppController::ShowHelp() { help_stream << " - " << key_description.second << ";"; } - help_stream << std::endl; } first_line = false; } @@ -146,6 +145,12 @@ void AppController::ShowHelp() help_stream << std::endl << cmd_line_help; } } + + if (!is_first_controller) + { + help_stream << std::endl; + } + help_stream << std::endl << "Powered by Methane Kit: https://github.com/egorodet/MethaneKit"; m_application.Alert({ AppBase::Message::Type::Information, From d291326ac48715d62b441f35774f94d28eedfc88 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 26 Dec 2019 00:23:17 +0300 Subject: [PATCH 052/129] Updated README --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index a0aef6511..a91507f2b 100644 --- a/README.md +++ b/README.md @@ -94,12 +94,10 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - **First time initialization** ```console -mkdir MethaneKit && cd MethaneKit git clone --recurse-submodules --depth 1 https://github.com/egorodet/MethaneKit.git ``` - **Update sources to latest version** ```console -cd MethaneKit git pull && git submodule update --init --depth 1 --recursive ``` From f513fd593c614db929ba9e669e9c199654e4d43a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 28 Dec 2019 14:31:56 +0300 Subject: [PATCH 053/129] Multi-resource bindings to program arguments implemented in Metal on MacOS. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 2 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 22 +-- Apps/Samples/Asteroids/Planet.cpp | 8 +- .../02-TexturedCube/TexturedCubeApp.cpp | 8 +- .../Tutorials/03-ShadowCube/ShadowCubeApp.cpp | 22 +-- Build/Posix/Build.sh | 0 .../Core/Include/Methane/Graphics/Program.h | 6 +- .../Core/Include/Methane/Graphics/Resource.h | 19 ++- .../Core/Include/Methane/Graphics/Shader.h | 14 +- .../Methane/Graphics/DirectX12/ShaderDX.cpp | 50 +++---- .../Methane/Graphics/DirectX12/ShaderDX.h | 9 +- .../Methane/Graphics/Metal/ProgramMT.hh | 4 +- .../Methane/Graphics/Metal/ProgramMT.mm | 138 ++++++++++++------ .../Methane/Graphics/Metal/ShaderMT.hh | 23 +-- .../Methane/Graphics/Metal/ShaderMT.mm | 82 +++++++---- .../Sources/Methane/Graphics/ProgramBase.cpp | 36 ++--- .../Sources/Methane/Graphics/ProgramBase.h | 6 +- .../Sources/Methane/Graphics/ShaderBase.cpp | 43 ++++-- .../Sources/Methane/Graphics/ShaderBase.h | 30 ++-- .../Sources/Methane/Graphics/SkyBox.cpp | 6 +- README.md | 3 +- 21 files changed, 317 insertions(+), 214 deletions(-) mode change 100644 => 100755 Build/Posix/Build.sh diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index dc14ef68a..3c48fa696 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -132,7 +132,7 @@ AsteroidsApp::AsteroidsApp() 4.f, // - disc_radius_ratio GetParamValueByComplexity(g_scale_ratio) / 10.f,// - min_asteroid_scale_ratio GetParamValueByComplexity(g_scale_ratio), // - max_asteroid_scale_ratio - false, // - textures_array_enabled + true, // - textures_array_enabled true // - depth_reversed }) , m_asteroids_complexity(static_cast(GetComplexity())) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index e404cea1c..422a71a71 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -282,27 +282,31 @@ gfx::MeshBufferBindings::ResourceBindingsArray AsteroidsArray::CreateResourceBin gfx::MeshBufferBindings::ResourceBindingsArray resource_bindings_array; if (m_settings.instance_count == 0) return resource_bindings_array; + + const gfx::Resource::Locations face_texture_locations = m_settings.textures_array_enabled + ? gfx::Resource::CreateLocations(m_unique_textures) + : gfx::Resource::Locations{ { GetInstanceTexturePtr(0) } }; resource_bindings_array.resize(m_settings.instance_count); resource_bindings_array[0] = gfx::Program::ResourceBindings::Create(m_sp_render_state->GetSettings().sp_program, { - { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { sp_asteroids_uniforms_buffer, GetUniformsBufferOffset(0) } }, - { { gfx::Shader::Type::Pixel, "g_scene_uniforms" }, { sp_scene_uniforms_buffer } }, - { { gfx::Shader::Type::Pixel, "g_constants" }, { sp_constants_buffer } }, - { { gfx::Shader::Type::Pixel, "g_face_textures" }, { GetInstanceTexturePtr(0) } }, - { { gfx::Shader::Type::Pixel, "g_texture_sampler"}, { m_sp_texture_sampler } }, + { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { { sp_asteroids_uniforms_buffer, GetUniformsBufferOffset(0) } } }, + { { gfx::Shader::Type::Pixel, "g_scene_uniforms" }, { { sp_scene_uniforms_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_constants" }, { { sp_constants_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_face_textures" }, face_texture_locations }, + { { gfx::Shader::Type::Pixel, "g_texture_sampler"}, { { m_sp_texture_sampler } } }, }); Data::ParallelFor(1u, m_settings.instance_count - 1, [&](uint32_t asteroid_index) { - const Data::Size asteroid_uniform_offset = GetUniformsBufferOffset(asteroid_index); - gfx::Program::ResourceBindings::ResourceLocationByArgument set_resoure_location_by_argument = { - { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { sp_asteroids_uniforms_buffer, asteroid_uniform_offset } }, + const Data::Size asteroid_uniform_offset = GetUniformsBufferOffset(asteroid_index); + gfx::Program::ResourceBindings::ResourceLocationsByArgument set_resoure_location_by_argument = { + { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { { sp_asteroids_uniforms_buffer, asteroid_uniform_offset } } }, }; if (!m_settings.textures_array_enabled) { set_resoure_location_by_argument.insert( - { { gfx::Shader::Type::Pixel, "g_face_textures" }, { GetInstanceTexturePtr(asteroid_index) } } + { { gfx::Shader::Type::Pixel, "g_face_textures" }, { { GetInstanceTexturePtr(asteroid_index) } } } ); } resource_bindings_array[asteroid_index] = gfx::Program::ResourceBindings::CreateCopy(*resource_bindings_array[0], set_resoure_location_by_argument); diff --git a/Apps/Samples/Asteroids/Planet.cpp b/Apps/Samples/Asteroids/Planet.cpp index f044f3d4a..f0c21907b 100644 --- a/Apps/Samples/Asteroids/Planet.cpp +++ b/Apps/Samples/Asteroids/Planet.cpp @@ -97,10 +97,10 @@ gfx::Program::ResourceBindings::Ptr Planet::CreateResourceBindings(const gfx::Bu assert(!!m_sp_state); assert(!!m_sp_state->GetSettings().sp_program); return gfx::Program::ResourceBindings::Create(m_sp_state->GetSettings().sp_program, { - { { gfx::Shader::Type::All, "g_uniforms" }, { sp_uniforms_buffer } }, - { { gfx::Shader::Type::Pixel, "g_constants" }, { sp_constants_buffer } }, - { { gfx::Shader::Type::Pixel, "g_texture" }, { m_mesh_buffers.GetSubsetTexturePtr() } }, - { { gfx::Shader::Type::Pixel, "g_sampler" }, { m_sp_texture_sampler } }, + { { gfx::Shader::Type::All, "g_uniforms" }, { { sp_uniforms_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_constants" }, { { sp_constants_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_texture" }, { { m_mesh_buffers.GetSubsetTexturePtr() } } }, + { { gfx::Shader::Type::Pixel, "g_sampler" }, { { m_sp_texture_sampler } } }, }); } diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp index 87f79ec61..99fccb2a2 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp @@ -147,10 +147,10 @@ void TexturedCubeApp::Init() // Configure program resource bindings frame.sp_resource_bindings = gfx::Program::ResourceBindings::Create(m_sp_program, { - { { gfx::Shader::Type::All, "g_uniforms" }, { frame.sp_uniforms_buffer } }, - { { gfx::Shader::Type::Pixel, "g_constants" }, { m_sp_const_buffer } }, - { { gfx::Shader::Type::Pixel, "g_texture" }, { m_sp_cube_texture } }, - { { gfx::Shader::Type::Pixel, "g_sampler" }, { m_sp_texture_sampler } }, + { { gfx::Shader::Type::All, "g_uniforms" }, { { frame.sp_uniforms_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_constants" }, { { m_sp_const_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_texture" }, { { m_sp_cube_texture } } }, + { { gfx::Shader::Type::Pixel, "g_sampler" }, { { m_sp_texture_sampler } } }, }); // Create command list for rendering diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp index b138c93b1..d0995453f 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp @@ -251,12 +251,12 @@ void ShadowCubeApp::Init() // Shadow-pass resource bindings for cube rendering frame.shadow_pass.cube.sp_resource_bindings = gfx::Program::ResourceBindings::Create(m_shadow_pass.sp_program, { - { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { frame.shadow_pass.cube.sp_uniforms_buffer } }, + { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { { frame.shadow_pass.cube.sp_uniforms_buffer } } }, }); // Shadow-pass resource bindings for floor rendering frame.shadow_pass.floor.sp_resource_bindings = gfx::Program::ResourceBindings::Create(m_shadow_pass.sp_program, { - { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { frame.shadow_pass.floor.sp_uniforms_buffer } }, + { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { { frame.shadow_pass.floor.sp_uniforms_buffer } } }, }); // ========= Final Pass data ========= @@ -279,19 +279,19 @@ void ShadowCubeApp::Init() // Final-pass resource bindings for cube rendering frame.final_pass.cube.sp_resource_bindings = gfx::Program::ResourceBindings::Create(m_final_pass.sp_program, { - { { gfx::Shader::Type::Vertex, "g_mesh_uniforms" }, { frame.final_pass.cube.sp_uniforms_buffer } }, - { { gfx::Shader::Type::Pixel, "g_scene_uniforms" }, { frame.sp_scene_uniforms_buffer } }, - { { gfx::Shader::Type::Pixel, "g_constants" }, { m_sp_const_buffer } }, - { { gfx::Shader::Type::Pixel, "g_shadow_map" }, { frame.shadow_pass.sp_rt_texture } }, - { { gfx::Shader::Type::Pixel, "g_shadow_sampler" }, { m_sp_shadow_sampler } }, - { { gfx::Shader::Type::Pixel, "g_texture" }, { m_sp_cube_buffers->GetSubsetTexturePtr() } }, - { { gfx::Shader::Type::Pixel, "g_texture_sampler"}, { m_sp_texture_sampler } }, + { { gfx::Shader::Type::Vertex, "g_mesh_uniforms" }, { { frame.final_pass.cube.sp_uniforms_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_scene_uniforms" }, { { frame.sp_scene_uniforms_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_constants" }, { { m_sp_const_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_shadow_map" }, { { frame.shadow_pass.sp_rt_texture } } }, + { { gfx::Shader::Type::Pixel, "g_shadow_sampler" }, { { m_sp_shadow_sampler } } }, + { { gfx::Shader::Type::Pixel, "g_texture" }, { { m_sp_cube_buffers->GetSubsetTexturePtr() } } }, + { { gfx::Shader::Type::Pixel, "g_texture_sampler"}, { { m_sp_texture_sampler } } }, }); // Final-pass resource bindings for floor rendering - patched a copy of cube bindings frame.final_pass.floor.sp_resource_bindings = gfx::Program::ResourceBindings::CreateCopy(*frame.final_pass.cube.sp_resource_bindings, { - { { gfx::Shader::Type::Vertex, "g_mesh_uniforms" }, { frame.final_pass.floor.sp_uniforms_buffer } }, - { { gfx::Shader::Type::Pixel, "g_texture" }, { m_sp_floor_buffers->GetSubsetTexturePtr() } }, + { { gfx::Shader::Type::Vertex, "g_mesh_uniforms" }, { { frame.final_pass.floor.sp_uniforms_buffer } } }, + { { gfx::Shader::Type::Pixel, "g_texture" }, { { m_sp_floor_buffers->GetSubsetTexturePtr() } } }, }); } diff --git a/Build/Posix/Build.sh b/Build/Posix/Build.sh old mode 100644 new mode 100755 diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Program.h b/Modules/Graphics/Core/Include/Methane/Graphics/Program.h index 90efea084..016e7b587 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Program.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Program.h @@ -92,7 +92,7 @@ struct Program { using Ptr = std::shared_ptr; using WeakPtr = std::weak_ptr; - using ResourceLocationByArgument = std::unordered_map; + using ResourceLocationsByArgument = std::unordered_map; struct ApplyBehavior { @@ -110,8 +110,8 @@ struct Program }; // Create ResourceBindings instance - static Ptr Create(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument); - static Ptr CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationByArgument& replace_resource_location_by_argument = {}); + static Ptr Create(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument); + static Ptr CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationsByArgument& replace_resource_locations_by_argument = {}); // ResourceBindings interface virtual const Shader::ResourceBinding::Ptr& Get(const Argument& shader_argument) const = 0; diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h index 4680c29f6..61e7a2119 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h @@ -45,9 +45,9 @@ struct Resource : virtual Object using Ref = std::reference_wrapper; using Refs = std::vector; - enum class Type + enum class Type : uint32_t { - Buffer, + Buffer = 0u, Texture, Sampler, }; @@ -93,11 +93,24 @@ struct Resource : virtual Object struct Location { Ptr sp_resource; - Data::Size offset = 0u; + Data::Size offset; + + Location(Ptr in_sp_resource, Data::Size in_offset = 0u) : sp_resource(std::move(in_sp_resource)), offset(in_offset) { } bool operator==(const Location& other) const; }; + using Locations = std::vector; + + template + static Locations CreateLocations(const std::vector>& resources) + { + Resource::Locations resource_locations; + std::transform(resources.begin(), resources.end(), std::back_inserter(resource_locations), + [](const std::shared_ptr& sp_resource) { return Location(sp_resource); }); + return resource_locations; + } + struct SubResource { struct Index diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Shader.h b/Modules/Graphics/Core/Include/Methane/Graphics/Shader.h index 87537e9af..e7659ce12 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Shader.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Shader.h @@ -63,13 +63,13 @@ struct Shader static Ptr CreateCopy(const ResourceBinding& other_resource_binging); // ResourceBinding interface - virtual Shader::Type GetShaderType() const = 0; - virtual const std::string& GetArgumentName() const = 0; - virtual bool IsConstant() const = 0; - virtual bool IsAddressable() const = 0; - virtual const Resource::Location& GetResourceLocation() const = 0; - virtual void SetResourceLocation(Resource::Location resource_location) = 0; - virtual uint32_t GetResourceCount() const = 0; + virtual Shader::Type GetShaderType() const = 0; + virtual const std::string& GetArgumentName() const = 0; + virtual bool IsConstant() const = 0; + virtual bool IsAddressable() const = 0; + virtual uint32_t GetResourceCount() const = 0; + virtual const Resource::Locations& GetResourceLocations() const = 0; + virtual void SetResourceLocations(const Resource::Locations& resource_locations) = 0; virtual ~ResourceBinding() = default; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp index 62d765a7e..840de52fd 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp @@ -42,6 +42,19 @@ DirectX 12 implementation of the shader interface. namespace Methane::Graphics { +static Resource::Type GetResourceTypeByInputType(D3D_SHADER_INPUT_TYPE input_type) noexcept +{ + ITT_FUNCTION_TASK(); + switch (input_type) + { + case D3D_SIT_CBUFFER: + case D3D_SIT_TBUFFER: return Resource::Type::Buffer; + case D3D_SIT_TEXTURE: return Resource::Type::Texture; + case D3D_SIT_SAMPLER: return Resource::Type::Sampler; + default: throw std::invalid_argument("Unable to determine resource type by DX shader input type."); + } +} + static std::string GetShaderInputTypeName(D3D_SHADER_INPUT_TYPE input_type) noexcept { ITT_FUNCTION_TASK(); @@ -184,32 +197,11 @@ ShaderDX::ResourceBindingDX::ResourceBindingDX(ContextBase& context, const Setti ITT_FUNCTION_TASK(); } -void ShaderDX::ResourceBindingDX::SetResourceLocation(Resource::Location resource_location) +void ShaderDX::ResourceBindingDX::SetResourceLocations(Resource::Locations resource_locations) { ITT_FUNCTION_TASK(); - if (!resource_location.sp_resource) - { - throw std::invalid_argument("Can not set empty resource to shader resource binding."); - } - - const Resource::Type resource_type = resource_location.sp_resource->GetResourceType(); - bool resource_type_compatible = false; - switch (m_settings_dx.input_type) - { - case D3D_SIT_CBUFFER: resource_type_compatible = (resource_type == Resource::Type::Buffer); break; - case D3D_SIT_TEXTURE: resource_type_compatible = (resource_type == Resource::Type::Texture); break; - case D3D_SIT_SAMPLER: resource_type_compatible = (resource_type == Resource::Type::Sampler); break; - default: assert(0); - } - - if (!resource_type_compatible) - { - throw std::invalid_argument("Incompatible resource type \"" + Resource::GetTypeName(resource_location.sp_resource->GetResourceType()) + - "\" is bound to argument \"" + GetArgumentName() + "\" of type \"" + GetShaderInputTypeName(m_settings_dx.input_type) + "\"."); - } - - ShaderBase::ResourceBindingBase::SetResourceLocation(std::move(resource_location)); + ShaderBase::ResourceBindingBase::SetResourceLocations(std::move(resource_locations)); m_resource_location_dx.sp_resource = std::dynamic_pointer_cast(m_resource_location.sp_resource); m_resource_location_dx.offset = m_resource_location.offset; @@ -223,7 +215,7 @@ void ShaderDX::ResourceBindingDX::SetResourceLocation(Resource::Location resourc { throw std::logic_error("Incompatible heap type \"" + dx_descriptor_heap.GetTypeName() + "\" is set for resource binding on argument \"" + GetArgumentName() + - "\" of \"" + GetShaderInputTypeName(m_settings_dx.input_type) + "\" shader."); + "\" of \"" + GetTypeName(m_settings.shader_type)+ "\" shader."); } const uint32_t descriptor_index = m_p_descriptor_heap_reservation->GetRange(IsConstant()).GetStart() + m_descriptor_range.offset; @@ -235,12 +227,6 @@ void ShaderDX::ResourceBindingDX::SetResourceLocation(Resource::Location resourc ); } -DescriptorHeap::Type ShaderDX::ResourceBindingDX::GetDescriptorHeapType() const -{ - ITT_FUNCTION_TASK(); - return (m_settings_dx.input_type == D3D_SIT_SAMPLER)? DescriptorHeap::Type::Samplers : DescriptorHeap::Type::ShaderResources; -} - void ShaderDX::ResourceBindingDX::SetDescriptorRange(const DescriptorRange& descriptor_range) { ITT_FUNCTION_TASK(); @@ -357,12 +343,12 @@ ShaderBase::ResourceBindings ShaderDX::GetResourceBindings(const std::set static void SetMetalResource(Shader::Type shader_type, id& mtl_cmd_encoder, const TMetalResource& mtl_buffer, uint32_t arg_index, Data::Size buffer_offset) noexcept; +template +static void SetMetalResources(Shader::Type shader_type, id& mtl_cmd_encoder, const std::vector& mtl_buffer, uint32_t arg_index, const std::vector& buffer_offsets) noexcept; + template<> void SetMetalResource(Shader::Type shader_type, id& mtl_cmd_encoder, const id& mtl_buffer, uint32_t arg_index, Data::Size buffer_offset) noexcept { @@ -54,6 +57,20 @@ void SetMetalResource(Shader::Type shader_type, id& mtl } } +template<> +void SetMetalResources(Shader::Type shader_type, id& mtl_cmd_encoder, const std::vector>& mtl_buffers, + uint32_t arg_index, const std::vector& buffer_offsets) noexcept +{ + ITT_FUNCTION_TASK(); + const NSRange args_range = NSMakeRange(arg_index, mtl_buffers.size()); + switch(shader_type) + { + case Shader::Type::Vertex: [mtl_cmd_encoder setVertexBuffers:mtl_buffers.data() offsets:buffer_offsets.data() withRange:args_range]; break; + case Shader::Type::Pixel: [mtl_cmd_encoder setFragmentBuffers:mtl_buffers.data() offsets:buffer_offsets.data() withRange:args_range]; break; + default: assert(0); + } +} + template<> void SetMetalResource(Shader::Type shader_type, id& mtl_cmd_encoder, const id& mtl_texture, uint32_t arg_index, Data::Size) noexcept { @@ -66,6 +83,20 @@ void SetMetalResource(Shader::Type shader_type, id& mtl } } +template<> +void SetMetalResources(Shader::Type shader_type, id& mtl_cmd_encoder, const std::vector>& mtl_textures, + uint32_t arg_index, const std::vector&) noexcept +{ + ITT_FUNCTION_TASK(); + const NSRange args_range = NSMakeRange(arg_index, mtl_textures.size()); + switch(shader_type) + { + case Shader::Type::Vertex: [mtl_cmd_encoder setVertexTextures:mtl_textures.data() withRange:args_range]; break; + case Shader::Type::Pixel: [mtl_cmd_encoder setFragmentTextures:mtl_textures.data() withRange:args_range]; break; + default: assert(0); + } +} + template<> void SetMetalResource(Shader::Type shader_type, id& mtl_cmd_encoder, const id& mtl_sampler, uint32_t arg_index, Data::Size) noexcept { @@ -78,44 +109,85 @@ void SetMetalResource(Shader::Type shader_type, id& mtl } } +template<> +void SetMetalResources(Shader::Type shader_type, id& mtl_cmd_encoder, const std::vector>& mtl_samplers, + uint32_t arg_index, const std::vector&) noexcept +{ + ITT_FUNCTION_TASK(); + const NSRange args_range = NSMakeRange(arg_index, mtl_samplers.size()); + switch(shader_type) + { + case Shader::Type::Vertex: [mtl_cmd_encoder setVertexSamplerStates:mtl_samplers.data() withRange:args_range]; break; + case Shader::Type::Pixel: [mtl_cmd_encoder setFragmentSamplerStates:mtl_samplers.data() withRange:args_range]; break; + default: assert(0); + } +} + template -static void SetMetalResourceForAll(Shader::Type shader_type, Program& program, id& mtl_cmd_encoder, const TMetalResource& mtl_resource, uint32_t arg_index, Data::Size offset) noexcept +static void SetMetalResourcesForAll(Shader::Type shader_type, Program& program, id& mtl_cmd_encoder, + const std::vector& mtl_resources, uint32_t arg_index, + const std::vector& offsets = std::vector()) noexcept { ITT_FUNCTION_TASK(); + assert(!mtl_resources.empty()); - if (shader_type != Shader::Type::All) + if (shader_type == Shader::Type::All) { - SetMetalResource(shader_type, mtl_cmd_encoder, mtl_resource, arg_index, offset); + if (mtl_resources.size() > 1) + { + for (Shader::Type specific_shader_type : program.GetShaderTypes()) + { + SetMetalResources(specific_shader_type, mtl_cmd_encoder, mtl_resources, arg_index, offsets); + } + } + else + { + for (Shader::Type specific_shader_type : program.GetShaderTypes()) + { + SetMetalResource(specific_shader_type, mtl_cmd_encoder, mtl_resources.back(), arg_index, + offsets.empty() ? 0 : offsets.back()); + } + } } else { - for(Shader::Type specific_shader_type : program.GetShaderTypes()) + if (mtl_resources.size() > 1) { - SetMetalResource(specific_shader_type, mtl_cmd_encoder, mtl_resource, arg_index, offset); + SetMetalResources(shader_type, mtl_cmd_encoder, mtl_resources, arg_index, offsets); + } + else + { + SetMetalResource(shader_type, mtl_cmd_encoder, mtl_resources.back(), arg_index, + offsets.empty() ? 0 : offsets.back()); } } } -Program::ResourceBindings::Ptr Program::ResourceBindings::Create(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) +template +static void GetBoundMetalResources(const Resource::Locations& resource_locations, std::vector& out_mtl_resources, std::vector& out_offsets) +{ +} + +Program::ResourceBindings::Ptr Program::ResourceBindings::Create(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument) { ITT_FUNCTION_TASK(); - return std::make_shared(sp_program, resource_location_by_argument); + return std::make_shared(sp_program, resource_locations_by_argument); } -Program::ResourceBindings::Ptr Program::ResourceBindings::CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationByArgument& replace_resource_location_by_argument) +Program::ResourceBindings::Ptr Program::ResourceBindings::CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationsByArgument& replace_resource_locations_by_argument) { ITT_FUNCTION_TASK(); - return std::make_shared(static_cast(other_resource_bingings), replace_resource_location_by_argument); + return std::make_shared(static_cast(other_resource_bingings), replace_resource_locations_by_argument); } -ProgramMT::ResourceBindingsMT::ResourceBindingsMT(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) - : ResourceBindingsBase(sp_program, resource_location_by_argument) +ProgramMT::ResourceBindingsMT::ResourceBindingsMT(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument) + : ResourceBindingsBase(sp_program, resource_locations_by_argument) { ITT_FUNCTION_TASK(); } -ProgramMT::ResourceBindingsMT::ResourceBindingsMT(const ResourceBindingsMT& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument) - : ResourceBindingsBase(other_resource_bindings, replace_resource_location_by_argument) +ProgramMT::ResourceBindingsMT::ResourceBindingsMT(const ResourceBindingsMT& other_resource_bindings, const ResourceLocationsByArgument& replace_resource_locations_by_argument) + : ResourceBindingsBase(other_resource_bindings, replace_resource_locations_by_argument) { ITT_FUNCTION_TASK(); } @@ -132,45 +204,27 @@ static void SetMetalResourceForAll(Shader::Type shader_type, Program& program, i { const Argument& program_argument = resource_binding_by_argument.first; const ShaderMT::ResourceBindingMT& metal_resource_binding = static_cast(*resource_binding_by_argument.second); - const Resource::Location& bound_resource_location = metal_resource_binding.GetResourceLocation(); - if (!bound_resource_location.sp_resource) - { -#ifndef PROGRAM_IGNORE_MISSING_ARGUMENTS - throw std::runtime_error( - "Can not apply resource binding for argument \"" + program_argument.argument_name + - "\" of \"" + Shader::GetTypeName(program_argument.shader_type) + - "\" shader because it is not bound to any resource."); -#else - continue; -#endif - } - + if ((apply_behavior & ApplyBehavior::ConstantOnce || apply_behavior & ApplyBehavior::ChangesOnly) && metal_resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state, apply_behavior & ApplyBehavior::ChangesOnly)) continue; - - const Resource::Type resource_type = bound_resource_location.sp_resource->GetResourceType(); + const uint32_t arg_index = metal_resource_binding.GetSettings().argument_index; - - switch(resource_type) + + switch(metal_resource_binding.GetSettings().base.resource_type) { case Resource::Type::Buffer: - { - const id& mtl_buffer = dynamic_cast(*bound_resource_location.sp_resource).GetNativeBuffer(); - SetMetalResourceForAll(program_argument.shader_type, *m_sp_program, mtl_cmd_encoder, mtl_buffer, arg_index, bound_resource_location.offset); - } break; + SetMetalResourcesForAll(program_argument.shader_type, *m_sp_program, mtl_cmd_encoder, metal_resource_binding.GetNativeBuffers(), arg_index, + metal_resource_binding.GetBufferOffsets()); + break; case Resource::Type::Texture: - { - const id& mtl_texture = dynamic_cast(*bound_resource_location.sp_resource).GetNativeTexture(); - SetMetalResourceForAll(program_argument.shader_type, *m_sp_program, mtl_cmd_encoder, mtl_texture, arg_index, bound_resource_location.offset); - } break; + SetMetalResourcesForAll(program_argument.shader_type, *m_sp_program, mtl_cmd_encoder, metal_resource_binding.GetNativeTextures(), arg_index); + break; case Resource::Type::Sampler: - { - const id& mtl_sampler = dynamic_cast(*bound_resource_location.sp_resource).GetNativeSamplerState(); - SetMetalResourceForAll(program_argument.shader_type, *m_sp_program, mtl_cmd_encoder, mtl_sampler, arg_index, bound_resource_location.offset); - } break; + SetMetalResourcesForAll(program_argument.shader_type, *m_sp_program, mtl_cmd_encoder, metal_resource_binding.GetNativeSamplerStates(), arg_index); + break; default: assert(0); } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.hh index cd78e0ec0..a0dd9bb5e 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.hh @@ -44,25 +44,28 @@ public: public: struct Settings { - ResourceBindingBase::Settings base; - MTLArgumentType argument_type; - uint32_t argument_index; + ResourceBindingBase::Settings base; + uint32_t argument_index; }; ResourceBindingMT(ContextBase& context, const Settings& settings); ResourceBindingMT(const ResourceBindingMT& other) = default; - + // ResourceBinding interface - void SetResourceLocation(Resource::Location resource_location) override; - uint32_t GetResourceCount() const override { return 1; } - - // ResourceBindingBase interface - DescriptorHeap::Type GetDescriptorHeapType() const override; + void SetResourceLocations(const Resource::Locations& resource_locations) override; const Settings& GetSettings() const noexcept { return m_settings; } + const std::vector>& GetNativeSamplerStates() const { return m_mtl_sampler_states; } + const std::vector>& GetNativeTextures() const { return m_mtl_textures; } + const std::vector>& GetNativeBuffers() const { return m_mtl_buffers; } + const std::vector& GetBufferOffsets() const { return m_mtl_buffer_offsets; } protected: - const Settings m_settings; + const Settings m_settings; + std::vector> m_mtl_sampler_states; + std::vector> m_mtl_textures; + std::vector> m_mtl_buffers; + std::vector m_mtl_buffer_offsets; }; ShaderMT(Shader::Type shader_type, ContextMT& context, const Settings& settings); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm index 3714fd547..5a4cbf850 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm @@ -23,13 +23,17 @@ #include "ShaderMT.hh" #include "ProgramMT.hh" -#include "ResourceMT.hh" +#include "SamplerMT.hh" +#include "BufferMT.hh" +#include "TextureMT.hh" #include "ContextMT.hh" #include "TypesMT.hh" #include #include +#include + namespace Methane::Graphics { @@ -45,6 +49,18 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept } } +static Resource::Type GetResourceTypeByMetalArgumentType(MTLArgumentType mtl_arg_type) +{ + ITT_FUNCTION_TASK(); + switch(mtl_arg_type) + { + case MTLArgumentTypeBuffer: return Resource::Type::Buffer; + case MTLArgumentTypeTexture: return Resource::Type::Texture; + case MTLArgumentTypeSampler: return Resource::Type::Sampler; + default: throw std::invalid_argument("Unable to determine resource type by DX shader input type."); + } +} + static std::string GetMetalArgumentTypeName(MTLArgumentType mtl_arg_type) noexcept { ITT_FUNCTION_TASK(); @@ -87,40 +103,43 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept ITT_FUNCTION_TASK(); } -void ShaderMT::ResourceBindingMT::SetResourceLocation(Resource::Location resource_location) +void ShaderMT::ResourceBindingMT::SetResourceLocations(const Resource::Locations& resource_locations) { ITT_FUNCTION_TASK(); + ResourceBindingBase::SetResourceLocations(resource_locations); - if (!resource_location.sp_resource) - { - throw std::invalid_argument("Can not set resource location with Null resource pointer."); - } - - const Resource::Type resource_type = resource_location.sp_resource->GetResourceType(); - - bool resource_type_compatible = false; - switch(m_settings.argument_type) - { - case MTLArgumentTypeBuffer: resource_type_compatible = (resource_type == Resource::Type::Buffer); break; - case MTLArgumentTypeTexture: resource_type_compatible = (resource_type == Resource::Type::Texture); break; - case MTLArgumentTypeSampler: resource_type_compatible = (resource_type == Resource::Type::Sampler); break; - default: assert(0); - } - - if (!resource_type_compatible) + m_mtl_sampler_states.clear(); + m_mtl_textures.clear(); + m_mtl_buffers.clear(); + m_mtl_buffer_offsets.clear(); + + switch(m_settings.base.resource_type) { - throw std::invalid_argument("Incompatible resource type \"" + Resource::GetTypeName(resource_location.sp_resource->GetResourceType()) + - "\" is bound to argument \"" + GetArgumentName() + - "\" of type \"" + GetMetalArgumentTypeName(m_settings.argument_type) + "\"."); - } - - ShaderBase::ResourceBindingBase::SetResourceLocation(std::move(resource_location)); -} + case Resource::Type::Sampler: + m_mtl_sampler_states.reserve(m_resource_locations.size()); + std::transform(m_resource_locations.begin(), m_resource_locations.end(), std::back_inserter(m_mtl_sampler_states), + [](const Resource::Location& resource_location) + { return dynamic_cast(*resource_location.sp_resource).GetNativeSamplerState(); }); + break; -DescriptorHeap::Type ShaderMT::ResourceBindingMT::GetDescriptorHeapType() const -{ - ITT_FUNCTION_TASK(); - return (m_settings.argument_type == MTLArgumentTypeSampler) ? DescriptorHeap::Type::Samplers : DescriptorHeap::Type::ShaderResources; + case Resource::Type::Texture: + m_mtl_textures.reserve(m_resource_locations.size()); + std::transform(m_resource_locations.begin(), m_resource_locations.end(), std::back_inserter(m_mtl_textures), + [](const Resource::Location& resource_location) + { return dynamic_cast(*resource_location.sp_resource).GetNativeTexture(); }); + break; + + case Resource::Type::Buffer: + m_mtl_buffers.reserve(m_resource_locations.size()); + m_mtl_buffer_offsets.reserve(m_resource_locations.size()); + for (const Resource::Location& resource_location : m_resource_locations) + { + assert(!!resource_location.sp_resource); + m_mtl_buffers.push_back(dynamic_cast(*resource_location.sp_resource).GetNativeBuffer()); + m_mtl_buffer_offsets.push_back(static_cast(resource_location.offset)); + } + break; + } } Shader::Ptr Shader::Create(Shader::Type shader_type, Context& context, const Settings& settings) @@ -183,10 +202,11 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept { m_type, argument_name, + GetResourceTypeByMetalArgumentType(mtl_arg.type), + static_cast(mtl_arg.arrayLength), is_constant_binding, is_addressable_binding }, - mtl_arg.type, static_cast(mtl_arg.index) } )); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp index e27ab3d51..f5bdd68a9 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp @@ -51,7 +51,7 @@ bool Program::Argument::operator==(const Argument& other) const std::tie(other.hash, other.shader_type, other.argument_name); } -ProgramBase::ResourceBindingsBase::ResourceBindingsBase(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) +ProgramBase::ResourceBindingsBase::ResourceBindingsBase(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument) : m_sp_program(sp_program) { ITT_FUNCTION_TASK(); @@ -62,34 +62,34 @@ ProgramBase::ResourceBindingsBase::ResourceBindingsBase(const Program::Ptr& sp_p } ReserveDescriptorHeapRanges(); - SetResourcesForArguments(resource_location_by_argument); + SetResourcesForArguments(resource_locations_by_argument); VerifyAllArgumentsAreBoundToResources(); } -ProgramBase::ResourceBindingsBase::ResourceBindingsBase(const ResourceBindingsBase& other_resource_bingings, const ResourceLocationByArgument& replace_resource_location_by_argument) +ProgramBase::ResourceBindingsBase::ResourceBindingsBase(const ResourceBindingsBase& other_resource_bingings, const ResourceLocationsByArgument& replace_resource_locations_by_argument) : m_sp_program(other_resource_bingings.m_sp_program) , m_descriptor_heap_reservations_by_type(other_resource_bingings.m_descriptor_heap_reservations_by_type) { ITT_FUNCTION_TASK(); // Form map of original resource bindings - ResourceLocationByArgument resource_location_by_argument; + ResourceLocationsByArgument resource_locations_by_argument; for (const auto& argument_and_resource_binding : other_resource_bingings.m_resource_binding_by_argument) { - resource_location_by_argument.emplace( + resource_locations_by_argument.emplace( argument_and_resource_binding.first, - argument_and_resource_binding.second->GetResourceLocation() + argument_and_resource_binding.second->GetResourceLocations() ); } // Substitute resources in original bindings list - for (const auto& argument_and_resource_location : replace_resource_location_by_argument) + for (const auto& argument_and_resource_location : replace_resource_locations_by_argument) { - resource_location_by_argument[argument_and_resource_location.first] = argument_and_resource_location.second; + resource_locations_by_argument[argument_and_resource_location.first] = argument_and_resource_location.second; } ReserveDescriptorHeapRanges(); - SetResourcesForArguments(resource_location_by_argument); + SetResourcesForArguments(resource_locations_by_argument); VerifyAllArgumentsAreBoundToResources(); } @@ -201,27 +201,28 @@ void ProgramBase::ResourceBindingsBase::ReserveDescriptorHeapRanges() } } -void ProgramBase::ResourceBindingsBase::SetResourcesForArguments(const ResourceLocationByArgument& resource_location_by_argument) +void ProgramBase::ResourceBindingsBase::SetResourcesForArguments(const ResourceLocationsByArgument& resource_locations_by_argument) { ITT_FUNCTION_TASK(); - for (const auto& argument_and_resource_location : resource_location_by_argument) + for (const auto& argument_and_resource_locations : resource_locations_by_argument) { - const Shader::ResourceBinding::Ptr& sp_binding = Get(argument_and_resource_location.first); + const Program::Argument argument = argument_and_resource_locations.first; + const Shader::ResourceBinding::Ptr& sp_binding = Get(argument); if (!sp_binding) { #ifndef PROGRAM_IGNORE_MISSING_ARGUMENTS - const Argument all_shaders_argument(Shader::Type::All, argument_and_resource_location.first.argument_name); + const Argument all_shaders_argument(Shader::Type::All, argument.argument_name); const bool all_shaders_argument_found = !!Get(all_shaders_argument); throw std::runtime_error("Program \"" + m_sp_program->GetName() + - "\" does not have argument \"" + argument_and_resource_location.first.argument_name + - "\" of " + Shader::GetTypeName(argument_and_resource_location.first.shader_type) + " shader." + + "\" does not have argument \"" + argument.argument_name + + "\" of " + Shader::GetTypeName(argument.shader_type) + " shader." + (all_shaders_argument_found ? " Instead this argument is used in All shaders." : "") ); #else continue; #endif } - sp_binding->SetResourceLocation(argument_and_resource_location.second); + sp_binding->SetResourceLocations(argument_and_resource_locations.second); } } @@ -243,7 +244,8 @@ bool ProgramBase::ResourceBindingsBase::AllArgumentsAreBoundToResources(std::str bool all_arguments_are_bound_to_resources = true; for (const auto& resource_binding_by_argument : m_resource_binding_by_argument) { - if (!resource_binding_by_argument.second->GetResourceLocation().sp_resource) + const Resource::Locations& resource_locations = resource_binding_by_argument.second->GetResourceLocations(); + if (resource_locations.empty()) { log_ss << std::endl << " - Program \"" << m_sp_program->GetName() diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h index 5489ca849..0f794f83b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h @@ -53,8 +53,8 @@ class ProgramBase public: using Ptr = std::shared_ptr; - ResourceBindingsBase(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument); - ResourceBindingsBase(const ResourceBindingsBase& other_resource_bingings, const ResourceLocationByArgument& replace_resource_location_by_argument); + ResourceBindingsBase(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_location_by_argument); + ResourceBindingsBase(const ResourceBindingsBase& other_resource_bingings, const ResourceLocationsByArgument& replace_resource_location_by_argument); ~ResourceBindingsBase() override; Ptr GetPtr() { return shared_from_this(); } @@ -73,7 +73,7 @@ class ProgramBase using DescriptorHeapReservationByType = std::array, static_cast(DescriptorHeap::Type::Count)>; void ReserveDescriptorHeapRanges(); - void SetResourcesForArguments(const ResourceLocationByArgument& resource_location_by_argument); + void SetResourcesForArguments(const ResourceLocationsByArgument& resource_location_by_argument); void VerifyAllArgumentsAreBoundToResources(); const Program::Ptr m_sp_program; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp index 7cd1be992..9d2066e7d 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp @@ -51,21 +51,43 @@ ShaderBase::ResourceBindingBase::ResourceBindingBase(ContextBase& context, const ITT_FUNCTION_TASK(); } -void ShaderBase::ResourceBindingBase::SetResourceLocation(Resource::Location resource_location) +void ShaderBase::ResourceBindingBase::SetResourceLocations(const Resource::Locations& resource_locations) { ITT_FUNCTION_TASK(); - if (!resource_location.sp_resource) - throw std::invalid_argument("Can not set empty resource for resource binding."); + if (resource_locations.empty()) + throw std::invalid_argument("Can not set empty resources for resource binding."); const bool is_addressable_binding = IsAddressable(); - const Resource::Usage::Mask resource_usage_mask = resource_location.sp_resource->GetUsageMask(); - if (static_cast(resource_usage_mask & Resource::Usage::Addressable) != is_addressable_binding) - throw std::invalid_argument("Resource addressable usage flag does not match with resource binding state."); - if (!is_addressable_binding && resource_location.offset > 0) - throw std::invalid_argument("Can not set resource location with non-zero offset to non-addressable resource binding."); + for (const Resource::Location& resource_location : resource_locations) + { + if (!resource_location.sp_resource) + throw std::invalid_argument("Can not use empty resource for resource binding."); + + if (resource_location.sp_resource->GetResourceType() != m_settings.resource_type) + { + throw std::invalid_argument("Incompatible resource type \"" + Resource::GetTypeName(resource_location.sp_resource->GetResourceType()) + + "\" is bound to argument \"" + GetArgumentName() + + "\" of type \"" + Resource::GetTypeName(m_settings.resource_type) + "\"."); + } + + const Resource::Usage::Mask resource_usage_mask = resource_location.sp_resource->GetUsageMask(); + if (static_cast(resource_usage_mask & Resource::Usage::Addressable) != is_addressable_binding) + throw std::invalid_argument("Resource addressable usage flag does not match with resource binding state."); + + if (!is_addressable_binding && resource_location.offset > 0) + throw std::invalid_argument("Can not set resource location with non-zero offset to non-addressable resource binding."); + } - m_resource_location = std::move(resource_location); + m_resource_locations = resource_locations; +} + +DescriptorHeap::Type ShaderBase::ResourceBindingBase::GetDescriptorHeapType() const +{ + ITT_FUNCTION_TASK(); + return (m_settings.resource_type == Resource::Type::Sampler) + ? DescriptorHeap::Type::Samplers + : DescriptorHeap::Type::ShaderResources; } bool ShaderBase::ResourceBindingBase::IsAlreadyApplied(const Program& program, const Program::Argument& program_argument, @@ -73,7 +95,6 @@ bool ShaderBase::ResourceBindingBase::IsAlreadyApplied(const Program& program, c bool check_binding_value_changes) const { ITT_FUNCTION_TASK(); - if (!command_state.sp_resource_bindings) return false; @@ -96,7 +117,7 @@ bool ShaderBase::ResourceBindingBase::IsAlreadyApplied(const Program& program, c // 2) No need in setting resource binding to the same location // as a previous resource binding set in the same command list for the same program - if (previous_argument_resource_binding->GetResourceLocation() == m_resource_location) + if (previous_argument_resource_binding->GetResourceLocations() == m_resource_locations) return true; return false; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.h index edf27d7f0..cdf85dcf6 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.h @@ -47,28 +47,30 @@ class ShaderBase public: struct Settings { - Shader::Type shader_type; - std::string argument_name; - bool is_constant; - bool is_addressable; + Shader::Type shader_type; + std::string argument_name; + Resource::Type resource_type; + uint32_t resource_count; + bool is_constant; + bool is_addressable; }; ResourceBindingBase(ContextBase& context, const Settings& settings); ResourceBindingBase(const ResourceBindingBase& other) = default; // ResourceBinding interface - Shader::Type GetShaderType() const override { return m_settings.shader_type; } - const std::string& GetArgumentName() const override { return m_settings.argument_name; } - bool IsConstant() const override { return m_settings.is_constant; } - bool IsAddressable() const override { return m_settings.is_addressable; } - const Resource::Location& GetResourceLocation() const override { return m_resource_location; } - void SetResourceLocation(Resource::Location resource_location) override; + Shader::Type GetShaderType() const override { return m_settings.shader_type; } + const std::string& GetArgumentName() const override { return m_settings.argument_name; } + bool IsConstant() const override { return m_settings.is_constant; } + bool IsAddressable() const override { return m_settings.is_addressable; } + uint32_t GetResourceCount() const override { return m_settings.resource_count; } + const Resource::Locations& GetResourceLocations() const override { return m_resource_locations; } + void SetResourceLocations(const Resource::Locations& resource_locations) override; - // ResourceBindingBase interface - virtual DescriptorHeap::Type GetDescriptorHeapType() const = 0; + DescriptorHeap::Type GetDescriptorHeapType() const; Ptr GetPtr() { return shared_from_this(); } - bool HasResource() const { return !!m_resource_location.sp_resource; } + bool HasResources() const { return !m_resource_locations.empty(); } bool IsAlreadyApplied(const Program& program, const Program::Argument& program_argument, const CommandListBase::CommandState& command_state, bool check_binding_value_changes) const; @@ -76,7 +78,7 @@ class ShaderBase protected: ContextBase& m_context; const Settings m_settings; - Resource::Location m_resource_location; + Resource::Locations m_resource_locations; }; ShaderBase(Type type, ContextBase& context, const Settings& settings); diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp index 5b529f768..66505796c 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp @@ -91,9 +91,9 @@ Program::ResourceBindings::Ptr SkyBox::CreateResourceBindings(const Buffer::Ptr& assert(!!m_sp_state); assert(!!m_sp_state->GetSettings().sp_program); return Program::ResourceBindings::Create(m_sp_state->GetSettings().sp_program, { - { { Shader::Type::Vertex, "g_skybox_uniforms" }, { sp_uniforms_buffer } }, - { { Shader::Type::Pixel, "g_skybox_texture" }, { m_mesh_buffers.GetSubsetTexturePtr() } }, - { { Shader::Type::Pixel, "g_texture_sampler" }, { m_sp_texture_sampler } }, + { { Shader::Type::Vertex, "g_skybox_uniforms" }, { { sp_uniforms_buffer } } }, + { { Shader::Type::Pixel, "g_skybox_texture" }, { { m_mesh_buffers.GetSubsetTexturePtr() } } }, + { { Shader::Type::Pixel, "g_texture_sampler" }, { { m_sp_texture_sampler } } }, }); } diff --git a/README.md b/README.md index a91507f2b..cf6de1946 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,8 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you #### Fetch Sources -**IMPORTANT:** Do not download source code via Zip archive, since it will not allow to properly initalize External submodules. Use git as described below. +**IMPORTANT:** Do not download source code via Zip archive, since it does not include content of External submodules. +Use git as described below. - **First time initialization** ```console From 7488690f1be6599eda62f8227f51f362bc8c325b Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 28 Dec 2019 20:38:18 +0300 Subject: [PATCH 054/129] Fixed build on Windows and Linux. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 2 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 28 ++--- .../Core/Include/Methane/Graphics/Resource.h | 6 +- .../Methane/Graphics/DirectX12/ProgramDX.cpp | 118 ++++++++++-------- .../Methane/Graphics/DirectX12/ProgramDX.h | 6 +- .../Methane/Graphics/DirectX12/ResourceDX.cpp | 16 +++ .../Methane/Graphics/DirectX12/ResourceDX.h | 14 +++ .../Methane/Graphics/DirectX12/ShaderDX.cpp | 74 +++++++---- .../Methane/Graphics/DirectX12/ShaderDX.h | 28 ++--- .../Methane/Graphics/Metal/ProgramMT.hh | 2 +- .../Sources/Methane/Graphics/ProgramBase.cpp | 6 +- .../Sources/Methane/Graphics/ProgramBase.h | 4 +- .../Methane/Graphics/Vulkan/ProgramVK.cpp | 26 ++-- .../Methane/Graphics/Vulkan/ProgramVK.h | 4 +- .../Methane/Graphics/Vulkan/ShaderVK.cpp | 17 +-- .../Methane/Graphics/Vulkan/ShaderVK.h | 5 +- 16 files changed, 195 insertions(+), 161 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 3c48fa696..dc14ef68a 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -132,7 +132,7 @@ AsteroidsApp::AsteroidsApp() 4.f, // - disc_radius_ratio GetParamValueByComplexity(g_scale_ratio) / 10.f,// - min_asteroid_scale_ratio GetParamValueByComplexity(g_scale_ratio), // - max_asteroid_scale_ratio - true, // - textures_array_enabled + false, // - textures_array_enabled true // - depth_reversed }) , m_asteroids_complexity(static_cast(GetComplexity())) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 422a71a71..836608c0c 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -296,22 +296,22 @@ gfx::MeshBufferBindings::ResourceBindingsArray AsteroidsArray::CreateResourceBin { { gfx::Shader::Type::Pixel, "g_texture_sampler"}, { { m_sp_texture_sampler } } }, }); - Data::ParallelFor(1u, m_settings.instance_count - 1, - [&](uint32_t asteroid_index) + // TODO: parallel initialization of resource binding is disabled due to unresolved race issues + // Data::ParallelFor(1u, m_settings.instance_count - 1, [&](uint32_t asteroid_index) + for(uint32_t asteroid_index = 1u; asteroid_index < m_settings.instance_count; ++asteroid_index) + { + const Data::Size asteroid_uniform_offset = GetUniformsBufferOffset(asteroid_index); + gfx::Program::ResourceBindings::ResourceLocationsByArgument set_resoure_location_by_argument = { + { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { { sp_asteroids_uniforms_buffer, asteroid_uniform_offset } } }, + }; + if (!m_settings.textures_array_enabled) { - const Data::Size asteroid_uniform_offset = GetUniformsBufferOffset(asteroid_index); - gfx::Program::ResourceBindings::ResourceLocationsByArgument set_resoure_location_by_argument = { - { { gfx::Shader::Type::All, "g_mesh_uniforms" }, { { sp_asteroids_uniforms_buffer, asteroid_uniform_offset } } }, - }; - if (!m_settings.textures_array_enabled) - { - set_resoure_location_by_argument.insert( - { { gfx::Shader::Type::Pixel, "g_face_textures" }, { { GetInstanceTexturePtr(asteroid_index) } } } - ); - } - resource_bindings_array[asteroid_index] = gfx::Program::ResourceBindings::CreateCopy(*resource_bindings_array[0], set_resoure_location_by_argument); + set_resoure_location_by_argument.insert( + { { gfx::Shader::Type::Pixel, "g_face_textures" }, { { GetInstanceTexturePtr(asteroid_index) } } } + ); } - ); + resource_bindings_array[asteroid_index] = gfx::Program::ResourceBindings::CreateCopy(*resource_bindings_array[0], set_resoure_location_by_argument); + } //); return resource_bindings_array; } diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h index 61e7a2119..b5ef4d3a2 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h @@ -95,7 +95,11 @@ struct Resource : virtual Object Ptr sp_resource; Data::Size offset; - Location(Ptr in_sp_resource, Data::Size in_offset = 0u) : sp_resource(std::move(in_sp_resource)), offset(in_offset) { } + Location(Ptr in_sp_resource, Data::Size in_offset = 0u) : sp_resource(std::move(in_sp_resource)), offset(in_offset) + { + if (!sp_resource) + throw std::invalid_argument("Can not create Resource::Location for an empty resource."); + } bool operator==(const Location& other) const; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp index ddc9f4be7..b65cf274c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp @@ -101,32 +101,32 @@ static D3D12_SHADER_VISIBILITY GetShaderVisibilityByType(Shader::Type shader_typ return D3D12_SHADER_VISIBILITY_ALL; }; -Program::ResourceBindings::Ptr Program::ResourceBindings::Create(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) +Program::ResourceBindings::Ptr Program::ResourceBindings::Create(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument) { ITT_FUNCTION_TASK(); - std::shared_ptr sp_dx_resource_bindings = std::make_shared(sp_program, resource_location_by_argument); + std::shared_ptr sp_dx_resource_bindings = std::make_shared(sp_program, resource_locations_by_argument); sp_dx_resource_bindings->Initialize(); // NOTE: Initialize is called externally (not from constructor) to enable using shared_from_this from its code return sp_dx_resource_bindings; } -Program::ResourceBindings::Ptr Program::ResourceBindings::CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationByArgument& replace_resource_location_by_argument) +Program::ResourceBindings::Ptr Program::ResourceBindings::CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationsByArgument& replace_resource_locations_by_argument) { ITT_FUNCTION_TASK(); - std::shared_ptr sp_dx_resource_bindings = std::make_shared(static_cast(other_resource_bingings), replace_resource_location_by_argument); + std::shared_ptr sp_dx_resource_bindings = std::make_shared(static_cast(other_resource_bingings), replace_resource_locations_by_argument); sp_dx_resource_bindings->Initialize(); // NOTE: Initialize is called externally (not from constructor) to enable using shared_from_this from its code return sp_dx_resource_bindings; } -ProgramDX::ResourceBindingsDX::ResourceBindingsDX(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) - : ProgramBase::ResourceBindingsBase(sp_program, resource_location_by_argument) +ProgramDX::ResourceBindingsDX::ResourceBindingsDX(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument) + : ProgramBase::ResourceBindingsBase(sp_program, resource_locations_by_argument) { ITT_FUNCTION_TASK(); } -ProgramDX::ResourceBindingsDX::ResourceBindingsDX(const ResourceBindingsDX& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument) - : ProgramBase::ResourceBindingsBase(other_resource_bindings, replace_resource_location_by_argument) +ProgramDX::ResourceBindingsDX::ResourceBindingsDX(const ResourceBindingsDX& other_resource_bindings, const ResourceLocationsByArgument& replace_resource_locations_by_argument) + : ProgramBase::ResourceBindingsBase(other_resource_bindings, replace_resource_locations_by_argument) { ITT_FUNCTION_TASK(); } @@ -161,10 +161,10 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list, ApplyBehavi struct GraphicsRootParameterBinding { - DXBindingType type; - uint32_t root_parameter_index; - D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor; - D3D12_GPU_VIRTUAL_ADDRESS gpu_virtual_address; + DXBindingType type = ShaderDX::ResourceBindingDX::Type::DescriptorTable; + uint32_t root_parameter_index = 0; + D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor = {}; + D3D12_GPU_VIRTUAL_ADDRESS gpu_virtual_address = 0u; }; RenderCommandListDX& render_command_list_dx = dynamic_cast(command_list); @@ -176,7 +176,7 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list, ApplyBehavi std::vector graphics_root_parameter_bindings; graphics_root_parameter_bindings.reserve(m_resource_binding_by_argument.size()); - ForEachResourceBinding([&](ResourceDX& resource, const Argument& argument, ShaderDX::ResourceBindingDX& resource_binding, const DescriptorHeap::Reservation* p_heap_reservation) + ForEachResourceBinding([&](const Argument& argument, ShaderDX::ResourceBindingDX& resource_binding, const DescriptorHeap::Reservation* p_heap_reservation) { if ((apply_behavior & ApplyBehavior::ConstantOnce || apply_behavior & ApplyBehavior::ChangesOnly) && resource_binding.IsAlreadyApplied(*m_sp_program, argument, command_state, apply_behavior & ApplyBehavior::ChangesOnly)) @@ -184,7 +184,6 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list, ApplyBehavi const DXBindingType binding_type = resource_binding.GetSettings().type; D3D12_GPU_DESCRIPTOR_HANDLE gpu_descriptor_handle = {}; - D3D12_GPU_VIRTUAL_ADDRESS gpu_virtual_address = 0; if (binding_type == DXBindingType::DescriptorTable) { @@ -195,26 +194,36 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list, ApplyBehavi const DXDescriptorRange& descriptor_range = resource_binding.GetDescriptorRange(); const uint32_t descriptor_index = p_heap_reservation->GetRange(resource_binding.IsConstant()).GetStart() + descriptor_range.offset; gpu_descriptor_handle = dx_descriptor_heap.GetNativeGPUDescriptorHandle(descriptor_index); + graphics_root_parameter_bindings.push_back({ + binding_type, + resource_binding.GetRootParameterIndex(), + gpu_descriptor_handle, + 0 + }); } else { - const Data::Size resource_offset = resource_binding.GetResourceLocation().offset; - gpu_virtual_address = resource.GetNativeGpuAddress() + resource_offset; + for (const ResourceDX::LocationDX& resource_location_dx : resource_binding.GetResourceLocationsDX()) + { + graphics_root_parameter_bindings.push_back({ + binding_type, + resource_binding.GetRootParameterIndex(), + gpu_descriptor_handle, + resource_location_dx.GetNativeGpuAddress() + }); + } } - graphics_root_parameter_bindings.push_back({ - binding_type, - resource_binding.GetRootParameterIndex(), - gpu_descriptor_handle, - gpu_virtual_address - }); - if (apply_behavior & ApplyBehavior::StateBarriers) { const ResourceBase::State resource_state = resource_binding.GetShaderType() == Shader::Type::Pixel ? ResourceBase::State::PixelShaderResource : ResourceBase::State::NonPixelShaderResource; - resource.SetState(resource_state, resource_transition_barriers); + + for (const ResourceDX::LocationDX& resource_location_dx : resource_binding.GetResourceLocationsDX()) + { + resource_location_dx.sp_resource->SetState(resource_state, resource_transition_barriers); + } } }); @@ -243,18 +252,12 @@ void ProgramDX::ResourceBindingsDX::ForEachResourceBinding(ApplyResourceBindingF for (auto& resource_binding_by_argument : m_resource_binding_by_argument) { assert(!!resource_binding_by_argument.second); - ShaderDX::ResourceBindingDX& resource_binding = static_cast(*resource_binding_by_argument.second); - const Argument& program_argument = resource_binding_by_argument.first; - const ResourceLocationDX& resource_location = resource_binding.GetResourceLocationDX(); - if (!resource_location.sp_resource) - { - throw std::invalid_argument("Empty resource is bound to argument \"" + program_argument.argument_name + - "\" of " + Shader::GetTypeName(program_argument.shader_type) + " shader."); - } + ShaderDX::ResourceBindingDX& resource_binding = static_cast(*resource_binding_by_argument.second); + const Argument& program_argument = resource_binding_by_argument.first; + const ShaderDX::ResourceBindingDX::DescriptorRange& descriptor_range = resource_binding.GetDescriptorRange(); + const DescriptorHeap::Reservation* p_heap_reservation = nullptr; - const ShaderDX::ResourceBindingDX::DescriptorRange& descriptor_range = resource_binding.GetDescriptorRange(); - const DescriptorHeap::Reservation* p_heap_reservation = nullptr; if (descriptor_range.heap_type != DescriptorHeap::Type::Undefined) { const std::optional& descriptor_heap_reservation_opt = m_descriptor_heap_reservations_by_type[static_cast(descriptor_range.heap_type)]; @@ -264,7 +267,7 @@ void ProgramDX::ResourceBindingsDX::ForEachResourceBinding(ApplyResourceBindingF } } - apply_resource_binding(*resource_location.sp_resource, program_argument, resource_binding, p_heap_reservation); + apply_resource_binding(program_argument, resource_binding, p_heap_reservation); } } @@ -274,14 +277,14 @@ void ProgramDX::ResourceBindingsDX::CopyDescriptorsToGpu() assert(!!m_sp_program); const wrl::ComPtr& cp_device = static_cast(*m_sp_program).GetContextDX().GetDeviceDX().GetNativeDevice(); - ForEachResourceBinding([this, &cp_device](const ResourceDX& dx_resource, const Argument&, ShaderDX::ResourceBindingDX& resource_binding, const DescriptorHeap::Reservation* p_heap_reservation) + ForEachResourceBinding([this, &cp_device](const Argument&, ShaderDX::ResourceBindingDX& resource_binding, const DescriptorHeap::Reservation* p_heap_reservation) { - if (!p_heap_reservation) - return; + if (!p_heap_reservation) + return; - const DescriptorHeapDX& dx_descriptor_heap = static_cast(p_heap_reservation->heap.get()); - const ShaderDX::ResourceBindingDX::DescriptorRange& descriptor_range = resource_binding.GetDescriptorRange(); - const DescriptorHeap::Type heap_type = dx_descriptor_heap.GetSettings().type; + const DescriptorHeapDX& dx_descriptor_heap = static_cast(p_heap_reservation->heap.get()); + const ShaderDX::ResourceBindingDX::DescriptorRange& descriptor_range = resource_binding.GetDescriptorRange(); + const DescriptorHeap::Type heap_type = dx_descriptor_heap.GetSettings().type; resource_binding.SetDescriptorHeapReservation(p_heap_reservation); @@ -290,21 +293,26 @@ void ProgramDX::ResourceBindingsDX::CopyDescriptorsToGpu() throw std::invalid_argument("Descriptor range offset is out of bounds of reserved descriptor range."); } - const DescriptorHeap::Types used_heap_types = dx_resource.GetUsedDescriptorHeapTypes(); - if (used_heap_types.find(heap_type) == used_heap_types.end()) + for (const ResourceDX::LocationDX& resource_location_dx : resource_binding.GetResourceLocationsDX()) { - throw std::invalid_argument("Can not create binding for resource used for " + dx_resource.GetUsageNames() + " on descriptor heap of incompatible type \"" + dx_descriptor_heap.GetTypeName() + "\"."); - } + assert(!!resource_location_dx.sp_resource); + const DescriptorHeap::Types used_heap_types = resource_location_dx.sp_resource->GetUsedDescriptorHeapTypes(); + if (used_heap_types.find(heap_type) == used_heap_types.end()) + { + throw std::invalid_argument("Can not create binding for resource used for " + resource_location_dx.sp_resource->GetUsageNames() + + " on descriptor heap of incompatible type \"" + dx_descriptor_heap.GetTypeName() + "\"."); + } - const uint32_t descriptor_index = p_heap_reservation->GetRange(resource_binding.IsConstant()).GetStart() + descriptor_range.offset; + const uint32_t descriptor_index = p_heap_reservation->GetRange(resource_binding.IsConstant()).GetStart() + descriptor_range.offset; - //OutputDebugStringA((dx_resource.GetName() + " range: [" + std::to_string(descriptor_range.offset) + " - " + std::to_string(descriptor_range.offset + descriptor_range.count) + - // "), descriptor: " + std::to_string(descriptor_index) + "\n").c_str()); + //OutputDebugStringA((dx_resource.GetName() + " range: [" + std::to_string(descriptor_range.offset) + " - " + std::to_string(descriptor_range.offset + descriptor_range.count) + + // "), descriptor: " + std::to_string(descriptor_index) + "\n").c_str()); - cp_device->CopyDescriptorsSimple(descriptor_range.count, - dx_descriptor_heap.GetNativeCPUDescriptorHandle(descriptor_index), - dx_resource.GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), - dx_descriptor_heap.GetNativeDescriptorHeapType()); + cp_device->CopyDescriptorsSimple(1, + dx_descriptor_heap.GetNativeCPUDescriptorHandle(descriptor_index), + resource_location_dx.sp_resource->GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), + dx_descriptor_heap.GetNativeDescriptorHeapType()); + } }); } @@ -363,15 +371,15 @@ void ProgramDX::InitRootSignature() ? D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC : D3D12_DESCRIPTOR_RANGE_FLAG_NONE; - descriptor_ranges.emplace_back(range_type, bind_settings.count, bind_settings.point, bind_settings.space, range_flags); + descriptor_ranges.emplace_back(range_type, bind_settings.base.resource_count, bind_settings.point, bind_settings.space, range_flags); root_parameters.back().InitAsDescriptorTable(1, &descriptor_ranges.back(), shader_visibility); const DescriptorHeap::Type heap_type = GetDescriptorHeapTypeByRangeType(range_type); DescriptorOffsets& descriptor_offsets = descriptor_offset_by_heap_type[heap_type]; uint32_t& descriptor_offset = resource_binding.IsConstant() ? descriptor_offsets.constant_offset : descriptor_offsets.mutable_offset; - resource_binding.SetDescriptorRange({ heap_type, descriptor_offset, bind_settings.count }); + resource_binding.SetDescriptorRange({ heap_type, descriptor_offset, bind_settings.base.resource_count }); - descriptor_offset += bind_settings.count; + descriptor_offset += bind_settings.base.resource_count; } break; case ShaderDX::ResourceBindingDX::Type::ConstantBufferView: diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h index d871e31f7..08e3966e9 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h @@ -47,8 +47,8 @@ class ProgramDX final : public ProgramBase class ResourceBindingsDX : public ResourceBindingsBase { public: - ResourceBindingsDX(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument); - ResourceBindingsDX(const ResourceBindingsDX& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument); + ResourceBindingsDX(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument); + ResourceBindingsDX(const ResourceBindingsDX& other_resource_bindings, const ResourceLocationsByArgument& replace_resource_locations_by_argument); void Initialize(); @@ -57,7 +57,7 @@ class ProgramDX final : public ProgramBase void Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior) const override; protected: - using ApplyResourceBindingFunc = std::function; + using ApplyResourceBindingFunc = std::function; void ForEachResourceBinding(ApplyResourceBindingFunc apply_resource_binding) const; void CopyDescriptorsToGpu(); }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.cpp index e9228a977..56ef7e9da 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.cpp @@ -54,6 +54,22 @@ void ResourceDX::ReleasePoolDX::ReleaseResources() m_resources.clear(); } +ResourceDX::LocationDX::LocationDX(const Location& location) + : sp_resource(std::dynamic_pointer_cast(location.sp_resource)) + , offset(location.offset) +{ + ITT_FUNCTION_TASK(); + if (!sp_resource) + throw std::invalid_argument("Can not create location for empty DX resource."); +} + +ResourceDX::LocationDX::LocationDX(const LocationDX& location) + : sp_resource(location.sp_resource) + , offset(location.offset) +{ + ITT_FUNCTION_TASK(); +} + ResourceDX::ResourceDX(Type type, Usage::Mask usage_mask, ContextBase& context, const DescriptorByUsage& descriptor_by_usage) : ResourceBase(type, usage_mask, context, descriptor_by_usage) { diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.h index db23d7bd4..5de1d8310 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.h @@ -27,6 +27,7 @@ DirectX 12 implementation of the resource interface. #include #include +#include "Methane/Data/Types.h" namespace Methane::Graphics { @@ -53,6 +54,19 @@ class ResourceDX : public ResourceBase std::vector> m_resources; }; + struct LocationDX + { + Ptr sp_resource; + Data::Size offset; + + LocationDX(const Location& location); + LocationDX(const LocationDX& location); + + D3D12_GPU_VIRTUAL_ADDRESS GetNativeGpuAddress() const noexcept { return sp_resource->GetNativeGpuAddress() + offset; } + }; + + using LocationsDX = std::vector; + ResourceDX(Type type, Usage::Mask usage_mask, ContextBase& context, const DescriptorByUsage& descriptor_by_usage); ~ResourceDX() override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp index 840de52fd..edd240760 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp @@ -42,7 +42,7 @@ DirectX 12 implementation of the shader interface. namespace Methane::Graphics { -static Resource::Type GetResourceTypeByInputType(D3D_SHADER_INPUT_TYPE input_type) noexcept +static Resource::Type GetResourceTypeByInputType(D3D_SHADER_INPUT_TYPE input_type) { ITT_FUNCTION_TASK(); switch (input_type) @@ -127,7 +127,7 @@ static std::string GetValueTypeName(D3D_NAME value_type) noexcept { case D3D_NAME_UNDEFINED: return "Undefined"; case D3D_NAME_POSITION: return "Position"; - case D3D_NAME_CLIP_DISTANCE: return "Clip Disnance"; + case D3D_NAME_CLIP_DISTANCE: return "Clip Distance"; case D3D_NAME_CULL_DISTANCE: return "Cull Distance"; case D3D_NAME_RENDER_TARGET_ARRAY_INDEX: return "RT Array Index"; case D3D_NAME_VIEWPORT_ARRAY_INDEX: return "Viewport Array Index"; @@ -197,34 +197,60 @@ ShaderDX::ResourceBindingDX::ResourceBindingDX(ContextBase& context, const Setti ITT_FUNCTION_TASK(); } -void ShaderDX::ResourceBindingDX::SetResourceLocations(Resource::Locations resource_locations) +ShaderDX::ResourceBindingDX::ResourceBindingDX(const ResourceBindingDX& other) + : ResourceBindingBase(other) + , m_settings_dx(other.m_settings_dx) + , m_root_parameter_index(other.m_root_parameter_index) + , m_descriptor_range(other.m_descriptor_range) + , m_p_descriptor_heap_reservation(other.m_p_descriptor_heap_reservation) + , m_resource_locations_dx(other.m_resource_locations_dx) { ITT_FUNCTION_TASK(); +} - ShaderBase::ResourceBindingBase::SetResourceLocations(std::move(resource_locations)); +void ShaderDX::ResourceBindingDX::SetResourceLocations(const Resource::Locations& resource_locations) +{ + ITT_FUNCTION_TASK(); - m_resource_location_dx.sp_resource = std::dynamic_pointer_cast(m_resource_location.sp_resource); - m_resource_location_dx.offset = m_resource_location.offset; + ShaderBase::ResourceBindingBase::SetResourceLocations(resource_locations); - if (!m_resource_location_dx.sp_resource || !m_p_descriptor_heap_reservation) - return; + m_resource_locations_dx.clear(); - const ResourceDX& dx_resource = *m_resource_location_dx.sp_resource; - const DescriptorHeapDX& dx_descriptor_heap = static_cast(m_p_descriptor_heap_reservation->heap.get()); - if (m_descriptor_range.heap_type != dx_descriptor_heap.GetSettings().type) + if (m_settings_dx.type == Type::DescriptorTable && + m_resource_locations.size() > m_descriptor_range.count) { - throw std::logic_error("Incompatible heap type \"" + dx_descriptor_heap.GetTypeName() + - "\" is set for resource binding on argument \"" + GetArgumentName() + - "\" of \"" + GetTypeName(m_settings.shader_type)+ "\" shader."); + throw std::invalid_argument("The number of bound resources (" + std::to_string(m_resource_locations.size()) + + ") exceeds reserved descriptors count (" + std::to_string(m_descriptor_range.count) + ")."); } - const uint32_t descriptor_index = m_p_descriptor_heap_reservation->GetRange(IsConstant()).GetStart() + m_descriptor_range.offset; - GetContextDX().GetDeviceDX().GetNativeDevice()->CopyDescriptorsSimple( - m_descriptor_range.count, - dx_descriptor_heap.GetNativeCPUDescriptorHandle(descriptor_index), - dx_resource.GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), - dx_descriptor_heap.GetNativeDescriptorHeapType() - ); + uint32_t resource_index = 0; + m_resource_locations_dx.reserve(m_resource_locations.size()); + for(const Resource::Location& resource_location : m_resource_locations) + { + m_resource_locations_dx.emplace_back(resource_location); + + if (!m_p_descriptor_heap_reservation) + continue; + + const ResourceDX::LocationDX& resource_location_dx = m_resource_locations_dx.back(); + const DescriptorHeapDX& dx_descriptor_heap = static_cast(m_p_descriptor_heap_reservation->heap.get()); + if (m_descriptor_range.heap_type != dx_descriptor_heap.GetSettings().type) + { + throw std::logic_error("Incompatible heap type \"" + dx_descriptor_heap.GetTypeName() + + "\" is set for resource binding on argument \"" + GetArgumentName() + + "\" of \"" + Shader::GetTypeName(m_settings.shader_type) + "\" shader."); + } + + const uint32_t descriptor_index = m_p_descriptor_heap_reservation->GetRange(IsConstant()).GetStart() + m_descriptor_range.offset + resource_index; + GetContextDX().GetDeviceDX().GetNativeDevice()->CopyDescriptorsSimple( + 1, + dx_descriptor_heap.GetNativeCPUDescriptorHandle(descriptor_index), + resource_location_dx.sp_resource->GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), + dx_descriptor_heap.GetNativeDescriptorHeapType() + ); + + resource_index++; + } } void ShaderDX::ResourceBindingDX::SetDescriptorRange(const DescriptorRange& descriptor_range) @@ -238,12 +264,11 @@ void ShaderDX::ResourceBindingDX::SetDescriptorRange(const DescriptorRange& desc "\" is incompatible with the resource binding, expected heap type is \"" + DescriptorHeap::GetTypeName(expected_heap_type) + "\"."); } - if (descriptor_range.count < m_settings_dx.count) + if (descriptor_range.count < m_settings_dx.base.resource_count) { throw std::runtime_error("Descriptor range size (" + std::to_string(descriptor_range.count) + - ") will not fit bound shader resources (" + std::to_string(m_settings_dx.count) + ")."); + ") will not fit bound shader resources (" + std::to_string(m_settings_dx.base.resource_count) + ")."); } - assert(descriptor_range.count <= m_settings_dx.count); m_descriptor_range = descriptor_range; } @@ -349,6 +374,7 @@ ShaderBase::ResourceBindings ShaderDX::GetResourceBindings(const std::set #include "DescriptorHeapDX.h" +#include "ResourceDX.h" #include #include @@ -41,13 +42,6 @@ namespace wrl = Microsoft::WRL; class ContextDX; class ProgramDX; -class ResourceDX; - -struct ResourceLocationDX -{ - std::shared_ptr sp_resource; - Data::Size offset = 0; -}; class ShaderDX final : public ShaderBase { @@ -66,6 +60,7 @@ class ShaderDX final : public ShaderBase { ResourceBindingBase::Settings base; Type type; + D3D_SHADER_INPUT_TYPE input_type; uint32_t point; uint32_t space; }; @@ -78,19 +73,18 @@ class ShaderDX final : public ShaderBase }; ResourceBindingDX(ContextBase& context, const Settings& settings); - ResourceBindingDX(const ResourceBindingDX& other) = default; + ResourceBindingDX(const ResourceBindingDX& other); // ResourceBinding interface - void SetResourceLocation(Resource::Location resource_location) override; - bool IsAddressable() const override { return m_settings_dx.type != Type::DescriptorTable; } + void SetResourceLocations(const Resource::Locations& resource_locations) override; + bool IsAddressable() const override { return m_settings_dx.type != Type::DescriptorTable; } - const Settings& GetSettings() const noexcept { return m_settings_dx; } - uint32_t GetRootParameterIndex() const noexcept { return m_root_parameter_index; } - const DescriptorRange& GetDescriptorRange() const noexcept { return m_descriptor_range; } - DescriptorHeap::Type GetDescriptorHeapType() const; - const ResourceLocationDX& GetResourceLocationDX() const noexcept { return m_resource_location_dx; } + const Settings& GetSettings() const noexcept { return m_settings_dx; } + uint32_t GetRootParameterIndex() const noexcept { return m_root_parameter_index; } + const DescriptorRange& GetDescriptorRange() const noexcept { return m_descriptor_range; } + const ResourceDX::LocationsDX& GetResourceLocationsDX() const noexcept { return m_resource_locations_dx; } - void SetRootParameterIndex(uint32_t root_parameter_index) { m_root_parameter_index = root_parameter_index; } + void SetRootParameterIndex(uint32_t root_parameter_index) { m_root_parameter_index = root_parameter_index; } void SetDescriptorRange(const DescriptorRange& descriptor_range); void SetDescriptorHeapReservation(const DescriptorHeap::Reservation* p_descriptor_heap_reservation) { m_p_descriptor_heap_reservation = p_descriptor_heap_reservation; } @@ -102,7 +96,7 @@ class ShaderDX final : public ShaderBase uint32_t m_root_parameter_index = std::numeric_limits::max();; DescriptorRange m_descriptor_range; const DescriptorHeap::Reservation* m_p_descriptor_heap_reservation = nullptr; - ResourceLocationDX m_resource_location_dx; + ResourceDX::LocationsDX m_resource_locations_dx; }; ShaderDX(Type type, ContextBase& context, const Settings& settings); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.hh index d2a464a30..58cb4506a 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ProgramMT.hh @@ -39,7 +39,7 @@ public: class ResourceBindingsMT : public ResourceBindingsBase { public: - ResourceBindingsMT(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_location_by_argument); + ResourceBindingsMT(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument); ResourceBindingsMT(const ResourceBindingsMT& other_resource_bindings, const ResourceLocationsByArgument& replace_resource_location_by_argument); // ResourceBindings interface diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp index f5bdd68a9..04f381337 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp @@ -215,9 +215,9 @@ void ProgramBase::ResourceBindingsBase::SetResourcesForArguments(const ResourceL const Argument all_shaders_argument(Shader::Type::All, argument.argument_name); const bool all_shaders_argument_found = !!Get(all_shaders_argument); throw std::runtime_error("Program \"" + m_sp_program->GetName() + - "\" does not have argument \"" + argument.argument_name + - "\" of " + Shader::GetTypeName(argument.shader_type) + " shader." + - (all_shaders_argument_found ? " Instead this argument is used in All shaders." : "") ); + "\" does not have argument \"" + argument.argument_name + + "\" of " + Shader::GetTypeName(argument.shader_type) + " shader." + + (all_shaders_argument_found ? " Instead this argument is used in All shaders." : "") ); #else continue; #endif diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h index 0f794f83b..ca099a97a 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h @@ -53,7 +53,7 @@ class ProgramBase public: using Ptr = std::shared_ptr; - ResourceBindingsBase(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_location_by_argument); + ResourceBindingsBase(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument); ResourceBindingsBase(const ResourceBindingsBase& other_resource_bingings, const ResourceLocationsByArgument& replace_resource_location_by_argument); ~ResourceBindingsBase() override; @@ -73,7 +73,7 @@ class ProgramBase using DescriptorHeapReservationByType = std::array, static_cast(DescriptorHeap::Type::Count)>; void ReserveDescriptorHeapRanges(); - void SetResourcesForArguments(const ResourceLocationsByArgument& resource_location_by_argument); + void SetResourcesForArguments(const ResourceLocationsByArgument& resource_locations_by_argument); void VerifyAllArgumentsAreBoundToResources(); const Program::Ptr m_sp_program; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp index a45d1d550..11e27feaa 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.cpp @@ -34,25 +34,25 @@ Vulkan implementation of the program interface. namespace Methane::Graphics { -Program::ResourceBindings::Ptr Program::ResourceBindings::Create(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) +Program::ResourceBindings::Ptr Program::ResourceBindings::Create(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument) { ITT_FUNCTION_TASK(); - return std::make_shared(sp_program, resource_location_by_argument); + return std::make_shared(sp_program, resource_locations_by_argument); } -Program::ResourceBindings::Ptr Program::ResourceBindings::CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationByArgument& replace_resource_location_by_argument) +Program::ResourceBindings::Ptr Program::ResourceBindings::CreateCopy(const ResourceBindings& other_resource_bingings, const ResourceLocationsByArgument& replace_resource_location_by_argument) { ITT_FUNCTION_TASK(); return std::make_shared(static_cast(other_resource_bingings), replace_resource_location_by_argument); } -ProgramVK::ResourceBindingsVK::ResourceBindingsVK(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument) - : ResourceBindingsBase(sp_program, resource_location_by_argument) +ProgramVK::ResourceBindingsVK::ResourceBindingsVK(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument) + : ResourceBindingsBase(sp_program, resource_locations_by_argument) { ITT_FUNCTION_TASK(); } -ProgramVK::ResourceBindingsVK::ResourceBindingsVK(const ResourceBindingsVK& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument) +ProgramVK::ResourceBindingsVK::ResourceBindingsVK(const ResourceBindingsVK& other_resource_bindings, const ResourceLocationsByArgument& replace_resource_location_by_argument) : ResourceBindingsBase(other_resource_bindings, replace_resource_location_by_argument) { ITT_FUNCTION_TASK(); @@ -69,19 +69,7 @@ void ProgramVK::ResourceBindingsVK::Apply(CommandList& command_list, ApplyBehavi { const Argument& program_argument = resource_binding_by_argument.first; const ShaderVK::ResourceBindingVK& vulkan_resource_binding = static_cast(*resource_binding_by_argument.second); - const Resource::Location& bound_resource_location = vulkan_resource_binding.GetResourceLocation(); - if (!bound_resource_location.sp_resource) - { -#ifndef PROGRAM_IGNORE_MISSING_ARGUMENTS - throw std::runtime_error( - "Can not apply resource binding for argument \"" + program_argument.argument_name + - "\" of \"" + Shader::GetTypeName(program_argument.shader_type) + - "\" shader because it is not bound to any resource."); -#else - continue; -#endif - } - + if ((apply_behavior & ApplyBehavior::ConstantOnce || apply_behavior & ApplyBehavior::ChangesOnly) && vulkan_resource_binding.IsAlreadyApplied(*m_sp_program, program_argument, command_state, apply_behavior & ApplyBehavior::ChangesOnly)) continue; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h index 19aca6d57..80f276286 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ProgramVK.h @@ -37,8 +37,8 @@ class ProgramVK : public ProgramBase class ResourceBindingsVK : public ResourceBindingsBase { public: - ResourceBindingsVK(const Program::Ptr& sp_program, const ResourceLocationByArgument& resource_location_by_argument); - ResourceBindingsVK(const ResourceBindingsVK& other_resource_bindings, const ResourceLocationByArgument& replace_resource_location_by_argument); + ResourceBindingsVK(const Program::Ptr& sp_program, const ResourceLocationsByArgument& resource_locations_by_argument); + ResourceBindingsVK(const ResourceBindingsVK& other_resource_bindings, const ResourceLocationsByArgument& replace_resource_location_by_argument); // ResourceBindings interface void Apply(CommandList& command_list, ApplyBehavior::Mask apply_behavior) const override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.cpp index 896602aad..ff4364c03 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.cpp @@ -42,24 +42,11 @@ ShaderVK::ResourceBindingVK::ResourceBindingVK(ContextBase& context, const Setti ITT_FUNCTION_TASK(); } -void ShaderVK::ResourceBindingVK::SetResourceLocation(Resource::Location resource_location) +void ShaderVK::ResourceBindingVK::SetResourceLocations(const Resource::Locations& resource_locations) { ITT_FUNCTION_TASK(); - - if (!resource_location.sp_resource) - { - throw std::invalid_argument("Can not set resource location with Null resource pointer."); - } - - const Resource::Type resource_type = resource_location.sp_resource->GetResourceType(); - ShaderBase::ResourceBindingBase::SetResourceLocation(std::move(resource_location)); -} - -DescriptorHeap::Type ShaderVK::ResourceBindingVK::GetDescriptorHeapType() const -{ - ITT_FUNCTION_TASK(); - return DescriptorHeap::Type::Undefined; + ShaderBase::ResourceBindingBase::SetResourceLocations(resource_locations); } Shader::Ptr Shader::Create(Shader::Type shader_type, Context& context, const Settings& settings) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.h index dbedbf899..194366493 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ShaderVK.h @@ -49,12 +49,9 @@ class ShaderVK : public ShaderBase ResourceBindingVK(const ResourceBindingVK& other) = default; // ResourceBinding interface - void SetResourceLocation(Resource::Location resource_location) override; + void SetResourceLocations(const Resource::Locations& resource_locations) override; uint32_t GetResourceCount() const override { return 1; } - // ResourceBindingBase interface - DescriptorHeap::Type GetDescriptorHeapType() const override; - const Settings& GetSettings() const noexcept { return m_settings; } protected: From 1aadd0f8532beafa0ebfc8004b2e2fe380105a8c Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 28 Dec 2019 23:10:40 +0300 Subject: [PATCH 055/129] Fixed multi-resource binding to program argument in DirectX 12 on Windows. Texture array mode enabled in Asteroids sample. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 2 +- .../Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index dc14ef68a..3c48fa696 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -132,7 +132,7 @@ AsteroidsApp::AsteroidsApp() 4.f, // - disc_radius_ratio GetParamValueByComplexity(g_scale_ratio) / 10.f,// - min_asteroid_scale_ratio GetParamValueByComplexity(g_scale_ratio), // - max_asteroid_scale_ratio - false, // - textures_array_enabled + true, // - textures_array_enabled true // - depth_reversed }) , m_asteroids_complexity(static_cast(GetComplexity())) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp index b65cf274c..1096135ca 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp @@ -293,6 +293,7 @@ void ProgramDX::ResourceBindingsDX::CopyDescriptorsToGpu() throw std::invalid_argument("Descriptor range offset is out of bounds of reserved descriptor range."); } + uint32_t resource_index = 0; for (const ResourceDX::LocationDX& resource_location_dx : resource_binding.GetResourceLocationsDX()) { assert(!!resource_location_dx.sp_resource); @@ -303,7 +304,8 @@ void ProgramDX::ResourceBindingsDX::CopyDescriptorsToGpu() " on descriptor heap of incompatible type \"" + dx_descriptor_heap.GetTypeName() + "\"."); } - const uint32_t descriptor_index = p_heap_reservation->GetRange(resource_binding.IsConstant()).GetStart() + descriptor_range.offset; + const uint32_t descriptor_index = p_heap_reservation->GetRange(resource_binding.IsConstant()).GetStart() + + descriptor_range.offset + resource_index; //OutputDebugStringA((dx_resource.GetName() + " range: [" + std::to_string(descriptor_range.offset) + " - " + std::to_string(descriptor_range.offset + descriptor_range.count) + // "), descriptor: " + std::to_string(descriptor_index) + "\n").c_str()); @@ -312,6 +314,7 @@ void ProgramDX::ResourceBindingsDX::CopyDescriptorsToGpu() dx_descriptor_heap.GetNativeCPUDescriptorHandle(descriptor_index), resource_location_dx.sp_resource->GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), dx_descriptor_heap.GetNativeDescriptorHeapType()); + resource_index++; } }); } From 7a1958b42bdeeec89db171efe4b3826078902651 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 29 Dec 2019 16:05:41 +0300 Subject: [PATCH 056/129] Parallel primitives implemented with PPL library on Windows. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 1 + Apps/Samples/Asteroids/AsteroidsArray.cpp | 8 +- Modules/Data/Primitives/CMakeLists.txt | 1 + .../Primitives/Include/Methane/Data/Math.hpp | 45 ++++++++++++ .../Include/Methane/Data/Parallel.hpp | 73 +++++++++++++------ .../Include/Methane/Graphics/MeshBuffers.hpp | 8 +- .../Sources/Methane/Graphics/ImageLoader.cpp | 5 +- 7 files changed, 108 insertions(+), 33 deletions(-) create mode 100644 Modules/Data/Primitives/Include/Methane/Data/Math.hpp diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 3c48fa696..800649078 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -136,6 +136,7 @@ AsteroidsApp::AsteroidsApp() true // - depth_reversed }) , m_asteroids_complexity(static_cast(GetComplexity())) + , m_is_parallel_rendering_enabled(true) { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 836608c0c..5ae7e7b3e 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -110,8 +110,8 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) std::uniform_real_distribution noise_scale_distribution(0.05f, 0.1f); texture_array_subresources.resize(settings.textures_count); - Data::ParallelFor(texture_array_subresources.begin(), texture_array_subresources.end(), - [&](gfx::Resource::SubResources& sub_resources, Data::Index) + Data::ParallelForEach(texture_array_subresources.begin(), texture_array_subresources.end(), + [&](gfx::Resource::SubResources& sub_resources) { Asteroid::TextureNoiseParameters noise_parameters = { static_cast(rng()), @@ -332,8 +332,8 @@ bool AsteroidsArray::Update(double /*elapsed_seconds*/, double delta_seconds) gfx::Matrix44f scene_view_matrix, scene_proj_matrix; m_settings.view_camera.GetViewProjMatrices(scene_view_matrix, scene_proj_matrix); - Data::ParallelFor(m_sp_content_state->parameters.begin(), m_sp_content_state->parameters.end(), - [&](Asteroid::Parameters& asteroid_parameters, Data::Index) + Data::ParallelForEach(m_sp_content_state->parameters.begin(), m_sp_content_state->parameters.end(), + [&](Asteroid::Parameters& asteroid_parameters) { ITT_FUNCTION_TASK(); diff --git a/Modules/Data/Primitives/CMakeLists.txt b/Modules/Data/Primitives/CMakeLists.txt index 00dc35b9f..32c256a5b 100644 --- a/Modules/Data/Primitives/CMakeLists.txt +++ b/Modules/Data/Primitives/CMakeLists.txt @@ -11,6 +11,7 @@ set(HEADERS ${INCLUDE_DIR}/ResourceProvider.hpp ${INCLUDE_DIR}/AppResourceProviders.h ${INCLUDE_DIR}/AlignedAllocator.hpp + ${INCLUDE_DIR}/Math.hpp ${INCLUDE_DIR}/Parallel.hpp ) diff --git a/Modules/Data/Primitives/Include/Methane/Data/Math.hpp b/Modules/Data/Primitives/Include/Methane/Data/Math.hpp new file mode 100644 index 000000000..d0c395975 --- /dev/null +++ b/Modules/Data/Primitives/Include/Methane/Data/Math.hpp @@ -0,0 +1,45 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Data/Math.hpp +Math primitive functions. + +******************************************************************************/ + +#pragma once + +#include + +namespace Methane::Data +{ + +template +std::enable_if_t::value, T> DivCeil(T numerator, T denominator) +{ + return numerator > 0 ? (1 + ((numerator - 1) / denominator)) : 0; +} + +template +std::enable_if_t::value, T> DivCeil(T numerator, T denominator) +{ + std::div_t res = std::div(static_cast(numerator), static_cast(denominator)); + return res.rem ? (res.quot >= 0 ? (res.quot + 1) : (res.quot - 1)) + : res.quot; +} + +} // namespace Methane::Data \ No newline at end of file diff --git a/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp b/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp index 6cdc9bc72..5d4e4318c 100644 --- a/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp +++ b/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp @@ -16,8 +16,10 @@ limitations under the License. ******************************************************************************* -FILE: Methane/Data/Parallel.hpp -Data parallel processing primitives. +FILE: Methane/Data/Posix/Parallel.hpp +Data parallel processing primitives +- on Windows platform: implemented with Parallel Primitives Library (PPL) +- on Posix platforms: implemented with STL Async and Future. ******************************************************************************/ @@ -25,31 +27,32 @@ Data parallel processing primitives. #include +#ifdef _WIN32 +#define METHANE_USE_PPL +#endif + +#ifdef METHANE_USE_PPL + +#include + +#else + +#include +#include + +#endif + +#include #include #include -#include namespace Methane::Data { -template -std::enable_if_t::value, T> DivCeil(T numerator, T denominator) -{ - return numerator > 0 ? (1 + ((numerator - 1) / denominator)) : 0; -} - -template -std::enable_if_t::value, T> DivCeil(T numerator, T denominator) -{ - std::div_t res = std::div(static_cast(numerator), static_cast(denominator)); - return res.rem ? (res.quot >= 0 ? (res.quot + 1) : (res.quot - 1)) - : res.quot; -} - template struct IteratorFunction { - using type = std::function; + using type = std::function; }; #if 0 // TODO: fix or remove experimental code @@ -69,11 +72,17 @@ struct IteratorFunction: #endif template -void ParallelFor(const Iterator& begin_it, const Iterator& end_it, - typename IteratorFunction::type&& body_function) +void ParallelForEach(const Iterator& begin_it, const Iterator& end_it, + typename IteratorFunction::type&& body_function) { ITT_FUNCTION_TASK(); +#ifdef METHANE_USE_PPL + + concurrency::parallel_for_each(begin_it, end_it, body_function); + +#else + const size_t items_count = std::distance(begin_it, end_it); const size_t hw_theads_count = std::thread::hardware_concurrency(); const size_t chunk_size = Data::DivCeil(items_count, hw_theads_count); @@ -90,7 +99,7 @@ void ParallelFor(const Iterator& begin_it, const Iterator& end_it, { for(size_t index = chunk_begin_index; index < chunk_end_index; ++index) { - body_function(*(begin_it + index), static_cast(index)); + body_function(*(begin_it + index)); } } ) @@ -101,22 +110,36 @@ void ParallelFor(const Iterator& begin_it, const Iterator& end_it, { future.wait(); }; + +#endif } template::value>> -void ParallelFor(IndexType start_index, IndexType count, std::function&& body_function) +void ParallelFor(IndexType begin_index, IndexType end_index, std::function&& body_function) { ITT_FUNCTION_TASK(); + if (end_index < begin_index) + { + throw std::invalid_argument("ParallelFor requires end_index to be greater or equal to begin_index"); + } + +#ifdef METHANE_USE_PPL + + concurrency::parallel_for(begin_index, end_index, body_function); + +#else + + const IndexType count = end_index - begin_index; const IndexType hw_theads_count = static_cast(std::thread::hardware_concurrency()); const IndexType chunk_size = Data::DivCeil(count, hw_theads_count); std::vector> futures; futures.reserve(static_cast(count)); - for (IndexType chunk_begin_index = start_index; chunk_begin_index < count; chunk_begin_index += chunk_size) + for (IndexType chunk_begin_index = begin_index; chunk_begin_index < count; chunk_begin_index += chunk_size) { - const IndexType chunk_end_index = std::min(chunk_begin_index + chunk_size, start_index + count); + const IndexType chunk_end_index = std::min(chunk_begin_index + chunk_size, end_index); futures.emplace_back( std::async(std::launch::async, [chunk_begin_index, chunk_end_index, body_function]() @@ -134,6 +157,8 @@ void ParallelFor(IndexType start_index, IndexType count, std::function #include #include +#include #include #include @@ -162,10 +163,11 @@ class MeshBuffers const RenderCommandList::Ptrs& render_cmd_lists = parallel_cmd_list.GetParallelCommandLists(); const uint32_t instances_count_per_command_list = static_cast(Data::DivCeil(instance_resource_bindings.size(), render_cmd_lists.size())); - Data::ParallelFor(render_cmd_lists.begin(), render_cmd_lists.end(), - [this, &instance_resource_bindings, &instances_count_per_command_list, bindings_apply_behavior](const RenderCommandList::Ptr& sp_render_command_list, Data::Index cl_index) + Data::ParallelFor(0u, render_cmd_lists.size(), + [&](size_t cl_index) { - const uint32_t begin_instance_index = instances_count_per_command_list * cl_index; + const RenderCommandList::Ptr& sp_render_command_list = render_cmd_lists[cl_index]; + const uint32_t begin_instance_index = static_cast(cl_index * instances_count_per_command_list); const uint32_t end_instance_index = std::min(begin_instance_index + instances_count_per_command_list, static_cast(instance_resource_bindings.size())); diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp index c88be1db1..dbe4d8549 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ImageLoader.cpp @@ -169,12 +169,13 @@ Texture::Ptr ImageLoader::LoadImagesToTextureCube(Context& context, const CubeFa std::mutex data_mutex; std::vector> face_images_data; face_images_data.reserve(image_paths.size()); - Data::ParallelFor(image_paths.begin(), image_paths.end(), - [&](const std::string& face_image_path, Data::Index face_index) -> void + Data::ParallelFor(0u, static_cast(image_paths.size()), + [&](Data::Index face_index) -> void { // NOTE: // we create a copy of the loaded image data (via 3-rd argument of LoadImage) // to resolve a problem of STB image loader which requires an image data to be freed before next image is loaded + const std::string& face_image_path = image_paths[face_index]; ImageLoader::ImageData image_data = LoadImage(face_image_path, desired_channels_count, true); std::lock_guard data_lock(data_mutex); From 64dacf25f16b7a8eef8786e7e44a3222bf305af1 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 29 Dec 2019 17:09:52 +0300 Subject: [PATCH 057/129] CPU frame time percent from total frame time calculation in FpsCounter implemented. --- .../App/Include/Methane/Graphics/App.hpp | 11 +++-- .../Sources/Methane/Graphics/ContextBase.cpp | 4 ++ .../Include/Methane/Graphics/FpsCounter.h | 45 ++++++++++++++---- .../Sources/Methane/Graphics/FpsCounter.cpp | 46 +++++++++++++++++-- 4 files changed, 89 insertions(+), 17 deletions(-) diff --git a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp index b972d3f9d..5cab82f19 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp +++ b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp @@ -276,15 +276,16 @@ class App throw std::runtime_error("Context is not initialized before rendering."); } - const Context::Settings& context_settings = m_sp_context->GetSettings(); - const FpsCounter& fps_counter = m_sp_context->GetFpsCounter(); - const uint32_t average_fps = fps_counter.GetFramesPerSecond(); - const double average_frame_time_ms = fps_counter.GetAverageFrameTimeMilSec(); + const Context::Settings& context_settings = m_sp_context->GetSettings(); + const FpsCounter& fps_counter = m_sp_context->GetFpsCounter(); + const uint32_t average_fps = fps_counter.GetFramesPerSecond(); + const FpsCounter::FrameTiming average_frame_timing = fps_counter.GetAverageFrameTiming(); std::stringstream title_ss; title_ss.precision(2); title_ss << m_settings.name << " " - << average_fps << " FPS (" << std::fixed << average_frame_time_ms << " ms)" + << average_fps << " FPS (" << std::fixed << average_frame_timing.GetTotalTimeMSec() + << " ms, " << std::fixed << average_frame_timing.GetCpuTimePercent() << "% cpu)" << ", " << context_settings.frame_size.width << " x " << context_settings.frame_size.height << ", " << std::to_string(context_settings.frame_buffers_count) << " FB" << ", VSync: " << (context_settings.vsync_enabled ? "ON" : "OFF") diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp index 1303d9cce..ff6852d67 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp @@ -105,9 +105,13 @@ void ContextBase::Reset(Device& device) void ContextBase::Present() { + ITT_FUNCTION_TASK(); + #ifdef COMMAND_EXECUTION_LOGGING Platform::PrintToDebugOutput("PRESENT frame " + std::to_string(m_frame_buffer_index) + " in context \"" + GetName() + "\""); #endif + + m_fps_counter.OnFrameReadyToPresent(); } void ContextBase::AddCallback(Callback& callback) diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h index bbd9c1820..31058702e 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h @@ -34,22 +34,51 @@ namespace Methane::Graphics class FpsCounter { public: + class FrameTiming + { + public: + FrameTiming() = default; + FrameTiming(const FrameTiming&) = default; + FrameTiming(double total_time_sec, double present_time_sec); + + double GetTotalTimeSec() const { return m_total_time_sec; } + double GetPresentTimeSec() const { return m_present_time_sec; } + double GetCpuTimeSec() const { return m_total_time_sec - m_present_time_sec; } + + double GetTotalTimeMSec() const { return m_total_time_sec * 1000.0; } + double GetPresentTimeMSec() const { return m_present_time_sec * 1000.0; } + double GetCpuTimeMSec() const { return GetCpuTimeSec() * 1000.0; } + + double GetCpuTimePercent() const { return 100.0 * GetCpuTimeSec() / GetTotalTimeSec(); } + + FrameTiming& operator=(const FrameTiming& other) = default; + FrameTiming& operator+=(const FrameTiming& other); + FrameTiming& operator-=(const FrameTiming& other); + FrameTiming operator/(double divisor) const; + FrameTiming operator*(double multiplier) const; + + private: + double m_total_time_sec = 0.0; + double m_present_time_sec = 0.0; + }; + FpsCounter() = default; FpsCounter(uint32_t averaged_timings_count) : m_averaged_timings_count(averaged_timings_count) {} void Reset(uint32_t averaged_timings_count); + void OnFrameReadyToPresent(); void OnFramePresented(); - inline uint32_t GetAveragedTimingsCount() const noexcept { return static_cast(m_frame_timings.size()); } - inline double GetAverageFrameTimeSec() const noexcept { return m_frame_timings_sum / GetAveragedTimingsCount(); } - inline double GetAverageFrameTimeMilSec() const noexcept { return GetAverageFrameTimeSec() * 1000; } - inline uint32_t GetFramesPerSecond() const noexcept { return static_cast(std::round(1.0 / GetAverageFrameTimeSec())); } + uint32_t GetAveragedTimingsCount() const noexcept { return static_cast(m_frame_timings.size()); } + FrameTiming GetAverageFrameTiming() const noexcept { return m_frame_timings_sum / GetAveragedTimingsCount(); } + const uint32_t GetFramesPerSecond() const noexcept { return static_cast(std::round(1.0 / GetAverageFrameTiming().GetTotalTimeSec())); } private: - Data::Timer m_frame_timer; - uint32_t m_averaged_timings_count = 100; - double m_frame_timings_sum = 0.0; - std::queue m_frame_timings; + Data::Timer m_frame_timer; + Data::Timer m_present_timer; + uint32_t m_averaged_timings_count = 100; + FrameTiming m_frame_timings_sum; + std::queue m_frame_timings; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Helpers/Sources/Methane/Graphics/FpsCounter.cpp b/Modules/Graphics/Helpers/Sources/Methane/Graphics/FpsCounter.cpp index f668ee4f2..b12e1a05a 100644 --- a/Modules/Graphics/Helpers/Sources/Methane/Graphics/FpsCounter.cpp +++ b/Modules/Graphics/Helpers/Sources/Methane/Graphics/FpsCounter.cpp @@ -27,6 +27,37 @@ FPS counter calculates frame time duration with moving average window algorithm. namespace Methane::Graphics { +FpsCounter::FrameTiming::FrameTiming(double total_time_sec, double present_time_sec) + : m_total_time_sec(total_time_sec) + , m_present_time_sec(present_time_sec) +{ + ITT_FUNCTION_TASK(); +} + +FpsCounter::FrameTiming& FpsCounter::FrameTiming::operator+=(const FrameTiming& other) +{ + m_total_time_sec += other.m_total_time_sec; + m_present_time_sec += other.m_present_time_sec; + return *this; +} + +FpsCounter::FrameTiming& FpsCounter::FrameTiming::operator-=(const FrameTiming& other) +{ + m_total_time_sec -= other.m_total_time_sec; + m_present_time_sec -= other.m_present_time_sec; + return *this; +} + +FpsCounter::FrameTiming FpsCounter::FrameTiming::operator/(double divisor) const +{ + return FrameTiming(m_total_time_sec / divisor, m_present_time_sec / divisor); +} + +FpsCounter::FrameTiming FpsCounter::FrameTiming::operator*(double multiplier) const +{ + return FrameTiming(m_total_time_sec * multiplier, m_present_time_sec * multiplier); +} + void FpsCounter::Reset(uint32_t averaged_timings_count) { ITT_FUNCTION_TASK(); @@ -35,8 +66,15 @@ void FpsCounter::Reset(uint32_t averaged_timings_count) { m_frame_timings.pop(); } - m_frame_timings_sum = 0; + m_frame_timings_sum = FrameTiming(); m_frame_timer.Reset(); + m_present_timer.Reset(); +} + +void FpsCounter::OnFrameReadyToPresent() +{ + ITT_FUNCTION_TASK(); + m_present_timer.Reset(); } void FpsCounter::OnFramePresented() @@ -48,9 +86,9 @@ void FpsCounter::OnFramePresented() m_frame_timings.pop(); } - const double frame_seconds = m_frame_timer.GetElapsedSecondsD(); - m_frame_timings_sum += frame_seconds; - m_frame_timings.push(frame_seconds); + const FrameTiming frame_timing(m_frame_timer.GetElapsedSecondsD(), m_present_timer.GetElapsedSecondsD()); + m_frame_timings_sum += frame_timing; + m_frame_timings.push(frame_timing); m_frame_timer.Reset(); } From e82537f6b489a0224db30b55c845fd7faafd6dee Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 29 Dec 2019 17:34:40 +0300 Subject: [PATCH 058/129] Asteroids optimization: scene_uniforms argument is made constant --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 5ae7e7b3e..cbd125a32 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -220,7 +220,7 @@ AsteroidsArray::AsteroidsArray(gfx::Context& context, Settings settings, Content const size_t textures_array_size = m_settings.textures_array_enabled ? m_settings.textures_count : 1; const gfx::Shader::MacroDefinitions macro_definitions = { { "TEXTURES_COUNT", std::to_string(textures_array_size) } }; const std::set addressable_argument_names = { "g_mesh_uniforms" }; - std::set constant_argument_names = { "g_constants", "g_texture_sampler" }; + std::set constant_argument_names = { "g_constants", "g_texture_sampler", "g_scene_uniforms" }; if (m_settings.textures_array_enabled) constant_argument_names.insert("g_face_textures"); From b771bc859d377e2b22e8e566e8c3a01884331ca2 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 29 Dec 2019 18:16:07 +0300 Subject: [PATCH 059/129] Fixed regression with crash on graphics device switch to another adapter. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 5 +++-- Modules/Graphics/Core/Include/Methane/Graphics/Context.h | 1 + .../Core/Sources/Methane/Graphics/ContextBase.cpp | 9 +++++++-- .../Graphics/Core/Sources/Methane/Graphics/ContextBase.h | 1 + 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 800649078..304b41b16 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -379,7 +379,8 @@ void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) ITT_FUNCTION_TASK(); if (m_asteroids_complexity == asteroids_complexity) return; - + + m_sp_context->WaitForGpu(gfx::Context::WaitFor::RenderComplete); m_asteroids_complexity = asteroids_complexity; m_asteroids_array_settings.instance_count = GetParamValue(g_instaces_count, m_asteroids_complexity); @@ -392,7 +393,7 @@ void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) m_sp_asteroids_array_state.reset(); assert(!!m_sp_context); - m_sp_context->Reset(m_sp_context->GetDevice()); + m_sp_context->Reset(); } void AsteroidsApp::SetParallelRnderingEnabled(bool is_parallel_rendering_enabled) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Context.h b/Modules/Graphics/Core/Include/Methane/Graphics/Context.h index 6d7ae5d78..d292a5eff 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Context.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Context.h @@ -84,6 +84,7 @@ struct Context : virtual Object virtual void WaitForGpu(WaitFor wait_for) = 0; virtual void Resize(const FrameSize& frame_size) = 0; virtual void Reset(Device& device) = 0; + virtual void Reset() = 0; virtual void Present() = 0; virtual void AddCallback(Callback& callback) = 0; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp index ff6852d67..c3e297791 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp @@ -95,12 +95,12 @@ void ContextBase::Reset(Device& device) ITT_FUNCTION_TASK(); #ifdef COMMAND_EXECUTION_LOGGING - Platform::PrintToDebugOutput("RESET context \"" + GetName() + "\""); + Platform::PrintToDebugOutput("RESET context \"" + GetName() + "\" with device adapter \"" + device.GetAdapterName() + "\"."); #endif WaitForGpu(WaitFor::RenderComplete); Release(); - Initialize(device, true); + Initialize(device, false); } void ContextBase::Present() @@ -147,6 +147,11 @@ void ContextBase::OnPresentComplete() void ContextBase::ResetWithSettings(const Settings& settings) { ITT_FUNCTION_TASK(); + +#ifdef COMMAND_EXECUTION_LOGGING + Platform::PrintToDebugOutput("RESET context \"" + GetName() + "\" with new settings."); +#endif + WaitForGpu(WaitFor::RenderComplete); DeviceBase::Ptr sp_device = m_sp_device; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.h index 8432bc765..6e71dea61 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.h @@ -54,6 +54,7 @@ class ContextBase void WaitForGpu(WaitFor wait_for) override; void Resize(const FrameSize& frame_size) override; void Reset(Device& device) override; + void Reset() override { ResetWithSettings(m_settings); } void Present() override; void AddCallback(Callback& callback) override; void RemoveCallback(Callback& callback) override; From aac23210bcb5022cfae670c6242131527c89468c Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 29 Dec 2019 20:49:32 +0300 Subject: [PATCH 060/129] Fixed memory issue in Asteroids sample. --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index cbd125a32..df79281ce 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -351,7 +351,7 @@ bool AsteroidsArray::Update(double /*elapsed_seconds*/, double delta_seconds) SetFinalPassUniforms( AsteroidUniforms { - std::move(model_matrix), + model_matrix, model_matrix * scene_view_matrix * scene_proj_matrix, asteroid_parameters.colors.deep, asteroid_parameters.colors.shallow, From 23f6bd2298a10f5161514162a90732d1f9638be2 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 29 Dec 2019 20:49:59 +0300 Subject: [PATCH 061/129] Added HLSL shader optimization compiler flags on Windows. --- CMake/MethaneShaders.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMake/MethaneShaders.cmake b/CMake/MethaneShaders.cmake index 1153aeda6..730ab7b5e 100644 --- a/CMake/MethaneShaders.cmake +++ b/CMake/MethaneShaders.cmake @@ -191,6 +191,8 @@ function(compile_hlsl_shaders FOR_TARGET SHADERS_HLSL PROFILE_VER OUT_COMPILED_S if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(EXTRA_COMPILE_FLAGS /Od) + else() + set(EXTRA_COMPILE_FLAGS /O3 /Gfa /all_resources_bound) endif() if(METHANE_SHADERS_CODEVIEW_ENABLED OR CMAKE_BUILD_TYPE STREQUAL "Debug") From 52fa2f383ce45671927c70f8f9fb216dc3a338fc Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 30 Dec 2019 18:05:49 +0300 Subject: [PATCH 062/129] Parallel initialization complete of resource bindings with copying descriptors to GPU in DirectX. --- .../Methane/Graphics/ResourceManager.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ResourceManager.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ResourceManager.cpp index b3845bd00..9f2e3a924 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ResourceManager.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ResourceManager.cpp @@ -25,6 +25,7 @@ and deferred releasing of GPU resource. #include "ResourceManager.h" #include +#include #include @@ -79,14 +80,16 @@ void ResourceManager::CompleteInitialization() } } - for (const Program::ResourceBindings::WeakPtr& wp_resource_bindings : m_deferred_resource_bindings) - { - Program::ResourceBindings::Ptr sp_resource_bindings = wp_resource_bindings.lock(); - if (!sp_resource_bindings) - continue; + Data::ParallelForEach( + m_deferred_resource_bindings.begin(), m_deferred_resource_bindings.end(), + [](const Program::ResourceBindings::WeakPtr& wp_resource_bindings) + { + Program::ResourceBindings::Ptr sp_resource_bindings = wp_resource_bindings.lock(); + if (!sp_resource_bindings) + return; - static_cast(*sp_resource_bindings).CompleteInitialization(); - } + static_cast(*sp_resource_bindings).CompleteInitialization(); + }); m_deferred_resource_bindings.clear(); } From eec86b58ad18f4dc2436373bcdf6511e1e47b7e0 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 30 Dec 2019 23:47:26 +0300 Subject: [PATCH 063/129] Fixed CPU frame time percent counter on MacOS. --- .../Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm index 810887cc0..3083dab7e 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm @@ -134,6 +134,7 @@ void ContextMT::Present() { ITT_FUNCTION_TASK(); + ContextBase::Present(); OnPresentComplete(); } From 7f3376e5395b5075da2432c319af34ffc3fd378b Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 1 Jan 2020 22:15:28 +0300 Subject: [PATCH 064/129] Fixed Metal frame capture with XCode on MacOS. --- .../Sources/Methane/Graphics/Metal/ContextMT.hh | 3 +++ .../Sources/Methane/Graphics/Metal/ContextMT.mm | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh index 835db3607..875b1443e 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh @@ -37,6 +37,7 @@ namespace Methane::Graphics struct CommandQueue; class RenderPassMT; class DeviceMT; +class CommandQueueMT; class ContextMT : public ContextBase { @@ -73,6 +74,7 @@ public: id GetNativeDrawable() { return m_app_view.currentDrawable; } DeviceMT& GetDeviceMT(); + CommandQueueMT& GetRenderCommandQueueMT(); const LibraryMT::Ptr& GetLibraryMT(const std::string& library_name = ""); protected: @@ -85,6 +87,7 @@ protected: AppViewMT* m_app_view; dispatch_semaphore_t m_dispatch_semaphore; LibraryByName m_library_by_name; + id m_frame_capture_scope; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm index 3083dab7e..e8c053fd8 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm @@ -51,8 +51,12 @@ vsyncEnabled: Methane::MacOS::ConvertToNSType(m_settings.vsync_enabled) unsyncRefreshInterval: 1.0 / m_settings.unsync_max_fps]) , m_dispatch_semaphore(dispatch_semaphore_create(m_settings.frame_buffers_count)) + , m_frame_capture_scope([[MTLCaptureManager sharedCaptureManager] newCaptureScopeWithDevice:GetDeviceMT().GetNativeDevice()]) { ITT_FUNCTION_TASK(); + + m_frame_capture_scope.label = Methane::MacOS::ConvertToNSType(device.GetName() + " Capture Scope"); + [MTLCaptureManager sharedCaptureManager].defaultCaptureScope = m_frame_capture_scope; // bind metal context with application delegate m_app_view.delegate = env.ns_app_delegate; @@ -122,6 +126,7 @@ if (switch_to_next_frame) { m_frame_buffer_index = (m_frame_buffer_index + 1) % m_settings.frame_buffers_count; + [m_frame_capture_scope beginScope]; } } @@ -135,6 +140,9 @@ { ITT_FUNCTION_TASK(); ContextBase::Present(); + + [m_frame_capture_scope endScope]; + OnPresentComplete(); } @@ -166,6 +174,12 @@ ITT_FUNCTION_TASK(); return static_cast(GetDevice()); } + +CommandQueueMT& ContextMT::GetRenderCommandQueueMT() +{ + ITT_FUNCTION_TASK(); + return static_cast(ContextBase::GetRenderCommandQueue()); +} const ContextMT::LibraryMT::Ptr& ContextMT::GetLibraryMT(const std::string& library_name) { From c30aff66e927f57dd56901cc852855fc2d4c82b0 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 2 Jan 2020 16:48:48 +0300 Subject: [PATCH 065/129] Fixed parallel initialization of resource binding copies with resource replacement. Redesigned Resource::Location class. --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 6 ++---- .../Core/Include/Methane/Graphics/Resource.h | 20 ++++++++++--------- .../Methane/Graphics/DirectX12/ProgramDX.cpp | 9 ++++----- .../Methane/Graphics/DirectX12/ResourceDX.cpp | 17 ++++++++++------ .../Methane/Graphics/DirectX12/ResourceDX.h | 18 +++++++++-------- .../Methane/Graphics/DirectX12/ShaderDX.cpp | 2 +- .../Sources/Methane/Graphics/ProgramBase.cpp | 16 +++++++-------- .../Sources/Methane/Graphics/ResourceBase.cpp | 12 +++++++++-- .../Sources/Methane/Graphics/ShaderBase.cpp | 13 ++++++------ 9 files changed, 63 insertions(+), 50 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index df79281ce..0f202cd9d 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -296,9 +296,7 @@ gfx::MeshBufferBindings::ResourceBindingsArray AsteroidsArray::CreateResourceBin { { gfx::Shader::Type::Pixel, "g_texture_sampler"}, { { m_sp_texture_sampler } } }, }); - // TODO: parallel initialization of resource binding is disabled due to unresolved race issues - // Data::ParallelFor(1u, m_settings.instance_count - 1, [&](uint32_t asteroid_index) - for(uint32_t asteroid_index = 1u; asteroid_index < m_settings.instance_count; ++asteroid_index) + Data::ParallelFor(1u, m_settings.instance_count, [&](uint32_t asteroid_index) { const Data::Size asteroid_uniform_offset = GetUniformsBufferOffset(asteroid_index); gfx::Program::ResourceBindings::ResourceLocationsByArgument set_resoure_location_by_argument = { @@ -311,7 +309,7 @@ gfx::MeshBufferBindings::ResourceBindingsArray AsteroidsArray::CreateResourceBin ); } resource_bindings_array[asteroid_index] = gfx::Program::ResourceBindings::CreateCopy(*resource_bindings_array[0], set_resoure_location_by_argument); - } //); + }); return resource_bindings_array; } diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h index b5ef4d3a2..ba56192f8 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h @@ -90,18 +90,20 @@ struct Resource : virtual Object using DescriptorByUsage = std::map; - struct Location + class Location { - Ptr sp_resource; - Data::Size offset; - - Location(Ptr in_sp_resource, Data::Size in_offset = 0u) : sp_resource(std::move(in_sp_resource)), offset(in_offset) - { - if (!sp_resource) - throw std::invalid_argument("Can not create Resource::Location for an empty resource."); - } + public: + Location(Ptr sp_resource, Data::Size offset = 0u); bool operator==(const Location& other) const; + + const Ptr& GetResourcePtr() const { return m_sp_resource; } + Resource& GetResource() const { return *m_sp_resource; } + Data::Size GetOffset() const { return m_offset; } + + private: + Ptr m_sp_resource; + Data::Size m_offset; }; using Locations = std::vector; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp index 1096135ca..12e471ff6 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp @@ -222,7 +222,7 @@ void ProgramDX::ResourceBindingsDX::Apply(CommandList& command_list, ApplyBehavi for (const ResourceDX::LocationDX& resource_location_dx : resource_binding.GetResourceLocationsDX()) { - resource_location_dx.sp_resource->SetState(resource_state, resource_transition_barriers); + resource_location_dx.GetResourceDX().SetState(resource_state, resource_transition_barriers); } } }); @@ -296,11 +296,10 @@ void ProgramDX::ResourceBindingsDX::CopyDescriptorsToGpu() uint32_t resource_index = 0; for (const ResourceDX::LocationDX& resource_location_dx : resource_binding.GetResourceLocationsDX()) { - assert(!!resource_location_dx.sp_resource); - const DescriptorHeap::Types used_heap_types = resource_location_dx.sp_resource->GetUsedDescriptorHeapTypes(); + const DescriptorHeap::Types used_heap_types = resource_location_dx.GetResourceDX().GetUsedDescriptorHeapTypes(); if (used_heap_types.find(heap_type) == used_heap_types.end()) { - throw std::invalid_argument("Can not create binding for resource used for " + resource_location_dx.sp_resource->GetUsageNames() + + throw std::invalid_argument("Can not create binding for resource used for " + resource_location_dx.GetResourceDX().GetUsageNames() + " on descriptor heap of incompatible type \"" + dx_descriptor_heap.GetTypeName() + "\"."); } @@ -312,7 +311,7 @@ void ProgramDX::ResourceBindingsDX::CopyDescriptorsToGpu() cp_device->CopyDescriptorsSimple(1, dx_descriptor_heap.GetNativeCPUDescriptorHandle(descriptor_index), - resource_location_dx.sp_resource->GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), + resource_location_dx.GetResourceDX().GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), dx_descriptor_heap.GetNativeDescriptorHeapType()); resource_index++; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.cpp index 56ef7e9da..ee94aafd9 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.cpp @@ -55,21 +55,26 @@ void ResourceDX::ReleasePoolDX::ReleaseResources() } ResourceDX::LocationDX::LocationDX(const Location& location) - : sp_resource(std::dynamic_pointer_cast(location.sp_resource)) - , offset(location.offset) + : Location(location) + , m_resource_dx(dynamic_cast(GetResource())) { ITT_FUNCTION_TASK(); - if (!sp_resource) - throw std::invalid_argument("Can not create location for empty DX resource."); } ResourceDX::LocationDX::LocationDX(const LocationDX& location) - : sp_resource(location.sp_resource) - , offset(location.offset) + : Location(location) + , m_resource_dx(dynamic_cast(GetResource())) { ITT_FUNCTION_TASK(); } +ResourceDX::LocationDX& ResourceDX::LocationDX::operator=(const LocationDX& other) +{ + Location::operator=(other); + m_resource_dx = dynamic_cast(GetResource()); + return *this; +} + ResourceDX::ResourceDX(Type type, Usage::Mask usage_mask, ContextBase& context, const DescriptorByUsage& descriptor_by_usage) : ResourceBase(type, usage_mask, context, descriptor_by_usage) { diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.h index 5de1d8310..76406589f 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ResourceDX.h @@ -40,8 +40,6 @@ class DescriptorHeapDX; class ResourceDX : public ResourceBase { public: - using Ptr = std::shared_ptr; - class ReleasePoolDX : public ResourceBase::ReleasePool { public: @@ -54,15 +52,19 @@ class ResourceDX : public ResourceBase std::vector> m_resources; }; - struct LocationDX + class LocationDX : public Location { - Ptr sp_resource; - Data::Size offset; + public: + explicit LocationDX(const Location& location); + explicit LocationDX(const LocationDX& location); - LocationDX(const Location& location); - LocationDX(const LocationDX& location); + LocationDX& operator=(const LocationDX& other); - D3D12_GPU_VIRTUAL_ADDRESS GetNativeGpuAddress() const noexcept { return sp_resource->GetNativeGpuAddress() + offset; } + ResourceDX& GetResourceDX() const noexcept { return m_resource_dx.get(); } + D3D12_GPU_VIRTUAL_ADDRESS GetNativeGpuAddress() const noexcept { return GetResourceDX().GetNativeGpuAddress() + GetOffset(); } + + private: + std::reference_wrapper m_resource_dx; }; using LocationsDX = std::vector; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp index edd240760..ecc3af3f9 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ShaderDX.cpp @@ -245,7 +245,7 @@ void ShaderDX::ResourceBindingDX::SetResourceLocations(const Resource::Locations GetContextDX().GetDeviceDX().GetNativeDevice()->CopyDescriptorsSimple( 1, dx_descriptor_heap.GetNativeCPUDescriptorHandle(descriptor_index), - resource_location_dx.sp_resource->GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), + resource_location_dx.GetResourceDX().GetNativeCPUDescriptorHandle(ResourceBase::Usage::ShaderRead), dx_descriptor_heap.GetNativeDescriptorHeapType() ); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp index 04f381337..03449a21f 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp @@ -72,22 +72,22 @@ ProgramBase::ResourceBindingsBase::ResourceBindingsBase(const ResourceBindingsBa { ITT_FUNCTION_TASK(); - // Form map of original resource bindings - ResourceLocationsByArgument resource_locations_by_argument; + // Form map of volatile resource bindings with replaced resource locations + ResourceLocationsByArgument resource_locations_by_argument = replace_resource_locations_by_argument; for (const auto& argument_and_resource_binding : other_resource_bingings.m_resource_binding_by_argument) { + // NOTE: constant resource bindings are reusing single binding-object for the whole program, + // so there's no need in setting its value, since it was already set by the original resource binding + if (argument_and_resource_binding.second->IsConstant() || + resource_locations_by_argument.count(argument_and_resource_binding.first)) + continue; + resource_locations_by_argument.emplace( argument_and_resource_binding.first, argument_and_resource_binding.second->GetResourceLocations() ); } - // Substitute resources in original bindings list - for (const auto& argument_and_resource_location : replace_resource_locations_by_argument) - { - resource_locations_by_argument[argument_and_resource_location.first] = argument_and_resource_location.second; - } - ReserveDescriptorHeapRanges(); SetResourcesForArguments(resource_locations_by_argument); VerifyAllArgumentsAreBoundToResources(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ResourceBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ResourceBase.cpp index 85eeca505..41865ce24 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ResourceBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ResourceBase.cpp @@ -35,6 +35,14 @@ Base implementation of the resource interface. namespace Methane::Graphics { +Resource::Location::Location(Ptr sp_resource, Data::Size offset) + : m_sp_resource(std::move(sp_resource)) + , m_offset(offset) +{ + if (!m_sp_resource) + throw std::invalid_argument("Can not create Resource Location for an empty resource."); +} + std::string Resource::GetTypeName(Type type) noexcept { ITT_FUNCTION_TASK(); @@ -95,8 +103,8 @@ Resource::Descriptor::Descriptor(DescriptorHeap& in_heap, int32_t in_index) bool Resource::Location::operator==(const Location& other) const { - return std::tie(sp_resource, offset) == - std::tie(other.sp_resource, other.offset); + return std::tie(m_sp_resource, m_offset) == + std::tie(other.m_sp_resource, other.m_offset); } Resource::SubResource::SubResource(Data::Bytes&& data, Index in_index) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp index 9d2066e7d..152feae8a 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ShaderBase.cpp @@ -54,6 +54,8 @@ ShaderBase::ResourceBindingBase::ResourceBindingBase(ContextBase& context, const void ShaderBase::ResourceBindingBase::SetResourceLocations(const Resource::Locations& resource_locations) { ITT_FUNCTION_TASK(); + + m_resource_locations.clear(); if (resource_locations.empty()) throw std::invalid_argument("Can not set empty resources for resource binding."); @@ -61,21 +63,18 @@ void ShaderBase::ResourceBindingBase::SetResourceLocations(const Resource::Locat for (const Resource::Location& resource_location : resource_locations) { - if (!resource_location.sp_resource) - throw std::invalid_argument("Can not use empty resource for resource binding."); - - if (resource_location.sp_resource->GetResourceType() != m_settings.resource_type) + if (resource_location.GetResource().GetResourceType() != m_settings.resource_type) { - throw std::invalid_argument("Incompatible resource type \"" + Resource::GetTypeName(resource_location.sp_resource->GetResourceType()) + + throw std::invalid_argument("Incompatible resource type \"" + Resource::GetTypeName(resource_location.GetResource().GetResourceType()) + "\" is bound to argument \"" + GetArgumentName() + "\" of type \"" + Resource::GetTypeName(m_settings.resource_type) + "\"."); } - const Resource::Usage::Mask resource_usage_mask = resource_location.sp_resource->GetUsageMask(); + const Resource::Usage::Mask resource_usage_mask = resource_location.GetResource().GetUsageMask(); if (static_cast(resource_usage_mask & Resource::Usage::Addressable) != is_addressable_binding) throw std::invalid_argument("Resource addressable usage flag does not match with resource binding state."); - if (!is_addressable_binding && resource_location.offset > 0) + if (!is_addressable_binding && resource_location.GetOffset() > 0) throw std::invalid_argument("Can not set resource location with non-zero offset to non-addressable resource binding."); } From dbc6f202ddbe72b21e3eee251b6dbd54f9d4190a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 2 Jan 2020 16:55:13 +0300 Subject: [PATCH 066/129] Fixed MacOS build. --- .../Core/Sources/Methane/Graphics/Metal/ShaderMT.mm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm index 5a4cbf850..3c9942681 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm @@ -119,14 +119,14 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept m_mtl_sampler_states.reserve(m_resource_locations.size()); std::transform(m_resource_locations.begin(), m_resource_locations.end(), std::back_inserter(m_mtl_sampler_states), [](const Resource::Location& resource_location) - { return dynamic_cast(*resource_location.sp_resource).GetNativeSamplerState(); }); + { return dynamic_cast(resource_location.GetResource()).GetNativeSamplerState(); }); break; case Resource::Type::Texture: m_mtl_textures.reserve(m_resource_locations.size()); std::transform(m_resource_locations.begin(), m_resource_locations.end(), std::back_inserter(m_mtl_textures), [](const Resource::Location& resource_location) - { return dynamic_cast(*resource_location.sp_resource).GetNativeTexture(); }); + { return dynamic_cast(resource_location.GetResource()).GetNativeTexture(); }); break; case Resource::Type::Buffer: @@ -134,9 +134,8 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept m_mtl_buffer_offsets.reserve(m_resource_locations.size()); for (const Resource::Location& resource_location : m_resource_locations) { - assert(!!resource_location.sp_resource); - m_mtl_buffers.push_back(dynamic_cast(*resource_location.sp_resource).GetNativeBuffer()); - m_mtl_buffer_offsets.push_back(static_cast(resource_location.offset)); + m_mtl_buffers.push_back(dynamic_cast(resource_location.GetResource()).GetNativeBuffer()); + m_mtl_buffer_offsets.push_back(static_cast(resource_location.GetOffset())); } break; } From 32a9909d9f6c739d285708f09b6890575d99c752 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 2 Jan 2020 20:04:40 +0300 Subject: [PATCH 067/129] Moved Timer from Animation to Instrumentation module. --- Modules/Data/Animation/CMakeLists.txt | 1 - .../Animation/Include/Methane/Data/Animation.h | 2 +- Modules/Data/Instrumentation/CMakeLists.txt | 1 + .../Include/Methane/Data/Timer.hpp} | 14 +++++++------- .../Graphics/App/Include/Methane/Graphics/App.hpp | 2 +- .../Helpers/Include/Methane/Graphics/FpsCounter.h | 2 +- .../Helpers/Include/Methane/Graphics/Helpers.h | 4 +--- 7 files changed, 12 insertions(+), 14 deletions(-) rename Modules/Data/{Animation/Include/Methane/Data/Timer.h => Instrumentation/Include/Methane/Data/Timer.hpp} (97%) diff --git a/Modules/Data/Animation/CMakeLists.txt b/Modules/Data/Animation/CMakeLists.txt index a12d735ff..d10e8eccf 100644 --- a/Modules/Data/Animation/CMakeLists.txt +++ b/Modules/Data/Animation/CMakeLists.txt @@ -5,7 +5,6 @@ include(MethaneModules) get_module_dirs("Methane/Data") set(HEADERS - ${INCLUDE_DIR}/Timer.h ${INCLUDE_DIR}/Animation.h ${INCLUDE_DIR}/AnimationsPool.h ${INCLUDE_DIR}/TimeAnimation.h diff --git a/Modules/Data/Animation/Include/Methane/Data/Animation.h b/Modules/Data/Animation/Include/Methane/Data/Animation.h index 6369d127a..d1ad4c737 100644 --- a/Modules/Data/Animation/Include/Methane/Data/Animation.h +++ b/Modules/Data/Animation/Include/Methane/Data/Animation.h @@ -23,7 +23,7 @@ Abstract animation class #pragma once -#include "Timer.h" +#include #include diff --git a/Modules/Data/Instrumentation/CMakeLists.txt b/Modules/Data/Instrumentation/CMakeLists.txt index b86d7e154..218f72e88 100644 --- a/Modules/Data/Instrumentation/CMakeLists.txt +++ b/Modules/Data/Instrumentation/CMakeLists.txt @@ -6,6 +6,7 @@ get_module_dirs("Methane/Data") set(HEADERS ${INCLUDE_DIR}/Instrumentation.h + ${INCLUDE_DIR}/Timer.hpp ) set(SOURCES diff --git a/Modules/Data/Animation/Include/Methane/Data/Timer.h b/Modules/Data/Instrumentation/Include/Methane/Data/Timer.hpp similarity index 97% rename from Modules/Data/Animation/Include/Methane/Data/Timer.h rename to Modules/Data/Instrumentation/Include/Methane/Data/Timer.hpp index d7d10dfbc..10e0e8142 100644 --- a/Modules/Data/Animation/Include/Methane/Data/Timer.h +++ b/Modules/Data/Instrumentation/Include/Methane/Data/Timer.hpp @@ -23,7 +23,7 @@ Basic animation timer for measuring elapsed time since start. #pragma once -#include +#include "Instrumentation.h" #include @@ -38,12 +38,6 @@ class Timer Timer() : m_start_time(Clock::now()) { ITT_FUNCTION_TASK(); } - void Reset() noexcept - { - ITT_FUNCTION_TASK(); - m_start_time = Clock::now(); - } - TimePoint GetStartTime() const noexcept { return m_start_time; } uint32_t GetElapsedSecondsU() const noexcept { return GetElapsedSeconds(); } double GetElapsedSecondsD() const noexcept { return GetElapsedSeconds(); } @@ -56,6 +50,12 @@ class Timer return std::chrono::duration_cast>(Clock::now() - m_start_time).count(); } + void Reset() noexcept + { + ITT_FUNCTION_TASK(); + m_start_time = Clock::now(); + } + private: TimePoint m_start_time; }; diff --git a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp index 5cab82f19..7ac2d125c 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp +++ b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp @@ -27,7 +27,7 @@ Base frame class provides frame buffer management with resize handling. #include "AppContextController.h" #include -#include +#include #include #include #include diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h index 31058702e..ceb44e8c6 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h @@ -23,7 +23,7 @@ FPS counter calculates frame time duration with moving average window algorithm. #pragma once -#include +#include #include #include diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h index bfafdeb3c..6a3a546c3 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Helpers.h @@ -33,7 +33,7 @@ Methane graphics helpers: all headers under one umbrella. #elif defined __linux__ -#include "Linux/MathTypes.h" +#include "Linux/Helpers.h" #endif @@ -44,5 +44,3 @@ Methane graphics helpers: all headers under one umbrella. #include "Mesh.h" #include "Noise.hpp" #include "FpsCounter.h" - -#include From c10f9e56c53c153a383c10eeab24ac686ecdc569 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Fri, 3 Jan 2020 20:50:25 +0300 Subject: [PATCH 068/129] Scope Timer implemented for low-overhead profliing. --- Modules/Data/Instrumentation/CMakeLists.txt | 3 + .../Include/Methane/Data/ILogger.h | 41 +++++++ .../Include/Methane/Data/ScopeTimer.h | 94 ++++++++++++++++ .../Include/Methane/Data/Timer.hpp | 18 +-- .../Sources/Methane/Data/Instrumentation.cpp | 11 -- .../Sources/Methane/Data/ScopeTimer.cpp | 103 ++++++++++++++++++ Modules/Platform/Utils/CMakeLists.txt | 1 + .../Utils/Include/Methane/Platform/Logger.h | 42 +++++++ 8 files changed, 294 insertions(+), 19 deletions(-) create mode 100644 Modules/Data/Instrumentation/Include/Methane/Data/ILogger.h create mode 100644 Modules/Data/Instrumentation/Include/Methane/Data/ScopeTimer.h create mode 100644 Modules/Data/Instrumentation/Sources/Methane/Data/ScopeTimer.cpp create mode 100644 Modules/Platform/Utils/Include/Methane/Platform/Logger.h diff --git a/Modules/Data/Instrumentation/CMakeLists.txt b/Modules/Data/Instrumentation/CMakeLists.txt index 218f72e88..f0b1d67c5 100644 --- a/Modules/Data/Instrumentation/CMakeLists.txt +++ b/Modules/Data/Instrumentation/CMakeLists.txt @@ -7,10 +7,13 @@ get_module_dirs("Methane/Data") set(HEADERS ${INCLUDE_DIR}/Instrumentation.h ${INCLUDE_DIR}/Timer.hpp + ${INCLUDE_DIR}/ScopeTimer.h + ${INCLUDE_DIR}/ILogger.h ) set(SOURCES ${SOURCES_DIR}/Instrumentation.cpp + ${SOURCES_DIR}/ScopeTimer.cpp ) add_library(${TARGET} STATIC diff --git a/Modules/Data/Instrumentation/Include/Methane/Data/ILogger.h b/Modules/Data/Instrumentation/Include/Methane/Data/ILogger.h new file mode 100644 index 000000000..e0e70ea95 --- /dev/null +++ b/Modules/Data/Instrumentation/Include/Methane/Data/ILogger.h @@ -0,0 +1,41 @@ +/****************************************************************************** + +Copyright 2020 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Data/ILogger.h +Abstract logger interface. + +******************************************************************************/ + +#pragma once + +#include +#include + +namespace Methane::Data +{ + +struct ILogger +{ + using Ptr = std::shared_ptr; + + virtual void Log(const std::string& message) = 0; + + virtual ~ILogger() = default; +}; + +} // namespace Methane::Data diff --git a/Modules/Data/Instrumentation/Include/Methane/Data/ScopeTimer.h b/Modules/Data/Instrumentation/Include/Methane/Data/ScopeTimer.h new file mode 100644 index 000000000..d2d5775ad --- /dev/null +++ b/Modules/Data/Instrumentation/Include/Methane/Data/ScopeTimer.h @@ -0,0 +1,94 @@ +/****************************************************************************** + +Copyright 2020 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Data/ScopeTimer.h +Code scope measurement timer with aggregating and averaging of timings. + +******************************************************************************/ + +#pragma once + +#include "Timer.hpp" +#include "ILogger.h" + +#include +#include + +namespace Methane::Data +{ + +class ScopeTimer : protected Timer +{ +public: + class Aggregator + { + public: + struct Timing + { + TimeDuration duration; + uint32_t count = 0u; + }; + + static Aggregator& Get(); + ~Aggregator(); + + void SetLogger(ILogger::Ptr sp_logger) { m_sp_logger = std::move(sp_logger); } + const ILogger::Ptr& GetLogger() const { return m_sp_logger; } + + void AddScopeTiming(const std::string& scope_name, TimeDuration duration); + const Timing& GetScopeTiming(const std::string& scope_name) const; + + void LogTimings(ILogger& logger); + + private: + Aggregator() = default; + + using ScopeTimings = std::map; + + ScopeTimings m_timing_by_scope_name; + ILogger::Ptr m_sp_logger; + }; + + template + static void InitializeLogger() + { + Aggregator::Get().SetLogger(std::make_shared()); + } + + ScopeTimer(std::string scope_name); + ~ScopeTimer(); + + const std::string& GetScopeName() const { return m_scope_name; } + +private: + std::string m_scope_name; +}; + +#ifdef SCOPE_TIMERS_ENABLED + +#define SCOPE_TIMER(SCOPE_NAME) Methane::Data::ScopeTimer scope_timer(SCOPE_NAME) +#define FUNCTION_SCOPE_TIMER() SCOPE_TIMER(__func__) + +#else + +#define SCOPE_TIMER(SCOPE_NAME) +#define FUNCTION_SCOPE_TIMER() + +#endif + +} // namespace Methane::Data diff --git a/Modules/Data/Instrumentation/Include/Methane/Data/Timer.hpp b/Modules/Data/Instrumentation/Include/Methane/Data/Timer.hpp index 10e0e8142..898447692 100644 --- a/Modules/Data/Instrumentation/Include/Methane/Data/Timer.hpp +++ b/Modules/Data/Instrumentation/Include/Methane/Data/Timer.hpp @@ -16,7 +16,7 @@ limitations under the License. ******************************************************************************* -FILE: Methane/Data/Timer.h +FILE: Methane/Data/Timer.hpp Basic animation timer for measuring elapsed time since start. ******************************************************************************/ @@ -33,21 +33,23 @@ namespace Methane::Data class Timer { public: - using Clock = std::chrono::high_resolution_clock; - using TimePoint = Clock::time_point; + using Clock = std::chrono::high_resolution_clock; + using TimePoint = Clock::time_point; + using TimeDuration = Clock::duration; Timer() : m_start_time(Clock::now()) { ITT_FUNCTION_TASK(); } - TimePoint GetStartTime() const noexcept { return m_start_time; } - uint32_t GetElapsedSecondsU() const noexcept { return GetElapsedSeconds(); } - double GetElapsedSecondsD() const noexcept { return GetElapsedSeconds(); } - float GetElapsedSecondsF() const noexcept { return GetElapsedSeconds(); } + TimePoint GetStartTime() const noexcept { return m_start_time; } + TimeDuration GetElapsedDuration() const noexcept { return Clock::now() - m_start_time; } + uint32_t GetElapsedSecondsU() const noexcept { return GetElapsedSeconds(); } + double GetElapsedSecondsD() const noexcept { return GetElapsedSeconds(); } + float GetElapsedSecondsF() const noexcept { return GetElapsedSeconds(); } template T GetElapsedSeconds() const noexcept { ITT_FUNCTION_TASK(); - return std::chrono::duration_cast>(Clock::now() - m_start_time).count(); + return std::chrono::duration_cast>(GetElapsedDuration()).count(); } void Reset() noexcept diff --git a/Modules/Data/Instrumentation/Sources/Methane/Data/Instrumentation.cpp b/Modules/Data/Instrumentation/Sources/Methane/Data/Instrumentation.cpp index ae824a90e..c8b847c4c 100644 --- a/Modules/Data/Instrumentation/Sources/Methane/Data/Instrumentation.cpp +++ b/Modules/Data/Instrumentation/Sources/Methane/Data/Instrumentation.cpp @@ -25,14 +25,3 @@ Defines common ITT domain required for instrumentation. #include ITT_DOMAIN_GLOBAL("Methane Kit"); - -namespace Methane::Data::Instrumentation -{ - -void dummy() -{ - // Prevents libtool warning for library: - // the table of contents is empty (no object file members in the library define global symbols) -} - -} diff --git a/Modules/Data/Instrumentation/Sources/Methane/Data/ScopeTimer.cpp b/Modules/Data/Instrumentation/Sources/Methane/Data/ScopeTimer.cpp new file mode 100644 index 000000000..c252182c8 --- /dev/null +++ b/Modules/Data/Instrumentation/Sources/Methane/Data/ScopeTimer.cpp @@ -0,0 +1,103 @@ +/****************************************************************************** + +Copyright 2020 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/ScopeTimer.cpp +Code scope measurement timer with aggregating and averaging of timings. + +******************************************************************************/ + +#include +#include + +#include +#include + +namespace Methane::Data +{ + +ScopeTimer::Aggregator& ScopeTimer::Aggregator::Get() +{ + ITT_FUNCTION_TASK(); + + static Aggregator s_scope_aggregator; + return s_scope_aggregator; +} + +ScopeTimer::Aggregator::~Aggregator() +{ + ITT_FUNCTION_TASK(); + if (m_sp_logger) + { + LogTimings(*m_sp_logger); + } +} + +void ScopeTimer::Aggregator::LogTimings(ILogger& logger) +{ + ITT_FUNCTION_TASK(); + if (m_timing_by_scope_name.empty()) + return; + + std::stringstream ss; + ss << std::endl << "Aggregated performance timings:" << std::endl; + + for (const auto& scope_name_and_timing : m_timing_by_scope_name) + { + const Timing& scope_timing = scope_name_and_timing.second; + const double total_duration_sec = std::chrono::duration_cast>(scope_timing.duration).count(); + const double average_duration_ms = total_duration_sec * 1000.0 / scope_timing.count; + + ss << " - " << scope_name_and_timing.first << ": " + << std::fixed << average_duration_ms << " ms. with " << scope_timing.count << " invocations count;" << std::endl; + } + + logger.Log(ss.str()); +} + +void ScopeTimer::Aggregator::AddScopeTiming(const std::string& scope_name, TimeDuration duration) +{ + ITT_FUNCTION_TASK(); + + Timing& scope_timing = m_timing_by_scope_name[scope_name]; + scope_timing.count++; + scope_timing.duration += duration; +} + +const ScopeTimer::Aggregator::Timing& ScopeTimer::Aggregator::GetScopeTiming(const std::string& scope_name) const +{ + ITT_FUNCTION_TASK(); + + static Timing g_empty_timing = {}; + auto scope_timing_it = m_timing_by_scope_name.find(scope_name); + return scope_timing_it != m_timing_by_scope_name.end() ? scope_timing_it->second : g_empty_timing; +} + +ScopeTimer::ScopeTimer(std::string scope_name) + : Timer() + , m_scope_name(std::move(scope_name)) +{ + ITT_FUNCTION_TASK(); +} + +ScopeTimer::~ScopeTimer() +{ + ITT_FUNCTION_TASK(); + Aggregator::Get().AddScopeTiming(m_scope_name, GetElapsedDuration()); +} + +} diff --git a/Modules/Platform/Utils/CMakeLists.txt b/Modules/Platform/Utils/CMakeLists.txt index 2a4bdd8b2..9c9781952 100644 --- a/Modules/Platform/Utils/CMakeLists.txt +++ b/Modules/Platform/Utils/CMakeLists.txt @@ -17,6 +17,7 @@ endif() set(HEADERS ${INCLUDE_DIR}/Utils.h + ${INCLUDE_DIR}/Logger.h ${PLATFORM_HEADERS} ) diff --git a/Modules/Platform/Utils/Include/Methane/Platform/Logger.h b/Modules/Platform/Utils/Include/Methane/Platform/Logger.h new file mode 100644 index 000000000..aa9c2b240 --- /dev/null +++ b/Modules/Platform/Utils/Include/Methane/Platform/Logger.h @@ -0,0 +1,42 @@ +/****************************************************************************** + +Copyright 2020 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Data/ILogger.h +Abstract logger interface. + +******************************************************************************/ + +#pragma once + +#include "Utils.h" + +#include + +namespace Methane::Platform +{ + +class Logger : public Data::ILogger +{ + // Data::ILogger interface + void Log(const std::string& message) override + { + PrintToDebugOutput(message); + } +}; + +} // namespace Methane::Data From d6e8fe5e1a1df433fa175481746910ca8ff4a2b6 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Fri, 3 Jan 2020 20:50:44 +0300 Subject: [PATCH 069/129] Asteroids sample is intstrumented with scope timers. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 21 +++++++++++++------ Apps/Samples/Asteroids/AsteroidsArray.cpp | 10 ++++++++- Apps/Samples/Asteroids/AsteroidsArray.h | 2 +- .../Methane/Graphics/DirectX12/ContextDX.cpp | 17 +++++++++++---- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 304b41b16..f5e060319 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -27,6 +27,8 @@ Sample demonstrating parallel rendering of the distinct asteroids massive #include #include #include +#include +#include #include #include @@ -172,6 +174,7 @@ AsteroidsApp::~AsteroidsApp() void AsteroidsApp::Init() { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsApp::Init"); GraphicsApp::Init(); @@ -293,6 +296,7 @@ bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) bool AsteroidsApp::Update() { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsApp::Update"); if (!GraphicsApp::Update()) return false; @@ -308,6 +312,7 @@ bool AsteroidsApp::Update() bool AsteroidsApp::Render() { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsApp::Render"); // Render only when context is ready assert(!!m_sp_context); @@ -326,7 +331,7 @@ bool AsteroidsApp::Render() if (m_is_parallel_rendering_enabled) { assert(!!frame.sp_parallel_cmd_list); - m_sp_asteroids_array->Draw(*frame.sp_parallel_cmd_list, frame.asteroids); + m_sp_asteroids_array->DrawParallel(*frame.sp_parallel_cmd_list, frame.asteroids); } else { @@ -346,12 +351,15 @@ bool AsteroidsApp::Render() // Sky-box rendering assert(!!m_sp_sky_box); m_sp_sky_box->Draw(render_cmd_list, frame.skybox); - - commit_cmd_list.Commit(true); - // Execute rendering commands and present frame to screen - m_sp_context->GetRenderCommandQueue().Execute({ commit_cmd_list }); - m_sp_context->Present(); + { + + commit_cmd_list.Commit(true); + + // Execute rendering commands and present frame to screen + m_sp_context->GetRenderCommandQueue().Execute({ commit_cmd_list }); + m_sp_context->Present(); + } return true; } @@ -406,5 +414,6 @@ void AsteroidsApp::SetParallelRnderingEnabled(bool is_parallel_rendering_enabled int main(int argc, const char* argv[]) { + Methane::Data::ScopeTimer::InitializeLogger(); return Methane::Samples::AsteroidsApp().Run({ argc, argv }); } diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 0f202cd9d..99bf77945 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -27,6 +27,7 @@ Random generated asteroids array with uber mesh and textures ready for rendering #include #include #include +#include namespace Methane::Samples { @@ -52,6 +53,7 @@ AsteroidsArray::UberMesh::UberMesh(uint32_t instance_count, uint32_t subdivision , m_min_subdivision(min_subdivision) { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsArray::UberMesh::UberMesh"); std::mt19937 rng(random_seed); @@ -102,6 +104,7 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) : uber_mesh(settings.unique_mesh_count, settings.subdivisions_count, settings.minimum_subdivision, settings.random_seed) { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsArray::ContentState::ContentState"); std::mt19937 rng(settings.random_seed); @@ -214,6 +217,7 @@ AsteroidsArray::AsteroidsArray(gfx::Context& context, Settings settings, Content , m_sp_content_state(state.shared_from_this()) { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsArray::AsteroidsArray"); const gfx::Context::Settings& context_settings = context.GetSettings(); @@ -278,6 +282,7 @@ gfx::MeshBufferBindings::ResourceBindingsArray AsteroidsArray::CreateResourceBin const gfx::Buffer::Ptr &sp_asteroids_uniforms_buffer) { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsArray::CreateResourceBindings"); gfx::MeshBufferBindings::ResourceBindingsArray resource_bindings_array; if (m_settings.instance_count == 0) @@ -326,6 +331,7 @@ void AsteroidsArray::Resize(const gfx::FrameSize &frame_size) bool AsteroidsArray::Update(double /*elapsed_seconds*/, double delta_seconds) { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsArray::Update"); gfx::Matrix44f scene_view_matrix, scene_proj_matrix; m_settings.view_camera.GetViewProjMatrices(scene_view_matrix, scene_proj_matrix); @@ -367,6 +373,7 @@ bool AsteroidsArray::Update(double /*elapsed_seconds*/, double delta_seconds) void AsteroidsArray::Draw(gfx::RenderCommandList &cmd_list, gfx::MeshBufferBindings& buffer_bindings) { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsArray::Draw"); const Data::Size uniforms_buffer_size = GetUniformsBufferSize(); assert(buffer_bindings.sp_uniforms_buffer); @@ -380,9 +387,10 @@ void AsteroidsArray::Draw(gfx::RenderCommandList &cmd_list, gfx::MeshBufferBindi gfx::Program::ResourceBindings::ApplyBehavior::ConstantOnce); } -void AsteroidsArray::Draw(gfx::ParallelRenderCommandList& parallel_cmd_list, gfx::MeshBufferBindings& buffer_bindings) +void AsteroidsArray::DrawParallel(gfx::ParallelRenderCommandList& parallel_cmd_list, gfx::MeshBufferBindings& buffer_bindings) { ITT_FUNCTION_TASK(); + SCOPE_TIMER("AsteroidsArray::DrawParallel"); const Data::Size uniforms_buffer_size = GetUniformsBufferSize(); assert(buffer_bindings.sp_uniforms_buffer); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index 3fc2c2dd7..5031ce092 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -111,7 +111,7 @@ class AsteroidsArray final : protected gfx::TexturedMeshBuffers +#include #include #ifdef COMMAND_EXECUTION_LOGGING @@ -203,18 +204,24 @@ void ContextDX::WaitForGpu(WaitFor wait_for) switch (wait_for) { case WaitFor::ResourcesUploaded: + { + SCOPE_TIMER("ContextDX::WaitForGpu::ResourcesUploaded"); assert(!!m_sp_upload_fence); m_sp_upload_fence->Flush(); - break; + } break; case WaitFor::RenderComplete: + { + SCOPE_TIMER("ContextDX::WaitForGpu::RenderComplete"); assert(m_sp_render_fence); m_sp_render_fence->Flush(); - break; + } break; case WaitFor::FramePresented: + { + SCOPE_TIMER("ContextDX::WaitForGpu::FramePresented"); GetCurrentFrameFence().Wait(); - break; + } break; } ContextBase::WaitForGpu(wait_for); @@ -239,13 +246,15 @@ void ContextDX::Resize(const FrameSize& frame_size) void ContextDX::Present() { ITT_FUNCTION_TASK(); - assert(m_cp_swap_chain); + SCOPE_TIMER("ContextDX::Present"); ContextBase::Present(); // Preset frame to screen const uint32_t present_flags = 0; // DXGI_PRESENT_DO_NOT_WAIT const uint32_t vsync_interval = GetPresentVSyncInterval(); + + assert(m_cp_swap_chain); ThrowIfFailed(m_cp_swap_chain->Present(vsync_interval, present_flags)); // Schedule a signal command in the queue for a currently finished frame From bfd6863877962764620ecf970105cf27e44406fe Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Fri, 3 Jan 2020 20:52:29 +0300 Subject: [PATCH 070/129] Root CMakeList extended with status and warning logging. Scope timers enabling option was added. --- CMakeLists.txt | 26 +++++++++++++++- CMakeSettings.json | 76 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 93 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7106e493d..8ee2f6215 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,8 @@ enable_testing() option(METHANE_USE_OPEN_IMAGE_IO "Enable using OpenImageIO library for images loading" OFF) option(METHANE_ITT_INSTRUMENTATION_ENABLED "Enable ITT instrumentation" OFF) -option(METHANE_SHADERS_CODEVIEW_ENABLED "Enable shaders code viewing in debug tools while keeping compiler optimizations in Release builds)" OFF) +option(METHANE_SCOPE_TIMERS_ENABLED "Enable low-overhead profiling with scope-timers" OFF) +option(METHANE_SHADERS_CODEVIEW_ENABLED "Enable shaders code symbols viewing in debug tools)" OFF) option(METHANE_RUN_TESTS_DURING_BUILD "Run tests during build" ON) set(METHANE_VERSION "0.1" CACHE STRING "Methane release major-minor version number") @@ -32,6 +33,11 @@ set(PARSE_CATCH_TESTS_VERBOSE OFF) if(MSVC) + if(NOT DEFINED ENV{WindowsSdkVerBinPath}) + message(FATAL_ERROR "Windows SDK binary directory path is undefined! " + "Please start cmake generation from \"Visual Studio Native Tools\" command prompt.") + endif() + set(VS_STARTUP_PROJECT MethaneShadowCube) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") set(WINDOWS_SDK_BIN_PATH $ENV{WindowsSdkVerBinPath}x64) @@ -45,10 +51,28 @@ elseif(APPLE) endif() +if(METHANE_USE_OPEN_IMAGE_IO) + message(STATUS "Methane Kit OpenImageIO media-library is enbabled.") +endif() + if(METHANE_ITT_INSTRUMENTATION_ENABLED) + message(STATUS "Methane ITT Instrumentation is enabled") add_definitions(-DITT_INSTRUMENTATION_ENABLED) endif() +if(METHANE_SCOPE_TIMERS_ENABLED) + message(STATUS "Methane Scope Timers are enabled") + add_definitions(-DSCOPE_TIMERS_ENABLED) +endif() + +if(METHANE_SHADERS_CODEVIEW_ENABLED) + message(STATUS "Methane shaders code symbols are enabled") +endif() + +if(METHANE_RUN_TESTS_DURING_BUILD) + message(STATUS "Methane tests running during build is enabled") +endif() + if (CMAKE_INSTALL_PREFIX AND EXISTS "${CMAKE_INSTALL_PREFIX}/bin/ctest") set(CTEST_EXE "${CMAKE_INSTALL_PREFIX}/bin/ctest") else() diff --git a/CMakeSettings.json b/CMakeSettings.json index b4264c426..4214febf2 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -7,10 +7,25 @@ "inheritEnvironments": [ "msvc_x86" ], "buildRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Build", "installRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Install", - "cmakeCommandArgs": "-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON", "buildCommandArgs": "-v", "ctestCommandArgs": "", - "variables": [] + "variables": [ + { + "name": "METHANE_ITT_INSTRUMENTATION_ENABLED", + "value": "True", + "type": "BOOL" + }, + { + "name": "METHANE_SCOPE_TIMERS_ENABLED", + "value": "True", + "type": "BOOL" + }, + { + "name": "METHANE_SHADERS_CODEVIEW_ENABLED", + "value": "True", + "type": "BOOL" + } + ] }, { "name": "x86-Release", @@ -19,10 +34,25 @@ "inheritEnvironments": [ "msvc_x86" ], "buildRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Build", "installRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Install", - "cmakeCommandArgs": "-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON", "buildCommandArgs": "-v", "ctestCommandArgs": "", - "variables": [] + "variables": [ + { + "name": "METHANE_ITT_INSTRUMENTATION_ENABLED", + "value": "True", + "type": "BOOL" + }, + { + "name": "METHANE_SCOPE_TIMERS_ENABLED", + "value": "True", + "type": "BOOL" + }, + { + "name": "METHANE_SHADERS_CODEVIEW_ENABLED", + "value": "True", + "type": "BOOL" + } + ] }, { "name": "x64-Debug", @@ -31,10 +61,25 @@ "inheritEnvironments": [ "msvc_x64_x64" ], "buildRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Build", "installRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Install", - "cmakeCommandArgs": "-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON", "buildCommandArgs": "-v", "ctestCommandArgs": "", - "variables": [] + "variables": [ + { + "name": "METHANE_ITT_INSTRUMENTATION_ENABLED", + "value": "True", + "type": "BOOL" + }, + { + "name": "METHANE_SCOPE_TIMERS_ENABLED", + "value": "True", + "type": "BOOL" + }, + { + "name": "METHANE_SHADERS_CODEVIEW_ENABLED", + "value": "True", + "type": "BOOL" + } + ] }, { "name": "x64-Release", @@ -43,10 +88,25 @@ "inheritEnvironments": [ "msvc_x64_x64" ], "buildRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Build", "installRoot": "${projectDir}\\Build\\Output\\VisualStudio\\${name}\\Install", - "cmakeCommandArgs": "-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON", "buildCommandArgs": "-v", "ctestCommandArgs": "", - "variables": [] + "variables": [ + { + "name": "METHANE_ITT_INSTRUMENTATION_ENABLED", + "value": "True", + "type": "BOOL" + }, + { + "name": "METHANE_SCOPE_TIMERS_ENABLED", + "value": "True", + "type": "BOOL" + }, + { + "name": "METHANE_SHADERS_CODEVIEW_ENABLED", + "value": "True", + "type": "BOOL" + } + ] }, { "name": "Linux-Debug", From ce4a29162fbbec2c562170e5446a323802d97e2a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Fri, 3 Jan 2020 22:54:11 +0300 Subject: [PATCH 071/129] FpsCounter now takes into account time of waiting for frame presented on GPU. --- .../Sources/Methane/Graphics/ContextBase.cpp | 18 +++++-- .../Sources/Methane/Graphics/ContextBase.h | 3 +- .../Methane/Graphics/DirectX12/ContextDX.cpp | 4 +- .../Methane/Graphics/Metal/ContextMT.mm | 13 ++--- .../Methane/Graphics/Metal/ShaderMT.mm | 3 +- .../Include/Methane/Graphics/FpsCounter.h | 22 +++++---- .../Sources/Methane/Graphics/FpsCounter.cpp | 47 +++++++++++++++---- 7 files changed, 79 insertions(+), 31 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp index c3e297791..a2bd8aa90 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.cpp @@ -76,7 +76,7 @@ void ContextBase::WaitForGpu(WaitFor wait_for) Platform::PrintToDebugOutput(GetWaitForName(wait_for) + " in context \"" + GetName() + "\""); #endif - m_resource_manager.GetReleasePool().ReleaseResources(); + m_fps_counter.OnGpuFramePresentWait(); } void ContextBase::Resize(const FrameSize& frame_size) @@ -111,7 +111,7 @@ void ContextBase::Present() Platform::PrintToDebugOutput("PRESENT frame " + std::to_string(m_frame_buffer_index) + " in context \"" + GetName() + "\""); #endif - m_fps_counter.OnFrameReadyToPresent(); + m_fps_counter.OnCpuFrameReadyToPresent(); } void ContextBase::AddCallback(Callback& callback) @@ -132,8 +132,18 @@ void ContextBase::RemoveCallback(Callback& callback) m_callbacks.erase(callback_it); } + +void ContextBase::OnGpuWaitComplete(WaitFor wait_for) +{ + ITT_FUNCTION_TASK(); + if (wait_for == WaitFor::FramePresented) + { + m_fps_counter.OnGpuFramePresented(); + } + m_resource_manager.GetReleasePool().ReleaseResources(); +} -void ContextBase::OnPresentComplete() +void ContextBase::OnCpuPresentComplete() { ITT_FUNCTION_TASK(); @@ -141,7 +151,7 @@ void ContextBase::OnPresentComplete() Platform::PrintToDebugOutput("PRESENT COMPLETE for context \"" + GetName() + "\""); #endif - m_fps_counter.OnFramePresented(); + m_fps_counter.OnCpuFramePresented(); } void ContextBase::ResetWithSettings(const Settings& settings) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.h index 6e71dea61..8b9b5ef33 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ContextBase.h @@ -82,7 +82,8 @@ class ContextBase protected: void UploadResources(); - void OnPresentComplete(); + void OnGpuWaitComplete(WaitFor wait_for); + void OnCpuPresentComplete(); void ResetWithSettings(const Settings& settings); virtual void Release(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp index cefcc4818..8993971cf 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp @@ -201,6 +201,8 @@ void ContextDX::WaitForGpu(WaitFor wait_for) { ITT_FUNCTION_TASK(); + ContextBase::WaitForGpu(wait_for); + switch (wait_for) { case WaitFor::ResourcesUploaded: @@ -224,7 +226,7 @@ void ContextDX::WaitForGpu(WaitFor wait_for) } break; } - ContextBase::WaitForGpu(wait_for); + ContextBase::OnGpuWaitComplete(wait_for); } void ContextDX::Resize(const FrameSize& frame_size) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm index e8c053fd8..6c1b8a92e 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm @@ -117,13 +117,14 @@ void ContextMT::WaitForGpu(WaitFor wait_for) { ITT_FUNCTION_TASK(); - - dispatch_semaphore_wait(m_dispatch_semaphore, DISPATCH_TIME_FOREVER); - - const bool switch_to_next_frame = (wait_for == WaitFor::FramePresented); + ContextBase::WaitForGpu(wait_for); + + dispatch_semaphore_wait(m_dispatch_semaphore, DISPATCH_TIME_FOREVER); + + ContextBase::OnGpuWaitComplete(wait_for); - if (switch_to_next_frame) + if (wait_for == WaitFor::FramePresented) { m_frame_buffer_index = (m_frame_buffer_index + 1) % m_settings.frame_buffers_count; [m_frame_capture_scope beginScope]; @@ -143,7 +144,7 @@ [m_frame_capture_scope endScope]; - OnPresentComplete(); + OnCpuPresentComplete(); } bool ContextMT::SetVSyncEnabled(bool vsync_enabled) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm index 3c9942681..d52f966a1 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ShaderMT.mm @@ -61,6 +61,8 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept } } +#ifndef NDEBUG + static std::string GetMetalArgumentTypeName(MTLArgumentType mtl_arg_type) noexcept { ITT_FUNCTION_TASK(); @@ -75,7 +77,6 @@ static MTLVertexStepFunction GetVertexStepFunction(StepType step_type) noexcept return "Unknown"; } -#ifndef NDEBUG static std::string GetMetalArgumentAccessName(MTLArgumentAccess mtl_arg_access) noexcept { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h index ceb44e8c6..17c6217b3 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/FpsCounter.h @@ -39,14 +39,16 @@ class FpsCounter public: FrameTiming() = default; FrameTiming(const FrameTiming&) = default; - FrameTiming(double total_time_sec, double present_time_sec); + FrameTiming(double total_time_sec, double present_time_sec, double gpu_wait_time_sec); - double GetTotalTimeSec() const { return m_total_time_sec; } - double GetPresentTimeSec() const { return m_present_time_sec; } - double GetCpuTimeSec() const { return m_total_time_sec - m_present_time_sec; } + double GetTotalTimeSec() const { return m_total_time_sec; } + double GetPresentTimeSec() const { return m_present_time_sec; } + double GetGpuWaitTimeSec() const { return m_gpu_wait_time_sec; } + double GetCpuTimeSec() const { return m_total_time_sec - m_present_time_sec - m_gpu_wait_time_sec; } double GetTotalTimeMSec() const { return m_total_time_sec * 1000.0; } double GetPresentTimeMSec() const { return m_present_time_sec * 1000.0; } + double GetGpuWaitTimeMSec() const { return m_gpu_wait_time_sec * 1000.0; } double GetCpuTimeMSec() const { return GetCpuTimeSec() * 1000.0; } double GetCpuTimePercent() const { return 100.0 * GetCpuTimeSec() / GetTotalTimeSec(); } @@ -58,16 +60,19 @@ class FpsCounter FrameTiming operator*(double multiplier) const; private: - double m_total_time_sec = 0.0; - double m_present_time_sec = 0.0; + double m_total_time_sec = 0.0; + double m_present_time_sec = 0.0; + double m_gpu_wait_time_sec = 0.0; }; FpsCounter() = default; FpsCounter(uint32_t averaged_timings_count) : m_averaged_timings_count(averaged_timings_count) {} void Reset(uint32_t averaged_timings_count); - void OnFrameReadyToPresent(); - void OnFramePresented(); + void OnGpuFramePresentWait(); + void OnGpuFramePresented(); + void OnCpuFrameReadyToPresent(); + void OnCpuFramePresented(); uint32_t GetAveragedTimingsCount() const noexcept { return static_cast(m_frame_timings.size()); } FrameTiming GetAverageFrameTiming() const noexcept { return m_frame_timings_sum / GetAveragedTimingsCount(); } @@ -76,6 +81,7 @@ class FpsCounter private: Data::Timer m_frame_timer; Data::Timer m_present_timer; + double m_present_on_gpu_wait_time_sec = 0.0; uint32_t m_averaged_timings_count = 100; FrameTiming m_frame_timings_sum; std::queue m_frame_timings; diff --git a/Modules/Graphics/Helpers/Sources/Methane/Graphics/FpsCounter.cpp b/Modules/Graphics/Helpers/Sources/Methane/Graphics/FpsCounter.cpp index b12e1a05a..8375ba6ee 100644 --- a/Modules/Graphics/Helpers/Sources/Methane/Graphics/FpsCounter.cpp +++ b/Modules/Graphics/Helpers/Sources/Methane/Graphics/FpsCounter.cpp @@ -27,35 +27,46 @@ FPS counter calculates frame time duration with moving average window algorithm. namespace Methane::Graphics { -FpsCounter::FrameTiming::FrameTiming(double total_time_sec, double present_time_sec) +FpsCounter::FrameTiming::FrameTiming(double total_time_sec, double present_time_sec, double gpu_wait_time_sec) : m_total_time_sec(total_time_sec) , m_present_time_sec(present_time_sec) + , m_gpu_wait_time_sec(gpu_wait_time_sec) { ITT_FUNCTION_TASK(); } FpsCounter::FrameTiming& FpsCounter::FrameTiming::operator+=(const FrameTiming& other) { - m_total_time_sec += other.m_total_time_sec; - m_present_time_sec += other.m_present_time_sec; + ITT_FUNCTION_TASK(); + m_total_time_sec += other.m_total_time_sec; + m_present_time_sec += other.m_present_time_sec; + m_gpu_wait_time_sec += other.m_gpu_wait_time_sec; return *this; } FpsCounter::FrameTiming& FpsCounter::FrameTiming::operator-=(const FrameTiming& other) { - m_total_time_sec -= other.m_total_time_sec; - m_present_time_sec -= other.m_present_time_sec; + ITT_FUNCTION_TASK(); + m_total_time_sec -= other.m_total_time_sec; + m_present_time_sec -= other.m_present_time_sec; + m_gpu_wait_time_sec -= other.m_gpu_wait_time_sec; return *this; } FpsCounter::FrameTiming FpsCounter::FrameTiming::operator/(double divisor) const { - return FrameTiming(m_total_time_sec / divisor, m_present_time_sec / divisor); + ITT_FUNCTION_TASK(); + return FrameTiming(m_total_time_sec / divisor, + m_present_time_sec / divisor, + m_gpu_wait_time_sec / divisor); } FpsCounter::FrameTiming FpsCounter::FrameTiming::operator*(double multiplier) const { - return FrameTiming(m_total_time_sec * multiplier, m_present_time_sec * multiplier); + ITT_FUNCTION_TASK(); + return FrameTiming(m_total_time_sec * multiplier, + m_present_time_sec * multiplier, + m_gpu_wait_time_sec * multiplier); } void FpsCounter::Reset(uint32_t averaged_timings_count) @@ -67,17 +78,30 @@ void FpsCounter::Reset(uint32_t averaged_timings_count) m_frame_timings.pop(); } m_frame_timings_sum = FrameTiming(); + m_present_on_gpu_wait_time_sec = 0.0; m_frame_timer.Reset(); m_present_timer.Reset(); } + +void FpsCounter::OnGpuFramePresentWait() +{ + ITT_FUNCTION_TASK(); + m_present_timer.Reset(); +} + +void FpsCounter::OnGpuFramePresented() +{ + ITT_FUNCTION_TASK(); + m_present_on_gpu_wait_time_sec = m_present_timer.GetElapsedSecondsD(); +} -void FpsCounter::OnFrameReadyToPresent() +void FpsCounter::OnCpuFrameReadyToPresent() { ITT_FUNCTION_TASK(); m_present_timer.Reset(); } -void FpsCounter::OnFramePresented() +void FpsCounter::OnCpuFramePresented() { ITT_FUNCTION_TASK(); if (m_frame_timings.size() >= m_averaged_timings_count) @@ -86,7 +110,10 @@ void FpsCounter::OnFramePresented() m_frame_timings.pop(); } - const FrameTiming frame_timing(m_frame_timer.GetElapsedSecondsD(), m_present_timer.GetElapsedSecondsD()); + const FrameTiming frame_timing(m_frame_timer.GetElapsedSecondsD(), + m_present_timer.GetElapsedSecondsD(), + m_present_on_gpu_wait_time_sec); + m_frame_timings_sum += frame_timing; m_frame_timings.push(frame_timing); From a44daaaf696913ed40e12f4af4d2d8164f5c4c3d Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Fri, 3 Jan 2020 23:05:08 +0300 Subject: [PATCH 072/129] Fixed Windows and Linux build. --- .../Sources/Methane/Graphics/DirectX12/ContextDX.cpp | 2 +- .../Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp index 8993971cf..3ef0c12f7 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp @@ -262,7 +262,7 @@ void ContextDX::Present() // Schedule a signal command in the queue for a currently finished frame GetCurrentFrameFence().Signal(); - OnPresentComplete(); + OnCpuPresentComplete(); // Update current frame buffer index m_frame_buffer_index = m_cp_swap_chain->GetCurrentBackBufferIndex(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp index 150b6a8c4..736fb17e3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.cpp @@ -78,10 +78,13 @@ void ContextVK::WaitForGpu(WaitFor wait_for) { ITT_FUNCTION_TASK(); - const bool switch_to_next_frame = (wait_for == WaitFor::FramePresented); ContextBase::WaitForGpu(wait_for); - if (switch_to_next_frame) + // TODO: Wait for GPU work complete + + ContextBase::OnGpuWaitComplete(wait_for); + + if (wait_for == WaitFor::FramePresented) { m_frame_buffer_index = (m_frame_buffer_index + 1) % m_settings.frame_buffers_count; } @@ -96,7 +99,7 @@ void ContextVK::Resize(const FrameSize& frame_size) void ContextVK::Present() { ITT_FUNCTION_TASK(); - OnPresentComplete(); + OnCpuPresentComplete(); } bool ContextVK::SetVSyncEnabled(bool vsync_enabled) From 4dc63ca8d5014c8151721f0b398ae46bb08588a8 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 4 Jan 2020 13:27:19 +0300 Subject: [PATCH 073/129] Asteroids sample rendering split into two command lists. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 59 ++++++++++++++++--------- Apps/Samples/Asteroids/AsteroidsApp.h | 5 ++- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index f5e060319..6eaa77589 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -230,14 +230,29 @@ void AsteroidsApp::Init() // ========= Per-Frame Data ========= for(AsteroidsFrame& frame : m_frames) { - // Create parallel rendering command list for final FB rendering - frame.sp_parallel_cmd_list = gfx::ParallelRenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_screen_pass); + // Create initial screen pass for asteroids rendering + gfx::RenderPass::Settings initial_screen_pass_settings = frame.sp_screen_pass->GetSettings(); + initial_screen_pass_settings.depth_attachment.store_action = gfx::RenderPass::Attachment::StoreAction::Store; + frame.sp_initial_screen_pass = gfx::RenderPass::Create(context, initial_screen_pass_settings); + + // Create final screen pass for sky-box and planet rendering + gfx::RenderPass::Settings final_screen_pass_settings = frame.sp_screen_pass->GetSettings(); + final_screen_pass_settings.color_attachments[0].load_action = gfx::RenderPass::Attachment::LoadAction::Load; + final_screen_pass_settings.depth_attachment.load_action = gfx::RenderPass::Attachment::LoadAction::Load; + frame.sp_final_screen_pass = gfx::RenderPass::Create(context, final_screen_pass_settings); + + // Create parallel command list for asteroids rendering + frame.sp_parallel_cmd_list = gfx::ParallelRenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_initial_screen_pass); frame.sp_parallel_cmd_list->SetParallelCommandListsCount(std::thread::hardware_concurrency()); frame.sp_parallel_cmd_list->SetName(IndexedName("Parallel Rendering", frame.index)); - // Create command list for final FB rendering - frame.sp_cmd_list = gfx::RenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_screen_pass); - frame.sp_cmd_list->SetName(IndexedName("Scene Rendering", frame.index)); + // Create serial command list for asteroids rendering + frame.sp_serial_cmd_list = gfx::RenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_initial_screen_pass); + frame.sp_serial_cmd_list->SetName(IndexedName("Serial Rendering", frame.index)); + + // Create final command list for sky-box and planet rendering + frame.sp_final_cmd_list = gfx::RenderCommandList::Create(context.GetRenderCommandQueue(), *frame.sp_final_screen_pass); + frame.sp_final_cmd_list->SetName(IndexedName("Final Rendering", frame.index)); // Create uniforms buffer with volatile parameters for the whole scene rendering frame.sp_scene_uniforms_buffer = gfx::Buffer::CreateConstantBuffer(context, scene_uniforms_data_size); @@ -326,40 +341,40 @@ bool AsteroidsApp::Render() // Upload uniform buffers to GPU frame.sp_scene_uniforms_buffer->SetData({ { reinterpret_cast(&m_scene_uniforms), sizeof(SceneUniforms) } }); - // Asteroids rendering assert(!!m_sp_asteroids_array); + gfx::CommandList::Refs execute_cmd_lists; + + // Asteroids rendering if (m_is_parallel_rendering_enabled) { assert(!!frame.sp_parallel_cmd_list); m_sp_asteroids_array->DrawParallel(*frame.sp_parallel_cmd_list, frame.asteroids); + frame.sp_parallel_cmd_list->Commit(false); + execute_cmd_lists.push_back(*frame.sp_parallel_cmd_list); } else { - assert(!!frame.sp_cmd_list); - m_sp_asteroids_array->Draw(*frame.sp_cmd_list, frame.asteroids); + assert(!!frame.sp_serial_cmd_list); + m_sp_asteroids_array->Draw(*frame.sp_serial_cmd_list, frame.asteroids); + frame.sp_serial_cmd_list->Commit(false); + execute_cmd_lists.push_back(*frame.sp_serial_cmd_list); } - gfx::RenderCommandList& render_cmd_list = m_is_parallel_rendering_enabled ? *frame.sp_parallel_cmd_list->GetParallelCommandLists().back() : *frame.sp_cmd_list; - gfx::CommandList& commit_cmd_list = m_is_parallel_rendering_enabled ? static_cast(*frame.sp_parallel_cmd_list) : *frame.sp_cmd_list; - - render_cmd_list.PopDebugGroup(); - // Planet rendering assert(!!m_sp_planet); - m_sp_planet->Draw(render_cmd_list, frame.planet); + assert(!!frame.sp_final_cmd_list); + m_sp_planet->Draw(*frame.sp_final_cmd_list, frame.planet); // Sky-box rendering assert(!!m_sp_sky_box); - m_sp_sky_box->Draw(render_cmd_list, frame.skybox); + m_sp_sky_box->Draw(*frame.sp_final_cmd_list, frame.skybox); - { - - commit_cmd_list.Commit(true); + frame.sp_final_cmd_list->Commit(true); + execute_cmd_lists.push_back(*frame.sp_final_cmd_list); - // Execute rendering commands and present frame to screen - m_sp_context->GetRenderCommandQueue().Execute({ commit_cmd_list }); - m_sp_context->Present(); - } + // Execute rendering commands and present frame to screen + m_sp_context->GetRenderCommandQueue().Execute(execute_cmd_lists); + m_sp_context->Present(); return true; } diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index f7fc7c0ec..8132dc8b9 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -38,8 +38,11 @@ namespace pal = Platform; struct AsteroidsFrame final : gfx::AppFrame { - gfx::RenderCommandList::Ptr sp_cmd_list; + gfx::RenderPass::Ptr sp_initial_screen_pass; + gfx::RenderPass::Ptr sp_final_screen_pass; gfx::ParallelRenderCommandList::Ptr sp_parallel_cmd_list; + gfx::RenderCommandList::Ptr sp_serial_cmd_list; + gfx::RenderCommandList::Ptr sp_final_cmd_list; gfx::Buffer::Ptr sp_scene_uniforms_buffer; gfx::MeshBufferBindings skybox; gfx::MeshBufferBindings planet; From b508528f8a3a4be0362de99ecd1bd3a617609e2c Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 4 Jan 2020 22:09:22 +0300 Subject: [PATCH 074/129] Fixed updating render pass textures on window resizing. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 6eaa77589..0938d2169 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -299,6 +299,22 @@ bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) // Resize screen color and depth textures if (!GraphicsApp::Resize(frame_size, is_minimized)) return false; + + // Update frame buffer and depth textures in initial & final render passes + for (AsteroidsFrame& frame : m_frames) + { + assert(!!frame.sp_initial_screen_pass); + gfx::RenderPass::Settings initial_pass_settings = frame.sp_initial_screen_pass->GetSettings(); + initial_pass_settings.color_attachments[0].wp_texture = frame.sp_screen_texture; + initial_pass_settings.depth_attachment.wp_texture = m_sp_depth_texture; + frame.sp_initial_screen_pass->Update(initial_pass_settings); + + assert(!!frame.sp_final_screen_pass); + gfx::RenderPass::Settings final_pass_settings = frame.sp_final_screen_pass->GetSettings(); + final_pass_settings.color_attachments[0].wp_texture = frame.sp_screen_texture; + final_pass_settings.depth_attachment.wp_texture = m_sp_depth_texture; + frame.sp_final_screen_pass->Update(final_pass_settings); + } m_sp_sky_box->Resize(frame_size); m_sp_planet->Resize(frame_size); From a926466db7a8390efca18aa5cce206637aad6fd9 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 5 Jan 2020 18:05:07 +0300 Subject: [PATCH 075/129] Render state applying optimizations to eliminate repeated setup of equal states. --- .../Primitives/Include/Methane/Data/Types.h | 14 ++++-- .../Methane/Graphics/RenderCommandList.h | 3 +- .../Include/Methane/Graphics/RenderState.h | 48 +++++++++++++++---- .../Core/Include/Methane/Graphics/Resource.h | 1 - .../Core/Include/Methane/Graphics/Types.h | 13 ++++- .../DirectX12/RenderCommandListDX.cpp | 7 +++ .../Graphics/DirectX12/RenderStateDX.cpp | 24 ++++++++-- .../Graphics/DirectX12/RenderStateDX.h | 2 +- .../Graphics/Metal/RenderCommandListMT.mm | 2 + .../Methane/Graphics/Metal/RenderStateMT.hh | 2 +- .../Methane/Graphics/Metal/RenderStateMT.mm | 23 +++++---- .../Graphics/RenderCommandListBase.cpp | 31 ++++++++++-- .../Methane/Graphics/RenderCommandListBase.h | 14 ++++-- .../Methane/Graphics/RenderStateBase.cpp | 32 +++++++++++++ .../Methane/Graphics/RenderStateBase.h | 2 +- .../Graphics/Vulkan/RenderCommandListVK.cpp | 3 +- .../Methane/Graphics/Vulkan/RenderStateVK.cpp | 4 +- .../Methane/Graphics/Vulkan/RenderStateVK.h | 2 +- 18 files changed, 184 insertions(+), 43 deletions(-) diff --git a/Modules/Data/Primitives/Include/Methane/Data/Types.h b/Modules/Data/Primitives/Include/Methane/Data/Types.h index 4b791c6ed..6ff4c5660 100644 --- a/Modules/Data/Primitives/Include/Methane/Data/Types.h +++ b/Modules/Data/Primitives/Include/Methane/Data/Types.h @@ -68,11 +68,11 @@ struct Rect Size(const Size& size) = default; Size(D w, D h) : width(w), height(h) { } - bool operator==(const Size& other) const - { return width == other.width && height == other.height; } + bool operator==(const Size& other) const noexcept + { return std::tie(width, height) == std::tie(other.height, other.width); } - bool operator!=(const Size& other) const - { return !operator==(other); } + bool operator!=(const Size& other) const noexcept + { return std::tie(width, height) != std::tie(other.height, other.width); } D GetPixelsCount() const noexcept { return width * height; } D GetLongestSide() const noexcept { return std::max(width, height); } @@ -85,6 +85,12 @@ struct Rect operator Rect() const { return { static_cast>(origin), static_cast::Size>(size) }; } + bool operator==(const Rect& other) const noexcept + { return std::tie(origin, size) == std::tie(other.origin, other.size); } + + bool operator!=(const Rect& other) const noexcept + { return std::tie(origin, size) != std::tie(other.origin, other.size); } + operator std::string() const { return std::string("Rt[") + origin + " + " + size + "]"; } diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h index 817c34687..06b28a129 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h @@ -25,11 +25,11 @@ Methane render command list interface. #include "CommandList.h" #include "Buffer.h" +#include "RenderState.h" namespace Methane::Graphics { -struct RenderState; struct RenderPass; struct ParallelRenderCommandList; @@ -54,6 +54,7 @@ struct RenderCommandList : virtual CommandList // RenderCommandList interface virtual void Reset(RenderState& render_state, const std::string& debug_group = "") = 0; + virtual void SetState(RenderState& render_state, RenderState::Group::Mask state_groups = RenderState::Group::All) = 0; virtual void SetVertexBuffers(const Buffer::Refs& vertex_buffers) = 0; virtual void DrawIndexed(Primitive primitive, Buffer& index_buffer, uint32_t index_count = 0, uint32_t start_index = 0, uint32_t start_vertex = 0, diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h index a05704ae8..5f41fa5ae 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h @@ -63,13 +63,19 @@ struct RenderState : virtual Object uint32_t sample_count = 1; bool alpha_to_coverage_enabled = false; bool alpha_to_one_enabled = false; + + bool operator==(const Rasterizer& other) const = default; + bool operator!=(const Rasterizer& other) const = default; }; struct Depth { - bool enabled = false; - bool write_enabled = true; - Compare compare = Compare::Less; + bool enabled = false; + bool write_enabled = true; + Compare compare = Compare::Less; + + bool operator==(const Depth& other) const = default; + bool operator!=(const Depth& other) const = default; }; struct Stencil @@ -88,11 +94,14 @@ struct RenderState : virtual Object struct FaceOperations { - Operation stencil_failure = Operation::Keep; - Operation stencil_pass = Operation::Keep; // DX only - Operation depth_failure = Operation::Keep; - Operation depth_stencil_pass = Operation::Keep; // Metal only - Compare compare = Compare::Always; + Operation stencil_failure = Operation::Keep; + Operation stencil_pass = Operation::Keep; // DX only + Operation depth_failure = Operation::Keep; + Operation depth_stencil_pass= Operation::Keep; // Metal only + Compare compare = Compare::Always; + + bool operator==(const FaceOperations& other) const = default; + bool operator!=(const FaceOperations& other) const = default; }; bool enabled = false; @@ -100,6 +109,27 @@ struct RenderState : virtual Object uint32_t write_mask = static_cast(~0x0); FaceOperations front_face; FaceOperations back_face; + + bool operator==(const Stencil& other) const = default; + bool operator!=(const Stencil& other) const = default; + }; + + struct Group + { + using Mask = uint32_t; + enum Value : Mask + { + None = 0u, + Program = 1u << 0u, + ProgramBindingsOnly = 1u << 1u, + Rasterizer = 1u << 2u, + DepthStencil = 1u << 3u, + Viewports = 1u << 4u, + ScissorRects = 1u << 5u, + All = ~0u + }; + + Group() = delete; }; struct Settings @@ -110,6 +140,8 @@ struct RenderState : virtual Object Rasterizer rasterizer; Depth depth; Stencil stencil; + + static Group::Mask Compare(const Settings& left, const Settings& right, Group::Mask compare_groups = Group::All); }; // Create RenderState instance diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h index ba56192f8..36e313cfe 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h @@ -77,7 +77,6 @@ struct Resource : virtual Object static std::string ToString(Usage::Mask usage_mask) noexcept; Usage() = delete; - ~Usage() = delete; }; struct Descriptor diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h index 44ff20d53..9096b5471 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h @@ -84,10 +84,13 @@ struct Volume Size() = default; Size(const typename Rect::Size& rect_size, D d = 1) : Rect::Size(rect_size), depth(d) { } Size(D w, D h, D d = 1) : Rect::Size(w, h), depth(d) { } - - bool operator==(const Size& other) const + + bool operator==(const Size& other) const noexcept { return Rect::Size::operator==(other) && depth == other.depth; } + bool operator!=(const Size& other) const noexcept + { return Rect::Size::operator!=(other) || depth != other.depth; } + D GetPixelsCount() const noexcept { return depth * Rect::Size::GetPixelsCount(); } D GetLongestSide() const noexcept { return std::max(depth, Rect::Size::GetLongestSide()); } @@ -99,6 +102,12 @@ struct Volume } }; + bool operator==(const Volume& other) const noexcept + { return std::tie(origin, size) == std::tie(other.origin, other.size); } + + bool operator!=(const Volume& other) const noexcept + { return std::tie(origin, size) != std::tie(other.origin, other.size); } + operator std::string() const { return std::string("Vm[") + origin + " + " + size + "]"; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp index d890ae419..7d4c5fb22 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp @@ -105,9 +105,16 @@ void RenderCommandListDX::ResetNative(RenderState& render_state) // Reset command list if (m_is_committed) { + ResetDrawState(); + m_is_committed = false; ThrowIfFailed(m_cp_command_allocator->Reset()); ThrowIfFailed(m_cp_command_list->Reset(m_cp_command_allocator.Get(), dx_state.GetNativePipelineState().Get())); + + m_draw_state.sp_render_state = dx_state.GetPtr(); + m_draw_state.render_state_groups = RenderState::Group::Program + | RenderState::Group::Rasterizer + | RenderState::Group::DepthStencil; } } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp index 4c226de77..c7dde8230 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp @@ -197,17 +197,31 @@ void RenderStateDX::Reset(const Settings& settings) m_cp_pipeline_state.Reset(); } -void RenderStateDX::Apply(RenderCommandListBase& command_list) +void RenderStateDX::Apply(RenderCommandListBase& command_list, Group::Mask state_groups) { ITT_FUNCTION_TASK(); RenderCommandListDX& dx_command_list = static_cast(command_list); wrl::ComPtr& cp_dx_command_list = dx_command_list.GetNativeCommandList(); - cp_dx_command_list->SetPipelineState(GetNativePipelineState().Get()); - cp_dx_command_list->SetGraphicsRootSignature(GetProgramDX().GetNativeRootSignature().Get()); - cp_dx_command_list->RSSetViewports(static_cast(m_viewports.size()), m_viewports.data()); - cp_dx_command_list->RSSetScissorRects(static_cast(m_scissor_rects.size()), m_scissor_rects.data()); + if (state_groups & Group::Program || + state_groups & Group::Rasterizer || + state_groups & Group::DepthStencil) + { + cp_dx_command_list->SetPipelineState(GetNativePipelineState().Get()); + } + if (state_groups & Group::ProgramBindingsOnly) + { + cp_dx_command_list->SetGraphicsRootSignature(GetProgramDX().GetNativeRootSignature().Get()); + } + if (state_groups & Group::Viewports) + { + cp_dx_command_list->RSSetViewports(static_cast(m_viewports.size()), m_viewports.data()); + } + if (state_groups & Group::ScissorRects) + { + cp_dx_command_list->RSSetScissorRects(static_cast(m_scissor_rects.size()), m_scissor_rects.data()); + } } void RenderStateDX::SetViewports(const Viewports& viewports) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.h index d0da3bd02..6c46a5ad8 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.h @@ -50,7 +50,7 @@ class RenderStateDX final : public RenderStateBase void SetScissorRects(const ScissorRects& scissor_rects) override; // RenderStateBase interface - void Apply(RenderCommandListBase& command_list) override; + void Apply(RenderCommandListBase& command_list, Group::Mask state_groups) override; // Object interface void SetName(const std::string& name) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm index d58e89bf6..cf147e99b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm @@ -79,6 +79,8 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit { ITT_FUNCTION_TASK(); + RenderCommandListBase::ResetDrawState(); + StartRenderEncoding(); RenderCommandListBase::Reset(render_state, debug_group); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.hh index 23c8b9b01..8f42e7913 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.hh @@ -46,7 +46,7 @@ public: void SetScissorRects(const ScissorRects& scissor_rects) override; // RenderStateBase interface - void Apply(RenderCommandListBase& command_list) override; + void Apply(RenderCommandListBase& command_list, Group::Mask state_groups) override; // Object interface void SetName(const std::string& name) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm index 1634c31c4..a237c6c20 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm @@ -197,26 +197,33 @@ static MTLWinding ConvertRasterizerFrontWindingToMetal(bool is_front_counter_clo ResetNativeState(); } -void RenderStateMT::Apply(RenderCommandListBase& command_list) +void RenderStateMT::Apply(RenderCommandListBase& command_list, Group::Mask state_groups) { ITT_FUNCTION_TASK(); RenderCommandListMT& metal_command_list = static_cast(command_list); id& mtl_cmd_encoder = metal_command_list.GetNativeRenderEncoder(); - [mtl_cmd_encoder setRenderPipelineState: GetNativePipelineState()]; - if (m_settings.depth.enabled) + if (state_groups & Group::Program || + state_groups & Group::Rasterizer) + { + [mtl_cmd_encoder setRenderPipelineState: GetNativePipelineState()]; + } + if (state_groups & Group::DepthStencil && m_settings.depth.enabled) { [mtl_cmd_encoder setDepthStencilState: GetNativeDepthState()]; } - [mtl_cmd_encoder setTriangleFillMode: m_mtl_fill_mode]; - [mtl_cmd_encoder setFrontFacingWinding: m_mtl_front_face_winding]; - [mtl_cmd_encoder setCullMode: m_mtl_cull_mode]; - if (!m_mtl_viewports.empty()) + if (state_groups & Group::Rasterizer) + { + [mtl_cmd_encoder setTriangleFillMode: m_mtl_fill_mode]; + [mtl_cmd_encoder setFrontFacingWinding: m_mtl_front_face_winding]; + [mtl_cmd_encoder setCullMode: m_mtl_cull_mode]; + } + if (state_groups & Group::Viewports && !m_mtl_viewports.empty()) { [mtl_cmd_encoder setViewports: m_mtl_viewports.data() count:static_cast(m_mtl_viewports.size())]; } - if (!m_mtl_scissor_rects.empty()) + if (state_groups & Group::ScissorRects && !m_mtl_scissor_rects.empty()) { [mtl_cmd_encoder setScissorRects: m_mtl_scissor_rects.data() count:static_cast(m_mtl_scissor_rects.size())]; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp index 5b1e77450..2cc62b3a3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp @@ -60,6 +60,7 @@ void RenderCommandListBase::DrawingState::Reset() opt_primitive_type.reset(); sp_index_buffer.reset(); sp_vertex_buffers.clear(); + sp_render_state.reset(); flags = { }; } @@ -68,7 +69,8 @@ void RenderCommandListBase::Reset(RenderState& render_state, const std::string& { ITT_FUNCTION_TASK(); - m_draw_state.Reset(); + // ResetDrawState() must be called from an overriden Reset method + ResetCommandState(); if (m_debug_group_opened) @@ -82,8 +84,26 @@ void RenderCommandListBase::Reset(RenderState& render_state, const std::string& PushDebugGroup(debug_group); m_debug_group_opened = true; } - - static_cast(render_state).Apply(*this); + + SetState(render_state); +} + +void RenderCommandListBase::SetState(RenderState& render_state, RenderState::Group::Mask state_groups) +{ + ITT_FUNCTION_TASK(); + + const RenderState::Group::Mask changed_states = (m_draw_state.sp_render_state + ? RenderState::Settings::Compare(render_state.GetSettings(), + m_draw_state.sp_render_state->GetSettings(), + m_draw_state.render_state_groups) + : RenderState::Group::All) + | ~m_draw_state.render_state_groups; + + RenderStateBase& render_state_base = static_cast(render_state); + render_state_base.Apply(*this, changed_states & state_groups); + + m_draw_state.sp_render_state = render_state_base.GetPtr(); + m_draw_state.render_state_groups |= state_groups; } void RenderCommandListBase::SetVertexBuffers(const Buffer::Refs& vertex_buffers) @@ -186,6 +206,11 @@ void RenderCommandListBase::Draw(Primitive primitive_type, uint32_t vertex_count m_draw_state.opt_primitive_type = primitive_type; } +void RenderCommandListBase::ResetDrawState() +{ + m_draw_state.Reset(); +} + void RenderCommandListBase::ValidateDrawVertexBuffers(uint32_t draw_start_vertex, uint32_t draw_vertex_count) { for (const BufferBase::Ptr& sp_vertex_buffer : m_draw_state.sp_vertex_buffers) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h index 09bf81cd5..7701b637c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h @@ -26,9 +26,9 @@ Base implementation of the render command list interface. #include "CommandListBase.h" #include "BufferBase.h" #include "RenderPassBase.h" +#include "RenderStateBase.h" #include -#include #include @@ -50,6 +50,7 @@ class RenderCommandListBase // RenderCommandList interface void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void SetState(RenderState& render_state, RenderState::Group::Mask state_groups = RenderState::Group::All) override; void SetVertexBuffers(const Buffer::Refs& vertex_buffers) override; void DrawIndexed(Primitive primitive_type, Buffer& index_buffer, uint32_t index_count, uint32_t start_index, uint32_t start_vertex, @@ -60,20 +61,25 @@ class RenderCommandListBase RenderPassBase& GetPass(); protected: + void ResetDrawState(); void ValidateDrawVertexBuffers(uint32_t draw_start_vertex, uint32_t draw_vertex_count = 0); struct DrawingState { struct Flags { - bool primitive_type_changed = false; - bool index_buffer_changed = false; - bool vertex_buffers_changed = false; + bool primitive_type_changed = false; + bool index_buffer_changed = false; + bool vertex_buffers_changed = false; + + bool operator==(const Flags& other) const noexcept = default; }; std::optional opt_primitive_type; BufferBase::Ptr sp_index_buffer; BufferBase::Ptrs sp_vertex_buffers; + RenderStateBase::Ptr sp_render_state; + RenderState::Group::Mask render_state_groups; Flags flags; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp index c22f38494..bfcd4f9bd 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp @@ -63,4 +63,36 @@ void RenderStateBase::SetScissorRects(const ScissorRects& scissor_rects) m_settings.scissor_rects = scissor_rects; } +RenderState::Group::Mask RenderState::Settings::Compare(const Settings& left, const Settings& right, Group::Mask compare_groups) +{ + Group::Mask changed_state_groups = Group::ProgramBindingsOnly; + if (compare_groups & Group::Program && + left.sp_program.get() != right.sp_program.get()) + { + changed_state_groups |= Group::Program; + } + if (compare_groups & Group::DepthStencil && ( + left.depth != right.depth || + left.stencil != right.stencil)) + { + changed_state_groups |= Group::DepthStencil; + } + if (compare_groups & Group::Rasterizer && + left.rasterizer != right.rasterizer) + { + changed_state_groups |= Group::Rasterizer; + } + if (compare_groups & Group::Viewports && + left.viewports != right.viewports) + { + changed_state_groups |= Group::Viewports; + } + if (compare_groups & Group::ScissorRects && + left.scissor_rects != right.scissor_rects) + { + changed_state_groups |= Group::ScissorRects; + } + return changed_state_groups; +} + } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.h index 43cbba571..0eabad2b0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.h @@ -48,7 +48,7 @@ class RenderStateBase void SetScissorRects(const ScissorRects& scissor_rects) override; // RenderStateBase interface - virtual void Apply(RenderCommandListBase& command_list) = 0; + virtual void Apply(RenderCommandListBase& command_list, Group::Mask apply_groups) = 0; Ptr GetPtr() { return shared_from_this(); } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp index 4a9d0a8a1..5b4bff3e4 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp @@ -61,7 +61,8 @@ RenderCommandListVK::RenderCommandListVK(ParallelRenderCommandListBase& parallel void RenderCommandListVK::Reset(RenderState& render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); - + + RenderCommandListBase::ResetDrawState(); RenderCommandListBase::Reset(render_state, debug_group); } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp index 3d0830b0e..6944cef33 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp @@ -61,7 +61,7 @@ void RenderStateVK::Reset(const Settings& settings) { throw std::invalid_argument("Can not create state with empty program."); } - + RenderStateBase::Reset(settings); ProgramVK& vulkan_program = static_cast(*m_settings.sp_program); @@ -78,7 +78,7 @@ void RenderStateVK::Reset(const Settings& settings) ResetNativeState(); } -void RenderStateVK::Apply(RenderCommandListBase& command_list) +void RenderStateVK::Apply(RenderCommandListBase& command_list, Group::Mask state_groups) { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.h index 60bb9ab56..0fa5f2262 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.h @@ -44,7 +44,7 @@ class RenderStateVK : public RenderStateBase void SetScissorRects(const ScissorRects& scissor_rects) override; // RenderStateBase interface - void Apply(RenderCommandListBase& command_list) override; + void Apply(RenderCommandListBase& command_list, Group::Mask state_groups) override; // Object interface void SetName(const std::string& name) override; From 147ddf1e4d2dcd70c5981948c84fc6f0e766cbc8 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 5 Jan 2020 19:10:55 +0300 Subject: [PATCH 076/129] Fixed build. --- .../Include/Methane/Graphics/RenderState.h | 18 ++-- .../Methane/Graphics/RenderCommandListBase.h | 8 +- .../Methane/Graphics/RenderStateBase.cpp | 94 ++++++++++++++----- 3 files changed, 82 insertions(+), 38 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h index 5f41fa5ae..3158604b7 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h @@ -64,8 +64,8 @@ struct RenderState : virtual Object bool alpha_to_coverage_enabled = false; bool alpha_to_one_enabled = false; - bool operator==(const Rasterizer& other) const = default; - bool operator!=(const Rasterizer& other) const = default; + bool operator==(const Rasterizer& other) const noexcept; + bool operator!=(const Rasterizer& other) const noexcept; }; struct Depth @@ -74,8 +74,8 @@ struct RenderState : virtual Object bool write_enabled = true; Compare compare = Compare::Less; - bool operator==(const Depth& other) const = default; - bool operator!=(const Depth& other) const = default; + bool operator==(const Depth& other) const noexcept; + bool operator!=(const Depth& other) const noexcept; }; struct Stencil @@ -100,8 +100,8 @@ struct RenderState : virtual Object Operation depth_stencil_pass= Operation::Keep; // Metal only Compare compare = Compare::Always; - bool operator==(const FaceOperations& other) const = default; - bool operator!=(const FaceOperations& other) const = default; + bool operator==(const FaceOperations& other) const noexcept; + bool operator!=(const FaceOperations& other) const noexcept; }; bool enabled = false; @@ -110,8 +110,8 @@ struct RenderState : virtual Object FaceOperations front_face; FaceOperations back_face; - bool operator==(const Stencil& other) const = default; - bool operator!=(const Stencil& other) const = default; + bool operator==(const Stencil& other) const noexcept; + bool operator!=(const Stencil& other) const noexcept; }; struct Group @@ -141,7 +141,7 @@ struct RenderState : virtual Object Depth depth; Stencil stencil; - static Group::Mask Compare(const Settings& left, const Settings& right, Group::Mask compare_groups = Group::All); + static Group::Mask Compare(const Settings& left, const Settings& right, Group::Mask compare_groups = Group::All) noexcept; }; // Create RenderState instance diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h index 7701b637c..a4bde3be8 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h @@ -68,11 +68,9 @@ class RenderCommandListBase { struct Flags { - bool primitive_type_changed = false; - bool index_buffer_changed = false; - bool vertex_buffers_changed = false; - - bool operator==(const Flags& other) const noexcept = default; + bool primitive_type_changed = false; + bool index_buffer_changed = false; + bool vertex_buffers_changed = false; }; std::optional opt_primitive_type; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp index bfcd4f9bd..a00954ed6 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp @@ -30,42 +30,54 @@ Base implementation of the render state interface. namespace Methane::Graphics { -RenderStateBase::RenderStateBase(ContextBase& context, const Settings& settings) - : m_context(context) - , m_settings(settings) +bool RenderState::Rasterizer::operator==(const Rasterizer& other) const noexcept { - ITT_FUNCTION_TASK(); + return std::tie(is_front_counter_clockwise, cull_mode, fill_mode, sample_count, alpha_to_coverage_enabled, alpha_to_one_enabled) == + std::tie(other.is_front_counter_clockwise, other.cull_mode, other.fill_mode, other.sample_count, other.alpha_to_coverage_enabled, other.alpha_to_one_enabled); } -void RenderStateBase::Reset(const Settings& settings) +bool RenderState::Rasterizer::operator!=(const Rasterizer& other) const noexcept { - ITT_FUNCTION_TASK(); - m_settings = settings; + return !operator==(other); } -void RenderStateBase::SetViewports(const Viewports& viewports) +bool RenderState::Depth::operator==(const Depth& other) const noexcept { - ITT_FUNCTION_TASK(); - if (viewports.empty()) - { - throw std::invalid_argument("Can not set empty viewports to state."); - } - m_settings.viewports = viewports; + return std::tie(enabled, write_enabled, compare) == + std::tie(other.enabled, other.write_enabled, other.compare); +} +bool RenderState::Depth::operator!=(const Depth& other) const noexcept +{ + return !operator==(other); } -void RenderStateBase::SetScissorRects(const ScissorRects& scissor_rects) +bool RenderState::Stencil::FaceOperations::operator==(const FaceOperations& other) const noexcept { - ITT_FUNCTION_TASK(); - if (scissor_rects.empty()) - { - throw std::invalid_argument("Can not set empty scissor rectangles to state."); - } - m_settings.scissor_rects = scissor_rects; + return std::tie(stencil_failure, stencil_pass, depth_failure, depth_stencil_pass, compare) == + std::tie(other.stencil_failure, other.stencil_pass, other.depth_failure, other.depth_stencil_pass, other.compare); +} + +bool RenderState::Stencil::FaceOperations::operator!=(const FaceOperations& other) const noexcept +{ + return !operator==(other); +} + +bool RenderState::Stencil::operator==(const Stencil& other) const noexcept +{ + return std::tie(enabled, read_mask, write_mask, front_face, back_face) == + std::tie(other.enabled, other.read_mask, other.write_mask, other.front_face, other.back_face); +} +bool RenderState::Stencil::operator!=(const Stencil& other) const noexcept +{ + return !operator==(other); } -RenderState::Group::Mask RenderState::Settings::Compare(const Settings& left, const Settings& right, Group::Mask compare_groups) +RenderState::Group::Mask RenderState::Settings::Compare(const Settings& left, const Settings& right, Group::Mask compare_groups) noexcept { + ITT_FUNCTION_TASK(); + Group::Mask changed_state_groups = Group::ProgramBindingsOnly; + if (compare_groups & Group::Program && left.sp_program.get() != right.sp_program.get()) { @@ -77,7 +89,7 @@ RenderState::Group::Mask RenderState::Settings::Compare(const Settings& left, co { changed_state_groups |= Group::DepthStencil; } - if (compare_groups & Group::Rasterizer && + if (compare_groups & Group::Rasterizer && left.rasterizer != right.rasterizer) { changed_state_groups |= Group::Rasterizer; @@ -87,12 +99,46 @@ RenderState::Group::Mask RenderState::Settings::Compare(const Settings& left, co { changed_state_groups |= Group::Viewports; } - if (compare_groups & Group::ScissorRects && + if (compare_groups & Group::ScissorRects && left.scissor_rects != right.scissor_rects) { changed_state_groups |= Group::ScissorRects; } + return changed_state_groups; } + +RenderStateBase::RenderStateBase(ContextBase& context, const Settings& settings) + : m_context(context) + , m_settings(settings) +{ + ITT_FUNCTION_TASK(); +} + +void RenderStateBase::Reset(const Settings& settings) +{ + ITT_FUNCTION_TASK(); + m_settings = settings; +} + +void RenderStateBase::SetViewports(const Viewports& viewports) +{ + ITT_FUNCTION_TASK(); + if (viewports.empty()) + { + throw std::invalid_argument("Can not set empty viewports to state."); + } + m_settings.viewports = viewports; +} + +void RenderStateBase::SetScissorRects(const ScissorRects& scissor_rects) +{ + ITT_FUNCTION_TASK(); + if (scissor_rects.empty()) + { + throw std::invalid_argument("Can not set empty scissor rectangles to state."); + } + m_settings.scissor_rects = scissor_rects; +} } // namespace Methane::Graphics From a6ce6befe278a2f0fbef4ea53a781a8787865635 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 5 Jan 2020 20:11:05 +0300 Subject: [PATCH 077/129] 16-bit mesh indices are used by default instead of 32-bit indices to improve performance on complex scenes (asteroids sample). --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 +- .../02-TexturedCube/TexturedCubeApp.cpp | 2 +- .../Core/Include/Methane/Graphics/Types.h | 16 ++++++++++++++++ .../Methane/Graphics/DirectX12/TypesDX.cpp | 4 +++- .../Sources/Methane/Graphics/Metal/TypesMT.mm | 10 +--------- .../Include/Methane/Graphics/MeshBuffers.hpp | 3 +-- .../Helpers/Include/Methane/Graphics/Mesh.h | 14 +++++++++++--- 7 files changed, 34 insertions(+), 17 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 99bf77945..d3abfd58d 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -71,7 +71,7 @@ AsteroidsArray::UberMesh::UberMesh(uint32_t instance_count, uint32_t subdivision std::lock_guard lock_guard(data_mutex); m_depth_ranges.emplace_back(asteroid_mesh.GetDepthRange()); - AddSubMesh(asteroid_mesh, true); + AddSubMesh(asteroid_mesh, false); }); } } diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp index 99fccb2a2..f76d9e356 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp @@ -167,7 +167,7 @@ void TexturedCubeApp::Init() // Create index buffer for cube mesh const Data::Size index_data_size = static_cast(m_cube_mesh.GetIndexDataSize()); - m_sp_index_buffer = gfx::Buffer::CreateIndexBuffer(*m_sp_context, index_data_size, gfx::PixelFormat::R32Uint); + m_sp_index_buffer = gfx::Buffer::CreateIndexBuffer(*m_sp_context, index_data_size, gfx::GetIndexFormat(m_cube_mesh.GetIndex(0))); m_sp_index_buffer->SetName("Cube Index Buffer"); m_sp_index_buffer->SetData({ { reinterpret_cast(m_cube_mesh.GetIndices().data()), index_data_size } }); diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h index 9096b5471..f7013663e 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h @@ -191,11 +191,27 @@ enum class PixelFormat R32Uint, R32Sint, R16Uint, + R16Sint, Depth32Float }; uint32_t GetPixelSize(PixelFormat data_format) noexcept; +template +PixelFormat GetIndexFormat(TIndex) noexcept { return PixelFormat::Unknown; } + +template<> +inline PixelFormat GetIndexFormat(uint32_t) noexcept { return PixelFormat::R32Uint; } + +template<> +inline PixelFormat GetIndexFormat(int32_t) noexcept { return PixelFormat::R32Sint; } + +template<> +inline PixelFormat GetIndexFormat(uint16_t) noexcept { return PixelFormat::R16Uint; } + +template<> +inline PixelFormat GetIndexFormat(int16_t) noexcept { return PixelFormat::R16Sint; } + enum class Compare : uint32_t { Never = 0, diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TypesDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TypesDX.cpp index 59b20d225..e5dabeeb3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TypesDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TypesDX.cpp @@ -83,7 +83,9 @@ DXGI_FORMAT TypeConverterDX::DataFormatToDXGI(const PixelFormat& data_format) no case PixelFormat::R32Float: return DXGI_FORMAT_R32_FLOAT; case PixelFormat::R32Uint: return DXGI_FORMAT_R32_UINT; case PixelFormat::R32Sint: return DXGI_FORMAT_R32_SINT; - default: assert(0); + case PixelFormat::R16Uint: return DXGI_FORMAT_R16_UINT; + case PixelFormat::R16Sint: return DXGI_FORMAT_R16_SINT; + default: assert(0); } return DXGI_FORMAT_UNKNOWN; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/TypesMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/TypesMT.mm index 16536f686..0dc9faea3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/TypesMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/TypesMT.mm @@ -57,6 +57,7 @@ case PixelFormat::R32Uint: return MTLPixelFormatR32Uint; case PixelFormat::R32Sint: return MTLPixelFormatR32Sint; case PixelFormat::R16Uint: return MTLPixelFormatRG16Uint; + case PixelFormat::R16Sint: return MTLPixelFormatRG16Sint; case PixelFormat::Depth32Float: return MTLPixelFormatDepth32Float; // MTLPixelFormatA8Unorm; // MTLPixelFormatR8Unorm; @@ -72,20 +73,12 @@ // MTLPixelFormatRG8Snorm; // MTLPixelFormatRG8Uint; // MTLPixelFormatRG8Sint; - // MTLPixelFormatR32Uint; - // MTLPixelFormatR32Sint; - // MTLPixelFormatR32Float; // MTLPixelFormatRG16Unorm; // MTLPixelFormatRG16Snorm; - // MTLPixelFormatRG16Uint; - // MTLPixelFormatRG16Sint; // MTLPixelFormatRG16Float; - // MTLPixelFormatRGBA8Unorm; // MTLPixelFormatRGBA8Unorm_sRGB; // MTLPixelFormatRGBA8Snorm; - // MTLPixelFormatRGBA8Uint; // MTLPixelFormatRGBA8Sint; - // MTLPixelFormatBGRA8Unorm; // MTLPixelFormatBGRA8Unorm_sRGB; // MTLPixelFormatRGB10A2Unorm; // MTLPixelFormatRGB10A2Uint; @@ -120,7 +113,6 @@ // MTLPixelFormatGBGR422; // MTLPixelFormatBGRG422; // MTLPixelFormatDepth16Unorm; - // MTLPixelFormatDepth32Float; // MTLPixelFormatStencil8; // MTLPixelFormatDepth24Unorm_Stencil8; // MTLPixelFormatDepth32Float_Stencil8; diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp index 9ae8a0ea9..e36c7c8fa 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp @@ -66,8 +66,7 @@ class MeshBuffers { 0, mesh_data.GetIndexCount() }, true ) }) , m_sp_vertex(Buffer::CreateVertexBuffer(context, static_cast(mesh_data.GetVertexDataSize()), static_cast(mesh_data.GetVertexSize()))) - , m_sp_index( Buffer::CreateIndexBuffer( context, static_cast(mesh_data.GetIndexDataSize()), - PixelFormat::R32Uint)) + , m_sp_index( Buffer::CreateIndexBuffer( context, static_cast(mesh_data.GetIndexDataSize()), GetIndexFormat(mesh_data.GetIndex(0)))) { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h index 0447c3a0c..e4ac146be 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h @@ -46,7 +46,7 @@ class Mesh using Normal = Vector3f; using Color = Vector4f; using TexCoord = Vector2f; - using Index = uint32_t; + using Index = uint16_t; using Indices = std::vector; enum class Type @@ -114,6 +114,7 @@ class Mesh const VertexLayout& GetVertexLayout() const noexcept { return m_vertex_layout; } Data::Size GetVertexSize() const noexcept { return m_vertex_size; } const Indices& GetIndices() const noexcept { return m_indices; } + const Index GetIndex(uint32_t i) const noexcept { return i < m_indices.size() ? m_indices[i] : 0; } Data::Size GetIndexCount() const noexcept { return static_cast(m_indices.size()); } Data::Size GetIndexDataSize() const noexcept { return static_cast(m_indices.size() * sizeof(Index)); } @@ -316,9 +317,16 @@ class UberMesh : public BaseMesh if (adjust_indices) { - const Mesh::Index index_offset = static_cast(BaseMeshT::GetVertexCount()); + const Data::Size vertex_count = BaseMeshT::GetVertexCount(); + assert(vertex_count <= std::numeric_limits::max()); + + const Mesh::Index index_offset = static_cast(vertex_count); std::transform(sub_indices.begin(), sub_indices.end(), std::back_inserter(Mesh::m_indices), - [index_offset](const Mesh::Index& index) { return index_offset + index; }); + [index_offset](const Mesh::Index& index) + { + assert(static_cast(index_offset) + index <= std::numeric_limits::max()); + return index_offset + index; + }); } else { From 0afa2a1c8bfd30b0d051b90e67f42cf1fca8cfc7 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 6 Jan 2020 14:23:39 +0300 Subject: [PATCH 078/129] Asteroids array update minor code improvement. --- Apps/Samples/Asteroids/Asteroid.h | 4 ++-- Apps/Samples/Asteroids/AsteroidsArray.cpp | 21 ++++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Apps/Samples/Asteroids/Asteroid.h b/Apps/Samples/Asteroids/Asteroid.h index cd514cf47..66b9ed630 100644 --- a/Apps/Samples/Asteroids/Asteroid.h +++ b/Apps/Samples/Asteroids/Asteroid.h @@ -90,8 +90,8 @@ class Asteroid final : public gfx::TexturedMeshBuffers const gfx::Point3f spin_axis; const float orbit_speed; const float spin_speed; - float spin_angle_rad; - float orbit_angle_rad; + const float spin_angle_rad; + const float orbit_angle_rad; }; struct TextureNoiseParameters diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index d3abfd58d..b6aeb7c39 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -328,7 +328,7 @@ void AsteroidsArray::Resize(const gfx::FrameSize &frame_size) m_sp_render_state->SetScissorRects({ gfx::GetFrameScissorRect(frame_size) }); } -bool AsteroidsArray::Update(double /*elapsed_seconds*/, double delta_seconds) +bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) { ITT_FUNCTION_TASK(); SCOPE_TIMER("AsteroidsArray::Update"); @@ -336,27 +336,30 @@ bool AsteroidsArray::Update(double /*elapsed_seconds*/, double delta_seconds) gfx::Matrix44f scene_view_matrix, scene_proj_matrix; m_settings.view_camera.GetViewProjMatrices(scene_view_matrix, scene_proj_matrix); - Data::ParallelForEach(m_sp_content_state->parameters.begin(), m_sp_content_state->parameters.end(), - [&](Asteroid::Parameters& asteroid_parameters) + const float elapsed_radians = cml::constants::pi()* static_cast(elapsed_seconds); + + Data::ParallelForEach(m_sp_content_state->parameters.begin(), m_sp_content_state->parameters.end(), + [&](const Asteroid::Parameters& asteroid_parameters) { ITT_FUNCTION_TASK(); - asteroid_parameters.spin_angle_rad += cml::constants::pi() * asteroid_parameters.spin_speed * static_cast(delta_seconds); - asteroid_parameters.orbit_angle_rad += cml::constants::pi() * asteroid_parameters.orbit_speed * static_cast(delta_seconds); + const float spin_angle_rad = asteroid_parameters.spin_angle_rad + asteroid_parameters.spin_speed * elapsed_radians; + const float orbit_angle_rad = asteroid_parameters.orbit_angle_rad + asteroid_parameters.orbit_speed * elapsed_radians; gfx::Matrix44f spin_rotation_matrix; - cml::matrix_rotation_axis_angle(spin_rotation_matrix, asteroid_parameters.spin_axis, asteroid_parameters.spin_angle_rad); + cml::matrix_rotation_axis_angle(spin_rotation_matrix, asteroid_parameters.spin_axis, spin_angle_rad); gfx::Matrix44f orbit_rotation_matrix; - cml::matrix_rotation_world_y(orbit_rotation_matrix, asteroid_parameters.orbit_angle_rad); + cml::matrix_rotation_world_y(orbit_rotation_matrix, orbit_angle_rad); - gfx::Matrix44f model_matrix = asteroid_parameters.scale_matrix * spin_rotation_matrix * asteroid_parameters.translation_matrix * orbit_rotation_matrix; + const gfx::Matrix44f model_matrix = asteroid_parameters.scale_matrix * spin_rotation_matrix * asteroid_parameters.translation_matrix * orbit_rotation_matrix; + const gfx::Matrix44f mvp_matrix = model_matrix * scene_view_matrix * scene_proj_matrix; SetFinalPassUniforms( AsteroidUniforms { model_matrix, - model_matrix * scene_view_matrix * scene_proj_matrix, + mvp_matrix, asteroid_parameters.colors.deep, asteroid_parameters.colors.shallow, asteroid_parameters.depth_range, From 8edac04b82b1a7754c55206dc5a3fccf206be802 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 6 Jan 2020 17:32:24 +0300 Subject: [PATCH 079/129] RenderState is made optional argument of RenderCommandList::Reset, which allowed to get rid of excessive pipeline state settings calls in parallel command lists. --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 4 +- Apps/Samples/Asteroids/Planet.cpp | 2 +- .../01-HelloTriangle/HelloTriangleApp.cpp | 2 +- .../HelloTriangleAppSimple.cpp | 2 +- .../02-TexturedCube/TexturedCubeApp.cpp | 2 +- .../Tutorials/03-ShadowCube/ShadowCubeApp.cpp | 2 +- .../Graphics/ParallelRenderCommandList.h | 2 +- .../Methane/Graphics/RenderCommandList.h | 2 +- .../Methane/Graphics/CommandListBase.h | 5 ++- .../DirectX12/ParallelRenderCommandListDX.cpp | 13 ++++--- .../DirectX12/ParallelRenderCommandListDX.h | 2 +- .../DirectX12/RenderCommandListDX.cpp | 38 ++++++++++--------- .../Graphics/DirectX12/RenderCommandListDX.h | 4 +- .../Metal/ParallelRenderCommandListMT.hh | 2 +- .../Metal/ParallelRenderCommandListMT.mm | 4 +- .../Graphics/Metal/RenderCommandListMT.hh | 2 +- .../Graphics/Metal/RenderCommandListMT.mm | 4 +- .../ParallelRenderCommandListBase.cpp | 4 +- .../Graphics/ParallelRenderCommandListBase.h | 2 +- .../Graphics/RenderCommandListBase.cpp | 7 +++- .../Methane/Graphics/RenderCommandListBase.h | 2 +- .../Vulkan/ParallelRenderCommandListVK.cpp | 4 +- .../Vulkan/ParallelRenderCommandListVK.h | 2 +- .../Graphics/Vulkan/RenderCommandListVK.cpp | 4 +- .../Graphics/Vulkan/RenderCommandListVK.h | 2 +- .../Sources/Methane/Graphics/SkyBox.cpp | 2 +- 26 files changed, 65 insertions(+), 56 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index b6aeb7c39..bbdcdcaaa 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -383,7 +383,7 @@ void AsteroidsArray::Draw(gfx::RenderCommandList &cmd_list, gfx::MeshBufferBindi assert(buffer_bindings.sp_uniforms_buffer->GetDataSize() >= uniforms_buffer_size); buffer_bindings.sp_uniforms_buffer->SetData({ { reinterpret_cast(&GetFinalPassUniforms()), uniforms_buffer_size } }); - cmd_list.Reset(*m_sp_render_state, "Asteroids rendering"); + cmd_list.Reset(m_sp_render_state, "Asteroids rendering"); assert(buffer_bindings.resource_bindings_per_instance.size() == m_settings.instance_count); BaseBuffers::Draw(cmd_list, buffer_bindings.resource_bindings_per_instance, @@ -400,7 +400,7 @@ void AsteroidsArray::DrawParallel(gfx::ParallelRenderCommandList& parallel_cmd_l assert(buffer_bindings.sp_uniforms_buffer->GetDataSize() >= uniforms_buffer_size); buffer_bindings.sp_uniforms_buffer->SetData({ { reinterpret_cast(&GetFinalPassUniforms()), uniforms_buffer_size } }); - parallel_cmd_list.Reset(*m_sp_render_state, "Asteroids Rendering"); + parallel_cmd_list.Reset(m_sp_render_state, "Asteroids Rendering"); assert(buffer_bindings.resource_bindings_per_instance.size() == m_settings.instance_count); BaseBuffers::Draw(parallel_cmd_list, buffer_bindings.resource_bindings_per_instance, diff --git a/Apps/Samples/Asteroids/Planet.cpp b/Apps/Samples/Asteroids/Planet.cpp index f0c21907b..a42c784a1 100644 --- a/Apps/Samples/Asteroids/Planet.cpp +++ b/Apps/Samples/Asteroids/Planet.cpp @@ -141,7 +141,7 @@ void Planet::Draw(gfx::RenderCommandList& cmd_list, gfx::MeshBufferBindings& buf assert(buffer_bindings.sp_uniforms_buffer->GetDataSize() >= sizeof(Uniforms)); buffer_bindings.sp_uniforms_buffer->SetData({ { reinterpret_cast(&m_mesh_buffers.GetFinalPassUniforms()), sizeof(Uniforms) } }); - cmd_list.Reset(*m_sp_state, "Planet rendering"); + cmd_list.Reset(m_sp_state, "Planet rendering"); assert(!buffer_bindings.resource_bindings_per_instance.empty()); assert(!!buffer_bindings.resource_bindings_per_instance[0]); diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp index f7e350386..67867d5b0 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp @@ -150,7 +150,7 @@ bool HelloTriangleApp::Render() assert(!!m_sp_state); // Issue commands for triangle rendering - frame.sp_cmd_list->Reset(*m_sp_state, "Cube redering"); + frame.sp_cmd_list->Reset(m_sp_state, "Cube redering"); frame.sp_cmd_list->SetVertexBuffers({ *m_sp_vertex_buffer }); frame.sp_cmd_list->Draw(gfx::RenderCommandList::Primitive::Triangle, static_cast(m_triangle_vertices.size())); frame.sp_cmd_list->Commit(true); diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp index 62f93258a..af86d129b 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp @@ -121,7 +121,7 @@ class HelloTriangleApp final : public GraphicsApp m_sp_context->WaitForGpu(Context::WaitFor::FramePresented); HelloTriangleFrame& frame = GetCurrentFrame(); - frame.sp_cmd_list->Reset(*m_sp_state); + frame.sp_cmd_list->Reset(m_sp_state); frame.sp_cmd_list->SetVertexBuffers({ *m_sp_vertex_buffer }); frame.sp_cmd_list->Draw(RenderCommandList::Primitive::Triangle, 3); frame.sp_cmd_list->Commit(true); diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp index f76d9e356..58f8dc5a3 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp @@ -241,7 +241,7 @@ bool TexturedCubeApp::Render() frame.sp_uniforms_buffer->SetData({ { reinterpret_cast(&m_shader_uniforms), sizeof(Uniforms) } }); // Issue commands for cube rendering - frame.sp_cmd_list->Reset(*m_sp_state, "Cube redering"); + frame.sp_cmd_list->Reset(m_sp_state, "Cube redering"); frame.sp_cmd_list->SetResourceBindings(*frame.sp_resource_bindings); frame.sp_cmd_list->SetVertexBuffers({ *m_sp_vertex_buffer }); frame.sp_cmd_list->DrawIndexed(gfx::RenderCommandList::Primitive::Triangle, *m_sp_index_buffer); diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp index d0995453f..8710e7032 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp @@ -427,7 +427,7 @@ void ShadowCubeApp::RenderScene(const RenderPass &render_pass, ShadowCubeFrame:: gfx::RenderCommandList& cmd_list = *render_pass_resources.sp_cmd_list; assert(!!render_pass.sp_state); - cmd_list.Reset(*render_pass.sp_state, render_pass.command_group_name); + cmd_list.Reset(render_pass.sp_state, render_pass.command_group_name); // Cube drawing assert(!!render_pass_resources.cube.sp_resource_bindings); diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h index 1339989c2..75f68959c 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h @@ -40,7 +40,7 @@ struct ParallelRenderCommandList : virtual CommandList static Ptr Create(CommandQueue& command_queue, RenderPass& render_pass); // ParallelRenderCommandList interface - virtual void Reset(RenderState& render_state, const std::string& debug_group = "") = 0; + virtual void Reset(const RenderState::Ptr& sp_render_state = RenderState::Ptr(), const std::string& debug_group = "") = 0; virtual void SetParallelCommandListsCount(uint32_t count) = 0; virtual const RenderCommandList::Ptrs& GetParallelCommandLists() const = 0; }; diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h index 06b28a129..c552af4d7 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h @@ -53,7 +53,7 @@ struct RenderCommandList : virtual CommandList static Ptr Create(ParallelRenderCommandList& parallel_command_list); // RenderCommandList interface - virtual void Reset(RenderState& render_state, const std::string& debug_group = "") = 0; + virtual void Reset(const RenderState::Ptr& sp_render_state = RenderState::Ptr(), const std::string& debug_group = "") = 0; virtual void SetState(RenderState& render_state, RenderState::Group::Mask state_groups = RenderState::Group::All) = 0; virtual void SetVertexBuffers(const Buffer::Refs& vertex_buffers) = 0; virtual void DrawIndexed(Primitive primitive, Buffer& index_buffer, diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h index be0ee4b9c..56d871c18 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/CommandListBase.h @@ -75,8 +75,9 @@ class CommandListBase virtual void Complete(uint32_t frame_index); void SetResourceTransitionBarriers(const Resource::Refs& resources, ResourceBase::State state_before, ResourceBase::State state_after); - const CommandState& GetCommandState() const { return m_command_state; } - Ptr GetPtr() { return shared_from_this(); } + const CommandState& GetCommandState() const { return m_command_state; } + Ptr GetPtr() { return shared_from_this(); } + void SetDebugGroupOpened(bool debug_group_opened) { m_debug_group_opened = debug_group_opened; } protected: CommandQueueBase& GetCommandQueueBase(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp index 9eac23384..947d910a3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.cpp @@ -67,17 +67,20 @@ ParallelRenderCommandListDX::ParallelRenderCommandListDX(CommandQueueBase& cmd_b assert(!!cp_device); } -void ParallelRenderCommandListDX::Reset(RenderState& render_state, const std::string& debug_group) +void ParallelRenderCommandListDX::Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); // Render pass is begun in "beginning" command list only, // but it will be ended in the "ending" command list on commit of the parallel CL - m_begining_command_list.Reset(render_state, GetTrailingCommandListDebugName(debug_group, true)); // begins render pass - m_ending_command_list.ResetNative(render_state); // only resets native command lists - m_ending_command_list.PushDebugGroup(GetTrailingCommandListDebugName(debug_group, false)); + m_begining_command_list.Reset(RenderState::Ptr(), debug_group); // begins render pass + m_ending_command_list.ResetNative(); // only reset native command list - ParallelRenderCommandListBase::Reset(render_state, debug_group); + // Instead of closing debug group (from Reset call) on beginning CL commit, we force to close it in ending CL + m_begining_command_list.SetDebugGroupOpened(false); + m_ending_command_list.SetDebugGroupOpened(true); + + ParallelRenderCommandListBase::Reset(sp_render_state, debug_group); } void ParallelRenderCommandListDX::SetName(const std::string& name) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h index 20e6d4c20..68fc680e7 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ParallelRenderCommandListDX.h @@ -39,7 +39,7 @@ class ParallelRenderCommandListDX final : public ParallelRenderCommandListBase ParallelRenderCommandListDX(CommandQueueBase& cmd_buffer, RenderPassBase& render_pass); // ParallelRenderCommandList interface - void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group = "") override; // CommandList interface void Commit(bool present_drawable) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp index 7d4c5fb22..945372444 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.cpp @@ -97,34 +97,36 @@ void RenderCommandListDX::Initialize() m_cp_command_list.As(&m_cp_command_list_4); } -void RenderCommandListDX::ResetNative(RenderState& render_state) +void RenderCommandListDX::ResetNative(const RenderState::Ptr& sp_render_state) { - assert(m_cp_command_list); - RenderStateDX& dx_state = static_cast(render_state); - // Reset command list - if (m_is_committed) - { - ResetDrawState(); + if (!m_is_committed) + return; - m_is_committed = false; - ThrowIfFailed(m_cp_command_allocator->Reset()); - ThrowIfFailed(m_cp_command_list->Reset(m_cp_command_allocator.Get(), dx_state.GetNativePipelineState().Get())); + m_is_committed = false; - m_draw_state.sp_render_state = dx_state.GetPtr(); - m_draw_state.render_state_groups = RenderState::Group::Program - | RenderState::Group::Rasterizer - | RenderState::Group::DepthStencil; - } + ResetDrawState(); + + ID3D12PipelineState* p_dx_initial_state = sp_render_state ? static_cast(*sp_render_state).GetNativePipelineState().Get() : nullptr; + ThrowIfFailed(m_cp_command_allocator->Reset()); + ThrowIfFailed(m_cp_command_list->Reset(m_cp_command_allocator.Get(), p_dx_initial_state)); + + if (!sp_render_state) + return; + + m_draw_state.sp_render_state = static_cast(*sp_render_state).GetPtr(); + m_draw_state.render_state_groups = RenderState::Group::Program + | RenderState::Group::Rasterizer + | RenderState::Group::DepthStencil; } -void RenderCommandListDX::Reset(RenderState& render_state, const std::string& debug_group) +void RenderCommandListDX::Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); - ResetNative(render_state); + ResetNative(sp_render_state); - RenderCommandListBase::Reset(render_state, debug_group); + RenderCommandListBase::Reset(sp_render_state, debug_group); RenderPassDX& pass_dx = GetPassDX(); if (m_is_parallel) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h index 3dfac6e33..d5b9b2729 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderCommandListDX.h @@ -53,10 +53,10 @@ class RenderCommandListDX final : public RenderCommandListBase void SetResourceBarriers(const ResourceBase::Barriers& resource_barriers) override; void Execute(uint32_t frame_index) override; - void ResetNative(RenderState& render_state); + void ResetNative(const RenderState::Ptr& sp_render_state = RenderState::Ptr()); // RenderCommandList interface - void Reset(RenderState& render_state, const std::string& debug_group) override; + void Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) override; void SetVertexBuffers(const Buffer::Refs& vertex_buffers) override; void DrawIndexed(Primitive primitive, Buffer& index_buffer, uint32_t index_count, uint32_t start_index, uint32_t start_vertex, diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh index d4d8c01c2..eb7767762 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.hh @@ -44,7 +44,7 @@ public: ParallelRenderCommandListMT(CommandQueueBase& command_queue, RenderPassBase& render_pass); // ParallelRenderCommandList interface - void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group = "") override; // CommandList interface void Commit(bool present_drawable) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm index 287698b0f..5a1c4f935 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ParallelRenderCommandListMT.mm @@ -63,7 +63,7 @@ } } -void ParallelRenderCommandListMT::Reset(RenderState& render_state, const std::string& debug_group) +void ParallelRenderCommandListMT::Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); if (m_mtl_parallel_render_encoder != nil) @@ -89,7 +89,7 @@ assert(m_mtl_parallel_render_encoder != nil); m_mtl_parallel_render_encoder.label = MacOS::ConvertToNSType(GetName()); - ParallelRenderCommandListBase::Reset(render_state, debug_group); + ParallelRenderCommandListBase::Reset(sp_render_state, debug_group); } void ParallelRenderCommandListMT::Commit(bool present_drawable) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh index 0036de151..19890f9f0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.hh @@ -52,7 +52,7 @@ public: void Execute(uint32_t frame_index) override; // RenderCommandList interface - void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group = "") override; void SetVertexBuffers(const Buffer::Refs& vertex_buffers) override; void DrawIndexed(Primitive primitive, Buffer& index_buffer, uint32_t index_count, uint32_t start_index, uint32_t start_vertex, diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm index cf147e99b..35da0a1e0 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderCommandListMT.mm @@ -75,7 +75,7 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit ITT_FUNCTION_TASK(); } -void RenderCommandListMT::Reset(RenderState& render_state, const std::string& debug_group) +void RenderCommandListMT::Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); @@ -83,7 +83,7 @@ static MTLPrimitiveType PrimitiveTypeToMetal(RenderCommandList::Primitive primit StartRenderEncoding(); - RenderCommandListBase::Reset(render_state, debug_group); + RenderCommandListBase::Reset(sp_render_state, debug_group); } void RenderCommandListMT::SetName(const std::string& name) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp index c717b9407..4ed19ee1c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.cpp @@ -48,7 +48,7 @@ ParallelRenderCommandListBase::ParallelRenderCommandListBase(CommandQueueBase& c ITT_FUNCTION_TASK(); } -void ParallelRenderCommandListBase::Reset(RenderState& render_state, const std::string& debug_group) +void ParallelRenderCommandListBase::Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); @@ -57,7 +57,7 @@ void ParallelRenderCommandListBase::Reset(RenderState& render_state, const std:: { assert(sp_render_command_list); const std::string render_debug_group = GetThreadCommandListName(debug_group, render_command_list_index++); - sp_render_command_list->Reset(render_state, render_debug_group); + sp_render_command_list->Reset(sp_render_state, render_debug_group); } } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h index 0cf10ad70..81c845ccc 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ParallelRenderCommandListBase.h @@ -46,7 +46,7 @@ class ParallelRenderCommandListBase ParallelRenderCommandListBase(CommandQueueBase& command_queue, RenderPassBase& render_pass); // ParallelRenderCommandList interface - void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group = "") override; void SetParallelCommandListsCount(uint32_t count) override; const RenderCommandList::Ptrs& GetParallelCommandLists() const override { return m_parallel_comand_lists; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp index 2cc62b3a3..83681aee9 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.cpp @@ -65,7 +65,7 @@ void RenderCommandListBase::DrawingState::Reset() flags = { }; } -void RenderCommandListBase::Reset(RenderState& render_state, const std::string& debug_group) +void RenderCommandListBase::Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); @@ -85,7 +85,10 @@ void RenderCommandListBase::Reset(RenderState& render_state, const std::string& m_debug_group_opened = true; } - SetState(render_state); + if (sp_render_state) + { + SetState(*sp_render_state); + } } void RenderCommandListBase::SetState(RenderState& render_state, RenderState::Group::Mask state_groups) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h index a4bde3be8..e4221c64f 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderCommandListBase.h @@ -49,7 +49,7 @@ class RenderCommandListBase RenderCommandListBase(ParallelRenderCommandListBase& parallel_render_command_list); // RenderCommandList interface - void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group = "") override; void SetState(RenderState& render_state, RenderState::Group::Mask state_groups = RenderState::Group::All) override; void SetVertexBuffers(const Buffer::Refs& vertex_buffers) override; void DrawIndexed(Primitive primitive_type, Buffer& index_buffer, diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.cpp index 756fcf03c..0ff50044b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.cpp @@ -50,11 +50,11 @@ void ParallelRenderCommandListVK::SetName(const std::string& name) ParallelRenderCommandListBase::SetName(name); } -void ParallelRenderCommandListVK::Reset(RenderState& render_state, const std::string& debug_group) +void ParallelRenderCommandListVK::Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); - ParallelRenderCommandListBase::Reset(render_state, debug_group); + ParallelRenderCommandListBase::Reset(sp_render_state, debug_group); } void ParallelRenderCommandListVK::Commit(bool present_drawable) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h index a3ec6ee9a..29f1629bf 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ParallelRenderCommandListVK.h @@ -40,7 +40,7 @@ class ParallelRenderCommandListVK final : public ParallelRenderCommandListBase ParallelRenderCommandListVK(CommandQueueBase& command_queue, RenderPassBase& render_pass); // ParallelRenderCommandList interface - void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group = "") override; // CommandList interface void Commit(bool present_drawable) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp index 5b4bff3e4..debb40bec 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.cpp @@ -58,12 +58,12 @@ RenderCommandListVK::RenderCommandListVK(ParallelRenderCommandListBase& parallel ITT_FUNCTION_TASK(); } -void RenderCommandListVK::Reset(RenderState& render_state, const std::string& debug_group) +void RenderCommandListVK::Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group) { ITT_FUNCTION_TASK(); RenderCommandListBase::ResetDrawState(); - RenderCommandListBase::Reset(render_state, debug_group); + RenderCommandListBase::Reset(sp_render_state, debug_group); } void RenderCommandListVK::SetName(const std::string& name) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.h index bcc283601..2c3968d97 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderCommandListVK.h @@ -50,7 +50,7 @@ class RenderCommandListVK final : public RenderCommandListBase void Execute(uint32_t frame_index) override; // RenderCommandList interface - void Reset(RenderState& render_state, const std::string& debug_group = "") override; + void Reset(const RenderState::Ptr& sp_render_state, const std::string& debug_group = "") override; void SetVertexBuffers(const Buffer::Refs& vertex_buffers) override; void DrawIndexed(Primitive primitive, Buffer& index_buffer, uint32_t index_count, uint32_t start_index, uint32_t start_vertex, diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp index 66505796c..8f88d06b0 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp @@ -126,7 +126,7 @@ void SkyBox::Draw(RenderCommandList& cmd_list, MeshBufferBindings& buffer_bindin assert(buffer_bindings.sp_uniforms_buffer->GetDataSize() >= sizeof(Uniforms)); buffer_bindings.sp_uniforms_buffer->SetData({ { reinterpret_cast(&m_mesh_buffers.GetFinalPassUniforms()), sizeof(Uniforms) } }); - cmd_list.Reset(*m_sp_state, "Sky-box rendering"); + cmd_list.Reset(m_sp_state, "Sky-box rendering"); assert(!buffer_bindings.resource_bindings_per_instance.empty()); assert(!!buffer_bindings.resource_bindings_per_instance[0]); From 5f149e224fca9b6423aeb3e16f6297cdcba1ff86 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 6 Jan 2020 18:36:38 +0300 Subject: [PATCH 080/129] Reduced number of matrix multiplications on asteroids array updates and reduced each asteroid mesh complexity to increase frame rate. --- Apps/Samples/Asteroids/Asteroid.h | 3 +-- Apps/Samples/Asteroids/AsteroidsApp.cpp | 2 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 16 +++++++++------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Apps/Samples/Asteroids/Asteroid.h b/Apps/Samples/Asteroids/Asteroid.h index 66b9ed630..a6b20e3f5 100644 --- a/Apps/Samples/Asteroids/Asteroid.h +++ b/Apps/Samples/Asteroids/Asteroid.h @@ -85,8 +85,7 @@ class Asteroid final : public gfx::TexturedMeshBuffers const uint32_t texture_index; const gfx::Vector2f depth_range; const Colors colors; - const gfx::Matrix44f scale_matrix; - const gfx::Matrix44f translation_matrix; + const gfx::Matrix44f scale_translate_matrix; const gfx::Point3f spin_axis; const float orbit_speed; const float spin_speed; diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 0938d2169..cb224e4ee 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -125,7 +125,7 @@ AsteroidsApp::AsteroidsApp() m_scene_scale, // - scale GetParamValueByComplexity(g_instaces_count), // - instance_count GetParamValueByComplexity(g_mesh_count), // - unique_mesh_count - 1u, // - minimum_subdivision + 0u, // - minimum_subdivision 3u, // - subdivisions_count GetParamValueByComplexity(g_textures_count), // - textures_count { 256u, 256u }, // - texture_dimensions diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index bbdcdcaaa..3285f7d37 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -181,6 +181,8 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) gfx::Matrix44f scale_matrix; cml::matrix_scale(scale_matrix, asteroid_scale_ratios * settings.scale); + const gfx::Matrix44f scale_translate_matrix = scale_matrix * translation_matrix; + Asteroid::Colors asteroid_colors = normal_distribution(rng) <= 1.f ? Asteroid::GetAsteroidIceColors(colors_distribution(rng), colors_distribution(rng)) : Asteroid::GetAsteroidRockColors(colors_distribution(rng), colors_distribution(rng)); @@ -193,8 +195,7 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) settings.textures_array_enabled ? textures_distribution(rng) : 0u, uber_mesh.GetSubsetDepthRange(asteroid_subset_index), std::move(asteroid_colors), - std::move(scale_matrix), - std::move(translation_matrix), + std::move(scale_translate_matrix), GetRandomDirection(rng), orbit_velocity_distribution(rng) / (asteroid_scale * asteroid_orbit_radius), spin_velocity_distribution(rng) / asteroid_scale, @@ -333,13 +334,14 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) ITT_FUNCTION_TASK(); SCOPE_TIMER("AsteroidsArray::Update"); - gfx::Matrix44f scene_view_matrix, scene_proj_matrix; - m_settings.view_camera.GetViewProjMatrices(scene_view_matrix, scene_proj_matrix); + gfx::Matrix44f view_matrix, proj_matrix; + m_settings.view_camera.GetViewProjMatrices(view_matrix, proj_matrix); + const gfx::Matrix44f view_proj_matrix = view_matrix * proj_matrix; const float elapsed_radians = cml::constants::pi()* static_cast(elapsed_seconds); Data::ParallelForEach(m_sp_content_state->parameters.begin(), m_sp_content_state->parameters.end(), - [&](const Asteroid::Parameters& asteroid_parameters) + [this, &view_proj_matrix, elapsed_radians](const Asteroid::Parameters& asteroid_parameters) { ITT_FUNCTION_TASK(); @@ -352,8 +354,8 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) gfx::Matrix44f orbit_rotation_matrix; cml::matrix_rotation_world_y(orbit_rotation_matrix, orbit_angle_rad); - const gfx::Matrix44f model_matrix = asteroid_parameters.scale_matrix * spin_rotation_matrix * asteroid_parameters.translation_matrix * orbit_rotation_matrix; - const gfx::Matrix44f mvp_matrix = model_matrix * scene_view_matrix * scene_proj_matrix; + const gfx::Matrix44f model_matrix = spin_rotation_matrix * asteroid_parameters.scale_translate_matrix * orbit_rotation_matrix; + const gfx::Matrix44f mvp_matrix = model_matrix * view_proj_matrix; SetFinalPassUniforms( AsteroidUniforms From 0feaa0d7d1ec1dc1cd45d9bf82d4e6d7b679063f Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 6 Jan 2020 20:08:04 +0300 Subject: [PATCH 081/129] Methane logo watermark images added along with Vectornator originals. --- .../Images/Logo/MethaneLogoName.vectornator | 1 + .../Images/Logo/MethaneLogoNameWatermark.png | Bin 0 -> 31196 bytes .../Images/Logo/MethaneLogoNameWatermark.svg | 47 ++++++++++++++++++ .../Logo/MethaneLogoNameWatermark.vectornator | 1 + .../Images/Logo/MethaneLogoWatermark.png | Bin 0 -> 27409 bytes .../Images/Logo/MethaneLogoWatermark.svg | 19 +++++++ 6 files changed, 68 insertions(+) create mode 100644 Resources/Images/Logo/MethaneLogoName.vectornator create mode 100644 Resources/Images/Logo/MethaneLogoNameWatermark.png create mode 100644 Resources/Images/Logo/MethaneLogoNameWatermark.svg create mode 100644 Resources/Images/Logo/MethaneLogoNameWatermark.vectornator create mode 100644 Resources/Images/Logo/MethaneLogoWatermark.png create mode 100644 Resources/Images/Logo/MethaneLogoWatermark.svg diff --git a/Resources/Images/Logo/MethaneLogoName.vectornator b/Resources/Images/Logo/MethaneLogoName.vectornator new file mode 100644 index 000000000..fb3b7f6d4 --- /dev/null +++ b/Resources/Images/Logo/MethaneLogoName.vectornator @@ -0,0 +1 @@ +{"WDDrawingKey":{"$class":"WDDrawing","ImageDatasKey":{},"ArtboardsKey":[{"Name":"Artboard 1","Rect":"{{0.0, 0.0}, {1024.0, 1024.0}}","Layers":[{"$class":"Layer","LockedKey":false,"IsNewFormat2.4":true,"VisibleKey":true,"NameKey":"Слой 1","ExpandKey":false,"ElementsKey":[{"[VN]:InitialPointKey":"{-212.12551478781421, 222.24610998707522}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{-212.12551478781421, 222.24610998707522}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.71556353569030762,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0,"WDAlphaKey":0.85647514686683957,"WDBrightnessKey":0.85912356396866785,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.35509138381201016,"WDHueKey":0,"WDAlphaKey":0,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":264.088134765625,"AnchorPoint_Y":600.212158203125,"inPoint_Y":789.682373046875,"OutPoint_X":62.946792602539062,"AnchorPoint_X":163.51748657226562,"OutPoint_Y":410.74197387695312},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":134.62583923339844,"AnchorPoint_Y":74.585243225097656,"inPoint_Y":175.41081237792969,"OutPoint_X":437.49807739257812,"AnchorPoint_X":323.61700439453125,"OutPoint_Y":13.830448150634766},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":567.98895263671875,"AnchorPoint_Y":68.374916076660156,"inPoint_Y":15.777088165283203,"OutPoint_X":746.78497314453125,"AnchorPoint_X":675.7266845703125,"OutPoint_Y":103.06572723388672},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":807.945556640625,"AnchorPoint_Y":235.09054565429688,"inPoint_Y":159.79005432128906,"OutPoint_X":948.48577880859375,"AnchorPoint_X":847.9151611328125,"OutPoint_Y":424.560791015625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":876.80682373046875,"AnchorPoint_Y":760.717529296875,"inPoint_Y":659.89190673828125,"OutPoint_X":498.82443237304688,"AnchorPoint_X":687.815673828125,"OutPoint_Y":861.5430908203125},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{498.47256469726562, 539.34628156416079}","WDFillTransformEndKey":"{920.4523690629494, 539.34628156416079}","WDFillTransformTransformKey":"[0.91879023687409755, 0, 0, 0.9409308867810614, 47.72457262232254, -89.836183475997728]","$class":"WDFillTransform"},"[VN]:AngleKey":0.13613833487033844,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(oval)"},{"[VN]:InitialPointKey":"{204.92336378910755, 813.09780970946395}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{204.92336378910755, 813.09780970946395}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.50625002384185791,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66666666666666663,"WDAlphaKey":1,"WDBrightnessKey":0.85026016236945201,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66666668653488159,"WDAlphaKey":1,"WDBrightnessKey":0.19137466307277629,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":423.4486083984375,"AnchorPoint_Y":671.875,"inPoint_Y":648.522216796875,"OutPoint_X":326.98345947265625,"AnchorPoint_X":381.78451538085938,"OutPoint_Y":702.59130859375},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":259.76690673828125,"AnchorPoint_Y":625.8499755859375,"inPoint_Y":678.54486083984375,"OutPoint_X":221.79721069335938,"AnchorPoint_X":225.80288696289062,"OutPoint_Y":619.63525390625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":218.25405883789062,"AnchorPoint_Y":606.05303955078125,"inPoint_Y":613.02197265625,"OutPoint_X":198.0804443359375,"AnchorPoint_X":215.24835205078125,"OutPoint_Y":566.24822998046875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":201.5576171875,"AnchorPoint_Y":487.04959106445312,"inPoint_Y":522.24102783203125,"OutPoint_X":233.69532775878906,"AnchorPoint_X":220.92295837402344,"OutPoint_Y":463.839111328125},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":252.98402404785156,"AnchorPoint_Y":432.65774536132812,"inPoint_Y":443.51348876953125,"OutPoint_X":317.90115356445312,"AnchorPoint_X":278.6094970703125,"OutPoint_Y":416.0125732421875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":370.2550048828125,"AnchorPoint_Y":521.36163330078125,"inPoint_Y":455.30361938476562,"OutPoint_X":427.237060546875,"AnchorPoint_X":398.74600219726562,"OutPoint_Y":587.419677734375},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0.13613833487033844,"WDFillTransformKey":{"WDFillTransformStartKey":"{496.98210236395471, 533.42138443226918}","WDFillTransformEndKey":"{772.39016311376736, 795.12140138465145}","WDFillTransformTransformKey":"[0.02589851299742205, -0.40065096754373131, 0.38375724576561032, 0.02657848446761827, 122.52476590780094, 740.42349776309584]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{215.65064611486486, 968.7889185574461}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{215.65064611486486, 968.7889185574461}","VNLockedElementKey":false,"WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.8461538553237915,"WDStopColorKey":{"WDSaturationKey":0.667779632721202,"WDHueKey":0.65636706352233887,"WDAlphaKey":0,"WDBrightnessKey":0.48598130841121501,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.1669449081803005,"WDHueKey":0.65636706352233887,"WDAlphaKey":0.29158512720156965,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":433.13900756835938,"AnchorPoint_Y":660.9361572265625,"inPoint_Y":628.21026611328125,"OutPoint_X":328.3944091796875,"AnchorPoint_X":361.4705810546875,"OutPoint_Y":676.03973388671875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":264.28097534179688,"AnchorPoint_Y":622.26666259765625,"inPoint_Y":670.26123046875,"OutPoint_X":200.2882080078125,"AnchorPoint_X":232.28459167480469,"OutPoint_Y":574.2720947265625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":214.55328369140625,"AnchorPoint_Y":490.13577270507812,"inPoint_Y":514.35003662109375,"OutPoint_X":288.43252563476562,"AnchorPoint_X":241.49594116210938,"OutPoint_Y":447.95230102539062},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":234.73800659179688,"AnchorPoint_Y":587.91925048828125,"inPoint_Y":529.8487548828125,"OutPoint_X":322.859375,"AnchorPoint_X":277.83050537109375,"OutPoint_Y":648.59918212890625},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0,"WDFillTransformKey":{"WDFillTransformStartKey":"{598.91348167555611, 580.96572841663908}","WDFillTransformEndKey":"{575.99110458386986, 231.12407779699038}","WDFillTransformTransformKey":"[-0.26958786504475918, -0.40438159869940238, 0.6275795667550782, -0.40596773123274776, 252.51321779223343, 953.76319375066942]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":4.0901503562927246}]},{"$class":"Layer","LockedKey":false,"IsNewFormat2.4":true,"VisibleKey":true,"NameKey":"Слой 1","ExpandKey":false,"ElementsKey":[{"StrokeKey":{"$class":"StrokeStyle","WDColorKey":{"WDSaturationKey":1,"WDHueKey":0.67977261749347251,"WDAlphaKey":1,"WDBrightnessKey":0.59349552872062639,"$class":"Vectornator.Color"},"WDEndArrowKey":"","WDCapKey":0,"WDStartArrowKey":"","WDJoinKey":1,"WDWeightKey":2.0099999904632568},"WDTransformKey":"[1, 0, 0, 1, 104.4902779365425, 905.62203075516095]","WDFontSizeKey":68,"VNHiddenElementKey":false,"$class":"WDText","[VN]:ElementNameKey":"","WDTextKey":{"NS.bytes":{"$data":"cG93ZXJlZCBncmFwaGljcw==","$class":"NSData"},"$class":"NSMutableString"},"VNIsFreehandCurve":false,"HeightKey":0,"[VN]:AngleKey":0,"WDAttributedTextKey":{"NSString":"powered graphics","NSAttributes":{"NSParagraphStyle":{"NSAlignment":2,"NSAllowsTighteningForTruncation":1,"$class":"NSMutableParagraphStyle"},"NSFont":{"NSSize":68,"NSfFlags":80,"NSDescriptor":{"UIFontDescriptorAttributes":{"NSFontSizeAttribute":68,"NSFontNameAttribute":"Helvetica-BoldOblique"},"$class":"UIFontDescriptor"},"NSName":"Helvetica-BoldOblique","$class":"NSFont"}},"$class":"NSAttributedString"},"VNLockedElementKey":false,"WDFontNameKey":"Helvetica-BoldOblique","WDAlignmentKey":2,"WDShadowKey":{"WDShadowOffsetKey":0,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":19.760000228881836,"WDShadowColorKey":{"WDSaturationKey":0.67101827676240089,"WDHueKey":0,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ElementAdditionalValueKey":0,"WDFillKey":{"WDGradientTypeKey":0,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.67977261749347251,"WDAlphaKey":1,"WDBrightnessKey":0.66318537859007809,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.63343223727154141,"WDHueKey":0.5587467362924281,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"WDFillTransformKey":{"WDFillTransformStartKey":"{506.2851627691831, 1001.4077756066821}","WDFillTransformEndKey":"{506.37788631531544, 945.09003803308951}","WDFillTransformTransformKey":"[1, 0, 0, 1, 10.17913596876906, -17.266580084682801]","$class":"WDFillTransform"},"[VN]:EndPointKey":"{10.17913596876906, -17.266580084682801}","[VN]:InitialPointKey":"{10.17913596876906, -17.266580084682801}","WDWidthKey":824.33013916015625},{"StrokeKey":{"$class":"StrokeStyle","WDColorKey":{"WDSaturationKey":1,"WDHueKey":0.67977261749347251,"WDAlphaKey":1,"WDBrightnessKey":0.59349552872062639,"$class":"Vectornator.Color"},"WDEndArrowKey":"","WDCapKey":1,"WDStartArrowKey":"","WDJoinKey":1,"WDWeightKey":3},"WDTransformKey":"[1, 0, 0, 1, 87.205199409861507, 757.82020239128451]","WDFontSizeKey":129,"VNHiddenElementKey":false,"$class":"WDText","[VN]:ElementNameKey":"","WDTextKey":{"NS.bytes":{"$data":"TUVUSEFORQ==","$class":"NSData"},"$class":"NSMutableString"},"VNIsFreehandCurve":false,"HeightKey":0,"[VN]:AngleKey":0,"WDAttributedTextKey":{"NSString":"METHANE","NSAttributes":{"NSParagraphStyle":{"NSAlignment":2,"NSAllowsTighteningForTruncation":1,"$class":"NSMutableParagraphStyle"},"NSFont":{"NSSize":129,"NSfFlags":80,"NSDescriptor":{"UIFontDescriptorAttributes":{"NSFontSizeAttribute":129,"NSFontNameAttribute":"Helvetica-BoldOblique"},"$class":"UIFontDescriptor"},"NSName":"Helvetica-BoldOblique","$class":"NSFont"}},"$class":"NSAttributedString"},"VNLockedElementKey":false,"WDFontNameKey":"Helvetica-BoldOblique","WDAlignmentKey":2,"WDShadowKey":{"WDShadowOffsetKey":0,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":19.760000228881836,"WDShadowColorKey":{"WDSaturationKey":0.67101827676240089,"WDHueKey":0,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ElementAdditionalValueKey":0,"WDFillKey":{"WDGradientTypeKey":0,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.67977261749347251,"WDAlphaKey":1,"WDBrightnessKey":0.66318537859007809,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.63343223727154141,"WDHueKey":0.5587467362924281,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"WDFillTransformKey":{"WDFillTransformStartKey":"{516.9112709832134, 884.6426858513189}","WDFillTransformEndKey":"{515.68345323741005, 788.25899280575538}","WDFillTransformTransformKey":"[1, 0, 0, 1, 0, 0]","$class":"WDFillTransform"},"[VN]:EndPointKey":"{-12.003121207814274, -22.869128663402989}","[VN]:InitialPointKey":"{-12.003121207814274, -22.869128663402989}","WDWidthKey":848.0550537109375},{"[VN]:InitialPointKey":"{-28.193783364905258, 269.78707953369786}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{-28.193783364905258, 269.78707953369786}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":0.13522537562604339,"WDHueKey":0,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.5134168267250061,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0,"WDAlphaKey":1,"WDBrightnessKey":0.18457943925233644,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":324.35543823242188,"AnchorPoint_Y":549.7200927734375,"inPoint_Y":690.04742431640625,"OutPoint_X":175.447021484375,"AnchorPoint_X":249.90126037597656,"OutPoint_Y":409.39279174804688},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":228.51226806640625,"AnchorPoint_Y":160.42501831054688,"inPoint_Y":235.09945678710938,"OutPoint_X":452.73382568359375,"AnchorPoint_X":368.42568969726562,"OutPoint_Y":115.42818450927734},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":549.3385009765625,"AnchorPoint_Y":155.82546997070312,"inPoint_Y":116.86992645263672,"OutPoint_X":681.70428466796875,"AnchorPoint_X":629.0986328125,"OutPoint_Y":181.51852416992188},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":726.9825439453125,"AnchorPoint_Y":279.300048828125,"inPoint_Y":223.53025817871094,"OutPoint_X":831.02691650390625,"AnchorPoint_X":756.57269287109375,"OutPoint_Y":419.62741088867188},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":777.96173095703125,"AnchorPoint_Y":668.59515380859375,"inPoint_Y":593.92071533203125,"OutPoint_X":498.13479614257812,"AnchorPoint_X":638.04827880859375,"OutPoint_Y":743.26959228515625},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0.13613833487033844,"WDFillTransformKey":{"WDFillTransformStartKey":"{628.95067481210776, 439.5829118868844}","WDFillTransformEndKey":"{1047.7652836609636, 198.51264734329905}","WDFillTransformTransformKey":"[0.87863914241974328, 0, 0, 0.87863914241974328, 61.040178604336518, -31.127698128356684]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(oval)"},{"[VN]:InitialPointKey":"{81.082732574889263, -424.03527608466669}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{81.082732574889263, -424.03527608466669}","WDFillKey":{"WDGradientTypeKey":0,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":0.88981636060100167,"WDHueKey":0,"WDAlphaKey":0.55683479696673266,"WDBrightnessKey":0.66355140186915884,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.98747766017913818,"WDStopColorKey":{"WDSaturationKey":0.24874791318864775,"WDHueKey":0,"WDAlphaKey":0.35616438356164393,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":247.50877380371094,"AnchorPoint_Y":357.4051513671875,"inPoint_Y":433.362060546875,"OutPoint_X":247.50877380371094,"AnchorPoint_X":247.50877380371094,"OutPoint_Y":236.55477905273438},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":361.93646240234375,"AnchorPoint_Y":138.58619689941406,"inPoint_Y":138.58619689941406,"OutPoint_X":644.24395751953125,"AnchorPoint_X":503.09024047851562,"OutPoint_Y":138.58619689941406},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":755.38592529296875,"AnchorPoint_Y":357.4051513671875,"inPoint_Y":225.95489501953125,"OutPoint_X":760.66497802734375,"AnchorPoint_X":758.67169189453125,"OutPoint_Y":437.1536865234375},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":678.8966064453125,"AnchorPoint_Y":511.60494995117188,"inPoint_Y":509.45693969726562,"OutPoint_X":327.16378784179688,"AnchorPoint_X":506.97100830078125,"OutPoint_Y":513.85150146484375},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{388.0745999759356, 438.46022716015432}","WDFillTransformEndKey":"{387.17105606002127, 625.60562875027108}","WDFillTransformTransformKey":"[2.0620263921329105, 0, 0, 1.9811501947788639, -292.78432021650298, -728.80114884375439]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":4.2570948600769043},{"[VN]:InitialPointKey":"{215.0788490785356, -173.97436098195362}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{215.0788490785356, -173.97436098195362}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.27549195289611816,"WDStopColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.73353609955968446,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.4973166286945343,"WDStopColorKey":{"WDSaturationKey":0.28547579298831388,"WDHueKey":0,"WDAlphaKey":0.33322323568982459,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":663.6109619140625,"AnchorPoint_Y":257.856689453125,"inPoint_Y":301.36328125,"OutPoint_X":644.73748779296875,"AnchorPoint_X":649.07623291015625,"OutPoint_Y":244.86953735351562},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":655.49359130859375,"AnchorPoint_Y":245.13763427734375,"inPoint_Y":236.72769165039062,"OutPoint_X":712.726806640625,"AnchorPoint_X":669.29840087890625,"OutPoint_Y":271.5943603515625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":738.096923828125,"AnchorPoint_Y":372.79959106445312,"inPoint_Y":324.10675048828125,"OutPoint_X":734.06781005859375,"AnchorPoint_X":734.9283447265625,"OutPoint_Y":386.02410888671875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":725.61968994140625,"AnchorPoint_Y":382.04879760742188,"inPoint_Y":397.68771362304688,"OutPoint_X":688.90216064453125,"AnchorPoint_X":714.316162109375,"OutPoint_Y":346.88742065429688},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{582.71404021216495, 488.94239767650072}","WDFillTransformEndKey":"{822.09127463459777, 341.52929851240367}","WDFillTransformTransformKey":"[0.93371543124458134, 0.049736597374667145, -0.049736597374667145, 0.93371543124458134, 95.700047650357504, -134.34594858244671]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":7.8464107513427734},{"[VN]:InitialPointKey":"{228.85098687537248, 1409.2473634667513}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{228.85098687537248, 1409.2473634667513}","VNLockedElementKey":false,"WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.83184260129928589,"WDStopColorKey":{"WDSaturationKey":0.667779632721202,"WDHueKey":0,"WDAlphaKey":0,"WDBrightnessKey":0.48598130841121501,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.1669449081803005,"WDHueKey":0,"WDAlphaKey":0.26223091976517043,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":751.85394287109375,"AnchorPoint_Y":668.94146728515625,"inPoint_Y":590.24420166015625,"OutPoint_X":499.97052001953125,"AnchorPoint_X":579.51007080078125,"OutPoint_Y":705.2615966796875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":345.79428100585938,"AnchorPoint_Y":575.95135498046875,"inPoint_Y":691.3658447265625,"OutPoint_X":191.90827941894531,"AnchorPoint_X":268.85128784179688,"OutPoint_Y":460.5369873046875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":226.21208190917969,"AnchorPoint_Y":258.21090698242188,"inPoint_Y":316.43991088867188,"OutPoint_X":403.8724365234375,"AnchorPoint_X":291.002197265625,"OutPoint_Y":156.77055358886719},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":274.75106811523438,"AnchorPoint_Y":493.35482788085938,"inPoint_Y":353.71044921875,"OutPoint_X":486.66015625,"AnchorPoint_X":378.37738037109375,"OutPoint_Y":639.274169921875},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0,"WDFillTransformKey":{"WDFillTransformStartKey":"{598.91348167555611, 580.96572841663908}","WDFillTransformEndKey":"{575.99110458386986, 231.12407779699038}","WDFillTransformTransformKey":"[-0.64828873624545069, -0.97243262614296555, 1.5091657191527077, -0.97624686257155824, 317.49588935831969, 1373.1144012336792]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":3.9232048988342285}]},{"$class":"Layer","LockedKey":false,"IsNewFormat2.4":true,"VisibleKey":true,"NameKey":"Слой 1","ExpandKey":false,"ElementsKey":[{"[VN]:InitialPointKey":"{52.162057510797339, -91.982202604555738}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{52.162057510797339, -91.982202604555738}","WDFillKey":{"WDSaturationKey":1,"WDHueKey":0.66666666666666663,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":774.54071044921875,"AnchorPoint_Y":413.8155517578125,"inPoint_Y":413.30963134765625,"OutPoint_X":725.57330322265625,"AnchorPoint_X":766.707275390625,"OutPoint_Y":416.47222900390625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":685.82586669921875,"AnchorPoint_Y":513.8062744140625,"inPoint_Y":454.95059204101562,"OutPoint_X":634.4984130859375,"AnchorPoint_X":659.58685302734375,"OutPoint_Y":570.08111572265625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":633.6265869140625,"AnchorPoint_Y":658.854248046875,"inPoint_Y":626.5535888671875,"OutPoint_X":740.648681640625,"AnchorPoint_X":654.76556396484375,"OutPoint_Y":605.39251708984375},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":789.52203369140625,"AnchorPoint_Y":416.47457885742188,"inPoint_Y":512.57952880859375,"OutPoint_X":782.40631103515625,"AnchorPoint_X":790.25860595703125,"OutPoint_Y":414.27679443359375},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":24.705532073974609},{"[VN]:InitialPointKey":"{1044.5359599327612, 463.81462858471633}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{1044.5359599327612, 463.81462858471633}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":0.27450980392156865,"WDHueKey":0.66666666666666663,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.5116279125213623,"WDStopColorKey":{"WDSaturationKey":0.98163606010016691,"WDHueKey":0.66666668653488159,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66666668653488159,"WDAlphaKey":1,"WDBrightnessKey":0.18457943925233644,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":744.6143798828125,"AnchorPoint_Y":417.8868408203125,"inPoint_Y":399.8055419921875,"OutPoint_X":869.707275390625,"AnchorPoint_X":795.25030517578125,"OutPoint_Y":444.47402954101562},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":900.08978271484375,"AnchorPoint_Y":606.72613525390625,"inPoint_Y":534.28839111328125,"OutPoint_X":848.33599853515625,"AnchorPoint_X":867.79559326171875,"OutPoint_Y":650.375244140625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":809.79766845703125,"AnchorPoint_Y":689.087158203125,"inPoint_Y":679.66778564453125,"OutPoint_X":737.78924560546875,"AnchorPoint_X":766.40728759765625,"OutPoint_Y":695.29962158203125},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":706.58489990234375,"AnchorPoint_Y":680.20703125,"inPoint_Y":693.89666748046875,"OutPoint_X":634.9376220703125,"AnchorPoint_X":678.302734375,"OutPoint_Y":659.216796875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":627.30487060546875,"AnchorPoint_Y":513.79290771484375,"inPoint_Y":586.23065185546875,"OutPoint_X":691.8931884765625,"AnchorPoint_X":659.59906005859375,"OutPoint_Y":441.35516357421875},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0.13613833487033844,"WDFillTransformKey":{"WDFillTransformStartKey":"{396.13198666585458, 505.95666276053771}","WDFillTransformEndKey":"{-98.148052214922473, 572.51555049064063}","WDFillTransformTransformKey":"[-0.34649584198713174, 0.27154905153778675, -0.26922859122615228, -0.34353494101942705, 1047.7093826321257, 586.62098402198944]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{52.162057510797339, -91.982202604555738}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{52.162057510797339, -91.982202604555738}","WDFillKey":{"WDGradientTypeKey":0,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66144812107086182,"WDAlphaKey":0.50489236790606729,"WDBrightnessKey":0.2289719626168224,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.50751252086811349,"WDHueKey":0.64818674325942993,"WDAlphaKey":0.35616438356164393,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":768.87841796875,"AnchorPoint_Y":413.8155517578125,"inPoint_Y":413.67532348632812,"OutPoint_X":725.57330322265625,"AnchorPoint_X":766.707275390625,"OutPoint_Y":416.47222900390625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":685.82586669921875,"AnchorPoint_Y":513.8062744140625,"inPoint_Y":454.95059204101562,"OutPoint_X":648.67431640625,"AnchorPoint_X":659.58685302734375,"OutPoint_Y":538.2838134765625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":642.433349609375,"AnchorPoint_Y":585.3367919921875,"inPoint_Y":562.7613525390625,"OutPoint_X":662.5906982421875,"AnchorPoint_X":640.47698974609375,"OutPoint_Y":600.6531982421875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":696.04266357421875,"AnchorPoint_Y":610.232177734375,"inPoint_Y":610.82476806640625,"OutPoint_X":831.81939697265625,"AnchorPoint_X":742.19171142578125,"OutPoint_Y":609.08154296875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":874.42852783203125,"AnchorPoint_Y":527.6273193359375,"inPoint_Y":570.3536376953125,"OutPoint_X":871.943603515625,"AnchorPoint_X":873.389404296875,"OutPoint_Y":468.18582153320312},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":830.3790283203125,"AnchorPoint_Y":413.84475708007812,"inPoint_Y":425.69296264648438,"OutPoint_X":771.04620361328125,"AnchorPoint_X":773.22332763671875,"OutPoint_Y":413.783203125},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{629.1875, 645.94515254107341}","WDFillTransformEndKey":"{878.30108696214165, 645.94515254107341}","WDFillTransformTransformKey":"[0.93503916263580322, 0, 0, 0.93503916263580322, 52.162057510797339, -91.982202604555738]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":4.2570948600769043},{"[VN]:InitialPointKey":"{541.28142983468638, 191.66526569219695}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{541.28142983468638, 191.66526569219695}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.26654741168022156,"WDStopColorKey":{"WDSaturationKey":0,"WDHueKey":0.66038179397583008,"WDAlphaKey":0.62394705846379495,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.44901609420776367,"WDStopColorKey":{"WDSaturationKey":0.28547579298831388,"WDHueKey":0.65753424167633057,"WDAlphaKey":0.088604840386497796,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":812.59051513671875,"AnchorPoint_Y":460.41717529296875,"inPoint_Y":487.2467041015625,"OutPoint_X":801.4830322265625,"AnchorPoint_X":804.03656005859375,"OutPoint_Y":452.40835571289062},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":808.15460205078125,"AnchorPoint_Y":452.78073120117188,"inPoint_Y":447.50149536132812,"OutPoint_X":842.9921875,"AnchorPoint_X":816.55755615234375,"OutPoint_Y":469.38870239257812},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":858.12127685546875,"AnchorPoint_Y":531.70135498046875,"inPoint_Y":501.83810424804688,"OutPoint_X":855.1240234375,"AnchorPoint_X":855.76416015625,"OutPoint_Y":539.81195068359375},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":849.83941650390625,"AnchorPoint_Y":537.20452880859375,"inPoint_Y":546.900146484375,"OutPoint_X":827.73028564453125,"AnchorPoint_X":843.033203125,"OutPoint_Y":515.40570068359375},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{582.71404021216495, 488.94239767650072}","WDFillTransformEndKey":"{822.09127463459777, 341.52929851240367}","WDFillTransformTransformKey":"[0.57274027247283588, 0.038431919482282771, -0.038431919482282771, 0.57274027247283588, 467.6654257564644, 214.98097844327833]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":3.5893154144287109},{"[VN]:InitialPointKey":"{708.36186343599252, 1198.5408429545271}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{708.36186343599252, 1198.5408429545271}","VNLockedElementKey":false,"WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.8461538553237915,"WDStopColorKey":{"WDSaturationKey":0.667779632721202,"WDHueKey":0.65636706352233887,"WDAlphaKey":0,"WDBrightnessKey":0.48598130841121501,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.1669449081803005,"WDHueKey":0.65636706352233887,"WDAlphaKey":0.45988258317025849,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":806.7850341796875,"AnchorPoint_Y":659.98114013671875,"inPoint_Y":650.99066162109375,"OutPoint_X":774.35198974609375,"AnchorPoint_X":797.47723388671875,"OutPoint_Y":682.31805419921875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":740.45245361328125,"AnchorPoint_Y":684.42034912109375,"inPoint_Y":688.88775634765625,"OutPoint_X":701.17840576171875,"AnchorPoint_X":713.91094970703125,"OutPoint_Y":682.2772216796875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":676.3380126953125,"AnchorPoint_Y":660.47442626953125,"inPoint_Y":677.39703369140625,"OutPoint_X":637.7193603515625,"AnchorPoint_X":661.400634765625,"OutPoint_Y":633.64605712890625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":647.56683349609375,"AnchorPoint_Y":571.31787109375,"inPoint_Y":571.31787109375,"OutPoint_X":647.56683349609375,"AnchorPoint_X":647.56683349609375,"OutPoint_Y":571.31787109375},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":653.87982177734375,"AnchorPoint_Y":516.875,"inPoint_Y":537.74169921875,"OutPoint_X":697.92059326171875,"AnchorPoint_X":679.71478271484375,"OutPoint_Y":502.17044067382812},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":684.1268310546875,"AnchorPoint_Y":509.43014526367188,"inPoint_Y":511.02090454101562,"OutPoint_X":712.427734375,"AnchorPoint_X":696.3226318359375,"OutPoint_Y":507.32949829101562},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":658.678466796875,"AnchorPoint_Y":613.993408203125,"inPoint_Y":556.71527099609375,"OutPoint_X":728.10150146484375,"AnchorPoint_X":694.201904296875,"OutPoint_Y":668.65313720703125},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0,"WDFillTransformKey":{"WDFillTransformStartKey":"{601.93249742971011, 518.80162540598462}","WDFillTransformEndKey":"{515.38397907056969, 229.18746153635016}","WDFillTransformTransformKey":"[-0.34303423008671685, -0.5145510920829256, 0.7985569879573059, -0.5165693496639977, 655.16408494531777, 1043.0556139427126]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":4.3405675888061523},{"[VN]:InitialPointKey":"{102.89369721484157, -110.90076010782653}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{102.89369721484157, -110.90076010782653}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.67799639701843262,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66666668653488159,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.35058430717863104,"WDHueKey":0.66666668653488159,"WDAlphaKey":0,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":260.54122924804688,"AnchorPoint_Y":447.03842163085938,"inPoint_Y":547.5291748046875,"OutPoint_X":260.54122924804688,"AnchorPoint_X":260.54122924804688,"OutPoint_Y":346.54769897460938},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":343.21847534179688,"AnchorPoint_Y":265.0838623046875,"inPoint_Y":265.0838623046875,"OutPoint_X":547.19366455078125,"AnchorPoint_X":445.20608520507812,"OutPoint_Y":265.0838623046875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":629.8709716796875,"AnchorPoint_Y":447.03842163085938,"inPoint_Y":346.54769897460938,"OutPoint_X":629.8709716796875,"AnchorPoint_X":629.8709716796875,"OutPoint_Y":547.5291748046875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":547.19366455078125,"AnchorPoint_Y":628.99298095703125,"inPoint_Y":628.99298095703125,"OutPoint_X":343.21847534179688,"AnchorPoint_X":445.20608520507812,"OutPoint_Y":628.99298095703125},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{352.29213860775883, 637.70977810309751}","WDFillTransformEndKey":"{517.8849440519424, 497.98226520148842}","WDFillTransformTransformKey":"[0.90739587521071496, 0, 0, 0.89407831652880765, 102.89369721484157, -110.90076010782653]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(oval)","[VN]:ObjectBlurKey":4.0901503562927246},{"[VN]:InitialPointKey":"{402.01680241958701, 774.50111809732402}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{402.01680241958701, 774.50111809732402}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":0.27450980392156865,"WDHueKey":0.66666666666666663,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.50268334150314331,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66666668653488159,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66666668653488159,"WDAlphaKey":1,"WDBrightnessKey":0.18328840970350402,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":581.22552490234375,"AnchorPoint_Y":575.39208984375,"inPoint_Y":530.02313232421875,"OutPoint_X":465.051025390625,"AnchorPoint_X":530.49090576171875,"OutPoint_Y":633.91119384765625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":364.03134155273438,"AnchorPoint_Y":561.2586669921875,"inPoint_Y":626.98138427734375,"OutPoint_X":271.10977172851562,"AnchorPoint_X":306.04861450195312,"OutPoint_Y":521.65594482421875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":259.57611083984375,"AnchorPoint_Y":421.66989135742188,"inPoint_Y":469.52383422851562,"OutPoint_X":277.4749755859375,"AnchorPoint_X":270.36148071289062,"OutPoint_Y":390.10787963867188},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":293.60787963867188,"AnchorPoint_Y":337.38909912109375,"inPoint_Y":359.59695434570312,"OutPoint_X":376.77816772460938,"AnchorPoint_X":320.516845703125,"OutPoint_Y":290.95700073242188},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":473.6005859375,"AnchorPoint_Y":365.42025756835938,"inPoint_Y":299.697509765625,"OutPoint_X":589.56610107421875,"AnchorPoint_X":531.58331298828125,"OutPoint_Y":431.14300537109375},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0.13613833487033844,"WDFillTransformKey":{"WDFillTransformStartKey":"{541.8428895889158, 581.95942464193479}","WDFillTransformEndKey":"{750.09751843409754, 988.67762165510533}","WDFillTransformTransformKey":"[-0.11195213843872799, -0.4724815234156951, 0.4724815234156951, -0.11195213843872799, 242.20823473603417, 750.95968717532378]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{192.01796200254836, 10.43016878476223}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{192.01796200254836, 10.43016878476223}","WDFillKey":{"WDGradientTypeKey":0,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66144812107086182,"WDAlphaKey":0.50489236790606729,"WDBrightnessKey":0.2289719626168224,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.50751252086811349,"WDHueKey":0.64818674325942993,"WDAlphaKey":0.35616438356164393,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":278.77859497070312,"AnchorPoint_Y":429.09707641601562,"inPoint_Y":469.7919921875,"OutPoint_X":278.77859497070312,"AnchorPoint_X":278.77859497070312,"OutPoint_Y":364.34994506835938},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":338.431640625,"AnchorPoint_Y":311.86196899414062,"inPoint_Y":311.86196899414062,"OutPoint_X":485.60321044921875,"AnchorPoint_X":412.0174560546875,"OutPoint_Y":311.86196899414062},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":543.54339599609375,"AnchorPoint_Y":429.09707641601562,"inPoint_Y":358.6708984375,"OutPoint_X":546.29547119140625,"AnchorPoint_X":545.25628662109375,"OutPoint_Y":471.82342529296875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":503.66824340820312,"AnchorPoint_Y":511.71163940429688,"inPoint_Y":510.56082153320312,"OutPoint_X":320.3040771484375,"AnchorPoint_X":414.04055786132812,"OutPoint_Y":512.91522216796875},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{389.3486634100783, 439.05945951694696}","WDFillTransformEndKey":"{390.81880820919588, 593.42466342429032}","WDFillTransformTransformKey":"[1.0749684738902252, 0, 0, 1.0614271091444112, -2.8851181473076437, -152.85213062952289]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":4.2570948600769043},{"[VN]:InitialPointKey":"{279.15525658192809, 985.15072966695629}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{279.15525658192809, 985.15072966695629}","VNLockedElementKey":false,"WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.8461538553237915,"WDStopColorKey":{"WDSaturationKey":0.667779632721202,"WDHueKey":0.65636706352233887,"WDAlphaKey":0,"WDBrightnessKey":0.48598130841121501,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.1669449081803005,"WDHueKey":0.65636706352233887,"WDAlphaKey":0.45988258317025849,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":555.89605712890625,"AnchorPoint_Y":593.42669677734375,"inPoint_Y":551.78497314453125,"OutPoint_X":422.61489868164062,"AnchorPoint_X":464.70233154296875,"OutPoint_Y":612.64508056640625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":341.03439331054688,"AnchorPoint_Y":544.22210693359375,"inPoint_Y":605.29229736328125,"OutPoint_X":259.60745239257812,"AnchorPoint_X":300.3209228515625,"OutPoint_Y":483.1519775390625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":277.7589111328125,"AnchorPoint_Y":376.09356689453125,"inPoint_Y":406.90475463867188,"OutPoint_X":371.76577758789062,"AnchorPoint_X":312.04180908203125,"OutPoint_Y":322.4176025390625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":303.44271850585938,"AnchorPoint_Y":500.51712036132812,"inPoint_Y":426.62600708007812,"OutPoint_X":415.5718994140625,"AnchorPoint_X":358.27536010742188,"OutPoint_Y":577.7286376953125},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0,"WDFillTransformKey":{"WDFillTransformStartKey":"{598.91348167555611, 580.96572841663908}","WDFillTransformEndKey":"{575.99110458386986, 231.12407779699038}","WDFillTransformTransformKey":"[-0.34303423008671685, -0.5145510920829256, 0.7985569879573059, -0.5165693496639977, 326.06064637854627, 966.03140491644672]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":3.4223706722259521},{"[VN]:InitialPointKey":"{224.35489943253833, 100.15825979279614}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{224.35489943253833, 100.15825979279614}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.26654741168022156,"WDStopColorKey":{"WDSaturationKey":0,"WDHueKey":0.66038179397583008,"WDAlphaKey":0.62394705846379495,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.44901609420776367,"WDStopColorKey":{"WDSaturationKey":0.28547579298831388,"WDHueKey":0.65753424167633057,"WDAlphaKey":0.088604840386497796,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":495.66400146484375,"AnchorPoint_Y":368.91018676757812,"inPoint_Y":395.73974609375,"OutPoint_X":484.55654907226562,"AnchorPoint_X":487.11001586914062,"OutPoint_Y":360.90133666992188},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":491.22805786132812,"AnchorPoint_Y":361.27374267578125,"inPoint_Y":355.99447631835938,"OutPoint_X":526.065673828125,"AnchorPoint_X":499.63104248046875,"OutPoint_Y":377.88168334960938},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":541.1947021484375,"AnchorPoint_Y":440.19439697265625,"inPoint_Y":410.33111572265625,"OutPoint_X":538.197509765625,"AnchorPoint_X":538.837646484375,"OutPoint_Y":448.30499267578125},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":532.91290283203125,"AnchorPoint_Y":445.69757080078125,"inPoint_Y":455.39324951171875,"OutPoint_X":510.80377197265625,"AnchorPoint_X":526.10662841796875,"OutPoint_Y":423.89877319335938},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{582.71404021216495, 488.94239767650072}","WDFillTransformEndKey":"{822.09127463459777, 341.52929851240367}","WDFillTransformTransformKey":"[0.57274027247283588, 0.038431919482282771, -0.038431919482282771, 0.57274027247283588, 150.73889535431636, 123.47397254387747]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":3.7562603950500488},{"[VN]:InitialPointKey":"{52.162057510797339, -91.982202604555738}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{52.162057510797339, -91.982202604555738}","WDFillKey":{"WDSaturationKey":1,"WDHueKey":0.66666666666666663,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":545.1146240234375,"AnchorPoint_Y":126.64163970947266,"inPoint_Y":126.24691009521484,"OutPoint_X":455.79519653320312,"AnchorPoint_X":500.45489501953125,"OutPoint_Y":127.03636932373047},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":410.59310913085938,"AnchorPoint_Y":160.41993713378906,"inPoint_Y":137.92152404785156,"OutPoint_X":366.20639038085938,"AnchorPoint_X":368.43905639648438,"OutPoint_Y":161.611572265625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":364.05282592773438,"AnchorPoint_Y":164.16009521484375,"inPoint_Y":162.91827392578125,"OutPoint_X":372.64297485351562,"AnchorPoint_X":361.86456298828125,"OutPoint_Y":209.26167297363281},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":426.59597778320312,"AnchorPoint_Y":241.15472412109375,"inPoint_Y":237.57977294921875,"OutPoint_X":576.581787109375,"AnchorPoint_X":498.2049560546875,"OutPoint_Y":245.06753540039062},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":641.2618408203125,"AnchorPoint_Y":165.12435913085938,"inPoint_Y":212.33132934570312,"OutPoint_X":640.7244873046875,"AnchorPoint_X":646.40869140625,"OutPoint_Y":161.84901428222656},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":634.9893798828125,"AnchorPoint_Y":155.8323974609375,"inPoint_Y":158.70372009277344,"OutPoint_X":589.2303466796875,"AnchorPoint_X":629.11041259765625,"OutPoint_Y":136.35462951660156},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":24.732454299926758},{"[VN]:InitialPointKey":"{312.57931902063831, -99.749005676280319}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{312.57931902063831, -99.749005676280319}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":0.27450980392156865,"WDHueKey":0.66666666666666663,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.52236133813858032,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66666668653488159,"WDAlphaKey":1,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66666668653488159,"WDAlphaKey":1,"WDBrightnessKey":0.18598382749326148,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":361.20370483398438,"AnchorPoint_Y":149.29914855957031,"inPoint_Y":203.04762268066406,"OutPoint_X":357.681640625,"AnchorPoint_X":359.77804565429688,"OutPoint_Y":70.265480041503906},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":430.46221923828125,"AnchorPoint_Y":13.452388763427734,"inPoint_Y":9.4978313446044922,"OutPoint_X":557.40484619140625,"AnchorPoint_X":509.67398071289062,"OutPoint_Y":15.835300445556641},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":598.6383056640625,"AnchorPoint_Y":78.254348754882812,"inPoint_Y":41.193992614746094,"OutPoint_X":639.2203369140625,"AnchorPoint_X":623.0919189453125,"OutPoint_Y":102.69744110107422},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":649.18109130859375,"AnchorPoint_Y":163.61984252929688,"inPoint_Y":132.30252075195312,"OutPoint_X":642.71636962890625,"AnchorPoint_X":646.62921142578125,"OutPoint_Y":211.63877868652344},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":577.41241455078125,"AnchorPoint_Y":241.1600341796875,"inPoint_Y":245.11456298828125,"OutPoint_X":418.98892211914062,"AnchorPoint_X":498.20071411132812,"OutPoint_Y":237.20550537109375},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0.13613833487033844,"WDFillTransformKey":{"WDFillTransformStartKey":"{550.95168699467388, 414.00485455120526}","WDFillTransformEndKey":"{766.59344180430537, -16.601103698035104}","WDFillTransformTransformKey":"[0.37835610242679385, 0.22504425267455377, -0.22312118848509901, 0.37512294689053188, 425.9516314852907, -147.05852177855982]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{281.22965866514619, -284.35630714382199}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{281.22965866514619, -284.35630714382199}","WDFillKey":{"WDGradientTypeKey":0,"WDGradientStopsKey":[{"WDStopRatioKey":0,"WDStopColorKey":{"WDSaturationKey":1,"WDHueKey":0.66144812107086182,"WDAlphaKey":0.50489236790606729,"WDBrightnessKey":0.2289719626168224,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.50751252086811349,"WDHueKey":0.64818674325942993,"WDAlphaKey":0.35616438356164393,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":367.99032592773438,"AnchorPoint_Y":134.31060791015625,"inPoint_Y":175.00552368164062,"OutPoint_X":367.99032592773438,"AnchorPoint_X":367.99032592773438,"OutPoint_Y":69.563446044921875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":427.64334106445312,"AnchorPoint_Y":17.07550048828125,"inPoint_Y":17.07550048828125,"OutPoint_X":574.81494140625,"AnchorPoint_X":501.2291259765625,"OutPoint_Y":17.07550048828125},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":632.755126953125,"AnchorPoint_Y":134.31060791015625,"inPoint_Y":63.884414672851562,"OutPoint_X":635.50714111328125,"AnchorPoint_X":634.468017578125,"OutPoint_Y":177.03694152832031},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":592.87994384765625,"AnchorPoint_Y":216.9251708984375,"inPoint_Y":215.77435302734375,"OutPoint_X":409.51577758789062,"AnchorPoint_X":503.25225830078125,"OutPoint_Y":218.1287841796875},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{389.3486634100783, 439.05945951694696}","WDFillTransformEndKey":"{390.81880820919588, 593.42466342429032}","WDFillTransformTransformKey":"[1.0749684738902252, 0, 0, 1.0614271091444112, 86.326578515290151, -447.63860655810709]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":4.2570948600769043},{"[VN]:InitialPointKey":"{316.30550207075862, -189.02510174271004}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{316.30550207075862, -189.02510174271004}","WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.26654741168022156,"WDStopColorKey":{"WDSaturationKey":0,"WDHueKey":0.66038179397583008,"WDAlphaKey":0.62394705846379495,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":0.44901609420776367,"WDStopColorKey":{"WDSaturationKey":0.28547579298831388,"WDHueKey":0.65753424167633057,"WDAlphaKey":0.088604840386497796,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":587.6146240234375,"AnchorPoint_Y":79.726791381835938,"inPoint_Y":106.55631256103516,"OutPoint_X":576.50714111328125,"AnchorPoint_X":579.06060791015625,"OutPoint_Y":71.717948913574219},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":583.17864990234375,"AnchorPoint_Y":72.09033203125,"inPoint_Y":66.811103820800781,"OutPoint_X":618.01629638671875,"AnchorPoint_X":591.58160400390625,"OutPoint_Y":88.698295593261719},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":633.1453857421875,"AnchorPoint_Y":151.010986328125,"inPoint_Y":121.14769744873047,"OutPoint_X":630.1480712890625,"AnchorPoint_X":630.78826904296875,"OutPoint_Y":159.12159729003906},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":624.863525390625,"AnchorPoint_Y":156.51416015625,"inPoint_Y":166.20982360839844,"OutPoint_X":602.75439453125,"AnchorPoint_X":618.0572509765625,"OutPoint_Y":134.71536254882812},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDFillTransformKey":{"WDFillTransformStartKey":"{582.71404021216495, 488.94239767650072}","WDFillTransformEndKey":"{822.09127463459777, 341.52929851240367}","WDFillTransformTransformKey":"[0.57274027247283588, 0.038431919482282771, -0.038431919482282771, 0.57274027247283588, 242.6894979925367, -165.70938899162863]","$class":"WDFillTransform"},"[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":3.7562603950500488},{"[VN]:InitialPointKey":"{368.12099371871983, 594.24596257171424}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{368.12099371871983, 594.24596257171424}","VNLockedElementKey":false,"WDFillKey":{"WDGradientTypeKey":1,"WDGradientStopsKey":[{"WDStopRatioKey":0.8461538553237915,"WDStopColorKey":{"WDSaturationKey":0.667779632721202,"WDHueKey":0.65636706352233887,"WDAlphaKey":0,"WDBrightnessKey":0.48598130841121501,"$class":"Vectornator.Color"},"$class":"WDGradientStop"},{"WDStopRatioKey":1,"WDStopColorKey":{"WDSaturationKey":0.1669449081803005,"WDHueKey":0.65636706352233887,"WDAlphaKey":0.45988258317025849,"WDBrightnessKey":1,"$class":"Vectornator.Color"},"$class":"WDGradientStop"}],"$class":"WDGradient"},"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":591.26922607421875,"AnchorPoint_Y":224.23416137695312,"inPoint_Y":210.95571899414062,"OutPoint_X":525.6632080078125,"AnchorPoint_X":551.4339599609375,"OutPoint_Y":232.82440185546875},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":472.27230834960938,"AnchorPoint_Y":221.37948608398438,"inPoint_Y":238.06060791015625,"OutPoint_X":387.39447021484375,"AnchorPoint_X":429.59963989257812,"OutPoint_Y":204.881103515625},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":370.25448608398438,"AnchorPoint_Y":162.38444519042969,"inPoint_Y":181.09584045410156,"OutPoint_X":363.908203125,"AnchorPoint_X":368.17544555664062,"OutPoint_Y":123.97901153564453},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":376.9427490234375,"AnchorPoint_Y":67.891777038574219,"inPoint_Y":89.864250183105469,"OutPoint_X":461.114990234375,"AnchorPoint_X":401.39105224609375,"OutPoint_Y":14.215831756591797},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":374.02999877929688,"AnchorPoint_Y":162.41357421875,"inPoint_Y":109.29196929931641,"OutPoint_X":468.96762084960938,"AnchorPoint_X":422.2288818359375,"OutPoint_Y":213.92587280273438},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","WDShadowKey":{"WDShadowOffsetKey":21.769580841064453,"WDShadowAngleKey":2.3591475486755371,"WDShadowRadiusKey":33.198692321777344,"WDShadowColorKey":{"WDSaturationKey":0,"WDHueKey":0,"WDAlphaKey":0.78339516971279366,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"$class":"WDShadow"},"[VN]:AngleKey":0,"WDFillTransformKey":{"WDFillTransformStartKey":"{653.02000102986801, 517.99435577378972}","WDFillTransformEndKey":"{654.24582588031626, 237.39933067234702}","WDFillTransformTransformKey":"[-0.34303423008671685, -0.5145510920829256, 0.7985569879573059, -0.5165693496639977, 418.489697210065, 647.43126758052972]","$class":"WDFillTransform"},"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)","[VN]:ObjectBlurKey":3.9232053756713867}]}],"ActiveLayer":{"$alias":"WDDrawingKey.ArtboardsKey.0.Layers.1"},"$class":"Vectornator.Artboard"}],"SettingsKey":{"WDIsolateActiveLayer":false,"WDSnapToPoints":false,"WDOutlineMode":false,"WDRulersVisible":true,"WDCMYKEnabledKey":false,"WDSnapToEdges":false,"WDDisplayWhiteBackground":true,"WDShowGrid":true,"WDGridSpacing":36,"WDUnits":"Pixels","WDDynamicGuides":false,"WDSnapToGrid":false},"VNModificationDateKey":{"NS.time":596754842.08866,"$class":"NSDate"},"ActiveArtboardKey":{"$alias":"WDDrawingKey.ArtboardsKey.0"},"VNVersionKey":"3.1.5","GuidesLayersKey":{"ExpandKey":false,"LockedKey":false,"IsNewFormat2.4":true,"VisibleKey":true,"ElementsKey":[],"$class":"Vectornator.GuideLayer"}},"WDThumbnailKey":{"$data":"\/9j\/4AAQSkZJRgABAQAAkACQAAD\/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAACQAAAAAQAAAJAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAligAwAEAAAAAQAAAlgAAAAA\/+0AOFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAAOEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv\/AABEIAlgCWAMBIgACEQEDEQH\/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv\/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8\/T19vf4+fr\/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv\/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8\/T19vf4+fr\/2wBDAAICAgICAgQCAgQGBAQEBggGBgYGCAoICAgICAoMCgoKCgoKDAwMDAwMDAwODg4ODg4QEBAQEBISEhISEhISEhL\/2wBDAQMDAwUEBQgEBAgTDQsNExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExP\/3QAEACb\/2gAMAwEAAhEDEQA\/AP38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACio2kC1QmvFQcmgDQaRRVWS7Re9c1d6wkeea5DUfFMMAJd8YoA9Gl1JF71nS6zGveviT4u\/tf\/AAi+EaPF4t1iKO6AyLWLMtwfT92mSoPYtge9fmt8SP8Agqrr11JJbfDDQViTnbcak5Yn\/tjERj\/v6fpX0uU8IZnmiU8LRfL\/ADP3V973+VzGpXhD4mfvpL4igT7zgfjVJ\/Flmn3pBX8o3i\/9tb9pfxk7C88UXFnGekdiFtgv0aMCQ\/ixrwHWfHXjbxG5k8QavfX7NyTcXEkpP13sa+8wfhFWkv8Aa8XGP+FOX58pyyx6XwxP7KJPiH4et38u5vYY29GdQf1Natn4z0m8G63uEceqsD\/Kv4nQ7mrVre3lpIJbSR43H8SEqfzFesvBvDyWmYO\/\/Xv\/AO3I\/tF\/yfj\/AMA\/t0g121l+64rViv45Ohr+M\/wx8e\/jb4PdW8NeK9WtFToi3cpj\/GNmKH8RX1t8Pf8Agpj+0p4PdIvEE9p4hgGARdwiOTHoHg8sZ92Vq8zG+DOPinLA4mFTyd4v8br72i45jH7SaP6h1mVqkBB6V+R\/wg\/4KnfCLxbJFp3xCtbjwzctgGST\/SLbJ\/6axgOPq0YA7mv0x8J+P\/DPjLS4da8NX0F9aTjdHNbyLJGw9mUkH86\/N854azHJ5cmZUJQ7N7P0krp\/JnZTrQqfA7noFFQRzK44NT5zXhmgUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf\/Q\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiignFAATiqss4UUye4CDJrjtV1uK3U5agErmre6msQPNcHq3iSOEHLdK4XxH41jt1bDYr86v2nP2wdK+Fdo2k6YVvtbnUmG2DfLGD0klI5C+g6t0GBkjrwGBrY6tHDYWPNJ\/18l5jn7i5p6I+r\/jH+0d4G+E2iPrfi+\/S3TkRxj5pZWH8MaDlj+g6kgV+Knxy\/b2+KPxLlm0jwM7+HtKYld0bf6XIvq0g\/wBXn0TBH9418i+NPGni34ka\/L4n8Z3j3t3L3Y\/Ki5yFReiqOwH1681zS29fuXDnBGEy9KrikqlXz+Fei6+r+SR5NbFSlpHRFGZp7mZrm5dpJJCWZmOWYnkkk9SaYIPatZbepRb1+j06U57nE2jIEHqKkW1J6CtuKzL9q1odP9q7VSUNybnMR2BbqKuppp9K6+HTvatGLTfas51LDscSumjHSn\/2d7V366YMdKeNLzzisfb2GcALEgdK9T+F3xe+JvwZ1ga18O9Vn0985kiB3QS+0kTZRvTJGR2IrJOm8dKgfTcdq1+te0g6FZKUHumrp+qegrWd0fur+zN\/wUc8JfEGS38J\/FRI9C1mQhEm3H7HOx\/us2TEx7K5I7BiTiv1L07V7W+jEkLg596\/jTewI6V+hH7KP7bniX4S3Vt4K+JE0l\/4dyI4pzl5rMdB6l4h\/d5ZR93gbT+T8V+GdKtGWN4fVpbun\/8AIP8A9tfyeyPRw2N15K33\/wCZ\/R8GDDilry\/wl420vxLpNvrWi3KXNrcoskUsbBkdWGQQRwQa76G\/DjmvwuScW4yVmj13Se6NKioknjfocVLQZtW3CiiigQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf\/9H9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo6darS3KIPl5NA0m9iwSAMmsq71BIwdvNU7y+IGCa4XWNYEaHBqHM6YYdvcsa1r2xWy1eFeKfGCQq3zVU8WeKxCjfNXxN8aPjFp\/gzw9eeINRfKQKSEB5djwqL7seP16CnShOtONKmrtuyXmzo9koR5mcT+1B+05F8NtHNhpLLPrN6pFtEeQg6GVx\/dB6D+I8dASPxn1C81XXtTn1zW5nubu6cySyyHLMx6k\/0HYcCug1\/XNc8feJLrxb4icyXF0+4j+FF\/hRfRVHA\/xqm1uE4r+h+F+H6eU0FTWtSXxP8AReS\/Hc+ZxeJdWV1t0MlIOKnWD2rQSEYqdYRX3uFw9zhlIzVg9qsxWu89K0Ug3Gtq0sx6V7kaShG5k3coW1h7VvQaeOOK1bWxHpXQ21gPSuGvMpGFDp3tWnFpntXT2+nZ7Vsw6Z7V5dWqaI41dM9qmXTDjpXeJpnHIqwNMOOlcjrFWPODpfXiqsmlj0r019M68VSl0w+lXCsJo8ul0snotZM+nleMV9A6b4ZF3GflzWLrXhKSHJC11UMYlKyZLie0fsiftS6n8E9di8IeLJnl8M3kmPmJJs5GP+sX\/pmT99R\/vDnIb9+tE8QW+pWsd5ayLJHIoZWU5DAjgg9wa\/lSvtLeIlWFfpz+wj+0PcqV+C3i2cs8SltLlc5JReWgJP8AdHzJ\/s5HQAV+e+JnB0cZQlxBl0f3kdaiX2l\/P6r7Xda9Hf2coxnvLDVdnt\/l\/kftBDe5GRWlFdsOhrzey1RXUYPWt+G996\/ntTPo6mF8juo7pG+9VkEMMiuPhvOODWnDd91NaqZwVMNbY3qKqx3Ktw1WgQRkVZyuLW4UUUUCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/\/9L9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKOlABUbyKg5qCa5CcLWPPc1LlY2p0XLcuT3RP0rJnuwoNUZ7sDvXP3t\/tXrWMpnpUcMLqepBFJzXifivxJ5SN81bniHXBGhwa+XvHHigIrjdWfMehHD2OQ8deMQgf56\/Iv9onx7c+OfGSeFbNy1nppzJjo07Dn\/vhTj6lq+uvi18QE0bR7zVZDnyI2cD1b+EfieK\/PLwpYXF9JJqd6TJLMxkdj1LMckn6mv0bw+y1VK08wqLSGi9X\/kvzPBzutyRVGPX8hyWC20AGO1ZckWTXa6nGEyorm2jya\/ccuhzO7PlZsorDU6w9qupFx0qwsPtX2WEoHPJkVrbbmyRXUWdpx0qCytunFdZZ2ucYFb4jQSHWln2xXS2tjnjFSWdpyBXVWdnntXg4iRqirbWAPatyDT89BWvaWWccV0dtYE9q8OvVsapHNRab7Va\/s32ruINNyOBVwaWcdK8+WI1KsebSab14rOm07HQV6rJphAPFY9xp+M8VdOvcGij4Ptka48lh1ruNd8JK8JkVeorktJzZX6yds19PWNlDq+kiVcE4rlxleVGaqLYqKvofBXinwwYSzKteTRz6p4a1e313RpGgu7KVZoZF6q6EMCPxr7k8Y+GwofivlXxZovkOxAr7HIceptKeqejXdHPUi1qj9uPgV8XLL4pfD\/T\/ABbbEJJMmy4jH\/LOdOJF9cZ5XPVSD3r6EtNTyo5r8QP2KviTJ4X8cXfw+vXxbaspmgB6C4iHIH+\/HnP+4K\/XbTNYDAHNfy\/4hcNf6vZxVwVNfu5e9D\/DLZfJ3j8j9NyeqsfhY1uuz9V\/nuez29+DyDWzBee9eWW2pA9TXQ2uoZA5r4yMzSthPI9Jhu61oLsjpXn9ve+9bdvd571vGZ5VbDeR3EcqydOtS1zUN13zWzDchhhq2Urnm1KLjsXKKAc8iiqMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/\/0\/38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiimswUZNAClgoyaz57njFR3Fx1rDuLr3qJSOqjRvuTT3NYdzee9Vrq7x3rnLu+9655zPYoYa5cub4DPNcdquphVPNMvNQwDzXnWu6rtRsGueVQ9uhgzkvF2uhUb5q+OvH\/iUgON1eu+N9dwj4PrXxP8QNfyXG6nDU1rUOVHzN8ePEUl7ZQaRG3\/H1ONw9VTn\/ANCK1meG9MFtpSnGOK4jxtdnVPF1nbsciNC3\/fTY\/wDZa9vtrPytKQAdq\/dOEaKoZbSS3k2399vySPzfOJ82Jl5aHmGqR\/Ma54xc12eqQ\/Oa5wxc1+p5TG9jw6jKyRcVZjiBYZqwkfFWY4vmFfc4SGhzSZp2MArr7K3HFYljFyK7SwgHHesMVEcTWsbccGuusrbpWZYwj0rsLGHpxXzeKRtFmjZ2vIrq7OyBxxVOyhrr7GAccV87imzVDrXT92MCtcaZx0rWsrceldPDZxlORXg1qrizVI84uNNx\/DXO3diB2r1S9tlXOK5G9gA7VvhptikeY3Nt5b7gOle2fDbXEZPsMx9q8yvYutVNI1GTSr5ZFOOa9OvhfrFJw6kRlZnu3jLS0eNnUcGvkLxxpajfxX2EdVi1bSg2cnFfOnje2XD1WQylTnyS3Q6tnqfHMOtXfg3xZY+KLAnzbC4SdQO+xgSv0YcH2NfuL4X8VW+pWMF7bPujmRXRvVWAIP5Gvw28awKkjcV+iH7OvjF9S+GOkeY2WgiNufYQsY1\/8dArzfHnKFVyzA5xFaxk6b9JLmX3cr+8+y8P63NWrYR9VzL5Oz\/NfcfoRY6sGAO7FdXaannHzV8+6VrW5ByK7ux1XpzX8s81j9Fr4HyPbrTUc45ro7a9B714\/Y6nnGDXWWeoZAwa1jUPExGDt0PU7a8z3rdt7nPevNrS9zjmujtbzIGDXRGZ4dfDWO\/t7mtJWDDIrjra6rbt7npXRGR49ag0bFFMRw4yKfWhyBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/\/1P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKRmCjJoARmCDJrLuLj3pbi461g3VwMGs5SOujRuFzcgZrnLq7xmku7vHeuWvL3g81zTme3hsMSXl9jOTXK3t\/15qvfX+M4NcZf6j1Ga5J1D6LC4O\/Qs6hqeA2DXlXiPVsRsM1o6nqqqrc14x4p1v5WGa53U1PoaGB02PK\/HmuYDgNXxL481olnya948e65w+DXxj411fe7816GGVzzMyp8iZ54s32zxrG5OcIo\/U19XC2B0xMf3a+ONHug\/iSGY9wB+RP+NfbOnAXGkpj+7X7tkNRfUaFux+QZkv9oqep5Jq1thzXKvFhq9N1mzIcnFcPcQbWr9LyepseNUM1E7Vbjj+YZoVADVpEr9FwSujjkbllGOK7GxjHBrlbHHHFdfZcYrPFUxxZ1tinSuwsV6VydiRgV19kelfN4qkbRZ11ivSuvsgMAVx9mw6V1NpJjvXzmKo3NoyOztGAxW4kwC9a5O3nwODWiLnivEq4W7NFIv3L5FcteYOa05rjOeaw7qUHOTW1DDWE5HN3o5NcjeDB3KOldXeP1rk709a9\/C0TKTN\/QPEjW3+jyHg+9ZPi24WeJnXHNcbcSmGTeprK1bXP9FZZDnA9a9Kjln71VIIlz0sfPXjuUiZse9fQX7M+vtB4QltXb\/VXcgH0Ko38zXy54xv\/AD7hsE9a9L+Beqmy0q4Xd1uSf\/HEqvGHCL\/VFqS1U4P81+TPrvD27zeMV1jI\/TLQ9dBQAHNenaZrIIHNfJXh7Xtyj5q9b0jWuhzX8N4j3Wf0DUwN1sfSthqnTmu1sNTzjJr5+0vV+nNd9p+p5xzXPGqeHisB5HudnqAPeurs77IHNeM2GpdOa7Oxv84ya64VD5rFYO3Q9ZtLvPJNdFbXOcV5nZXucc11Npdg9664TPncThrHoVvcd61UcOMiuNtbmt63n6V0xkeJXo2NeimqwYZFOrQ4wooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/9X9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKAAnAzWfcTdqmnlCjFYN1P15qZSsdFGld3ILq461zV3dYzU95c4zzXJ3151wa5ZzPcw2HuQ3t51rjr+\/xnmpL++wDzXDajqGAcmuOpUPpcHhLiahqPB5rgNU1cKDg1Fq+r4yM15TrmvrGGy31rgqVD6vB4LYuazroQHLV4L4r8R4QjdR4i8ThAw3V83eNvGkFrC89xJtUf5\/M1jGWp7kaKSsc5448QBg43V8eeLfEazStHbHefXsK6jxR4lv\/EMzJFmOE9u5+v8AhXm93pxCkmvcwVRPRHzeb4JqLlIzNBv5YtRWWViSDX3h4K1WO90lADk4r8\/nU2024V9CfDLxgLYrazNxX61wnjFOi8I3rHVenX8fzPxzPcM4VfapaM+jNVthIDivPr6zKseK9CN1HcwiVDkGsG8iSTkV+o5ViOVq58zUicEY9p5qVF7GtK4ttpqpsKnmv03K8UpJHBOJfsjggV2Fk9cTCxQ9a6aym9696vSU1dGaZ31k4yK6yzk6CuAs5wMc11NpcDgZr5\/E4c0TO\/tJuldHbT8VwNrdDjmt6C7A714dfCmqkd3Dc8VcF1xXGx3vHWrQvRjrXnSwfkXzHSSXR7VlXFwTmsx73Oeaz57zPerp4OwnIfdTE5rmLyTrVq5uhg81zN7eqoJJ4r1sPhSHIzr+ULkk15J4p1dIo2RTW\/4h8QRxIyoa8G1\/V3ndjmvs8nyxykpSRjJnK61e+Y7NXo\/w6M1npaSKcGRi\/wCuB+gFePtHLqV6tnD1c8n0Hc17xodqIIkijGFUAAewr82+kBnFOjl2HySm\/fk+d+SSaX3tv\/wE\/WPCPAXxtTH1Y3ilyr1dm\/uS\/E968O6+ybVc4r2vQ9dzg7utfMmncAZru9M1Ga3I5yK\/h7HYjlk4zP6eWURq0\/aYfXy6n1tpOs5CgNXo+m6qOOa+WNE14Nj5q9W0nWdwBzXDGtqfO4zLvI+k9O1QHHNdzp+o5xzXz\/peq8jmvQ9N1LPeuylVPkcdgLX0PdLC\/wCnNdlZXpPevF9O1DpzXc2F7nGTXfTqHyWMwlj1qzuia6a1uM4FeZ2N3nHNdZZ3QIFdsJnzOJw9jvraetIEEZFcraz5rfglBGK6YyPDrUrO5coooqzmCiiigAooooAKKKKACiiigAooooAKKKKACiiigD\/\/1v38ooooAKKKKACiiigAooooAKKKKACiiigAqOR9q08nAzWbczdaTdi4Ruyncz4rm7y461cu5+tcre3OM1zzkezhqNyhfXWM81xl\/edavahd4yc1wep32M81xVJn02Dw1ylqV+BnBrzbWNWAB56Vc1jU8AgGvHPEOuhAx3VwVah9dgsLYg1\/XwgPzV4P4l8UBNw3U3xR4nCBvm9a+W\/HnjyLToWctudshFB5J\/z1Ncknc+gpQUbJF3xx4\/t9MjZ5nyx4VB1Y+g\/qa+ZdQvdT8TXpurw8fwoOij2\/xppN\/r96b6+JZm7dgPQe1djZ6ckKDisJT10Pcw2HUVzS3OT\/ALKWOPkVzupWXBwK9VmtcjgVzd\/Y7geK9LB1+VnmZpgvaReh4bqNmQTxWdY302nXAdDjBr0fUtMPPFcLfaeVJ4r7LLsdKlKNWk7NH5TnOVXupLQ+gPBnj9JYlt7pvzr1FryK4TzICDmvh2Ce4sZNyEjFeneHvHk9viOZuK\/ZuH89oY60G+Wp26P0\/wAt\/U\/NMdl1TDtu10fQUtypOH4qmzxseDXM2viOy1BPvAE1LJI33om4r9Ny+vKDSZ4s4X2N7ODV+2uChxmuGbUJojg0q64F+9X3WCxLmuVnJOB6\/aXg45rpbW8GAM14fa+JokOGNdNaeJrbuwrpq4Vy1SJTPa7e9xjmtmG+968at\/E1v1DVrxeJ7YdHFeZVwEn0LUj2CO\/461YS\/GODXki+KrcZw1Rt4xhTPNcv9mzeyHzHrb6gMnms6fVEUZzivI5vGXoa5q88XSOpw1dVHJpyewOR6zqHiCGIHLV5prfiskEI1cFfa\/JLnLVx97qhOcmvocFkqjrIhyNPVtYeYks1efX940jbE5J4AFST3U1y\/lQAsTXTaD4eIkE8o3Oe\/p9K4+KeNMv4XoP2rUq1vdgt\/WXZfi+lz1snyOvmdRKCtHq\/8u7LXhTQWtx58wzK\/X2HpXsumWOFHFU9I0nAHFehWNhtUcV\/EfGHElfNsVUx2Mnecnr+iXZJaI\/pbhfKaeCowoUVZIhtrYqK27cMmAatxWeF6VYFsewr8kx81Nu5+o4Gq6VnEt200sJ3xGvQdE1zLBWOCK86jUoa0Yg6nzYjhhXjKo6bs9j1sRhoY2PPBWn+f\/BPpHSNXDAc16dpWqdOa+WND1nBCscEdq9f0bVtwHNejRqnw2YYC19D6P0zUc45r0DTr71NeA6TqWcZNelaXqGQDmvTpVD4jH4K19D3DT73OOa7Oxu+lePabfdOa7zT7vOOa9GnM+OxmGPUrO5yBXTW0+QK87sbnOOa6u0n6V2wkfMYmjY7SJ9wxU1ZNtL0rVByM10J3PGqR5WLRRRTMwooooAKKKKACiiigAooooAKKKKACiiigD\/\/1\/38ooooAKKKKACiiigAooooAKKKKACiikY4GaAIJ3AGKwLqar9zLjNc1eTVlNnfh6RmXs\/WuN1C661q39x1rh9RusA1x1JH0uDoXsY+pXmM815trGohc4Nbmr320EZrx\/xDqwRW5rz6sz6\/A4Y5\/wAQ6yEBGa+efFfiXaGO6ug8WeIQisM18reM\/FUcUbyyPtVQSSegArjep9HTSgjn\/HfjWKwt5J5n+g7k+g9a+YTLfeItRN9enJY8DsB6Cm6vq9z4q1XzTnyVOEX29T7mu50bSlgiGRzXPUl0R7GDpW9+W5Y07T0gQcc1srCcYq5Da8VdEGBWDR68JIxWg7Gs64s9w6V1DR5FRmAMMGqhU5WdHsVUR5tfaYGB4riNQ0c88V7lPY57VgXelB+gr2cJjuXqfPZjkqqJux89XmksM8VgS2MkRyte83uiZzgVyt3oRGflr6PDZgnbU+BzDh1q9kebW2oXlm2VJ4rrrDxhNEAsh6etQ3GiEfw1jy6QwPAr9CybjzHYJKDkpx7S1+57\/n6Hw+O4VjJtpWfkeiw+KLacfPVg6hZzDhhXlP2GeP7tPH2yPoTX6llPipl7ssXSlB+VpL9H+DPl8RwziIfA0\/wPTGeBvuuKQXJj6Nn8a86W7vF61KL+57g1+k5d4j5BVSTxaX+KMl+lvxPHq5Li4\/8ALv8AI9Oi1Ig8Pz9a0E1VgPvfrXkf26c9jUi390Pu5r6KHFvD81f6\/T\/8CRzPLsUv+XT+49iGr8n5qa2sf7VeVJf3ZPINTrcXrnhayq8a8N0NamOi\/S8v\/SUy45VjJaKkz0dtY\/2qzZNWHrXLxQX8gx0zWrb6HczEb8mvncf4w5DhU1hFOq\/Jcq++Vn+DPRw\/DGMqv3rL8fy\/zGTak0nCck02Gxur1vm4BrsdP8LkkZWvQdL8LdPlr8w4g8asyxcXSwKVCPlrL\/wJ7fJJ+Z9ZlnBVJNSr+8\/w+44fR\/DmMYWvVNI0DaBxXV6X4aC4+Wu8sNDCAfLX4fmWdTqylUqSbb3bd2\/Vn6llWTxpJJKxz2n6TsAyK6q307AFdDbaWMgYrqbLRC+Plr4jG4x1Gfb4WEaSOFWyI7UG1I616i3hxwn3axLvR3i\/hrwqybPXoYqL0TODNuc8U9EKnFb0lmV7VTaAjkCuKcb6Hr0MS4u6ZTKujCaLqP1ruNB1ndjnBrkkXHBpmXs5RcR9Cfm\/xrKnJ03ys7cZQji6brQ3W\/8AmfSejanuAwa9T0jUc4Oa+Y9A1cMF+avYdG1HODmvVo1D8\/zLBb6H0Lpd8DjmvQ9NvM4ya8K0i\/6c9K9L0u8GRzXqUpnwmPwtrns2n3XA5rsrK4yAK8p026ziu6sLjJFejTkfHYyhY9GtJuK6CCTIwa4iznyBXT2svArshI+bxNI2qKap3DNOrU84KKKKACiiigAooooAKKKKACiiigAooooA\/9D9\/KKKKACiiigAooooAKKKKACiiigAqvO+0VYJwM1lXMlJs0pxuzLu5a5S9nxk1s3kvXNcdfz4zXLOR7uEpXMHULjgmvP9UvNqkk10WpXPBGa8y1u9Azg8CuGrI+swFDY5PXdR2A5NfP3ivXAqtz0ru\/FGr7A3NfLPjXxBtDqGrgm7n1uHp8qucD4z8SABxur4q+IHieXVb06TbNlQcyH1PZfw716T8RvFxsbV3Rsu3yoPc\/4da8I8PWEt\/debJlixySepJrKeisd2HXtJcz2R2XhnR8KJGFepWlkdo7U3R9KEUQ4roSgQbRXO4nrqrbRFLywgxTCDU79aZjOKykd9DUhCZqVY8ipVWrSRggVzSZ7lCOhS8jNV5LENyK3FSpBED0pRqtHaqClucZPpYbPFYtxoobtXqH2Pd2qNtKLDpXbRxc0ctfK6c9zxW40DP8NZMvh0ntXvJ0Mt\/DULeHif4a9ihj5o+exuQ0nsfPcnhxv7tUn8OH+7X0S3hvP8NQnwz\/s16tLMn1Pl8Tw5F7I+dW8NN\/dpv\/CNN\/dr6J\/4Rlc\/dpw8Lrn7td0M0XVnkVeHOyPndfDLH+GrMfhdifu19EJ4WGPu1eh8KL\/droWaLucj4et0PnqHwsx\/hratvCTEj5a+gYPCaddtblt4WXstN5qu5UchS6HhFp4RJ\/grrbHwiRj5a9stfDCDB210dr4dRcfLXPUzbzO2jk0V0PJLDwqFx8tdrY+GwuPlr0i20NV7VuQaUo6CvNrZk31PWoYGMOhxFpogQD5a3odLx2rrY9OVR0qyLMY4FeTWxTkerSionPW9jhh8teiaFpivjIrBjtgrc13\/AIeChwK41K7DFVGoaHQLoCPFwtcrqvhoYJC17fp9okkQOKh1DSVdTxWsqV0eJRzGUJ2bPkzU9FaIniuPuLNkPSvpjWtABBIWvJNW0jymORXn1aNj67A5gpq1zzFocGmNGGTBrfuLbaTkVnmPHFcVWndH0+BxfJJMy7C4fT7ryWPynla9j0HU8gDNeQXlv5iZXgjkGtvw7qbAAMcEHmnh6vRmWcYFfHDZn1Fo1\/naM16lpN7kDmvnnQ7\/AHbTmvW9GvegzXsUah+cZnhbXPdNLu+BzXoOnXHTmvGdKuulej6bc5wDXqUpnwmPw9rnqtjP0rrLSXpXnWnz9K7KymPFd9OR8li6Vjtbd8jFWqx7WTOK1wcjNdSZ4VWNmLRRRTMgooooAKKKKACiiigAooooAKKKKAP\/0f38ooooAKKKKACiiigAooooAKKKKAIpWwtYN3Lwa1rl8CuavJetZzZ2YeFzDvpsZriNRmznvXSX8vBrg9Tm61x1JH02CpbHKatdFVJzXj3iLUAisAa73XLsAH2rwPxZqmxWy1edVkfZYGlZHlPjPWxGjgH1r4\/8ca+fn+bmvX\/HOuYD818T\/ErxKbe1k8tv3knyr9T3\/AVzpdT1ZzsuVHknifVpNd1oohzHESq+57mvWPBGh4jWRhXkHhTTjeXijHevrPRNPSys1GMcVnJXZ3UpKEbIsiIRIFAqnJya0J2rPbk1nI7KLuVtuTShPapMe1SKvtXLM97DIEjq7HHkcCnQQM56VvW1moxkU6ODqV3aKPSeLhQV5MzorNn6itSLTsckVoxiKMdKl+0ItfQYXhyUtZI82vxDGOkWRJZKO1WVtEqI3kYFN+3J617tHhh\/ynnT4jXWReWzjPOKsLYI3aqCagnrV2O\/j9a7o8MSXQ46nESfUnGmRH+Gnro6N2qaK9jPetOG5jOKipw7OPQ5\/wC24y6mWuhxsfu1MugIf4a6OGVDWpEI26ivLr5RUh0N4ZnCW7OSTQUHO2r0WiL6fpXaRQRnkCtCK1TsK8etQqUzshiKczjodFTptrVh0ZePlrqo7Vew5rQitR6VxutJaMuUYbo5yHSQMfLWpDpqr2rfitR6VfjthU+1bOeTSMKOwA7VcSyAHSt6O2HpVlbWlzNmLqHPi0GOlP8AsoxXRfZfal+yjHSpaEqpzf2XvXQaQPLlFK1uKltl8twalLUU580bHtnh8iSMCupnsQ6ZxXCeGLkZVTXrsMYliz7V6NNXR8fjJOnUPLNU0sMp4rybX9EGCQK+k7+yGDxXnWs6arKeKwrUrnqZdjmmtT5S1TTjGx4rlZbcqa9t8QaXtJOK8vvLbY3SvJqwsff4HE86TOVli4rCLNZXglXox5+tddLFwa56+g8xCv6+9efP3Jcx9lh7Yqg6T36Hpfh7UQwXmvZ9FvNwGDXy\/wCG79gQpOCOCK900O8yFJ4r1KEz4TNMNvofQekXWQN1emaVc8CvD9Fu+mDXqWk3OMV61GR+eZjQtc9g06fpg13FjL0ry7TJ8gc13uny5Ar0qcj4rG0tz0C0k4BroIW3CuRs5OldLbPmu2DPmMTAv0UUVocQUUUUAFFFFABRRRQAUUUUAFFFFAH\/0v38ooooAKKKKACiiigAooooAKQ8ClpkhwtA0Zl0+K5a9k61vXj8GuSvpOvWsJs9bCwOZ1GXGa8+1WcAGuv1GTr1rzbWpyFOM1wVWfWYClseb+I7wIjc18x+NtX2IwzXtniu+ZVb\/GvkXx7qrAOc\/rXBN6n1uHXLE8B8ea1kuA3618TeMtSfU9aMAOVh4\/E8mvoDx7rPlJNO54QE\/lXzJpcUl9e+ZJyztuP1PNJqyHCXNO\/Y9r+G2jBmEzivf2URptHpXF+CLBbayU4wcV2kx71m1odsZ8zM2XNVGBq3LmqjnmsJnrYcafT1q5BCznmq8Sbjk1ca6jgXrXqZZk88VK7WhWMziGGjZPU14hHD1ok1FIx1rzzXfGOnaNAbi\/mWNe2ep+g6k\/SvBfEHxi1C6ZodCj8tf+eknLfgvQfjn6V+u8PcEVsUk6MPd7vRff8A5H55nHGNOh\/Enr2W59TXWvwwIXdwoHJJOK4XUfip4YsSVkvEYjsmX\/8AQc18eajrOr6vJ5mpXDzH0Y8D6DoPwrL2ua\/UcBwJgqKX1qq2+0Vb8Xf8j4LF8b4ib\/cQt6\/8D\/M+p7n436FG2IUnk9woA\/VhWY3xzs8\/JbS\/iV\/xr5s2PThE1fR0eHcqgrKi36t\/pY8afE+Plrz2+R9MQ\/HPT8\/vIJl+m0\/1Fb9n8afD8pAkkeL\/AHlP\/sua+SxE9TLBIeldn+r+VyVnTa9H\/mmRHiXGreSfyPujS\/iLo1+QtpdI7HsGGfy613Nn4likx81fnMsEo5rqNL8SeI9JI+y3L7R\/C3zD8j0\/CuOvwdg6q\/cVLPtJfqv8jvocW1o\/xY\/cfo7Z62r45rq7PU1fBBr4U8P\/ABZmQrHqyFP9tOR+XUfrXu+g+NrW+jWWCUOD3Br5DNeCp0tZQ077r7z6TA8TQq\/DI+nLS8Vsc10lrMr4BNeJ6V4gV8fNXoWm6or4wa\/OM14YcL6H1OEzq\/U9JgCsK1IoR2rm7C8VgOa620kDYwa\/O8xyZ029D6TDZrzbssxQVoR29SwR5FasMJ6V81Oi4OzPReIUldFSO2HerSWw9K044CauJbmhROWdYxRbD\/IoNsMf\/WrohbE0029PkMvbnMtbiq5gCtkV07wVSkhqXE2hVuX9DuPKkGa910O5WaIDNfPduTFJwa9X8NajjCk10UJW0PJzShzR5kehXluGTIrhtUswQa9FVxNFkVzepQZBroqRuePhKri7HgniDTgVJxXier2WxzX05rlruU8V4f4gsyrGvKxED9AyjE3sjyOeLBxWBdxjGa7O6iwxzXNXseK8jER0P0XJ63vWOSgf7JqAIHD\/AM69o8OXeQvNeK6guFEg6oc\/413vhm9BVearCz0OfPsLyzcls9T6U0S76AGvWNIuMgc\/rXg2h3H3fmr17Rp+F5r26Ej8vzOhue0aVPwOf1r0HTpuleT6TNwOa9F02XpzXq0mfB4+luek2UuQM\/zrqrVxXD2EmcV1to\/Su6DPksXA6NTkZpaiiOVqWug8h7hRRRQIKKKKACiiigAooooAKKKKAP\/T\/fyiiigAooooAKKKKACiiigAqCc4FT1SuW4pMuCuzBvH4PNchfycHk1094x5rjNQc4PNc1Rnu4OJx2pycHvXlevz4VjivRdUkABOa8c8S3ACNivPqs+wwENjwzxrf7UYdK+L\/H+qffwRX0147v8AAfFfEfj7UTl8muS12e\/KXLE+YfiTqZeL7Op5lbHHoOTWH4N0\/wA2dXIrK8W3JvNbWEHIQZ\/En\/61ek+DrMRxq2KqS1MqMrRue86FF5VoB7VoTnFV9LwLYfSn3DYNZSO6iyjM+DWeWBPNFxNyax7m9WFMk135XlssXUStoPG5ksNTvfU0ri\/SBeteN+M\/iTFphax0\/Etz6fwp\/ve\/tWF448cywM2l6W375vvMP4Af6\/yrx+K2Zjvfknkk9Sa\/oPhXhOlCnHE4pe70Xfzfl+fpv+Q59xLUnJ0qL16vsJfXl\/q1ybzUZDLIe57ewHQD6VAIa1Ft6mEHtX6dT5pJQirJdEfCyk23KTuzJEFSi39RWsIPapVtsnAFelQwvczcjIFvnjFWo7Et2rfg0\/OCRWxBp2e1dTUYLQRy8enegq\/Hpo9K66LThjAFaEem9yK5Z1RnFDTu+Kd\/Z\/tXerpvbFSf2bnjFY+2HY89\/s8joKt2Mt9pk3nWbtG3t0P1HeuzbTh0xVWTTeCQK6KOMlDTp2DbVHe+FviE29bfUD5b9Aex\/wAK+htB8TJKF+avjBrLb2rq\/Dvia70aVYbhi0Pr3X\/EVli8loZhBugrS7f5f5HsYHOJ0mo1Xp3P0C0fWFcDmvTNMvw2Oa+RfC\/iiOdUZXyCODXu2g6wJAvNfkPEHDbhfQ+7wGaXtqfQFjMHxXUW67sV5jpF8GAya9G0+UMBX4\/m2UuDeh9Zhcwv1OhhiBrSjgzUNqu4CtuCIHFfKSp8rszvlWurlQWwoa2Fb0duDTZIAKfKc\/t9TlpbcCs6WEV1EsQrKnirOSOylUObePaa3dHvDDKBmqM0dVo2Mbg1mnZnY4+0jZnvGk6iskYBPard4FZSa800XUiuFJrvFuxLHXXGd0fO1sM6c7o4\/V4QVNeMeIbfqcV7nqgBUmvIvEKD5q466PpMpqWaPEL+LDmuT1BAATiu71JMORXF6kPlNeNiI6M\/S8oqe+jiLtVIINWPDNy6P5Z\/hOOtQ3YPOKzNNlMOoEEdcGuTDO0mj6LOqXPh41O36n0xoFySq5zXseiz5A5NfPvhu4BC9q9r0ObOOSK9yhI\/Ks1pbntmkTdOcV6VpkvTmvI9Hl6YNem6XIcDvXr0WfnmY09z03T5OAc12Nmx4rgtOc8Zrs7JxxXoU2fHYyJ11ucirNULZuKv11I8CorMKKKKZAUUUUAFFFFABRRRQAUUUUAf\/9T9\/KKKKACiiigAooooAKKKKACs66J5rQPSsq6J5pS2NaK1OavmHOa4rUXAzXX3xABzXEak\/XFcdRn0WCjscHq8hCnFeHeLLgqjZNey607bTzXz54ym2o+TXn1WfZYGJ8ufEC9AD85r4g8eX2WcV9afEK8xv\/GviHxvdEu3NZQWp24mdongQzfa\/K\/X58flxXu+iQiCFBXiHhaL7Re+aedzE\/nXvEX7qNRTaJhLRI9U0x82wPtUF7MFBrP0e6DW+M9Kp6ld7ScGpjBydkdXteRXM+7vAgJJryLxp4tbT7cx25zNJwg9PUn6V0muaslvC8jtgKCSfYV8\/vNNrmovfTdCcKD2UdB\/nvX7RwPw\/GdqlVe6tX59kfm3E2dSu4QerK9tbySMZpSWZjkk8kk1tw2DuOldBpeiNMAccVtzWkdsu1RX7JCfM7H54zinswlCwcVsTR5NIkHFfR4PD3SuYykZy2+TwK07ayzyRVu3tdx6V0dpZdOK9ScVBWM07lG2sfat2308nHFatrY+1dFbWAwOK8utM0RgQ6dnoK1I9M9RXUW+nDjiteLTVx0ry6lUtHFrpp9Kl\/ss+ld8mme1S\/2Z7VzOuVY84fTfap7Lw+Lx9oHWu6fTfUVqaDZpHeKpHBpuu1FtCsea6l4QkiTcFrg7vS5IGKsOlfc134US6sxKi5yK8T8TeEvL3MFrXL8z95a6hOB4boWszaHcgOSYSef9n3r6e8KeIllVCrZyBgivmvU9LMLFSKveENel0q+WwuD+7Y\/IfQ+n+FfU5jlsM1wzxFNe+lr5+fqdeXY6VCapyeh+hPh\/VRJtOa9j0e83AV8jeFNb3hfm619CaBqO4Lg1\/P3EmTcjeh+hYDGXse+afKGArqrbBFec6RdBgOa72zlyBX45meE9nJn1WHrcysdBHgCmygGokfAoZ89K8W50KnqUJkFZcy1ryGsyas5M7aSMWZaypVxyK25hWTP3rGR6dJC2t00L5BruNP1TcuCa8ykcoc5q7aagY260QlYqvhVNXPSbyZZEJJrzPXiCre9b\/wDaYaPrXF63eKwJzWk1zInBUnCVjzXVPvmuH1QgKQTXXajMpY1wOrzqM815tei7H6DlEvfRyt5IuTXPCTZexueK0rqYc1z88wEisOxFeZCk4zR9tirTwtSPl+Wp734YuAQuG\/Ovc9ClfA5zXzh4VuVZUzXvegyA7Spr2KSaPyrNFdM9x0eXgZFeo6U4OO1eP6NIwxXqukSghc16lE\/PMxjuenaa3TBrtrFyAK4HTTkDFdxYk16VNnxWNjudhatWqKxrRuma2B0rrjsfOVlqLRRRVGIUUUUAFFFFABRRRQAUUUUAf\/\/V\/fyiiigAooooAKKKKACiiigBD0rGuycHFbDfdrGuu9TI3obnKX3euI1IgA5rtr84Brg9S5zXHUPpcEtjzbXZDtOOK+cPGkmFf8a+idf4Rq+Y\/HUpCOBXn1D7DB7Hxz8RLnaHFfEPju5ISZvQE\/pX2H8Q5fv\/AI18T+O3Pkz\/AO61KmisXLoc14HgDSBq9cuW2xivNPA0Q2bq9FvmwhFDQRlqbOk6gEUpmq2q32FJzXFx6iYJsZpuqalviJBr0spw\/tayTOLNMV7Ok7HnnjXVXmK6dEeZTlv90f4mrvhfQmuCqgcVxltv1nXnl6qG2r9BX1J4V0FbOxE7rziv6RyuisFhIU1u9X6v+rH47jazrVXNmS9hFYW4QDmuLvzuc16DrT8lRXAXI3NX0mW0+Z3ZwzZhGLNWEhzgVaEVXYYcsK+9wlK0bnLJklnaZxXV2dn04qCyt+BXV2VtntWWJYRH2lmOARXTWll0p9nadK6uzs+nFeBiZWNkVLaw6VuQ6dnBxWvaWWccV0ltp\/A4rxK9WxokcxHpuR0qf+zM8YruodNyOlWjpeB0rz5Ygux5lJpvHSqsVobedXA6GvS5tNwOlYdzYEcgVtTrX0Ez2rwfBFqulCM4LAVyPi3wuF3\/AC1b+HOq\/YrsWspwDxXsnibTI7m285BnIrx5VJYbEW6M0S5on51+LNA8p2ZVrxDWLJkJZeCDX2t410YDfxXyx4ksfLdwBX6vwpj3zpHFWidh8OvE7XluqyN+8jO1\/r6\/jX1r4W1Teq81+cfh7VH0TX43JxHKQjc8c9D+dfang7VNwQ5rxOPsijRqOdNe7LVf5fI+nyTGucUm9UfYGhXu4KK9O0+43KK8D8PXoYKc16\/pVxlRmv5j4hwfI2fouX1L2PQIpeKezk1lwzDFWPMyK\/OqvuyaPpqcLq5JI59KoSN7VK7CqMrjtWLZ1QplaZvQVkTN7VdmYVkXEgHFRa5204lG4fHasiS5KHPSprqYDOa5i8ulTJJrenQcmdalZamy+rsgwTXNajq28GuevdUVM4Ncdfa0PWvWoZdKfQj2kYu5tX18Oea8+1W\/UsQKo6n4gVFOWrzy+15XY811VMlk1se3lmPjGV2zori7BrEuLnuPWufk1dT3qq+oBu9eRiMnlBp2PtKOZRqUpxv0f5H0F4TulYJX0LoD\/dIr5U8I3asFya+lfDVxnaM\/jWM8M4M+BxtVSjdHv+iSttXvXrOjuG27a8d0N8qtesaOeBV01Y+GzHW56ppvau5sWPAPNcFpTbgB3ru7HtXfTPicatzsLTHGK2l6Vg2fGK3k+7XZE+ar7jqKKKo5wooooAKKKKACiiigAooooA\/\/1v38ooooAKKKKACiiigAooooAa3Ssa771st92sa671MjehuchqHU1wuo45rvNQGQTXB6l0NcdU+mwPQ8v8Qn5Gr5Y8dP8r19S+IfuNXy349TCuR05rz6h9fhHofDvxCJy\/PrXxX45OYpR7Gvs\/4hkgvivi\/xkN0c2f7rfyp00Ri2J4HAEINdjqT7UxXH+CDiCum1V+CKdjPnscLqFxskyKwNW1ZorCSQHkKcfXtVvVZfmrgtdnP2URZ++wH9f6V9Zwnh1VxMYvq0fNcQYi1Jnc\/C7SDe3iEjNfX1zbrZ2KxKMYFeJfA\/Sw4ExHQV7xr\/AMoKiv3arPmqKJ+bHkOrklmrj5Uy3Sux1MZY\/WubePJr7HJ6exzVGUUi+bpWlaxEvgCkSPnNalnGM9K+9oQtA5GzasYeldfZW54rDsIxkcV2FlH04rzsVEuLNqxt84rr7K25FY9jEMDArsLCIV83ikbRZq2VpkCussrLPFZ1lEMjIrsbKIccV85ijaJNbaduHIrROl\/LnFbFlCuBkVutFF5XvXhVajTNEea3WngDGK5i9s+or0++iXnArkL2Ic5rvw0myWcLbu9jdLMnGDX0RoWtRarpQicjIFeA3kXUir2ga4+nXAjJwDXbisF7eCkt0KM7M0vG1muXwK+RPGFoFZzjpX2F4ku47y2Mi85FfK\/jJAC7D3r6bhnmjOKZjWdz5i1mPEjFeK+mfhfr7ahptvO7fPja\/wDvLwfz6182a4B5rAV3Hwc1Yx3lzpjH7pEi\/jwf5Cv0fi3A\/Wcr9rbWGvyej\/T7jTKa3JXUe5+jHhi9LIvNe3aPcZUHNfNHhG6LIvPavetFn+QV\/IPFWGs2frOVSvY9Xt5TjrV3zOOtc9ay5HetHzeM1+L45cs2fe4SF4lt5cVSkk7VG8uBVGWUAVxrU7Y0xs8uBWDdTgZ5qW6uAoPNcbqeoqoPNdlCi5MpvlQmoagFB5rz3VdYWMH5qqa1raxg5avGfEHihU3fNX1eXZW5NXR5uJxygtzptX8RqmSWrzHV\/FqRhmZ8AdTXmHiTxsIWKI29z0UV5fc3V\/qsu+7cleyjoK\/XOGuA6uNiq9X3Kfd9fRdfXY+CznjGGGbp0\/el2\/zPRtW8fRyuUtcyn\/Z6fnXKv4h1ickxqqD3yT+fFUrayA7VtQ2XOMdK\/UsHwnlGFSXsed95a\/hovwPhsTxdmdb4avKuy0\/HcorqOut8wdf++atR61rERHnRq49sg\/1rWjssjgVbWxBGCK7a3DuS4mPJXwcGvJWf3qzMsNxbm+HfNSxUvm7\/AIO6O78GePdISVLe+c2r5x+84X\/vrp+eK+xvCmoJLGkkbBlIGCO9fn1LpMco+ZetbvhfxR4q8C3KzaJNuhBy1vJ80Z+g\/hPuP1r864k8G8Li4utkVXkn\/JPVP0luvnf1R9dlXiVWjalmcLr+Zb\/NbP5W9D9dvDs+5F+leyaMcgGvif4NfGXw745C2Ct9k1FBl7aQ\/MQOpQ8b1HtyO4FfZuhTBguK\/nbNcnxWVYiWDx9Nwmuj\/Nd0+jWjPsJY6jjKar4eXNFnrOk\/eFegWPSuA0kdGrv7HtXPTPlsb1OstO1bsf3awrQdK3k4UV1wPmsRuOoooqzmCiiigAooooAKKKKACiiigD\/\/1\/38ooooAKKKKACiiigAooooAQ9KxrsHmtk9Kyrqplsb0dzj77vXD6koOa7y+UEGuH1JCAcVyVD6PBPY8m8RIdjZFfL\/AI7XKv8AjX1Xr4OxsivmLxzEpjcmvPqI+vwj0Pgr4ixff\/Gvi3xchLyKe4I\/Ovt34jxMN5HvXxP4uO2dvrTpozxkrGX4IkHk4rp9Wbg1xPgyTY7RnsSPyrsNVJ8virSOaU+p5lqrnea4HVm8yaJPVq7bVmwxrhrr572Ee5\/pX3HBdli4\/wBdGfI8QSvTZ9nfBK3EWmeYe4r0XX+Sa4b4U\/uNFVvYV2uqSCVTX69SfNVufFSWh5dqKZY1gOnJrq9QTJNYLR81+hZP0OKoVkj61p2iYbioUTrV2BcOK++w8bxscjOmsUHFdjYp0rkrLtXX2R6GuDFUi4s66xQcYNdhYgcVyNl2rrrMjAFfOYqibRZ19ljjmuusyOK42zfGBXT2soFfO4mg2aqR2NrIBWmZxtzXLw3FW\/tBxivInhNTRSJ7qRSK5e9K81qTzg1g3cvWuvD4axLkc5e4OTmuSunMTblOCK6m8cHNcneEYNe\/haJlKQ86zmDy5Grxfxncqyuc129\/LsBINeK+LNQzuXNfUZNl\/wC9UkjGcjx7WpQZGxTfhtfG18bQpnHno6H8t3\/stZurTE5NY\/hS58rxfYSDjMyr\/wB9fL\/Wv0zG4dTy+vTfWL\/IjDz5a0JeaP068G3GUTFfQuhTfKK+ZfBch2rz6V9F6G\/yjBr+KuLUryP2XJlex6tZzfKPpWgZuM1z1pJ8vWrzS4GM1+EZl8Z+l4Cn7pdknwM1l3FyAOTUc0+O9c3qF8FU81zUYczO2cbIg1LUAoPNeV67rYjU5NXdd1nYp+avA\/FPiTYrEtX1uWYHma0PDx2K5Eyv4m8ThA3zV85+JvFskshgt2y5\/SofFfil3kaONsselcHbxtI\/mOcknk1+58GcKQqxWPxkf3a2X8z\/AMl177dz8n4k4hlFvD0H73V9v+CW4IWmk8yQksTyTXRWtqMDiorK2ziuqtLXpxX6lUxPQ\/P7X1YlvZ5A4rbhsvarttZ5xW9BZ+1crxI7GNFZ8cCrq2XfFdDHZgDGKuJZCqjihOJyossjAFMk05sZIrvLHTxJMEYV2Fx4XDQBlWt1mCg0mTyXPnmWxntLlL+wdoJ4WDpIhKsrDoQRyCK\/Q\/8AZt\/aGTxRcx+CvGzrFq6jEM3CrcgD06CT1HQ9R6V8canobwE8cVw99YSxSrdWrNFNEwdHUkMrKcggjkEHoa5+IuHcFxRhPqmMVpr4J9Yv9U+q6+Ts13ZbmlbL6nPTej3XR\/8AB8z+hfRpldVIr0ewGQMdK+Af2T\/juvxL0ZvD3iJwuu6ao84cDz4+AJlHrnhwOA2DwGAr780uTcB71\/ImcZLicnxlTL8bG04v5Ps13TWqPu5YuGJpqtSejOxtABitpelY9op4rZHSuSJ4dd6i0UUVRgFFFFABRRRQAUUUUAFFFFAH\/9D9\/KKKKACiiigAooooAKKKKACs26960qo3KnFJ7GlJ6nI3qg5ridRQ81316vXiuK1FBz2rkqI+hwcjy3XIyUPGa+aPHUQ2OCK+pNbTEZ5r5q8doRG5FcFRH12EnofAHxLQLvAPrXwv40YiVue9fdvxPOPM49a+B\/HMgEj8VVKJhj6mhy3hi4C3rD1Neg6kd0ORXiPhfV0m1SRFPCcD39a9rnbzLUEelbVKbhLlkcNGuqtJTi\/6R5drHDGuHn\/4+4m\/2v513mtKQxrgrn5XVv7rA19PwtW9ni4ev5nz2cx5qbPtr4ZsG0AbewrXvrzypCrVy3wiuRPpPl57VteJImRmZa\/Y8NP95qfGyV0Z9y6zAkVjOgzWI2rNBJtc1dh1KGcda\/Q8plaxw1UaEYFWkGCDVSN1PIq6uO1foOCqaI45I3bJxxXXWTjiuEtpdrV1FncDiujE0r6iiz0CzkAxzXVWcw7GvPrO5rprS6xjmvn8ThzVM9CtZwMc10Fvce9ef213W1De4714tbCmikd3FdDGM1Y+2DHWuNS+Iqb7eMZrheDL5jo5boHjNZFxce9Zkl8cZrMnvR3NbUsJ5CciW6nBzk1y97Oo6mlvdSRQSTXnOueI0jUqhr28HgZTaSRm5FfxFq6QxsoPNeBa7qHnOxz3rd1vWXnY5avMdTvOvNfoGU5d7JLTUxlI5\/VbgHOKz\/DjH\/hJNPI6\/aYv\/QxVO9nMj1f8IxmfxXpyD\/n4jP5MD\/SvezOao4Spf+V\/kKguapFeaP0u8GcIlfRWiHCDNfPng5MIte\/6RgIK\/hbiuunzH7rklHY9CtZPl\/CrLzcYzWPDJtGaZNdKvU1+HY+V6h+oYChaBNeXYVTzXAazqgjU81b1bV4olOWrxHxT4pjjVgGrty+hzNXJxilFOxl+KfEIRWy1fLnjHxUMsqtnNa\/jHxYzbgGr58vb9765LMcgGv17g7IXmOJjR2itZPsl+r2Xmz8s4pzT6rTcr67L1LyySXUxllOSa6awg6HFc\/YR7q7Swi6V+91ZxhFU6StFaJdkj8elJzblJ3bNyxtycV19lbZxisqwhyRXZ2MHSvMq1h2LtpacAV0cFnzS2dtkCuotbPI6VwTxBVjNhs\/l6VcWywDxXQw2Qx0q2LLAPFKOJ1E0c3b2\/lSqwHQ17pommpqOmggZOK8ra0wM1658Or1RJ9klPBrPHVW6fPHoOC1scX4h8Nbd3y14brekm3cjFfdHiTQ0aMyKvBr5v8V6MBuOK9HI805rJsirTseCeHPE+t\/DbxfZeOfDh23NjJuKnO2RDw8bY\/hdcg+nUcgV\/QD8LPG+kfEDwlp\/i7QX32t\/EJEz1B6Mrf7SsCrDsQa\/ALV7JfmQivt7\/gn78UJNN13Ufg\/qkv7uYG+sAx6MMCaMfUYcD2c968nxX4ajmmWLN6C\/e0N\/OD3\/APAXr6cx3ZRjHSm6EnpL8\/8Agn7IWXzKCa2B0rD0xwyjnrW5X8yRPYqvUKKKKZkFFFFABRRRQAUUUUAFFFFAH\/\/R\/fyiiigAooooAKKKKACiiigAqvOuVqxUcoytBUXZnL3iiuPv4+DzXc3a8GuSv0BBJrmqI9vCSPK9cX5GzivmPx+QI34r6g1\/5UbOK+UviJNiJxxXDOJ9RhqtkfAfxSmH7yvzt+KWpfY7aRlOHc7F+p\/wGa++finON0g+tfmZ8V743OvrYqciFcn\/AHm\/+sB+dejlWF9tWjDpuzzM6xXJSbW5xnhe5NrqKnseK+mrGbz7EfSvl6wiMMgf8a9\/8LXouLQLmu7O8PyTjUXXQ83Iq94SovpqZ+txcmvObxfmIr1vWYcgmvL9Rj2ua4sDWdKpGaOjHQ5otH0J8E9UHFuxr27xJa7kLCvkH4Z6udN1lEJwCRX2vchb\/TlmXnIr9qwuJU1CtHZo+HnDlbiz5w1u3ZGJArhpNQuLN+DxXsfiCxIJ4ryPVbXDEV+h5Li1pc46kS\/Y+LSnEprsrLxLazAAtg14TcRlDxxVeO8uIG+Umv1HLeSokcFSJ9PwanbvyrCt+z1BOxr5ctvEF1F\/FW9beLrlD96vpqeXuorJmD0Pq60vl4wa6O2vhxzXyvY+OpAQHPNddaeOSwBJrhxOSVV0GpH0vb32e9a0OoADBNfOlv43zwDWrF40JAwa8erktTsaKR9CLqS9zQ2qIv8AFXgX\/CYOw4aq8niudxw1YLJJ9SuY92n16FATurmL\/wAVRoDtNePT+IZX43GsO51hmGd1d1DI0n7wnI77VPFEj5AavPNR1d5CSTWJd6r15rlb3U+vNfRYPLVHZEORb1DUM55rhtQvSxKg0XuoFiQprBdyTk19FSpRox5mZN3Edq7r4W2n23xxaZGVi3yH8FIH6kV567V7Z8EbBn1S61Uj7iiJT\/vHJ\/kK+K41zVYbLsRUb6Nffp+p6uS4V4jF06a7\/lqffXhXZGq5r2Ww1CGKMZNfPuhzOqKM13UV64XrX8McU5ldux\/THDuR8yVz1abxDFEpANcpqPiokEIa4m5vyM5NcvfahhTzX5HOu6lU\/WsPlFOjSu0X9f8AEkrg814L4n11iGJat\/XdVwG5rwfxNq5w3NfaZNh72bPiOIsRGjFpHG+JdXaVyoPJrnrMbmrGu7o3F0TnPNbdh2r+qOEcpWXZbGUl79W0n6fZX3a\/M\/l\/iPMXjMXKz92Oi\/U7LT06V3Gnx5xXHacOma7vTxnBNenWkeEjrtOiHFdxYQ9MVyenLkiu605QSK8evMtHU2MHA4rsbO1B7VhadGDiu50+EV49erY0SJYbLK9Ks\/Y+ORXQ29puSnSW4UHNc1PEXYNHIS22BUuj3b6bfJKnGDWlcR8GsKcY5FezQlzrlZm9D6ptLqHWNIWQHJxXiPi\/TgN\/FXPBPiY25+yTHg8VqeLNksTSLyCK48HRlhcRy9C5PmR8jeIbXy5W4rj\/AAt4vuvhn8RdG8fWWc6ZdJLIF6tFnbKn\/Aoyy\/jXpnimMCRiK8O8Uwh7Vj7V+sZZCGJpPD11eMk4td01Z\/gcEm4vmR\/UF4av4L+yivLVw8Uqh0ZejKwyCPqK7Ec18a\/sV+M38Z\/s9eG9RmbdNbW5spM8nNqxhGfcqin8a+x4zla\/ijNsvll+Mr4CpvTlKL\/7dbR9TGp7RKa6j6KKK88YUUUUAFFFFABRRRQAUUUUAf\/S\/fyiiigAooooAKKKKACiiigApCMilooAxrteK5TUEIU121ymRXKamoCGsZo9LCzPFvEzFEavjv4kXBCSD619feLjtiavin4ly\/I5PvXLKJ9DRq2R8BfE+cs0mD61+YXiCU6n4ovbk8gzMoPsp2j9BX6T\/EyYKZHboMn8K\/NnRojdXBlfksST9TX1fC2H5pVZ9kl9\/wDwx4OeVr8sQnt\/JiBFdZ4N1Ly5vIY+9Z+r2+yPFcxp921neLIOxr0s0wLrUpRW\/Q83L8T7CtGb26+h9E3yCaHeO4rzPVrchjXoel3SXtkMHORXPaxaZya+Ci2mfXV43Wh5\/YXL2V4sydVOa+5\/h1r0es6OsLHJAxXwreRNG+4dq9Z+GHixtJv1gkbCMa\/RuGcx9pT+rSeq2PkMxw\/JLnR9J+ItM+8cV4trGnlWPFfS7iHVrETxc5FeV67pGC3Ffo2WY3kaTZ5E4nzrf2mCTiuaniIJr1jVNNwTxXC3lmVJr9NyfNLW1OOpA5YHBxUytT5oCpqtytfpWXZopJanHOBeSQjkGtOC\/kTgmsJXqVXr6uhjYzVpGLjY7a21YjvW1Dq3GAa81WQjkGrCXUi962dGnPVCu0eopq+PmBqb+2V7GvMU1CQcGn\/2i9ZvAxY+Y9EfV+CSetZ0+rZ71xDahI1VnupG6mqjhIR1YuY6S61XPfrWFPevIaoGQnrUReqlVp01oFmyRn9ars1NZ6gZq8bGZh5lxgOZq+vfhRoh0vQIA64km\/ev9W6fkMV8xeENFbX9dhtGGYlO+T\/dHb8elfcOhQCNF4r+fvFfiVQpwy+D1+J\/kv1f3H6h4eZJKvVli5LTZfr\/AF6npWmkIordN0EHWuZt5Qij2qK5vguea\/j7iHMuaT1P6v4cye0VoaF3fdcGuR1LUMKeabd33U5riNX1DCnmvm8vXPO59TmkFRp2Oc8Qapw3NeDeI9RLlhmu58Qajw3NeK6pdGWYiv2ngzKljcXRwr2b19Fq\/wAEz+cePM09hSqTT1\/XoQwuWlzXX2HauKtj84rsdOboBX9RV3zao\/nNPqzv9POQK7rTyDivP9PbpXcae44ryayKR6FpxGRXd6a2MV55p0g4ruLCUAivIrxLR6TpzDiu709wOa8zsJunNdnZXO2vFr02zRM9LtbpQlEswIJrl4L3C4qx9ryDzXNTw9ncbZJcOMVgXLDmrc1xlSaxbibjrXuYWmzKTIUu5LS4EqHGK7f+3xfWOxjk4rzG6l71mjU5Lc4zxXtrBqqk+plzWGeJ5AznFeLeJMfZWHtXo+r35nJwa8q8T3AS1bPFfa5NScXFHNNn6tf8Ew\/ELXfwq1vw\/I2TY6uzr7JNDGQP++lY\/jX6rW7ZSvxT\/wCCVuotKfHFnnKxy6fJ+Li4H\/stftPZHMdfyt4r4ZYfifG013i\/\/AoRl+p9DgXejFl2iiivzw6wooooAKKKKACiiigAooooA\/\/T\/fyiiigAooooAKKKKACiiigAooooAhmXK1y+qJ8ldaRkYrn9UT93mpkjooTsz548ZjEbY96+GviYxAkz7193eNYyImzXwn8ToziT8a5pI9mlU0Pzq+KJY29xjrsb+VfAXhWAOwr9CviJEGeQN0OQa+B\/CcJhu2t36oxU\/gcV9pwgk1Wj6fqePm7u4P1LWuwELXmF2pjfNe269bfISK8k1O3wTX1tXDcyPIUjuPBOscC1kPTpXo9\/brNHuXnNfOGmXkljdCRT0NfQmh6jHqNmpBzkV+a59l7w1b2sV7svzPr8pxXt6Xspbx\/I4PVLPBJArnIZpLO4DqcYPFeq6rYZBIFedX9kUY8V52DxUqE1Ug9UVi8Opppn098L\/HyTRLYXjcjjmvatS0+K9h86LkGvzx0zU7jTLlZI2IK9K+svh98SYL2FbO+bDdOa\/VMrzOOKgqkPiW6PksRQdKVmO1rRSCflrzPUtKKk8V9SXlhb6hD5sGCDXm2r+HyCflr7TL8zcbXZxzgfOF3YFSeK5+a1K9q9o1HRWBPFcZd6UVzgV95l2dWtqcs6Z54yFTTQxFdHcaeQTxWVJaMOlfbYPPF1ZzyplUPTw9MaJhUeCK+ioZwn1MnTLO+jfVXJpN5rtWaruT7MtF6QvVXeaaXqJ5p5hyFgvUZeoC9Rl682vmXmWoExeossxCqMk8AComevW\/APhB3mTWNRT3iQ\/wDoR\/p+dfG8RcT0csw8sRWfou77Hr5RlNXMa8cPRXq+yPSPhv4Z\/sWwElwP382Gc+nov4fzr3vT8RqDXG6Zb+WorpRP5a5r+OeLeJamLq1MRWleUtf69D+uOCuFoUKcKVNaI6J7wIvWsW5v896xbq\/IGAayZLwkE1+LY7HOtUdj+gssyhUKadjTur35TzXA6zf\/ACnmtC8vSFNef6xeEg8172SxvJHyfFL5ISON16+yCM15lLLvkJNdLrdySTXIBvmr+lPDHDpVquJf2Y2+cn\/kmfxz4j4vmlGj3f5GpAeQa6rT5OlclAa37KTB4r9up+9E\/KXoejadJXa2EnIFecWEvSuzsZ+lclWmNM9KsJuQK7SwuMYFeaWFz0zXX2VzjANeZVpFJnp9lc4ArqbW7x0NeZ2l3wOa6O3vB0zXBPD3KueiQ3vHJq2L3PeuHivMrnNW1vcg81McKDkdNJd8dazJ7nistrwEZzVGW64r0sPhzNss3M9YNzNkGlnuc96xLm5HU19BhaJjJlW9mABOa8b8ZaoFjMamu21zVo7eM\/NXz14l1ZriVsGvu8iwLlJTZhNn61\/8EoUdl8cX3USS6eg+qC4J\/wDQq\/brTzlBX4\/\/APBKzQ3tPhJrPiCQYN\/qzIvukMMYB\/76dh+FfsBp\/wBwV\/HXi7iI1+KsfOPSUV\/4DCMf0Po8ArUImlRRRX5wdgUUUUAFFFFABRRRQAUUUUAf\/9T9\/KKKKACiiigAooooAKKKKACiiigArL1KPdFWpVe6TfERQyouzufP3jW2Jifivhb4nWpxJgetfoV4ttd0TYr4k+JmnErJx61jJHpUp6H5jfEK3Ilkz618Evb\/ANl+Mr21IwPOLj6P8w\/nX6RfEbTtryYFfAnxJsDp3iO31ZRhZh5b\/wC8vT8wf0r6PhXEKnivZv7S\/Hf\/ADOXMI81Pm7FrVrbzbfcPSvIdWtSrGvb4Nt3p4I54rzvXLEhjxX6jSgpKx4b0PHJ4yj8V2fhPXGs5hFIflNYt\/bYJ4rFVmhkDL2rxs3yuNenKnNbnVhcTKjNVIdD6kQx3tvvXniuS1TTepArG8H+IwwFrMee1emywJdRb171+Q4rDTwtV0am6\/E+5pVIYmmqsDxC9sihPFV7O\/uLCYPGxUjoa9F1LSuSQK4q805lJOK3wWPnhpqdN2ODFYJTVmj27wT8V5bUrbX7cV9A2WtaPr0IeNxkivz3KSQtxXSaR4s1XSXBickCv0fLM+o4lKNR8svwPmsTgZ09tUfaWo+H45QWjAIrgdR8OsCflrkdA+MRwIr05+temWvjnQdST52AJr7HD4qpDVHnONzy680JgT8tczcaMQele\/SyaPdjdG681i3OmWb\/AHWFe9hs3lHcylTPAZtKcdqzZNNYdBXuFzo9uO4rBudMt1zkiveoZ5LuZumeQvYOO1QNYuO1eh3aWMPJIrlb7UbSIER8169HOZy2M3TOee2K\/eqjKVTpTrrUTITtrLaUscmu2OZS+0yeQnL0i75HEcYLMeAB1NaWm6HqGpsDGuxD\/E39B3r13w74UtdPw6LukPVz1\/D0FfJ59x1hsBFxjLmn2X6vp+Z72U8O4jHSVlaPf\/IxfCfgo+Yt9qq7m6rH1A9z6mvfdMswgHFZ2n2SxgZFdCsiRLX878UcXVsbUdbET16LovJH9B8H8Iww0VClH\/N+ptRssaVVuL4dAaxJ9QzkKaoNOW6mvxfNszlXk0mf0ZkOVxw8E5I05LguaryS\/LVPzaikl+WvCpwu9T6yeJUY2RSvpsA159q83Brrr6Xg157q0vWvu8jp2aPybjDGe5LU4HV5MsawF3b81qag26QfWokhBXJFf1N4YYJ1sJXlHe6X3J\/5n8b8c1ubFxv2ZLAela9u205rIjXa1aUJr9Sp4epS0kj4dtPY66wmxiuxsrjpXnNrLsNdTZ3GMGtKlG+pNz0uyueldXaXWMV5pZ3XSumtbsgDmuKeHHc9MtbvpzW\/BemvOLa8xjmtuC8A71zvDD5j0GO8461bW9461w0d5x1q2t7gYqo4UTkdf9s+U81Vlu+Otcy2oIBy1ZtzrUcYPNelh8DKT0RDkdLPegDk1yOq65HCh5rl9T8SgAqjV5rqutSTZ5r6\/LMklJqUzGUyz4g19pydp4ry69uDKx5q1e3jOTg5NdN8KvA138T\/AIlaL4Cs87tUu44nYdVizmV\/+ARhm\/Cvs6k6OW4aeIqu0YptvskrtmSTm0kf0b\/sM+C38Ffs5+F9OmTbNdWxvpPUm7czLn3COq\/hX3tYjCCvKvB2nW+n2MNlaII4oUVEReiqowAPYCvW7VcJX+becZjPMcbXzCpvUlKT\/wC3m3+p9fThyRUF0LNFFFecWFFFFABRRRQAUUUUAFFFFAH\/1f38ooooAKKKKACiiigAooooAKKKKACmsMqadRQB5\/4jtBJG3FfIPxG0neknHrX3Bqlv5sRGK+cvHej+Yj\/LUyR0UZ20Pyj+JmikNIcV8H\/Evw8+o6dPboP3i\/PH\/vL0\/Pp+Nfqz8TfDpbzDt9a+DPHOhtFK5x606FWVGcasN07nTJKScWfIHg\/Ulng+zueRWlren7wWArE8SafL4Y8QfboRi3uWJ9lf+Ifj1H412ttNDqdoGXriv2bLMbDEUo16ez\/qx8\/VpuEnFnh+qWBDHiuKurcqa9z1nSiCTivNdR08qTxXs1KSqRMU7HG2tzJazB0OMGvb\/CnidLmMQTn5hXi1zbFGNMs7yaymDoSCDXw+f5HHFQ7SWzPWy3MJYWd9090fVsttHdR7l5rlNQ0nrgVmeFfFqXCCGc\/N3r0wJDeR70wc1+VV6M8PN0qqs0fdUpQrwVSm7pnil5pZGcCsCaxZT0r3C80gNkgVyt1o\/XilCu4O6ZnUwal0PLWtz3FOjkvrc5hkP412FxpLKeBWY9iynpX0GA4jr4bSMtDysRksZ6pFWHxHrdtxliPY1dXx3qkfEjMPrmq\/2fHUU9bVT2r67CcbO37yKf4f5nlVMgmvhJW8eXzjG81nzeLb2Xq5rQGnxN1UGrUelw\/3RXt0uOKS\/wCXf4\/8Aw\/sGq+v4HIS6vdXB4JNRrb6jcn5Y259eP516NDp0Y6CtWCxiBq6niBKK\/dQS9Xf\/I66HC85v3m\/uPO7TwzeTkGdgg9uTXb6V4VtISHKb29W5\/8ArV00EES+lbMTwxjivls044xFZONSrZdlp\/XzPr8q4NjzJqnd+Y6x01UAyK6m3jiiAzxXPC+C8LSfbJH6V+d5hxItVA\/W8k4U5bOaOta\/SNcKeapvfPJxmufWRm6mrKviviMZjqld6s\/V8swdHCpcqNTzc9aeJazBJT\/Nry3TPooYtdDS82oZJeKqebUUkvFa0oaiq4r3dzPv5PlNef6q+c12d6+Qa4PVGzmvtcm0aPyni2teLOIu2zL+NalvDviBrHuj+8zXXaRCJYuK\/prwux6p0K9Ps4v70\/8AI\/lLjKDeIjL1MOSIoeKdG5Xg1t3lkVPSsV4ypr9+y3HU6qSmfDzjYvRTgVq297sIyeK5xXI4NWUZTX09HB4WqtYmLbR39pqacc101tqSADmvJI5ChyprShv3TGTWk+GcNU1gT7Vns9vqiDHzVrRasnTNeMw6rg53VoJquRjNc0uFqS6Fe1PYl1oKODTH18KOteTjVz61G2rY5zzV0+HaUegnUPSrjxCx6Gudu9bdxy1cVLq3vWTPqRbIBr1MPlUIbIhzOjvNTLZJOa5a6vmkPymqMlw7nk1UZ69D3KKJ1Y95M1+q3\/BM34PyX+u6j8ZNVi\/dW4NhY7h1kbDTSD\/dXCA99zDtX5neAvBWvfEnxjYeCPDUfmXmoSiNfRR1Z29FRQWb2Ff1GfA74a6N8NfBOmeCtATbbafCsakjBduru3+07Esfc1+AeOPGiweXf2Nh5fvK2\/lBb\/8AgT081zdj1ctw3NP2j2X5n0boNtsjWu7iGErB0uDYgroQMDFfx+e+LRRRQAUUUUAFFFFABRRRQAUUUUAf\/9b9\/KKKKACiiigAooooAKKKKACiiigAooooAq3MYZa8w8U6UJ4mYCvV2G4YrA1G0EiEEdaBp2Pz\/wDiL4Z8xZPlr4J+IfhZgz4Wv148a+HBKj8dRXxN8RPBxfewX1rNo64Sufkn438LRXkEtlcL8rdD3U9iPcV8+adfXnhzUW0rUeCp4PZh2I9jX6I+OfCLI7kLXyV448FR6lEVYbJY8mN\/7p9D7HvX0GQZ08DU5KvwPfy8\/wDMxxOH9orrcyGNvqMG9CCSK4nVtFPJArBs9X1Hw\/eHTtUUo6+vQj1B7ivQrfVLLUYuSMmv1rD11OKnB3TPGlFp2Z4xqGmMpPFcnc2RXtXv+oaQkoLJiuA1DRWUnijEQU0ETzSC4ns5A8ZIxXrnhbxrysFy2G\/nXn13ppU9KxmgkhbctfFZzk9PFRtNWfRnq5fmNTCy5obdUfYNlf219GMEZNSz6dHIMgV816B4uu9PcRzklR3717loni63u41DsCD3r8yx2Aq4SXLUWnfoffYHG0sXHmpPXqupNc6QM9KxJ9HHpXpkT2t0u5CKjl05W6VwNnqQpp7nkcmkYzgVVbSyDwK9Ul0v2qi+l+1ZubR1U8PFnmw09xzipVtJB2ru200DtUZ09QelQ681sz0aODp9jkUgkHarccMneuj+xY6CnC1ANc88RUfU9rDYanHoY8cUnSrKRMBWgIMdKcIcVw1HKW7PosK4Q2Kyx4qdVqQIBS7a5JU7nu0cYlsKDinhqZilxWLpHo08f5km6nbveoqXBqHSOuGP8xdxqORj2pxBzUbjiqhTsy3jrq1zHu2JBritS712d2Qua4\/UBnNfR5bNRZ8RxC3UgzhbriSu88J4mxHXDXq4bNdB4TvhBdqG6E1+vcD5ssNi\/ZSek1b57r\/L5n88cW4Nyi5pfCz0m\/0kldwFcbeacyE8V73a2EeoWayR88Vy+paAyk8V+55fm7g7Nn51OmeIyWzIar4K9eK9CvNGZSeK56fTXU9K+9y\/PlpdnLOkYKyEVMsoqaSyZarmF1r67C53F9TB0ycS1KJmHQ1Q2MKORzXsU83i+pm6Zo\/aH9aQzseprP3MKTe1bf2pHuHIXTJnrURkqqZCODTDJXPVzPzGoFhpKi3M7BEGSeABVcvX6m\/scfslXP221+KHxJtcSqRLYWUg5Q9VmlU\/xd0U9Op5xj4bi3jbDZFhJYvFS1+zHrJ9l+r6I6aGGlVlyxPoL9hf9meX4caL\/wAJ34tt9uvaqgARh81tbnBEfs78M\/pgLxg5\/Wrw5pwijXiuE8J6GIkXivbtMtBGgr+JM9zvE5zjKmY42V5SfyS6JeSX9XPo6VNU4qETatY9qirtMRdop9eQaBRRRQAUUUUAFFFFABRRRQAUUUUAf\/\/X\/fyiiigAooooAKKKKACiiigAooooAKKKKACq80YYVYoIzQBwetaWtxGykV82eNvCQkD5WvsC5g3jFcJrmiJdRkEc0mi4Ssz8rPHvgUneQn6V8e+MPBLIzkJX7DeMPBYl3fJXyd4z+H27f8lZtHZCVz8jvGXgK21OIwXacrna4+8p9j\/SvnHVdJ1\/wlMTODJBniVen\/AvQ\/p6V+qvivwAys2E\/SvA9e8EOu5WTIOQQRxXt5Tn9fLnyx1j2f6djOthY1dep8ZWHjD5QJDmtk63ZXS\/Niut8S\/B6zmdp9MzayegGUJ\/3e34flXj+p+CvF2jE7oDMg\/ii+b9PvfpX6NgOJMFjFbn5Zdnp\/wGeVVwdWnra6Nu6FnLypFczd20HUGufkvLuFjHKCrDqDwage9lYcmvQr0IzV0zBOxNPCinINR2+rXGnvuhbGO3aqMkrt1NU3BPWvnMdl8ZJxmro6KNaVOSnB2aPYtB8fBWCSttb3PH517BpfjC3nAWU18iwaXqFwcwxNj1IwPzNdbpsGq6ePnkLD+72Ffm+aZbRotujP5f1+p9zlWdValoYmF\/7y\/y\/wAvuPr63vrO6AKsKsNbxv8AdNfNlj4ivLbG4mu00\/xu64VzXz8otbn11Cqpq8GervZ1Ve0FYVp4vtpRhyK3ItasphncKxlE9CnUaIGtaiNsK1Rc2sg4agmE85rKUDvp4loxTBiozFW2Y06g1EY0rKUD0KeLMYxUnlVqtGnrUZWMd6ydM7qeLZm+WaTy6uM8S9TVZ7qBO9ZuB3U8Uxnl0bQOtUpdTiXgGsubVN3CmsnFHfSrSZsyyonNZs92CMCsh7xm71D5pNZWO+FW25NPJuzmuevFyDWwzFuBzUY024uTwMV34TmvoeLm+JpqL52ee30R5xWdZ+bBOG6Yr1Q+GJH5IP5VTm8MOv8ACa+pwtbktJPU\/H85pus3yxsjvfBHitYQttdHj3r21bay1OEPEQcivlOHT5bc7WBx7cYrs9I8TavouM5ljHcdR9RX6zknE9PFRVOvLlqfg\/8Ag+X3H5njssnQk5QV4\/kerX\/hckkqK4y98MuCflrsNI+IenXiBZyM11Sajo96Mqw5r7nD5hUp7njuCPALnw647VjzaC4PAr6Sl07TphlSKyJ9Ds+oIr3cPnsl1M3SPnV9EcdVqsdFcdq92udKsoupFcvfvp1sDyK9uhn03szJ0jyxtJZeorNurdIRzXR6trtsmVirhXuLzVLpbSxjeaWQ4VEBZifQAZJr2qOZza5puyM3ArTSDdhavaNpGseI9Ti0bQbaS7upztSKJSzMfoOw7noB1r6Q+GX7Jnj\/AMaTR3fib\/iT2bYOHG6dh7Jn5f8AgRBH901+qfwX\/Z78IfDu0Fv4cswkjgCS4f5ppP8Aef074GFHYV8VxJ4rYLLoujg37Wp5P3V6y\/RX+R00cDKestEfO\/7Mv7HFt4curfxh8RES81RSHhtvvQ256gns8g9fuqemThq\/W3wj4ZWFVytVvCvhNYQvy17xoujLCo4r+cs7z3GZziHi8fPml07Jdkui\/p6nr06Uaa5YovaNpgiQcV29vFsFV7W3CADFaQGBgV45oLRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/\/0P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAQgEYNULi2DjmtCkIB4NAHnes6FHcofl5rwzxN4KSUMNnWvq2WAMK5zUNHjuFPHNJq5pCfKfnN4p+HivuIj\/AEr548SfDb5mPl\/pX6pa14Sjlz8teP674DSTPyfpWTR305pn5Q618OnVj+7\/AErzPUvh++TtSv1K1r4cht3yV5hqfw1BJzH+lZtnbBJn5lap8N4LobbmBZB6MoP864i7+DmiPybGMf7q7f5Yr9Nrz4aAkgx\/pXPXHw0xn5KcMXVpfw5tejaOuGFhP4kmfmk\/wc0ZDlLNfxyf500fDG1teYLZEP8AsqBX6OP8Mgf+Wf6VnS\/DEY5j\/Ssq2PrT0qTb9Wz08Pl1PdRR+dsvgJxzsrIn8FSrxtr9D7r4aDHCfpXJX\/w6AyfLx+FcLrHrU8uTPz\/ufCkic7KwLnw9LGTgGvuLUvh9tzhK4HUvAjjOUqfa33Nv7P5dYnyQ1ne2\/wBwmnpf39v1zXv194LcE\/Ia5O78IOufl7Unys0j7aHmeeQ+JLqPqxFacXiqcD7xrQn8KuD92smXwzIv8OKh0+zOqGLkvjiaaeK5u5qceKZD3rmn0CdCMA0z+xbodM1k6TOynj6fVM6c+JpD3qJvEMrd6wBo91Ui6Pc9eazdGR208xpL\/hjSbWpW6moG1GR+9Oj0K6YZINaEHhu4c4INQ6D6nXHNqa2T+4yftLN1pQ7N0rr7bwnI45U11Fj4NZiAU6io+rrqzVZvN6Qh955pFb3Epwi1u2mgXVwQCDXsumeCGbBKfpXomleB+nyenajkhHZDeKxNX4pWXlp\/wTwvTPBzvglc16BpvgckAbK9+0rwQAB8nSvRNP8ABSqAClWpvoZ+witWfMUfgQ44SqV34DbHCV9rQeC1K8rinT+BEcYEfWuulVZ42OoRaPz5vfArDPyVzU3hO4hOUBr9Br34dhgf3dcfe\/DgsT8lehCqfGY3DK7PhafwtFMSZovm\/vLwfzHX8arDwpqUPNhdunorjd+ox\/KvtCf4btn7n6VR\/wCFbsD\/AKuvewWf43CpKhVaXZ6r7nc+ZxOApzd5RPkRNL8cwDELxyj2Yg\/qP60\/7D8RZPlS3DfSRP8AEV9hQ\/DeTdnZW\/Z\/DeUkfIa+gpcdY+G6i\/VP9Gjyp5bT8z4a\/wCEP+JmoHb5KJ7tIP6ZrTsvgL441dwNQvoIAeuwPIR+BCj9a\/QvS\/hm\/GUr1HRPhkcqPL\/SuiXiBmbVqbjH0j\/nc53gaS3PgDwr+yZoMkiy67PcXzd1B8pD+C5b\/wAer7L+HfwO8O+GIxHoenxWuRglEG4\/7zfeP4mvp7w\/8NliC5j5r2nQvAqRAfJXhY\/Pcfj1bF15SXa+n3LT8BKnCPwI8i8M+Agm35P0r6A8O+EUhC\/LXbaR4XSID5a9CsNJSIDivJKMnStFWEDjpXbWtqEA4qaC2CDpV5VCjAoARVCjFOoooAKKKKACiiigAooooAKKKKACiiigAooooA\/\/0f38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACmNGGp9FAGXc2CTAgiuUv9CRs5Wu\/pjxo4wwpNXLhNxPDNQ8Lxvk7a4m\/8HRMeEr6VuNORhkdKwrjSkPpWUono0a58t3fgmM9ErAm8FRj+Cvqa40ZDk4FYU+iJzkAVzygetQxCPmCbwVFg\/JWZP4NjH8FfTNxoqjPArFuNIUciuecD2cPiUj5hu\/BsRXITFchqPgqNgQEr6uutHjPVfxrnLvRAwzjNc0qZ7dDFo+NtS8Cpz8lee6n4CU5+WvuC98PIc8Vyd74WRv4axcGj0YV4vc+DNR8AckhPWuJvvh+cn5O1ffd54QRgfk7Vyt54KQ5+XtU6nQuVnwHdeAWDfc\/Suen8AsF4TpX3xc+B1Lfd\/Sufn8CDacJS5mUqUWfCU3gJsZKVW\/4QMnqtfcUvgNSpOz9Kp\/8ACBj+5+lLnZSw8T4l\/wCEEYHGz9Ksx+BWY42V9onwCrdU\/Sp4\/ASrzspOTNFRgfHkPgQ44T9K27TwGecpX1vF4IQcbK1rbwUqr9ypbbNo04I+WLLwGdvKV2Fh4FAK\/JX0pa+DVC\/dro7XwiqkDb0FTZmqnGJ8\/ad4JUbfkrurDwcqgfL2r2u08MquPlrpbTw6FH3cU1TJlioo8qsPCoXqtdrZeHU7L1r0O10RVPT\/ACa6G10kDGB6VpGicVXMLdTgbfw4p5YcVrJ4ZVlwBXo9tpXTjit620lTyRXTCkeNiMdc8YfwesnBX9KoS+Alc52j8q+j4NGB7Vpx6Ajfw11QgzwMTiEz5Pf4cxtxs\/Sox8NEb+D9K+wY\/DUbfw1cj8Kx\/wB3mumKPDr1UfH0PwzUn\/V5\/Cugsvhqg\/5Z\/pX1pD4UiyDtrctfCsYIO3it4xPKq1UfMmm\/DlcjEf6V6JpngKKAD5OfpXusGhQxDCrWlFpiL2rVKxwSnc8zsPCsUWMLXXWeiRx\/w11kdmi9qtLEq0yDLgsEQcCtNIQoqYADpRQAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD\/9L9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACimswUZNY17rcVmCWXOPfFJtLc0hSlN2gjbor5N179tP8AZ98N6rc6HqvibSoruzkaGaJ7yMPHIh2sjDsykEEdjWNH+3f+ze7YPinSV+t7H\/hXWsDiWk1Rl\/4DL\/I6FgKrV7L74\/5n2XRXkHw++N\/gD4p6dJq\/gLUbXVbaKQwyS2k6yqsgAbaxXocEHB7GvS21SNU3lf1rlmnCThNWa6PRmUsNUjujUqvJAr8jg15P49+N3gX4ZaV\/bnji+ttLszIIhNdTLEhdgSFBbqxAJwOcA+leJt+3h+zgrYHijST7\/bY\/8K2pYatWjz0qcpLuot\/kjaOCrdFb5pfmz6vntexFZE1p14rwHRv20f2ePEOo2+j6f4o0mW5upFhhiW9jLO7naqqO5JIAHc17nP4mtAnmCP8A8e\/+tWGIoTo2VaLjfumvzOqlRrXsl9zT\/Upz2XXisWexHPFeF6v+2d+ztpt3LY3HijSRLA7I6\/bY8qynBB+hFc5L+27+zseP+El0o\/8Ab7H\/AIVTyzFPVUZ\/+Ay\/yPRowq+X\/gUf8z3240\/jGKxbjTc54rwyT9tb9nluniXS\/wDwMj\/wqg\/7Z37PTf8AMyaX\/wCBkf8AhWMsrxX\/AD4n\/wCAy\/yPSpOouq\/8Cj\/me0XGmDBwKxZ9IUnJFeUH9sL9nmTr4n0of9vkdddL8bfhw3hD\/hYA1K0\/sQgn7d9oTyPv+X\/rPu\/f+Xr97jrXNWy6vTt7SlJXdleLV32Wm\/kejRq1HfladvNf5l+fRFI6dqxp9AUk8V57P+1r+z8eniXSz\/29x1nv+1n8AiT\/AMVJpn\/gXHQ8nxf\/AD4n\/wCAy\/yO2nin\/Mv\/AAKP+Z3UvhxSfu1lyeGEwRtzXGt+1f8AAQkf8VHpn\/gWlVm\/aq+AhJ\/4qPTP\/AuOs3k+L\/58T\/8AAZf5HVHGW+3H\/wACj\/mdY\/hdSCNtU\/8AhF067a5xf2o\/gK3XxLpg\/wC3uOu48J\/FLwD48hmufBmoWuppbMFlNtMsmwtyA23OM4OM9cVjWyzEUYupWpSiu7i0vvaOini+eXJCSb8mn+plf8IunXbUo8MKOqVz95+0j8DdPu5bC98SaZFNA7RyI11HlWU4IPuDwa6Dwl8aPhR461UaF4U1ywv7xlLiGC4R3Kr1IUcnHenLKsTGLqSoyS78rt99g+vq\/KpK\/qv8x6+GlB+7V+Pw4qqBtr02OxWUAhetOnhjtxllrj9ktw+utvlRwEWgKEHFakWiID0rgNY\/aJ+CXh\/Up9F1fxHptvdWrmKaJ7qMOjrwysOxB4IPQ1t+FPj38G\/GOtQ+HvDWv6de31xu8qCG5R5H2gsdqjk4UEnHYGu\/+ysSoe1dGXLa9+V2t3vbY554\/XlUlf1X+Z28GjgYwtasOkdOK62ztVmAIWtUWSxqDiueNNHFVxzvY5SDSgAOPStmHTMAcVW1vxPovhjTJ9Y1uSO2tLWNpJppXCIiKMlmY8AAdTXjK\/tf\/s8I2B4o0o\/9vkddmHwNaum6FOUrdk3+RyVa0\/tWXq0vzZ9E2+mgdq2YNPx1FeQeBP2ifg\/8QtXGg+DtcsNRvdhk8i3uUkk2rjJ2jnAzzX0LY7LhQyrirnhp0ZclWLi+zTT\/ABPLr1ppc3T1TKcFh0yK2YLIDtWgIlhXcRmuM8ZfE7wf8OtGk8ReMruDTbGEqrz3MqxRgsQFG5uMknAFaQp80lCKu2eZKpOp8J3cFmvXFasNkp4A5r5LT9t\/9mxGwfFekf8AgbHXtfw9+O3w7+J9jJqPgHUbXVbeGTypJLWdZQj4B2sV6HBB5rsqYOtRjz1qcoru4tL8UcdWlWeyv81\/mevRWkacsKtBFHQVQj1GORN4H61g654y0zw\/ZTalqbJDb26NJLJI4RERBlmZjwAAMknoKyujgVCpN2SOuwKWvkA\/tzfs1Bto8XaOff7bHXqngP4+fDn4nWc1\/wCAdTtNXhtnEcrWlwsoRiMgNtzgkcjNdNXC16UeerTlFd3Fpfiilgqr0S\/Ff5ntdFeK+PPjz8Pvhlp0ereO9QtdKtppPKjkup1iVnILbVLdTgE4HYV45L+3j+zghwvifSW+l7H\/AIUqWGrVY89KnKS7qLa\/BFLL6zdrL70vzZ9m0V8V\/wDDe37Of\/Qy6V\/4Gx\/4Uf8ADe37Of8A0Mulf+Bsf+FafUcT\/wA+Z\/8AgMv8i\/7Nr9l\/4FH\/ADPtSivi9P28\/wBnJjz4m0of9vsf+Fdn4R\/a8+BHjjXLfw14a8SaZd6hdsVht4ruN5HIBYhVHJOATgUngsRFOUqMkl\/dl\/kRLAVY7pfev8z6dorPtdQS5AKrjPvWgOa5U77HLKDi7SCiiimSFFFFABRRRQAUUUUAFFFFABRRRQB\/\/9P9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKAKt0+2M14P8TPFdr4Y0G+129bbBZQSTyH\/ZjUs36CvbNTk2xGvzn\/bn8S3WlfAnXrLT2\/0rVUj0yFe7NeyLAQP+AOx+gqsPhnisTSwi+3JR+92PdypRgp157RTf3K58rfs++C9HvfhNpfiDxPp9tdajrPm6lcSyxI7M15K0wOWBP3WGK9ij8HeBJmdItKsGaM7XAgiJU4Bwfl4OCD9DW1omlW2haNaaHZjENlBHBGP9mNQo\/QV8o\/sn+Jf+EuvvHniFW3Jd69LJGf8ApmVAT8lAFf0I06iqVYuyX6s\/mKtOrjHiMdzPR3\/8CZ9RfsYPbaP4p+I+k2UawxR+IAyogCqoa2i6AcCv0KvdWEdrnPavza\/Zcn+zfE34lQ+mr27f99WsdfTXxl+KGnfDP4c6r441Q5i023aUJnG9+kcY93cqo9zX4dxVGdTOa1Gkryk4pLu3GNj+pOHMLGplWDrT25E2\/kfI3xR1WL42ftGr4euVW50HwFB5kyOA0cup3i4VWByreTDz\/su2DXWReD\/Ak+7ydKsH2MVbbBEcMOoOF4I9K8V8N3UnwN+BF\/498aHzNXuVm1fUS3Blvrs7hGffcUi\/Cpf2T9Ov4PgzZ6\/rDF77Xbi51O4durPPIcN\/wJFU\/jX7LgMuWBwcKFN6QtH1erk\/vu\/mkfzxxZmc81xVfNIytBSUIrulf9Ff5oseNPC\/hu7+Mfw38I6Xp9tbvJqz6rK0USIRHpsRlAYqAdpkZOOhOK+6fil8QD4I+HOteLmbB02xuLkZ7tFGzKPxIAr4+8CQnxP+1bqeoD5ofC+hQ2uP7txfymUke5ijA+ldR+2NfSz\/AAmTwXbsVm8T6lY6ShHX9\/MrP\/5DRs+1fm3FTePzzC5ZfRcif\/bz5m\/\/AAFr7j908PsJHAcNrHVt2pT+XT8jz74I\/DTw3pPwk8PWur6bbT3b2Uc87zQo7mScea+5mBJIZyOa9T\/4QjwX\/wBAey\/8B4\/\/AImukiiigiWGEBUQBVA6ADgCvkb4OfBvwh8cbLVfiZ41N3cnVtWvXtDHeXEKraxymKJQscirgbDzj9MV9\/m+c0cuoyx2McuXmS91Xd3d7Nron1PxDhThjGcWYytSw9XkaTk2721fkfSv\/CD+C\/8AoEWX\/gPH\/wDE0f8ACEeC\/wDoD2X\/AIDx\/wDxNZ9v+xd8EZEy1rf\/APgyvf8A49V+P9iT4ISHAtb\/AP8ABle\/\/Hq+bXiBlj\/5+f8AgMf\/AJM+2l4M5hHfGR\/8mOO+Iml+CvB\/gLWfFP8AZNiDp9lPOv8Ao8fLohKj7vdsCvEtY8LHSPgx8J\/gxKnzave2dxdwkcNFAjXt0pHf5yM19bxfsF\/Ai+j8m70+9njb7yPqN6ysPQgzcivXPiZ+y\/8ADv4sf2dL40spZn0kSC1aGea3MYmChwDC6ZyEUc5xjjvXn47jLA4jEYWUVNwpyc5XSvdRahZczvZtt6o+q4c4OrZLg8bhniIyqVo8qetkutzwv\/hB\/Bf\/AECLL\/wHj\/8AiaP+EI8F\/wDQHsv\/AAHj\/wDiai1n9h\/4N2SForW\/GP8AqI3v\/wAer5r0z4X+HPAv7TelaB4QN1BFYaRc6hdrJdTzK\/nOLeJSJXYcfOwH49hX0OV8WYLMsR9Tw3tOazesUlor6tTb8tt2fA5z4XYzK8vq5rVxkXGC2XNd9kj6Z\/4QfwX\/ANAiy\/8AAeP\/AOJo\/wCEI8F\/9Aey\/wDAeP8A+JrA+LnikeDvhfr\/AImifZLaWMzREHGJShWP\/wAfIriPht+xx4C1PwjpU3iiK\/m1B7SFrp\/t92uZigMh2rKAPmzwBxXZm+e4fKqcKuMcvebS5Um9N95R7r7zw+DeCMZxLCtUoV1BU7X5r639D1b\/AIQfwX\/0CLL\/AMB4\/wD4mvnn4NarYeGvAnjv4tW8UcVtdanqF1AEUKhtbFTFEABgf8s26dzX0C37D\/wbjTc1rf8A\/gxvf\/j1eW\/tF+C9F+HHwET4WeCYfscOp3VtpFpHuZyDd3AMnzOSxJUuTk96+OzbiTC57Gjk+DU71KkFLmSS5b67SfWz+R+z8DcFVOFq2IzbGYiM+WnK1r6PfqQ\/AX4c+H7H4PeHzrmnW1zeXNqt3NJNCjyM9yTOdzMMkjfj2xirnw50DR7\/APar1O60e0ht4PDmhw2zLDGqAXF9KZdx2gc+VGB9DXt9pBa2NrFZWoCRQoqIo7KowB+VeXfsrMmr6p4y+IMvzHWddnjhf+9bWQW3iP8A461fTcZY50crxFS9ue0V\/wBvPX\/yVM\/N\/CmhUzHP5Yud2oqUvm9vzPvGwscxA+1cd4yvrXRNMuNSvG2Q20bSyN6KgLE\/kK721vIUtuuK+Qf2wPFkmi\/BDxCbE5uL23FhCo6l7x1gAHvhyfwr8QweF+tV6WEjvOSj97SP6LhUdJ1MRPaKb+5XPBf2ePCGjar8LLPxX4l062uNQ12a51Od5okdibqZ5F5YE42Fa2vD\/h3RL79rLRbLSLKC2j8OaJc37tDGqfvryQW6K20DJ2K5GegJ9a9d8NaVZ+GfDmn+HLVh5VhbRWyY\/uxIEH6CuW\/Zksv+En+K\/wAQvH33ozqMGjwn0XT4QJAPYySEn3HtX7rxVjPYZbiqkNLrlS\/xNRt\/4C39x\/NnhzGeZcRvF1G2o80\/8vzPvzR7TMKsRU+qMlvGSa3rC2WG2BPavAfj18UdJ+FngPUvGmq5dLOP93Ev3ppWO2KJf9p3IUenXoK\/C6VCdWUaNJXlJpJd29j+gITU6spzdorVvyPkb9oHWpfi38RLH4A6a5bTLXy9T8Qup48hW3W9oT6zOAzDg7ACO9dsPA\/goDA0ey\/8B4\/\/AImuC+DHhLUvDHh2fXPFziXxF4gmbUNUk9JpOViHokK4RRnAwcdaw\/h38dLL4hfFLxH4G06JfsWjJH5FyCczsHaOYjsUVxtUjrgnPPH9A5PlP9nYSODofZV5PvJ7v9F\/dSP5l4zz6vn+PrYrD39lTVl5Rva\/zZNrWm6P4J+P\/wANvEmkWkNnFPd32nTeTGse\/wC1WxMYbaBnDx8Z96\/WHwuxniXvmvyY\/aDuU03RPDvi4HjQvEWmXrH0TzvKb8CJMGv1d8FXANuuPSvz\/j+k\/rOGrvrFx+6Tf\/tx+neHOJdbIZU3q4Tf46ncagghgLE44r8yf2yL+PxP4r8AfC1gHj1HWjqM6Nyrw6bE0rKwPBUs6ZB68Cv0m8Q3W21Jz2r8ovG2oL4p\/a6uGZt0HhbQUix\/dub+YuT+MMYry+D6Hts1py6QUpfcrL\/yZo9fP8S8HkmKxPVqy9Xodj\/wg\/gv\/oEWX\/gPH\/8AE1x3w0vbf4P\/ALT6abYxpa6T470\/ascahUXUNOBIwBgLvgY+7MO9d3qnifQNFktYdWuo7dr2Zbe3EjBfMlYEhFz1YgHAryL9oK2vT4FTxr4fG7VPCl1DrNr\/ALX2Vsyocc4aIuCO\/FfrGOwTx2GqYOf200vXeL+UkmfhfB+bVMtzShiarfI3Z+j0Z+uWm6r5lqDntXxh+3F4xu9H+APiCx01v9K1eOPS4F7s17IsBA\/4A7H8K9m8CeNtO8T+FrHxHpMnmWt\/bx3ELeqSqHU\/ka+N\/wBq\/VB4i+IHw88AZytxq8mqy\/7mmxFwG9i8i\/U1+LcN0HiM0w9Ca2ldryj7zX3I\/pXNoRy\/CYnGvaMW192g\/Svhx4I0rS7bS49Ks3W2iSIM0EZJCKFySV5JxVj9iaK1h8Da\/wCNbGNIovEevX13AEUKBbxP9niUAYGB5R7dzWR8UvF0fhH4b674lRtslnYzyRn\/AKabCEH4tgV6x8APCx8D\/Bfw34aZdkltp8Hmjp+9dA8n\/j7GvveP8bKll0aTes5r7opt\/i4n5h4M4CWIxGJxlbWySXq3dnj\/AMfLm38e\/tFeDfBN7Gtxa6LYX2sXEUgDoxl22sJZTx8rFyP\/AK1dN\/whHgv\/AKA9l\/4Dx\/8AxNeYeGb1PEn7Qvj3xbId8Wn\/AGLRbdvTyYzNOv8A38kH5Vk\/tCXD65p\/hz4eWcskZ8Ra1bW8\/lOyP9lizNOQykEcIBwe9e9kVL6nlmHhN2UYcz+d5v7r\/gfOcaRq5xxPLL8LK3vRprsey\/8ACD+C\/wDoEWX\/AIDx\/wDxNH\/CEeC\/+gPZf+A8f\/xNcppf7HnwZukDS298c\/8AURvP\/j1dIn7FXwPb\/l1v\/wDwZXv\/AMerw4+IWVy1XtP\/AAGP\/wAmfR1fBTMqb5ZYyP8A5MT\/APCD+C\/+gRZf+A8f\/wATXDeDvCuh6n+174U0zRrGC2Xw7pV9q83kxqm5pytpFu2gZILOV\/E9q9Hs\/wBh34GzMA1pfn\/uJXv\/AMer6O+Cn7Mnwv8Ag7ql3rngexlhu7+NIZpp7ie4YxxksqgzO+0ZOTjGa5sw44wVfC1qOF5+aUXFXSS10e030v0OrJvDqvk+Np47FYmM1G+iv28z6n0QN5QzXWL0rHsLbykArZFfnUFZH0eKmpTbQUUUVZzBRRRQAUUUUAFFFFABRRRQAUUUUAf\/1P38ooooAKKKKACiiigAooooAKKKKACiiigAooprHC0Ajmdcm2QtX5T\/ALYWqjWPH3w+8BZ+W41eTVZR\/sabEXAPsXkX6kV+n\/ii42QtzX41fF3Wx4g\/avvWU7ovDeiw22P7s97IZifqYlUV9DwZhfrGb030gpS\/Cy\/8maOvOa\/1TI8TVW8lyr56HV\/FDxz\/AMIt8Otb8QRvtktbKZ4z0\/ebCE\/NiK+cv2RtPPgq18R+HHG14JrIyD\/po9pGz\/8AjxNXvjZdNr+g6X4GQ7v7f1Wzs3H\/AEy8wSyH6BU5qx4Muhp3xV8eW5OP9NtD+dqlfr\/t+XErALrCUn8p01H85H5Vg8kUeF8Vj5LWVWnFeiUm\/wAbHvH7Oeo+X8VviUSet\/YP\/wB9Wi\/4VR\/aC8Q\/8LE+KXh74QQtvsNMK67qwHQiI7bSFux3yZdlPVVBrzz4OeKLDw\/8QviZrWpSiK1tm0+4lc9FRLPLN+ABrifh54if+yda+Mviz9zc+IZX1GXd1hs4lIt4\/okQyPrXxmByd4jibFYya92koW\/xShG33K78nY\/T84zX+zuDcFSov95Whyrvbq\/0OS\/a98WXXie2PgGwZnttNtxqF6FP3ppm+z2cX1LuZCp6gA19j+E4IPC\/hbTfDVufk0+1htlx6RIE\/pXwm2mXuoaV4a1bXUK6l4615NXnRuq2Nkhkhh\/3VTYf+BV9MeK\/GR8PeGNR14tj7HbSzD6ohIH4kV9tg6\/1yEvZ\/CpyivPltFv\/AMDUrPtY\/MeLMj\/s2jgcpS9\/k55\/4pu6+6NvxPU\/2S4DrKeMPiNL8x1vXZ0hf+9bWSrbxfqrVkftB6gus\/HHwJ4SB3RaeL3WbhfTy0EEDf8Afbt+VevfsxeF28HfAbwzpEo2ymxjuJQeokuczvn33Oc18r+JtZGvftM+K9ZzuTRbKz0mJu3zA3Mo\/BnAPvX5fkC\/tLifEYtaxhztei9yP4NH7PxXbKuFvqkNPcjD79\/1PZfE2qanL4c1CLQiDfNbSi33HA80odmT2G7HPavA\/hZ40+N3wu8E6Z4LsvA1vcJp0CxeZ\/a0Sb2HLPt8lsbmJOMnGeprW8W\/EjTPB1tbTX8dxcSXkwt4YbWMzSyOQWwqLyeFNc+nxeuX+54X8SN9NLnP9K\/ScyynBY2mqGYwUo3uk5OOuqvpJX3Z+L8JZhneTxqV8kp3U9G+Tm26HssX7Rnx8iGP+FeWx\/7jMX\/xitK3\/ac+PUJyfhzbN\/3Goh\/7b14b\/wALYvu3hTxL\/wCCq4\/+Job4qauUY2\/hHxM7AHA\/sq45PYfdryFwhkS2oR\/8Dn\/8mfUT4v4tl8VL\/wApn6U\/ssfGvVfjp4X1LXtb0QaHNpmpz6Y0S3IuldrdULusgjjGNzFeARlSc19lQ2UTRcgV8T\/sS+AtZ8D\/AAC0Cw8RW8ltqV2kt\/eJKpSQS3crzEOrAFWVWCkEZGMHmvuNPkt6\/I80p0IY2vDCRtTUmo6t6J23d3rufc151OSn7V+9ZX9TyzxdZW6wtxX5H6JqSa18fPiD4sQ7ora4tdHgP937JFumH4yyV+rHxF1i30zTbi\/u32RQI0jseyqMk\/gBX4ofBbVLm58EnxLe\/Lc69eXWqTe7XMzMD\/3ztr6\/w6wXtMRicVb4YqP\/AIE7\/wDtv4ng+IOKlDJYYW\/8SS+6Op6L8bpG8VafoHw4T5v+Ek1uxs5V7+QsnnSn6BY+a\/V\/wl4eBhUlO1flF8OrZvGn7UvhrT\/vReHtOvNUcdt0221jz7jcxH51+0Hhe38u3X6Vh4h1VLGUMJ0hG\/zk\/wDJRNeAqDwGRuotHUk38lojJ1jSo4Lc5XHFfl7+1HepqXxj8A+DF+aOC4utYnX+79li8uAn6ySH8q\/VnxRceXbsPavxc+JWvrr\/AO1T4i1AtlNA0y00tPTdOTdSY9xlQfyrg4GwSr5tGdtIRlL8OVfjJHp8RY+dHIsTJvWSUV83\/ket32s3rWUw08qJyjeWXzt34O3OM8Z68V84\/Cu+\/aE+FPg6y8G6VpWi3EVkG\/eSXcwZ2d2kZjiPqWYmtnxd8RbbwjZW9w9tPfS3lzHaQW9soaWSWXO1VDFR2PeqSeN\/iJKMxeAPEbD2to\/\/AI5X61mWBwOIprD5kouN7pSlbVXV913Z+S8JVc8y1VMTkVN+9o2o321semD40\/tOhPLGhaDj\/r8n\/wDjdee+LLn43fFTUdF0\/wAcWWlWOl2GpwahObW4lkeQW+WWPayAEFsE89qpyeOPiLCMy+AfESj3to\/\/AI7UPhj4oyeIdbvvDd7pd9pN7p6RvLHeoiECXJXhXbqBnntXFgMgyeFZVsFThzx1VpXa87cz\/I9\/M+JOLI4WpHHRcaclZtwS38z6F1HxJBpmnz6ldNiK3jaVz6KgLH9BXp37Dfhu5svgdpGsaiuLvWmn1Scn+JruVpVP\/fBWvhb4za\/eJ8NtTsdPO651BFsYVHVmunWHA\/BjX68fDTRLTwj4T07w7Z8Q6fbRW0fb5YkCD9BXzXiPW9lhKGF\/nk3\/AOAq3\/t34Ho+FOXulTxWMtrpFfmenajPHaWnJxgV+T3xY8XR\/Gb46rokLeZ4c8CzeZL3S41Yj5V9CLVT+Dkg8V9UftW\/Guf4XfD2WTQsS65qriw0uHruuZeA5H92MZds8cAE818I+B9KtPA3he30KKXzXQGS4nc\/NLM53SyMTySzEnk9MDtXB4fZJ7WUs2qrSN4w9er+S0Xm31R63H2cPAYL+zqL\/eVd\/KP\/AATq\/i7471mx0ODwn4POde8Qy\/YLHHVC4\/eTHHRYUyxPY4rhtG8Jad8Ivjbofh3SBttZPDMlopPBeSC5WRnP+0xdmPua6H4B2I8feM9Q+NWqDdaRB9O0VW6eSjYnuB7yuNqng7QQasfH6ZLD4r+A9aj4UtqNq5HfzIFdR+aV69TiBVuJKOT0X7kFNS858jf\/AJLa3q5GuA4I\/s7grF4qtD97VSl5qKasvnv9xN8fmfXPg14islOSlo04x2NuRMD+BSv1H+DviNfEfg7S\/EKHIv7SG4GPSVA\/9a\/K7XLlNY0W80l+VuoJITn0dSv9a+0P2KPEja3+zt4Tu3OTFYran62rNBj8PLrDxHw1sLh6\/wDLJr\/wJX\/9tPD8Lf4OLwn+GX6H2D4nvNto3Pavx6+H2tf29468eePWbd\/aeuy20T\/3rewVbeIj2+VsV+l3xh8Yw+D\/AAHq\/iucjZpllPdHPfyY2fH44r8i\/g8JdE+Gej2dwxMskH2iQnqXuCZWz75euLw3wfPLE4trpGK+bbf5I7\/Eip7LLKODX25Xfov+CzF\/aKt9f8e+LNI8MeF5WS80Sxu9dXbyTJAUWAD3LggfWvo\/wr4207xz4PstfjAaDUrZXZDyBvX50P0OVP0ri\/gHpT+L\/ix4x8XSDfHYJaaVA3+6rTTD8Gda4TwzaS\/Dfxv4k+E83yQ2F19usB0H2O9zIFX2jfcp96+0wucLEZpiMmf\/AC6jFx+avP7nKP4nzmecIRo8MYDNKa968ub0k\/d\/I+jP2R\/Fkuj+FNV+E9\/IWn8JX0ltFuOWaznJmtWP1Vio9lriPGOvf8JJ+1LeXQO6Lw3okNrj+7PeymUn6mNFFeYab4iPgf466V4hVttp4lt20q5\/u+fHmW2Y+rN80Y9jWX8P9cGs+IfFnjaRsnVdYmSNv70FqBBF+imvEy\/IHQ4kxOKS9xw51\/im7P8AFT+Vj6vPc9jjODKU7\/vJSVOX\/bur\/Cx3nxtuX8UaLo\/w8Xn\/AISTWLGwkA6+UZRLIfoFjOfav0auJobDTHuJ2CRxoWYnoABkn8BX5xeCIz4y\/aW8MaYPmi0KyvNVkHbMgW2iP1DOSP8A61fWf7T3ilvB3wF8T6vEdspsZLeIjqJLnECY9wzjFfN+IKeKzLCZVT3svvnK35KJ7Phbg44DJp4ua+KTk\/SK\/wCHPkj4C6pLeeCZ\/FtzlZvEeo3mqyA9c3Ezbf8AxxV\/CqvxDbx7H8S\/DnjbwtpMeswaJFdYhe6W2xNcqI92WVs4QHHHc9KXwpjw54X07w\/HgCytooOPVECk\/iRXMH4wW899dWWkaTq+pCzma3llsrKSeMSJ95d6AjIzyK\/WsThKMqc6VVL2bTi03ZWata6ae2m5+KZfXx39qvNcuhzVVJyWnNbXex7VZftDfHSzUKPh\/btj\/qMRj\/2hWun7T3x1j6\/Dy3\/8HMf\/AMj14N\/wszVW6eFfEh\/7hdx\/hSj4kauenhTxJ\/4K7j\/4mvmFwdkC2oR\/8Dn\/APJn3VTjHi2bvOn\/AOU\/+AfRVp+2X8U9E1jSNP8AEPw+hhi1XULbTkePV0kbzLmQIuEFvknvjI6dRX61aGFdAa\/Dn4U6X4p+K3x58GQTeHdYsNK0a6m1O6mv7Ka3jEkELC3AZwFJMjDjrX7l6FA0cYzXwPGGX4DA4mlh8ugo+7eVm3u2lu32\/E+lyvG47F4J1810m29LW0XkdjGoC1LTUGFp1fLnNJ6hRRRQIKKKKACiiigAooooAKKKKACiiigD\/9X9\/KKKKACiiigAooooAKKKKACiiigAooooAKimbCGpap3jYjNDLgrtHlHjO72Qtz2r8HNM8R\/8JF4+8aeNy24anrU8cT\/3re0xbxH8kNfsj8fPFq+Cvh9rni5yANMsbi657mKNmA\/EjFfgn8Pp30jwXp1lIfn8kSPnrvlJkbPvljX6T4YYLnnisW1tyxXzu3+UTm45ny5dQwkftO7+W35ntXheFvF37QHh\/TR80ei2V3qUgPTMmLeP8QWJFUri4\/s\/44+PIOn+kWB\/O0Su\/wD2RtHk8Q+M\/GPjaQbkha10yBvTykMsw\/76da8h+Is5039ojxzBnGX04\/nZR17mBxH1ji3E0VtToqP\/AJNCT\/GTN8xwCw3BNCj1lUUn8+ZfoeVa3rtzqXjzxN8NbMsv\/CR3GmtdOONtnbQlphnsWOxR65Ir13xDZyePtd0X4PaX8sWqyh7zZx5dhbYeUcfd34CL7nFcFaaZpdl4mvPFqFjdXkaRsSRhVQY+XjPOBnPpX1H+yJ4Nn11dY+NGoIT\/AGo5sdOJHSzt2IZl9pZck\/7or2eK8dTyPL8Rj6Ok5Wt5zcVFP5KN\/wDt08nhbBTz\/McFha+tLDxX3J3f3ydjhfineW83x+stLgAFv4e0clVUYCS3cm3AHb91GK4v4mTzeI9EtfBNqSJfEF\/aaapHX9\/Mu7\/x0GsPVteXWPix4z8SbsiTUzZIexSxQQgj2JDGuu+Edi3jX9ojwnpGPMh0wXWqTD08qPy4j+Ejipyyj\/Y+QU6kt6dLm\/7etzP\/AMmZOdR\/triqUnqnUS+UdPyR+tUEUGn6YsMICRxIFUDgBQMAfgK\/ILwB4iOtprPjXP8AyMGrXl8ueojaUpGPoEQY9q\/S39oXxI3gb4JeJfEitskt9OnER9JZFMcf\/j7LX5P+FZRonhqw0hRj7PBGh\/3go3H8Tmvi\/CfAOVPFYyXVxivldv8AOJ9L4qYnno0MJHq3J\/kv1Pbfh9D\/AMJh+0b4d09\/mi0Syu9SkB6bpALePPuCxIr9X9D060MQzivw68K+N\/iB8PPHmpeMPC9rp959ut4bdPtckqtGkeWIGwfxMc9ewr3O2\/bD+PlqoVNG0M\/9trj\/AAq+NeD81zbMfrGFpp04xUVeSXdvRvu2b8JcQZZlmUU8HUrcs7ttWe7\/AOAfr+um2PoK3NPsLRWGAK\/HMftp\/tAg5\/sXQv8Av9c\/4VcT9uj9oDT4muJND0ErGCxJmueg5PavmI+G+cr\/AJdR\/wDAo\/5no1uK8ukrRxH4M\/crSYIkUba37xxHAfpXzb+zT8TNe+K\/wh0H4g+JbOOwvNWt\/PeCEsyKrM2wqW5+ZArc+vU19A6jKRbE+1fM1qMqE50Km8W0\/VaM4K0XKon3Pg39tvxi\/hX4B+Kb+BsTT2bWceOu+7YW4x7jzM\/hX5taDMmh6HZ6LCRstII4R9EUL\/SvqH\/goj4hxo\/hbwUG51TV1uHX+9DZI0jj\/vpkr4cl12OGNpXbCqCSfQCv2jw2wHLlkq7Ws5t\/JWS\/FM+Q8Qp+1rUMKvsxv83\/AMA+y\/2INLbxB8RvG3j2Ub0jltdJgb0+zxmWYfi0i\/lX7DaNEIrUfSvzd\/4J+eGJbD4Gafrt0m24125udTlz6zysEP4xqlfpdbp5Vr+Ffl\/FGK+s5viqq2UuVf8Abvu\/ofZQoLC4DDYRdIr8df1POvGt35cLDPavwI8K+I\/+Eh1fxJ453bhrus3lzE3\/AExWTyoh9AqcV+xX7UHjBvA\/wk8S+K1fY9lp9xJEf+muwiMfi5UV+F3g5\/7F8K6fpY4MUCBh\/tEZb9Sa+48LsDz\/AFrGP+7Ffi3\/AO2nz\/HM7YHD4SPVtv5aI968CWDeOv2hvB\/h7G+HThdarOvp5Uflwn8JHFfstoXhGI24JXtX5YfsK6G3iP4veK\/Gkq5TTbW00yFvXzS08o\/Aqma\/arSbZYrQcdq+a8RKqxGbuj0pxjH7\/e\/9u\/A93hiUsuyalTho5ty+\/T9DwzxT4dhghY7a\/FW011NV+JHjXxUpyLvV5LWNuzQ2SiBCPY4Nftl8bPEkHg\/wVq\/iu4x5emWc902emIY2c\/yr+fDwDdyWHhGyS5fdNKhnkY9S8zGRiffLV7nhXlqdbFYy2yjFfN3f\/pKOHj7MJ1cto4ST+KV38lp+Z7hpsbeM\/jB4G8HH5kfVf7QkHbZYRtNg+xbaPc1+yEeoJaWWScACvyS\/ZQsD4m+Pmo+ICN8Wg6SsI\/2ZryXcD\/37jIr3r9sn4t3fhbwbB8NfDk5j1jxPug3qfmgsxxPL7Eg7E6ZJJBytcnHNCrm2f0cnwu6il6XvJt+kWm\/Q9bgzD0styL65iNE25P8AJI+avHfxG\/4XR8Xrv4gK\/maLovmafow6q\/OLi6H\/AF0YbVP9wDPNRahcW+qWE+m3ZJiuI2icAlTtcEHBGCOD1FeTWd\/Y6DpSWdtthtrWPA9FVB1P8ya9r+D37OfxL+NHhOPx\/N4il0C11GRnsrVbOKYm2HCSMzkEGTBYDkYIIPNfqWIrYDh3B04158lONorRtt77JN3erbtufmSy3HcTY6riKK97fV2SXRXPKLT4deG7C3S0sbzUYIoxhUjvZ1VR6ABgBV208EeHbTVLbV5bi8uZrN\/Mh+0XUsqq2CMhXYjoa+rj+wd482bz4\/uP\/Bdb\/wDxVeI\/Gz9m\/wCIHwd+H2pePovF8uo\/2YI5DA9lBGHUyojZYEkYVieB2ry8NxnklevCjSre\/NpL3JLVu2\/L1vuezV4Pz90p89W8Undc\/RLXS446yv8Aer6u\/YL1oD4Xal4fB40fW7+1Ueis4nH5+bX59jVwRkNwa+pP2GdaZPEnjnw+rYUXFneoPXz4mRz+cYzXN4j4PmyWpU\/klF\/jy\/8AtxPhvH2eZSov7cWvu1Pfv26fFEll8CL\/AES2fbPrtxbaZF9Z5V3j8Y1evimPVorS3WKMhI4lAA7BQP6CvVP25fEZuPE3gvwcWyizXOpzL6eQgjhP\/fUjflXxt4z8StZeFb+aEneYWRMddz\/IuPxIpeG2XuGTwqtfxJSl\/wC2\/wDtpt4ir2+Y08JH7CS+b1P0v\/Yf8MSS\/BhfFdwmJfEV\/eak2euJJTGn\/jkakexrzv8AbO8JP4S8T+Gfi9aLtjEjaNfkf88bg74GJ7KkoOT\/ALVffvwJ8CDwX8NNC8I7QG02wt7dvdo41Vj9SwJNZH7R3wqi+J3wq1vwQygPfWzLCx4Czp88Lf8AAZFU\/hX5Pg899jnzzhv3ZTd\/8Em1+EXp6I\/R8XhYYjAPJntyJL1S0\/E\/HD4hW95r\/heaHS2K31syXVow6rPCwdCM8ZOMfjTvh5BN4a8Fado91lZo4g0oJyRJIS7gn13Ma4Hw34ou9R0SCa+zHcqPLnRhhlljO1wR2O4Gtl9ZCIXdsKoySa\/pb2Glkfz9Up1Y0\/qctk7289j68\/Y608638Q\/GnjmUbkgNppUDenlIZZh\/3061037cGtKfDXhrwUrc6vrELyr\/AHoLRWmk\/wDHgldV+w94dlsPgVa6\/cKVm167utSkB\/6aylEP4xopr5r\/AGxPEH9ofHvR9B3Zj0PSpLg\/7Mt5Jsx9dkQP0NfhuDj\/AGpxlKe8YSf\/AJTjyr\/yZI\/c8SllfDKpR35EvnL\/AIDOWuvEMNpbyXUzEJEpdj7AZNfXP7GPh0WXwV0nUb9cXOrNNqMx9Tcys6n\/AL421+bnia4u9U8P3mmWEirNcRNGpckAbhg5wCeleveEP2oPjF4M0Ky8PaXpGjGCwgjt48yz\/ciUIvQegr7jj3IMdmuDpYTLoJ+9zSu0tk0t\/X8D4rw7x+CympXxGNqcraSWjfW72P2ts9OsfLGcVqw6dZbuAK\/HVP23\/jzGNo0XRP8Av7cVYj\/bn+PcZz\/YmiH\/ALa3FfmEfDXOl\/y6X\/gUf8z7qpxZl0r2xH4P\/I\/bXSbK2UjbivSLCNVUYr8cf2fv20\/i\/wDEH406F8M\/EWh6XFa6oLh5ZrWSYvEkELSbvn45YKvTnNfsJpM\/mRg14+ZZLicprLDY2KUmr6NPS7XT0PLxGKhi4e3oSvHudIOlLSDpS1yHjBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/\/1v38ooooAKKKKACiiigAooooAKKKKACiiigAqleAshAq7UUq7hiky4Ozufnb+3xpHjHVf2eta0TwRpl3qt7qMlvbmGyiaaURNMrSsEQFiNilTx3r8c18LfGCNRGngLxMAowB\/Zk\/T8q\/p9vdMWfORWAfDcRbO2vrOHeMq2SYeWFo0YyvJyu276pL9DpxuAw2Y8ssTJrlVlY\/OX9jH4Ta\/wCEPgjbSeKrGbT9U1a7ur+5t7hDHKjSyFUDq2CD5aIcEZFfDX7SPw9+KWm\/tGeKdY0TwnrOqWGoLYtDcWNlLPE3l2qI\/wA6jGQwIIz2r+g6PQo1XAWqlx4dik\/hriyvievgMzr5wqalKpzXTvZXknp6WSXkeljXQxmEhltRtQjbbyVj+ZuP4bfHPxlcQ+E9L8H67YS6lKlt9qu7CWKGFZWCtJI5GFVVJJNftzonw6tPhz8PYNA8N2rSw6PZeXBCoy8nkx\/KPdnI59Sa+pYfDMKHO2tL+w49uNtHE\/E+Iz72Ua9NRjC7sr6t9X8tvmLJ44bKFNYRu8urP5c9A8CfG\/TdNWHUvAviV7l3klmYaZPhpJHLsfu+pr7t\/YU+E3jhPHviT4g+NtDv9FCWltp9muoW727yKztLMVVwCQGVORxz7V+yEnhyJmztFXLfQY4+gr1864+xWZ4Opl8qMYqVldN7Jp\/ja3ocGBy7CYLELG05Ny138z80f29PDXjTU\/gjH4f8GaPe6y9\/qdpHdQ2MLzyLbxlp2YogJxvjQZ6ZIr8uW8N\/F2M4fwN4lH102f8Awr+ni40RJFwRXO3PhOKUk7a5eHeNK+R4X6lQoRkrt3bd7u3b0RrmOBwua1VWxc2mlbQ\/ml\/sD4sf9CR4j\/8ABdN\/hTf7B+LX\/Qj+I\/8AwXTf4V\/Sf\/whcH9wUf8ACFwf3BXuf8RVxv8A0Cx+9nH\/AKq5X\/z8l+B\/Nf8A2B8XCePA\/iP\/AMFs3+FU9U8D\/HDW9Mn0rTPA3iLzrpDEpfTplUb\/AJcliMAc9T0r+l0eC4AfuCtez8LxQtkLTXirjf8AoGh97JlwzlsPejOX4HG\/CbwfF4J8GaR4Rtf9VpdnBaJjpthjVB\/KvVL+EtbkCrllYJAAAKvTQB1xX5m+aV5TerO+vilKpzI\/Cn9vvwz8UNd+N2iS+HPDGr6xpmmaU7JPYWktxGLi5lIkUsgIBCRpkZzyK+JdV8CfHDVNMn03T\/AniMTToY0LadOqguMZJ28Yz1r+oq90SOckkVnw+G4kfO2vvco8QcTlmEp4Gjh4tQW7b73\/ADZy4vK8JjKrxVeb5tPwPMPgz4Bj8CeBtF8IxAbdLsre1BHfyY1TP44zXvbxEQY9qjstPSAAAVqNGCuK+D96Tc57vVnTi8V7Saa2PzU\/4KF6L401r4D3Hh7wVpN5rE2pX1pDPDYwvPKsCSec7bEBO3MYUn\/awetfkF\/wiPxn6f8ACB+Jc\/8AYMn\/AMK\/qJvtLWfORWB\/wjUW\/O2vsOHuNK+SYZ4ShQjJNuV23e7sv0MMbgMNmLjUxMmmlZWPz7\/4J\/8Awr8R+C\/hJNqfi\/T59N1LW9Tub6S3uo2imjXIijV0YBl+WMMAexz3r9J4LfZBt9qisdJS3xgVvCIBcV8zj8XPHYqrjaqs5tv08vlsb1q8YwhQp7RVj4C\/bt0vxhqP7O\/iHSfA+nXWqahfrDbLBZxNNL5ckyCUhEBYgR7s4HfnivxPj8E\/GOCNYV8B+JVCgAD+zJ+APwr+pO+0xZxgiucfw1EzbttfScO8ZV8joSw1CjGXNLmu277JfoY4zBYfMeWWJk1yqysflP8AsMfCjxX4d8G694q8Z6XdaVf6xqJKwXcTQzfZ7eNUiLIwDDLF8fpXwd8Q7D48+P8A4nax8Qda8B+JA10\/kWcY02ciCziJ8qMHb1P3nxwWJIr+lBPD0ajAWoZPDcbnpWeA4wrYTMcRnDoRlUqd2\/dXZfcvuO7FU6GIwlPLnNqEe3U\/nC+HnwC+LPxd8cab4J1zwzrGiaPPKJNRu720ltkFtH8zxo7ADfJgIuOec4wDX9BHhHwTY6VYwWFlCsMECLHGijCqijCqB2AAwK7y18OxRtnbXV2tmsIGBXHxJxHiM+q06mIioxgtEtrvd69Xp9xjhFRy2jKjhH8T1b3Obfw9D5WNtfKX7Unw1vfFvwR8WaFo9s1zeXGmXP2eGNdzySrGWjRQOrMwAA9a+4WT5cVh3unLODkZrwqT9jVhXgtYtNfJ3NMNmM1eMno9PvP5XrbwP8bIbWKG48C+JN6qob\/iWz9QOf4a+tv2IvBfxN034zave+JfDWraPp93o4UzX9pJbo08U6bFDOACSjsQBzwa\/cOXwzEzZ21LF4cjQYC191nPiFiczwlXAVcPFKate701ucuXZZhMBXji6E3zI\/BL9r3wh8WNY\/aDn1LRvCmtanp9lptvZ29xZWUs8T7i00hDoCuQz7Tzn5a8g+H\/AMGvi344+I\/hvw\/q\/g\/W7HTn1S1lvZ7yxmhhW3hcSSbnYbRkLgZ71\/SZJ4djb+Gpbbw9HG2cUsD4gYrB4COW0aEUox5U7u+2\/r1HisvwmIxTx9STcr38jL8O6V5MIUjtU+vaSJ4CoFdta2axLgCpLi1WVcEV8AqPu2Ol5hL23tD+cD9pH4F\/ErwF8cNem8G+GdU1bRtakXUoJNPtZLhI5Zh+\/RigIU+YCwHowrwPUfAPxy1HTp7Gw8C+IvNmRo1LadOACwxknbxX9SF54eimYkrVSDwxDG2QtfpOA8TMbhcPTwzoxlypK7bu7K2p59fJsDiKksTKTTbvbSx89\/DD4cjwP8PNF8IIoH9mWNvanHcxRqhP4kZr8Yv2h\/Bvxk1P9oTxb4ht\/BuvXdrNcRQW01vYTSxPDbRLGrI6rghiC3B71\/R2mjIq4xWXd+HY5uCtfLcPcQVcmxVTHwpqc5Jp3v1ab\/FHrZjUpZjSWFrSaimtvI\/l5Pg\/4wD73gjxGP8AuHT\/APxNJ\/wiPxf\/AOhI8Rf+C6b\/AOJr+mqTwbCxztFR\/wDCFwf3BX2P\/EV8b\/0DQ+9nkrhnLP8An5L8D+Zn\/hEfi\/8A9CR4i\/8ABdN\/8TSjwd8YWPy+B\/EZ\/wC4bP8A\/E1\/TL\/whcH9wVPD4OhQ52ij\/iK+N\/6BofewfDOW20qS\/A\/HD9gb4S+Pk+MuqeP\/ABroGo6NBY6WLS1\/tG2e3Ly3EoZ2QOBnaseDjpu561+4mjwlIwDVCw0KODGBXVW8IjGBXxGd5xVzjGSx1eKi2krLZJL+mbtUsPRjhaGyLY6UtFFeaeeFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf\/9f9\/KKKKACiiigAooooAKKKKACiiigAooooAKOtFFADSgPWk8tafRQO7GbFo8tafRQHMxnlrRsWn0UBzMZ5a0bFp9FAczGbFNJ5SHtUlFAczI\/Kj9KPKj9KkooDmZH5UfpS+Wg7U+igOZibRRgUtFArjNi0eWtPooHzMQKBS4oooFcaUU9aTy1p9FA7saEA6UuBS0UBcaUB60nlrT6KAuxnlrR5a0+igOZjNi04AClooC7CmlQadRQK4zy09KPLWn0UD5mM8taNi0+igOZiACjApaKBXGbFo8tafRQPmY3YvSk8tafRQHMyPyo\/Sjyo\/SpKKA5mR+VH6UeVH6VJRQHMxmxRTsYpaKAuFFFFAgooooAKKKKACiiigAooooAKKKKACiiigD\/\/0P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKa5wtAIhknEYrJn1lIeDis7WL7yEJzX52fE39oP4q2\/jDxPpngK30s6b4ZCRyyXazySyzG2S5kVBE6j5VkQYwTnNdeXZdiMxqvD4RXaV9XbS6X5tHTXqYbB0frWOlywulffV+h+jH\/CRx5xkVaj1uNxnIr8o9A+Ov7QPjnSbDUrW30nws89tHI0N\/HLeXLuVBdhCk0AhTdnaGd324LBTwPV\/h\/wDHvxfD4pg8BfFK3tYry+R3sL6w3i2ujEN0kRikLPDKq\/OFLurKCQ2VIruxfDOY4SjLE1oK0dWk02l3\/wCGvbqRhc1yjG4pZdha6dR7Kzs32TtZn6EPrKIM8VTPiJAccV8T\/Ev9oVvC1\/D4R8KWR1vxDdR+aloJBFFBFnHnXM2G8qMkELhWdyCFU4JHhE3xU+OV3qw0+78XeHtPvn+7YQ2LysO4BMl4sj\/UKn0FTlvDmPzCksRRilF7Nu1\/RJN287W8wzXM8qymr9Xx1W0+qSba9bJ2P1TTX0fuKl\/tuP2r88fAXx28YxeKIfAXxQt7WK9vI3ksL6x3rbXXlDMkZikLPDKq\/OF3urKCQ2VIrzHxH+0x8crXTvFfibQ7bRP7P8OXGoRrFOtyZ5EsdxBLLIF3Oqg9MDNFHhzMKmJnglBc0Unq1ZpuyafX+r6mtXG5ZDCU8y9r+6m+VOz37bXT9T9XP7cj9qP7cj9q\/Pz4ifHrxRpSaDoXgWG1m1nXN0uLsuYYbaGPfLK4jIY4do41HGS49KrfDP43\/ETVfG2q+C\/iEmnq9lY2t9DLYCVVIuJJ4yriVm5Hk5BHrXGsrxTwUs05V7Neeu\/Lt66HbKlhI4+OTuf75q\/LZ7Wv6bH6Gf25H7VE2vxr3Ffk5rv7U\/xom0GXxt4NtNIfTLy7+zaRBcC4a5uw83kW7ZR1QeccOOPljOT0NeqeKf2hvEbaq\/gv4e2MOraxaqov7iSRorCzdlB2u4DPJIc5ESDIUguyZGeyrw5mMKlOj7O8ppu11ola\/N23S166bnLTxWWSo1sW6yUKb5ZSd7X7Lu\/S5+hg8Qxk4yKnXXIyM8V+Vmm\/Fn4839zJLpHibwzqM8H+tso7KZVX\/ZMqXsjqe24xn\/dr3n4cfHUeM9IvG1m2OlanpMpg1C0dw4icKHDpJgb4nQhkfAyOCAwIGea5Djstp+3xEU47XTva+19n89vMnJsblmcVZYfL6t5pXs007d1dK59rNr8a9xTR4hjPpX5DXv7Wvxs0\/wAO6D48uNJ06607X7u3jt7C2Sc3zRXOXQKzSCPzPKBYkgKD1wM13Gm\/HX4z2vxE0Sx8bSaPYaVqEV7c3VtCkryW1vaw7i7XjyojFZHjVj5Crgnnoa68RwnmWHpzrVopRim\/iXTdK2t\/6uZ4XM8pxNWnhqFa85ycUrPdb9Nl32P1APiKMdxT01+Nz1FfmHqv7RfxC8U2z6v8PobHRtCXlNW1oO3nqekkVqjwkRn+F5ZULcEJjBNfT\/jZ8cPD9kPEs9xpPjDSkBeVNOgktLkoPvGAm4uIpWUchDs3dN2adLhLNJ0va8iXk3Z\/5J+TaZzYjPsjo1\/qssQua9rpNxv\/AIrW\/E\/U3+2Y8ZyKy7zxMLcErivlC\/8Aj34O03wEnxIuL0NpM0Ec8MiAs0omA8pY0HzM8hYKqAZLHGM188at8X\/jx4mQ6raf2T4SsHOYotQikvbrB+75vlz28UbHuimTHTca87LMmxuZc31eFlF2beiv2737pJ26np5tWy7JuWWZ1VHm2Wrb80ld28z6x+NH7RGu\/DbTdMHhrTrfVdS1i\/WxtreaZrePPlSTO7yLHKwVI4mPCHnFZnwO\/aK8ffEnxXrvhTxjodlpcmixWknm2d3JdJIbrzfkPmW8BVlWMMeDwwr4Z\/tr4meMvinpNp4\/sYUh0C0u7pL6zD\/ZLmW58uGLarlmjkRPO3IWbgghiDx9F\/spRm6tfE3jI8\/2vrlysbesNiqWKge2+B2H+8a+ix2SU8tyd1cZBe2bsndu15abO2sU3tfXueJgszpZnnLw2XSUsPGmpN23b\/Fb\/gfobBqBdNzYqGfWEh9K499R8iDrXxh8Q\/2iPE2oeJbzwX8H7O3vZ9Ofyr7Ur1nFlbzYyYUWP555VH31VkVM4Z92Vr5XAYLEY+p7DCRu930SXds9nFrDYKlLFY2ahBdX+S7s+8D4kTOMipV8QRt3FflHrfx1+PPgXR73xNfHSvFkFmjNNa6dbTWlzG2DgruuLgSBTgspCNtyQSRg9Z4U+OHxqT4h6D4S8aw6QbfVobqaX7Gs4liW3jUk5kcqR5kkanjvXr4rhXMcNTnXqKPLFN35l0V3Zb\/h6HJgM3yfH1KVDCVrzm2krO918tNOp+mB8QRjuKT\/AISFPavyl8fftPfFvSbLxX4r8K2+knRvDs89vGt0tw0872yKJMGN1UZmLRrxxjml1X9oT4+XEOla7Z2em6Ja6lqFjZxWN3FLcXki3MyRs0jpLEkBCFpNgWQqBgtnOHT4TzKVONflSi1e7ktNE9et7Pt6lzzPKYVnhXW99T5LWd+bay0+97I\/Vg+IkHpQviKMnGRX5v8AiP8AaJ8Y67fXll8KrW0+w6e7xXGsam7i18yIlZEgijKvMI2GHcvGgIIBbBxyWi\/GL46ahvvdA8Q+GPEAiP7y3htpoQP9nzo7y42Z9Wjb6UsLwpmdekq6gknsm7P\/AIHzsYY\/PMlwVaWGr1\/ei7OybSfZtKx+qg1yMjPFQP4hjXuK+CrP9pSK4+Emt\/EW6s2s7zQIrsXdjI4cpc2iFjEHXAdX+UowA3KwOAeB4vqX7Rn7RHh7WtG0\/VdD03VTqyzZhsfPhMBjj3BpZpWdEjDsoY7SSM7QWwDzYLh\/MMW6saNPWDaabS1Wtlrb9D0MbXy3A+xeKrJKorxetmlrf0sfq2PEaHuKz7zxY0C5TbX5rW3xP\/aPdP7Vtr3w5dr\/AM+aW90qnH8Iu\/tDc9txt8f7Nel6H8dtN8TeBLvxlcxSWL6YJ01C1lIL201suZYyw4YAYZWHDIVYdayzXI8dl0I1a8bpu2jvq+j\/AKt5l8P4rKs5qzpYCqpOOrTTTt316GR40\/bg+JOhReIde8OeEtPv9G0G6ubQTS6lJDPcPaOYpNkS2cijMoKKPM5I5xX3Fpfji4u4ka4VEcgFlHOD3GeM49a\/FbUrfxPpvwO8K2NnpsmqX2pX1jeXkEZ2As839oT+ZIQRHGXUq7twA3ckA+6aJ8RfjvqiNqei654bk8s4a0htp7iNT\/da5W6Q5\/2vJH+7X2Wd8HzcaUcsppWvzNyer0S0bdur0SWp8jk3FmXuGIrZtVUVztQSi21FdXZdfPsfqZN4pZF3Ltr4S8fftjfFLRNS8V3nhLRdIn0XwtLNC895dTxyym2gSWcqkcLqArs0Yy2SVOcVs\/D340N4z8MXeo65bjTL\/SZ5LTUbff5iRSxKrko+BujeN1kQkA7WGQDkV+ei6G3if+x\/G2u6DYfYvGuqW8s1mt\/qysy6lL5srPGLsQFhGWkdfL2HBG3HFePwzlkHXxKzOi5KkrNXWj1f80b6J7Nrr2Ppc9hTp0cL9Srxi60lytpy5l2Vk97rVn7e+EfHuqa34c0\/VdZgS0u7q2ilmgBLCKR0DOgY4ztJIzgZxXXL4jQ9SK+EPHfxzTwbdweGdAs31nX7xDLDYxuI1SIHBmuJSCIYgeA2GZjwisQceYH4p\/tB3OofZv7b8NWVzjcLEWVxcNjr80hvIWI\/2hEv0rystyDH5jT+s0YKMHtd2v6bu3nt5l57mOUZRV+rY2slPsk2162Wh+o6a5Gw6ikfXY07ivhH4Z\/HXxHq+vTeA\/iDZQ2OsxW5u4ZbV2e1u4FYI7x7wHRo2ZQ8bZxuUhmB44rxl+0p4m1G8vrP4YxWUdhpjvFd63qrstmssZ2ukMaMjTbDw7mSNAwIDMQQM6eR4+eKlgI0\/fWr1Vkns77a9OvTcqpXy6ng45pOsvZS2fd9kt7+Vj9H08QIxxkVqQX4m9K\/JLwv8cfjHrLSXvhDxd4X8T+QR5tvDbPGBnoPOhvJzHnsWjf6GvuX4H\/Fe3+KXhYa59mewu7eeS0vbSRg7W9zCdsib14dejIwxuRlOBnA2zPIMblsVVxKXLe109n57P8ACxw4LMcuzJzp4CpeUdWmmnbvZpH0wrbqdVS1fcgNW68lBNWdgooooJCiiigAooooAKKKKACiiigAooooAKKKKAP\/0f38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKgnbahNT1Qvn2xGky6avJI8v8V3hjRua\/F218eatdeGb\/XPDcgXUvF+tzmzdhuCfbboxQSEdxFbhHPqFr9Mf2l\/GEvgz4TeJPE1u22a00+4aHtmYoViH4uVFfjH\/wAJLb+GIvDmjaXLF9v0t4Z7OCUssc32NQroWAO3cjEA4JBOcHBFfofh7galSli8XSV5aRj6pN2fz5Tl4wjRksDgsT\/Dc+af+FWv+DZ9YfEH4PfDHwp8Kda1WHT4hqOn2E92urygPqH2mGNnWc3J\/eF94B4bH8IG3iuQ17xhLNqXgy51I7Li3vvt02OqJb2Nw859hglf+BYriPiD8Ztc+JGkJoGpafHoekK6TXu64E0twIyHEWVVVSLcAXJJLAbcAE59C+FHwr174raRrHjvUI3t7K90y50zRvNBBdblcTXeDyFYhVjOMlQzD5WGejBYfF5Pk2IrcQVHz1G0k5czXMuXu13bS6I9bNHgs8z\/AAH9iwXJh\/elJKy01S6dkvmcjpGu+Ibnwxb3drMYPEfju+h865GGeD7Vzhc54tbVSsY6ZTPc19C+LPhN8KdA+Fuq2P8AZFrFb2tlPO1yyKbgPHGz+eZz+8MoI3eYW3Z5zXxVpPirVbWHRNVt4QNU8N3SNNZzsUxNCj288DkBtjbXcA4ODg4Ir0n4lfHPWPiR4fbwtJpy6FpE2DqEs06ySzRKdxhUINqI+MO7NkrlQozmu\/ibIMyxmMwlHLfdoRs207JWfa93aKXLa\/XzPP4OznLctwmOxWa64mcpXTV29NEtO97nSR+ItU1iH4fLfNu1N9RspGP8W8W0huD\/AN+\/Mz7VjeLdWay8N\/FPRWOD59+cf9d7CKX9d9eqfs5\/DzWvHWtJ8X9ZgeHS7WF4dHSQENMZeJbvB5CFR5cRP3lLt0Kk+LfGWxFp8VvHXhWdzEmppbEkdhNYxwkgH\/crsweOpYniOph6LuoUrP8AxKabXyT++54tfJZYPhSmq6tJ1lO3ZNNHD+PfiXrtx4e1zxn4XmZb+5tG0rS5EODFaafE815cKR03OsgDDusWD0rsfFnjW9fxlqmgaZOUv\/EWj6ZpsbqfmSN571riUehjhDkH+9t9ayvCXgBb74M+N\/GsMZGn6PoF9o+mZ7rDbs11KPXdIqx59Y29a4y448SQ+MNJjN3rVzZw6TYW\/HzSyyHYB\/vO4BPZQT0zXo4KhhMTTrZVBfu6Dgm+7jyzd\/LRKXnzF5lLEYTEUM+S\/f4hVWl2UkoQXyWqPbr3xCLYaj4v0uFTpXgCzaDTof8AlnJqksQjjX0xBG6xj0aVu61ieKLe50T4f6d4J0y+swJZxLqZvrprVr4HL3GZUR3zNKQZCByhK5GePof4gfA\/U\/Cv7NV14R8PRvf31hHBfTFFzJdTQXMd3cMB1LSlXwvXkKO1fH9r4q0mXxLYeOjptv4jsfssts9vIY87ZWR1liMgKb1KbSGK5DHkEYPlZBmH9pwxuY0Ic7UuWMb2bhFe7r0cm5P19Doz3I6eXSyrKZVVCnFOcptc0faN6trrayWvQ6WPXLeXXtE1C1tfC+grpVxvM2nXuZTAUZHg2fZ4lZGyCQWwCoOMgV0mq+Nllh+I3iHw5cJIs2jadpySRsGU3dw91EhBXIyvnR\/pXmHizxvHqF2L3StI07w7afLFBarY2t7d3MrHgY8tl3E4VI49xPJJ5AHqfjrRvEvgr4Q+EtB8aw21rq+tauLy6ht4YoAkVqrzoriEKjOjLCrEDG4nBIAJjEYdwoYbLJYdU1VnH3XUc5JKSnLdPpH+ayb7np4dU5Y7EcQPF+2lRpyXMqahFtxajqnrq+3Q7eFb3xLruifCHw5dy2NqLZ57ua3O2ZLO0CRCON\/4GkeRF3D5gobbg4Izvip8OPAXhXW9D8K6HZGGTWmlN9LJNNNJJYWpjllhLSux2yz+Qr8\/MuQc1337Jeiy+LPGPirxlKN0dpHaaXCeuGAe5m\/MSxflUX7W2k33hHxf4a8dSoRpzQXemyzfwxTTPBLDuPQCTymUE8bgo6kV5uJxtSvxRSy51Gqcel7Jy5XJX7u9lr2sjLKctpZdwpVr0Ka+sTTfNb3km7aPde729TwvxprtzeePV1O+\/sLVLGwhVLSy1K9aEQzHJklaEQSqzkbVQk\/IoOACxq94E8VWOh+JdW1u9uNE0m11GO3xZ6ddiSIzxGQSTENHCFZ0ZFO1TnYCTXEeGPFWieE21K21rwpbeIPtd1JdwXObcOPNAJjl84ZAVgdrLu+U42jHONpaeOfHPiiHwv4Rg0oarfSbzaQaXaSwWVuW+aSWV49+yNeNzYMjcKATgfTVKVSnia2KqYblUFbnlUai476RXMl3furXzPFo4Ghicpw+SxxylGdn7ONFOSlvrK6e\/W+3kdz8NtcPiBfD+mXTZ07w9ayajDGfum4v7ic27YPB8m2Hyenm56gV7X8NfBfh\/wCJ+mv8TfiBZQ6s2oSSf2fBdos0NtZo5SPZG4KCSUL5jvjcdwXOFArzH4nafL8N\/jBqWm3CCC31a1tbmy2qFRkt4hbyRoBwDGUUlR0Dj1rF8MfHjxH8NPh1D4Oh0q1lbSoTBBqE10EtxCufLeWMLv3KuAyqcMRwwzx4ObYLHZjk9GWQqzqy5pWaTXNzSkrtraTs+ultj6LKMRgMBxHiq2eS\/hwjCndX0SS0WurWvzZ3Oj+IrH4dHxjpmnfJo+g3sjWsWflijFpDPLEnoiSs4UDheg4GK\/QD9mzwvceFfg94c0i9BFyljDJcZ\/57zL5sx\/GR2NfkJoTweM9F0vwlYzyXr+LNQt4Z53Xa8xvrhTcysvYFGdsdlAA4Ffvto9h5FuABgAV5PH6nhsPg8vqS5pJXk+7ilFP5vmZz8IwpSxOY5pShyqpOyW1ldu34o8T\/AGi\/Huo\/Dz4S6z4j0cgX6xLb2ZPIFzdSLbwEjuBJIpI9BX556dpEGp3uhfBTS5pYtOME13qUiOyzTW8BQOrSA7g1xPKpkYHcV3885r7S\/bD0LVtZ+Dt8+iQvcXGnXFpqIhQbmkSzuI5pFUDkt5asVA5JAFfmnpXj7UdK8RWfxD8Gm2v2+yy2rwzSGOOaCZkfKyIrlGVoxg7CCCQR3GvB2Eq1cnxcsu\/jttLWz+FcuvTeVn39A4hdCOb5dLNF\/s8byel1fzXW2h7v8SPCXgj4daj4X1jwJpdrpF7Jqa2h+xRJD51u0EzypKEA3qAm8Fs4ZQQck5v+D9bi1D4r614qu2223h\/SIrfeezXMjzzfkkMRP1r5nu\/iteeP\/HxuvEc0C3OlQN5FnaMZIbbziA7PKwUyTMBj7qhVyAOST6Hpsstj+zH4w8aliJfE99PaQv8AxFZZI9Lj2\/QIWH4murFZTjMFkNPLsdNutWnGG97c8r2v191O\/TV+p6GHxWBzHiuecYWFqVCk3e1rtJ62+enoWvCfiHxCnw40HRNGcQaz4pulIkZQ\/lS6jI91PKVPDNEjSOAeCVAPFfROofBr4V+CNIl8X6vLPFc6dFJMdWvbqaaWJ9jKZ\/3rlA43EqAmAcBV6CvE\/gDpy+MfjlpFnAubfw\/p91feyu4S1iH1KSS4+lex\/tk\/aNL0HwxYTgrp93q6\/aD\/AAu0MEssEbdsGRQ4B6lBWXFMsRis4w+R4Wq6cGves7b3un391KyempzcFUcNgMqxOfYmip1ZOUtVrptZ9Nb7HxxHHqsOl6dpdss2oeFdLKGGHXnttOt5hEpEbSRwwSTOgPz7ZdhZgCwrvfh54h0nX\/HFz4rt7rSPtGn2n2M2+ip+6VZ3V90s3HmtmLCAABBu7tXDab4p8L6T4o1DXfHPh6fxC3lRLppAt3htwoYy7lnkQRuzEEyBWO0AZ4weTX4iR3GheIviFbtCLi5EriO2JaKBbeLZFCjYXcFAyWAALMxHGK+0w+AlPHSU6EvcjZVJS3b3SitOrvKy2t2PlczrupkrhRxEI+2ld0acEra7zk7vptfX7z206o158GhvOD418S7yPW3+1b\/\/AB60tf1r0OysYPi548ufDuvZm0HQ4IZLi1yRHdXVwWKJKB9+OKNNxQ\/KzOuQQuK8t+IVvD4Pu\/AngGBgU0TS5Lh8c5cRx2sbe+4NMc1z\/wAPfjNceEtc1nVfD1lHrdnqEqJMizCCWC5tl8ph86kMjKF7gjGRuB4+Xw+Ex2LyTE4vK1+8rTnKOtmk58ujdre5HTX01Pq8csuw3EmDw+ZW9jhqUY6q65+W+u\/V\/ej27xHpHhr4b\/FbRoPA1lBpUWp6fem9t7SNYYXFu9v5MrRxgLvUyMobGSGI7DHn2r6vNdeB\/iG1sxWPX9ZtdJjxxuaeC0tZ2H0Vmyf9g1wuoeNfE\/iTxe+v3dst34h1dUs9O0y1JcRxoSyxKxCkjcS80zBVA54VRXpXxV8Kn4WeGfAnw5vJRPdvdXWr3sq\/8tZ40PmPzztM90Cueygdq1jgamHw2XZLjZc1aUk5a3fLFuo9fKyjfrrbYwjiKVXM804nwUeWlGk4Rdrc0mlG6\/P7jsmtIvih4+s\/h9fjfomn2Z1C+txkJOS4itoZAOseRI7KeGKKCCMik1+y0Hwh8bra18M2kGnLFocjXS28axLJ51ygt9wQAHZ5M23PTca7P9kvQ5PED+KvHUinFxew6dET3js4Q5I9vNnkH1FfO\/xW8aRWHxV8b+Icgx6e0dmn+5ZQBnH4TSSiscJ7bG8T1aUZP2dGFrX0u0k9Nr3k\/uXY5cRhKGX8FxwcIL2lZpt211d9\/JJHZLrt5B8CvHXiy2fbN4k1G6trZ++XMWkxEf8AAowRXQWFzbX\/AMTPCvh23IFpoNtd6kwP3UEMS2kWfwuGI\/3Se1c18S9Il8BfBv4c+A7z5bmeWC6uge7WsDTynH\/Xy8Zrb+A3hq88fX3jXXYjgC2h0aB+yv5bzy\/+j48\/QVxyqqGT5hmbdvazmk\/7rapr7ldnsywMJZ7lOXR+HDUk3\/it\/mkcRpvjDWbjwlc+NNLfZr3ja8hS2kcZMSXcghs1wf4YIGDkdCdxP3jX0nqX7O3gWfwSdA8L21vYatG0c8GsSQie8FzG6v58kuVlkdyCH+cZBI6cV8LaH4g1G20LQprWBf7Q8OXFu0tpM2z99Zny5oHPOxuGUHBwcHGK9I+Jvxy1jx3BbJfJP4Y0WwLTT+VeulxcSlSqKXtmQrGuSdocl228Dbg+vxBkOZYjE4ShlEuSlDXmTVk1bluvtWSSSs1q+lzyOF82y3B0Mwxebrnr1Ju8be80+i+9n0cvws+KNjrLeMNV1+zvbyx02+trKO1sntf310seGd3uZuA0a8YHrnivnnSH8P8Ai74daR4H067WwvdBNs8lrPGJHhubYcpc20mCw35JzjLYYN0NW7vQ\/i38NfgqvxBn1PVdKXWdYtTMlxO9zNZaaYpI4y\/2szeU8s7RtJx8qsqnBU152mv2DatdS\/FLTZ\/G1pNFF9mnK2i3lpIhfzAr4tjscMmCr5BU8c1lk8cevrWLqSjiY3UfdtGXu7pKyi17z3krrVXuka55gcrqRwWAw8pYOUL1I3V4JvXV3unddnZs7rxDN4wk1my8S+IImVrCKWB73wy8dvdtBKUZle2u4p0kAMYZVWYMDnaDnFfpb+zB4X8L+HfBn9qeD9Vutatdfn\/tQ3l20bSStNHGmf3ccSqAsajbsBBBzzX5E2Hio6Ld3j6bb3sNldSRR6ZptxOby7aQjGxGDOSZGICpvfbjOQDgfs1+zL8PdV+Hfwm0LwprmPt1vBvuQpyqzTM0siKe6q7lQe4AryeNsLTweBw9LDtwUn\/Db6atu13Zpu1k7ammQYzEYnEYqrj+SpKNkqsY2cvK9ldadj6wsc+UK0KqWi7UFW6\/O1saVXeTCiiimZhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/0v38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKytSz5ZrVqCWBJhhs0mro0pyUXdn5af8FEPEQ0P4P22ik861qtrbkd9kJN2x+n7gA\/XHevj\/wDZL+FPh341av4nv\/Gdil\/YWlva2UQfcCJJGeaRkdSGRlCxYZSCM9a\/Zj4vfs0\/CL47WtlZfE6wlv49PkeS3EdzPb7GcbWOYHjJyB3z7VN8Kv2cfhR8FNFn8PfDaxksLS5nNzKrTyTs0pVULF5md\/uooAzgY4HJr63C8QUsJkU8qw3NGtKXM5KyS1Wzve9opbHT7SE8fDHVbOMYtJW73+XU+VvCP7E3wO0q\/j1S40iTUZImDRrqF1cXcSkdP3U0jRnHYspNfW8fhOJIwioAAMACvU4dJtIBhAat\/ZYfSvlcViMRjGpYyrKbX8zbt952LM40rrDQUV5K35Hw\/wDEj9kj4SfEnVm8Q69pjQ6k4Ae7s5pbWVwBgeYYmUSYHA3hiBwK5jwt+w\/8DdA1GPU7nSpdVmiYMn9pXE11GpHIPkyMYiQeQShI7V+gbWNu3UUgsLdegrpp5pj6dL6tTxE1Da3M7W7b7eRlLGUZS9rKlFy72V\/vPMoPDEaRhFXAAwAK8S8ffspfBv4j6+3inxjoaXl+8axNN5s0ZKpnaCI5FBxk84zX2ALaIdKQ2sR6iuTDTq4aXtMNNxl3Taf3oc8ydTSorrz1PmGx+BvgjTPBDfDew02OLQ2t5LVrQbthhmDCRSc7jv3NuOckknOa43wd+yD8D\/A\/iC28VeGvD8dvf2ZZoJWlml2FlKEqskjLnaxGcZGeK+z\/ALJD6UotYR2rSnicRBTjCrJKfxe8\/evvfXW\/mVPMuflcor3dtNvTseWv4Yj2Y218teNv2Lfgt4w1mbxBPpktheXLF5pNPuJrUSsTks8cTCNmJ5LFdxPU198fZ4jURsbduopYSvXwcvaYSo4Pum1+RM8xVVcleKkuzVz4q+HX7KHwi+GmojWvDWkA6gAQLy6kkurhQRg7JJ2coCOCE2g12Hj\/APZ1+GnxW+xf8LA0pdROn+Z9nJkkjMfm7d+DG6H5ti5z6V9Sixtx0FPFpCO1VLF4mVZYuVaTqfzcz5vv3G8xiqfsYwSj2srfceB\/Dn4L+BvhXoj+HvAWnJp1nLM1w8as77pWCqXZpGZiSqqOT0AFb3iXwJo3iXSZ9E120ivbO6QxzQToJI5FPVWVgQR9a9hFvGOlIbaJutY1HOpN1pybk9bt6373IhmLjpHY\/OO7\/YK+Bct2ZLazv7aEnJt4dQu0i+gHm5UeykAdq9++H\/wM8BfDTS20jwNpUGnQuQ0nlqS8jDgNJIxLyNju7E+9fTBsLc9RTxZwL0FdWKzDGYuCpYqvKcezk2vxZVLHU6LcqNNRb6pJHzB8RvgT4F+KGjDQ\/HGnJfQI\/mRklo5InxjfHLGVdGxxlWBI4PFeJaB+xF8EfD+pLqbaXNqM0ZzH\/aFzPdIh9Vjldo9w7MVLA8g5r9DDZwN1FR\/2dbelRQxuLoUnh6FeUYPopNL7rlPMITmqtWCcl1aTf3nxd4E\/ZA+BngfxBZ+J\/DXh6O2vtPYtbyebO4jJUplVeRlztJA447V9UCw8qHGO1datnCvQUr2sTjBzWeIrVsQ+fE1HN7Xk23b5mLxsdoRSXkrH5Yftv\/Gn4mfBi88OjwZHZJY6r9qjuLi8gkmCzR+WYoxsliCl1MhGc52HHQ1+aumfEv4WalNeah8VfBsV7qM0xljn0RRaQyBlBPnxNdKN+\/cS3zbgRkZHP9Hnjb4U+B\/iNoc\/hrxrZR6jYXAHmQTqroSOQcEHDA8hhgg8gg18jz\/8E0f2WZbgzQ2WpQRk\/wCqj1G42fQbmLAfRq+zyDN8ow+D+rY2jONT+em7SavfVqUX5W1Via2PxKqqdCpFx\/lnHmSffZn4lW2pal4y8ZtYeA9Ihtr\/AFYx2mm6XZgbIY4wdgYqoGAWeWaQgAZYngV+2Xhb9mrwXcfCfSfhP4utF1Ow0+GBXDF4\/MmiGTLlGVgWfLdepr3r4afss\/BT4QRuvw90hbB5Rtkmz5k7jOcPNJukYZ5ALEV7db6FY2wxHu\/HH+FcnE3Ev9ouhQy+Lp0qWsdfeb6Nu71Xq3q23qPL6sML7avUlz1KvxO1lbsl2Pm74Zfs6fC\/4UT3V54B0hNPmvlRJ3DySM6xklRmV3wAWJwMZ711njf4W+GPH3h648LeL7GLULC5AEkMoyMg5VgRgqykZVlIIPIINe6raxKMClNrCeor5apVrVKn1ipUbnp7zbvptrvp0NI5hyrkirLtbQ\/Oqz\/YU+BWnX4vJdMuL5IzlIL28ubiAexikkKuPaQNTfEn7HHwM1i\/udU1Dw7E010xeXZLNGrEjB+RJFQfgBX6InT7Y9RVKbQbGf7+78Mf4V01c1zGcvaPFTvtfnlt95vh8fh6a5PYxtvblX+R\/Nt+0d4h07Q\/jXrunacqxWvh+0tNMgVfuqkEPnFR6BWmK\/8AAa+5\/hp+xz8OPEPw18Ny+LNOki1YadAbqe1nmtZHkkUSSCQwugfDsQCwJA6EV9YeKf2Af2XfGniS+8W+JNDuLi+1KZri5b7feIskjnLExrMEAPoFAxxjFfVNt4W0u1AEW7A6Dj\/Cvp844nVTA4PBZVKcHSXvO9m3ZLRptu\/vN37nHhKlKGJxOLxMVP2ttGr2S9V6Hyx8Mf2bfhn8LRJP4M0lLa5nXbLcyM89w69drTTM8hXPO3dtz2rU8ffs1fCz4qXlrqHj7SF1CazRo4XMksZVXILD926ZBIB5z0r6qTT7eMYUGpPssPpXySxOJ9t9b9rL2n83M+b773OieZRcPYqK5e1tPu2PAvA\/wi8IfDjw9H4V8FWK2FhEzusSFm+aRizEs5ZiST1JNeQ65+xf+z94g1q78Q6v4ainur+eS5uGM1xtkllYu7MgkCfMxJIxj2r7c+yw+lJ9kh9Kqli8TSnKtSrSUpbtSab9XfUzlj1JKM4ppbK2x8pfEL9nP4afFZ7OTx\/pS6i2n+YLcmSWMxiXbvwY3X72xc5z0ra8C\/BDwR8MtDfw94F05NPs5JWnaNS77pHABYs7MxJCgcnoAK+kvskPpS\/ZIfSsnVrSorCyqPkW0bvl+7Y0\/tO0\/apLm721+8+F\/iH+yD8I\/iJrMniTWNOkttSlx5l1Yzy2skmBgGQRMFkOABl1JwAM4qHwH+xz8G\/AurxeILDSnvdQgO6K41CaW7aNh0aNZWZEYdmVQ3vX3WbG3PUUCwtx0FdKzLHKj9VWInybW5na3a19vLYh42k5+2dNc3eyv954rqfgjT9X06bS9Vt47m2uEaOWKVQ6OjDDKysCCCOCCMGvlDUv2Dfghc3LTadaX2noxyYrW+uUiGf7qFyqD2UADsK\/Rs2cJGMUw6fbHqKyweLxWCv9TrShfflbV\/WxdXMIV9MRBS9Un+Z8dfC\/9lj4S\/C\/UhrXhbR1XUMFftlzJJdXAB6hZZ2dkB7hCoPpX1Tpumi3UYFby2UCdBVhY1XpUVqtXET9tiZuUu7bb+9mFXGpx9nTSS7JWQka7RipKKKk4G7hRRRQIKKKKACiiigAooooAKKKKACiiigAooooA\/\/T\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/\/U\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/\/Z","$class":"NSData"},"Author":"448BABEC-2684-5439-9C7C-35F28706EF2E"} \ No newline at end of file diff --git a/Resources/Images/Logo/MethaneLogoNameWatermark.png b/Resources/Images/Logo/MethaneLogoNameWatermark.png new file mode 100644 index 0000000000000000000000000000000000000000..783b9ab1c564a1e354950a938fe35b26b154ca92 GIT binary patch literal 31196 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 literal 0 HcmV?d00001 diff --git a/Resources/Images/Logo/MethaneLogoNameWatermark.svg b/Resources/Images/Logo/MethaneLogoNameWatermark.svg new file mode 100644 index 000000000..3f9a35cc5 --- /dev/null +++ b/Resources/Images/Logo/MethaneLogoNameWatermark.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/Images/Logo/MethaneLogoNameWatermark.vectornator b/Resources/Images/Logo/MethaneLogoNameWatermark.vectornator new file mode 100644 index 000000000..aed1133cf --- /dev/null +++ b/Resources/Images/Logo/MethaneLogoNameWatermark.vectornator @@ -0,0 +1 @@ +{"WDDrawingKey":{"$class":"WDDrawing","ImageDatasKey":{},"ArtboardsKey":[{"Name":"Methane Logo 1.vectornator","Rect":"{{0, 0}, {1024, 1024}}","Layers":[{"$class":"Layer","LockedKey":false,"IsNewFormat2.4":true,"VisibleKey":true,"NameKey":"Слой 1","ExpandKey":false,"ElementsKey":[{"[VN]:InitialPointKey":"{-1.3392961572532158, -25.535084926043282}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{-1.3392961572532158, -25.535084926043282}","WDFillKey":{"WDSaturationKey":0,"WDHueKey":1,"WDAlphaKey":1,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"VNLockedElementKey":false,"WDWidthKey":848.0550537109375,"WDAlignmentKey":1,"WDTextKey":{"NS.bytes":{"$data":"TUVUSEFORQ==","$class":"NSData"},"$class":"NSMutableString"},"VNHiddenElementKey":false,"HeightKey":0,"$class":"WDText","WDTransformKey":"[1, 0, 0, 1, 97.869024460422565, 755.15424612864422]","[VN]:AngleKey":0,"WDFontNameKey":"Helvetica-Bold","VNIsFreehandCurve":false,"WDAttributedTextKey":{"NSString":"METHANE","NSAttributes":{"NSParagraphStyle":{"NSAlignment":2,"$class":"NSMutableParagraphStyle"},"NSFont":{"UIFontMaximumPointSizeAfterScaling":0,"UIFontPointSizeForScaling":0,"UIFontDescriptor":{"UIFontDescriptorAttributes":{"NSFontSizeAttribute":129,"NSFontNameAttribute":"Helvetica-Bold"},"$class":"UIFontDescriptor"},"$class":"UIFont","NSName":"Helvetica-Bold","NSSize":129,"UIFontTraits":2,"UIFontPointSize":129,"UISystemFont":false,"UIFontName":"Helvetica-Bold"}},"$class":"NSAttributedString"},"[VN]:ElementNameKey":"","WDFontSizeKey":129,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{16.844026625369679, -27.263916069583729}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{16.844026625369679, -27.263916069583729}","WDFillKey":{"WDSaturationKey":0,"WDHueKey":1,"WDAlphaKey":1,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"VNLockedElementKey":false,"WDWidthKey":824.33013916015625,"WDAlignmentKey":1,"WDTextKey":{"NS.bytes":{"$data":"cG93ZXJlZCBncmFwaGljcw==","$class":"NSData"},"$class":"NSMutableString"},"VNHiddenElementKey":false,"HeightKey":0,"$class":"WDText","WDTransformKey":"[1, 0, 0, 1, 111.15516859314312, 895.62469477026002]","[VN]:AngleKey":0,"WDFontNameKey":"Helvetica-Bold","VNIsFreehandCurve":false,"WDAttributedTextKey":{"NSString":"powered graphics","NSAttributes":{"NSKern":3.046875,"com.linearity.vn.kerning":3.046875,"NSFont":{"UIFontMaximumPointSizeAfterScaling":0,"UIFontPointSizeForScaling":0,"UIFontDescriptor":{"UIFontDescriptorAttributes":{"NSFontSizeAttribute":68,"NSFontNameAttribute":"Helvetica-Bold"},"$class":"UIFontDescriptor"},"$class":"UIFont","NSName":"Helvetica-Bold","NSSize":68,"UIFontTraits":2,"UIFontPointSize":68,"UISystemFont":false,"UIFontName":"Helvetica-Bold"},"NSParagraphStyle":{"NSAlignment":2,"$class":"NSMutableParagraphStyle"}},"$class":"NSAttributedString"},"[VN]:ElementNameKey":"","WDFontSizeKey":68,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","WDFillKey":{"WDSaturationKey":0,"WDHueKey":1,"WDAlphaKey":1,"WDBrightnessKey":0,"$class":"Vectornator.Color"},"VNLockedElementKey":false,"WDFillRuleKey":0,"VNHiddenElementKey":false,"$class":"WDCompoundPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"[VN]:ElementNameKey":"","[VN]:ElementTypeDescriptionKey":"(curve)","WDSubpathsKey":[{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":499.82128412178508,"AnchorPoint_Y":13.4375,"inPoint_Y":13.190152478793834,"OutPoint_X":421.67961410906264,"AnchorPoint_X":494.9375,"OutPoint_Y":17.147716314898418},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":357.81591791017854,"AnchorPoint_Y":149.3125,"inPoint_Y":75.218407012201624,"OutPoint_X":359.92739744423272,"AnchorPoint_X":359.78125,"OutPoint_Y":154.82221556235498},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":360.80027759193962,"AnchorPoint_Y":165.15625,"inPoint_Y":160.06968928118863,"OutPoint_X":250.62998121588134,"AnchorPoint_X":362.09375,"OutPoint_Y":229.44071134779233},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":197.76903196605144,"AnchorPoint_Y":479.21875,"inPoint_Y":358.407487447721,"OutPoint_X":223.98968167199735,"AnchorPoint_X":225.625,"OutPoint_Y":481.79427742686454},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":222.40178748362126,"AnchorPoint_Y":487.0625,"inPoint_Y":484.40148345646213,"OutPoint_X":201.5721429775549,"AnchorPoint_X":220.9375,"OutPoint_Y":522.25390729878563},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":198.08209177351273,"AnchorPoint_Y":606.0625,"inPoint_Y":566.25768924341173,"OutPoint_X":218.25570687668642,"AnchorPoint_X":215.25,"OutPoint_Y":613.03149434831721},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":221.80682361109029,"AnchorPoint_Y":625.84375,"inPoint_Y":619.62902813509936,"OutPoint_X":259.27769061322579,"AnchorPoint_X":225.8125,"OutPoint_Y":677.76500602328542},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":324.99816732568797,"AnchorPoint_Y":673.09375,"inPoint_Y":701.77990808147661,"OutPoint_X":459.12116733523453,"AnchorPoint_X":379.34375,"OutPoint_Y":712.08536900058243},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":555.72765861943844,"AnchorPoint_Y":668.59375,"inPoint_Y":713.60494112008382,"OutPoint_X":645.29534895915333,"AnchorPoint_X":640.0625,"OutPoint_Y":665.80088003100343},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":650.38728762702999,"AnchorPoint_Y":659.78125,"inPoint_Y":662.84579699430503,"OutPoint_X":661.18662787909193,"AnchorPoint_X":655.375,"OutPoint_Y":667.84156886916321},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":668.41999282139022,"AnchorPoint_Y":678.5625,"inPoint_Y":674.31874326138427,"OutPoint_X":705.46968671527065,"AnchorPoint_X":677.1875,"OutPoint_Y":692.25211629339901},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":736.66320715492839,"AnchorPoint_Y":687.4375,"inPoint_Y":693.64998390910478,"OutPoint_X":808.67155077229836,"AnchorPoint_X":765.28125,"OutPoint_Y":678.01818819584514},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":847.19665469349638,"AnchorPoint_Y":605.0625,"inPoint_Y":648.71158984251088,"OutPoint_X":898.95060317598836,"AnchorPoint_X":866.65625,"OutPoint_Y":532.624753700562},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":868.58195208878169,"AnchorPoint_Y":416.21875,"inPoint_Y":442.80594968558944,"OutPoint_X":793.49066446321206,"AnchorPoint_X":794.125,"OutPoint_Y":415.99223895192608},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":792.85415547993,"AnchorPoint_Y":415.6875,"inPoint_Y":415.89558687432867,"OutPoint_X":792.44075712229824,"AnchorPoint_X":792.21875,"OutPoint_Y":369.62235377038087},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":781.65201128789317,"AnchorPoint_Y":279.3125,"inPoint_Y":322.83042528782062,"OutPoint_X":731.92586692263785,"AnchorPoint_X":758.5625,"OutPoint_Y":229.10907850056628},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":692.52504612890516,"AnchorPoint_Y":164.125,"inPoint_Y":190.16717606908605,"OutPoint_X":646.57772253995802,"AnchorPoint_X":646.5625,"OutPoint_Y":163.95703500008688},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":646.61126967230246,"AnchorPoint_Y":163.625,"inPoint_Y":163.7933809807414,"OutPoint_X":649.17683926875907,"AnchorPoint_X":646.625,"OutPoint_Y":132.30767728932733},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":639.22216844941431,"AnchorPoint_Y":78.25,"inPoint_Y":102.69309561778391,"OutPoint_X":598.64011564492284,"AnchorPoint_X":623.09375,"OutPoint_Y":41.189645298510186},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":557.41837707353261,"AnchorPoint_Y":13.4375,"inPoint_Y":15.820411753145208,"OutPoint_X":504.73676158137903,"AnchorPoint_X":509.6875,"OutPoint_Y":13.190340670531214},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":445.58275697782165,"AnchorPoint_Y":48.6875,"inPoint_Y":51.294245479705296,"OutPoint_X":503.12782552629437,"AnchorPoint_X":499.53125,"OutPoint_Y":48.513717109746253},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":506.76020198128481,"AnchorPoint_Y":48.6875,"inPoint_Y":48.51371484476968,"OutPoint_X":545.55683240743224,"AnchorPoint_X":510.40625,"OutPoint_Y":50.363093426096242},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":575.92880195353337,"AnchorPoint_Y":94.25,"inPoint_Y":68.19025089165325,"OutPoint_X":605.81499898068603,"AnchorPoint_X":593.9375,"OutPoint_Y":111.43766327264893},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":613.16061915594446,"AnchorPoint_Y":154.28125,"inPoint_Y":132.25983617639304,"OutPoint_X":609.39023520873934,"AnchorPoint_X":611.28125,"OutPoint_Y":176.43986068641971},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":588.01165100780577,"AnchorPoint_Y":203,"inPoint_Y":194.19800795708124,"OutPoint_X":540.85102668767752,"AnchorPoint_X":557.0625,"OutPoint_Y":207.61055960090636},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":522.0213476435124,"AnchorPoint_Y":208.8125,"inPoint_Y":209.76820122070217,"OutPoint_X":443.63457569477441,"AnchorPoint_X":501.96875,"OutPoint_Y":206.03179160414015},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":401.08117678910276,"AnchorPoint_Y":144.21875,"inPoint_Y":182.012981269585,"OutPoint_X":398.58387958663593,"AnchorPoint_X":400.03125,"OutPoint_Y":92.117984490570507},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":517.96783834879363,"AnchorPoint_Y":75.09375,"inPoint_Y":74.941006338017871,"OutPoint_X":509.72139467244779,"AnchorPoint_X":515.90625,"OutPoint_Y":75.551965250319697},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":506.66355377705804,"AnchorPoint_Y":86.1875,"inPoint_Y":80.433170782894024,"OutPoint_X":524.38990318229753,"AnchorPoint_X":509.90625,"OutPoint_Y":111.89013239848509},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":546.70991961010805,"AnchorPoint_Y":157.1875,"inPoint_Y":137.78006940859268,"OutPoint_X":577.60472771061393,"AnchorPoint_X":568.09375,"OutPoint_Y":165.81952629383483},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":582.44579571479198,"AnchorPoint_Y":149.375,"inPoint_Y":157.71491838514561,"OutPoint_X":579.3342793053298,"AnchorPoint_X":581.78125,"OutPoint_Y":118.66740834591019},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":556.30196225549662,"AnchorPoint_Y":76.25,"inPoint_Y":88.425456092023524,"OutPoint_X":520.35354002377017,"AnchorPoint_X":523,"OutPoint_Y":75.282435865176794},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":627.57150876797266,"AnchorPoint_Y":225.59375,"inPoint_Y":226.39106244238155,"OutPoint_X":638.13264310320642,"AnchorPoint_X":636.8125,"OutPoint_Y":225.47984790462547},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":639.5357932608066,"AnchorPoint_Y":225.6875,"inPoint_Y":225.5146700489671,"OutPoint_X":644.90514576152395,"AnchorPoint_X":641,"OutPoint_Y":226.14838792267108},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":649.28058102041973,"AnchorPoint_Y":230.46875,"inPoint_Y":227.67852266261298,"OutPoint_X":711.26807320389116,"AnchorPoint_X":653.84375,"OutPoint_Y":265.57955274316078},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":742.54701763283265,"AnchorPoint_Y":389.96875,"inPoint_Y":331.0599245952917,"OutPoint_X":733.26818507963969,"AnchorPoint_X":735.25,"OutPoint_Y":405.96783749259771},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":721.06483375257005,"AnchorPoint_Y":399.8125,"inPoint_Y":419.57937680980194,"OutPoint_X":674.25990961800994,"AnchorPoint_X":706.65625,"OutPoint_Y":355.37002939653985},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":642.65440928216503,"AnchorPoint_Y":244.5,"inPoint_Y":298.32808591409776,"OutPoint_X":622.2142698561679,"AnchorPoint_X":625.5625,"OutPoint_Y":233.95522785550042},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":384.43134480106619,"AnchorPoint_Y":336.96875,"inPoint_Y":336.18316648049404,"OutPoint_X":447.37397871629082,"AnchorPoint_X":411.96875,"OutPoint_Y":337.97879555851358},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":484.27774985186261,"AnchorPoint_Y":383.8125,"inPoint_Y":353.50506501473683,"OutPoint_X":558.76685221015714,"AnchorPoint_X":511.09375,"OutPoint_Y":437.69253700614081},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":551.93234885872198,"AnchorPoint_Y":555.9375,"inPoint_Y":518.7437733056031,"OutPoint_X":456.41446779754915,"AnchorPoint_X":510.21875,"OutPoint_Y":603.91193278554374},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":373.32934712389397,"AnchorPoint_Y":544.34375,"inPoint_Y":598.22364967703516,"OutPoint_X":296.92974004964503,"AnchorPoint_X":325.65625,"OutPoint_Y":511.87712000409874},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":287.47618585226246,"AnchorPoint_Y":429.90625,"inPoint_Y":469.13724889052901,"OutPoint_X":302.19242304112532,"AnchorPoint_X":296.34375,"OutPoint_Y":404.03146030878656},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":315.4380918902832,"AnchorPoint_Y":360.8125,"inPoint_Y":379.01860609271444,"OutPoint_X":357.80025542490944,"AnchorPoint_X":337.5625,"OutPoint_Y":344.15888418792838},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":435.1757292048602,"AnchorPoint_Y":374.71875,"inPoint_Y":374.94227600763816,"OutPoint_X":423.22275325761001,"AnchorPoint_X":432.1875,"OutPoint_Y":374.04801080612128},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":417.66800616468259,"AnchorPoint_Y":388.625,"inPoint_Y":380.08389638241817,"OutPoint_X":435.37040244929449,"AnchorPoint_X":420.90625,"OutPoint_Y":426.77532055428583},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":460.96763025096698,"AnchorPoint_Y":497.8125,"inPoint_Y":466.81567290434759,"OutPoint_X":498.35269835121278,"AnchorPoint_X":486.84375,"OutPoint_Y":511.5993656452556},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":507.29263811064675,"AnchorPoint_Y":490,"inPoint_Y":501.5328779478732,"OutPoint_X":512.3606161669577,"AnchorPoint_X":508.375,"OutPoint_Y":447.53579585360876},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":486.79288870192977,"AnchorPoint_Y":377.78125,"inPoint_Y":401.39701405015876,"OutPoint_X":438.54154735151326,"AnchorPoint_X":442.09375,"OutPoint_Y":375.90454223126051},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":760.87167543814849,"AnchorPoint_Y":446.1875,"inPoint_Y":446.12285804555887,"OutPoint_X":768.01006396672574,"AnchorPoint_X":762.65625,"OutPoint_Y":446.38138425928008},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":773.38695001606743,"AnchorPoint_Y":449.25,"inPoint_Y":447.37401940794842,"OutPoint_X":834.47141177711865,"AnchorPoint_X":778.71875,"OutPoint_Y":468.86626874256933},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":857.21242340945719,"AnchorPoint_Y":588.59375,"inPoint_Y":535.14865461652198,"OutPoint_X":818.46009401765002,"AnchorPoint_X":833.03125,"OutPoint_Y":620.79845778757453},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":789.61539301744278,"AnchorPoint_Y":649.34375,"inPoint_Y":642.39406310668528,"OutPoint_X":735.69608751647934,"AnchorPoint_X":757.125,"OutPoint_Y":653.927361942836},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":712.30260276330318,"AnchorPoint_Y":642.8125,"inPoint_Y":652.91303028962602,"OutPoint_X":658.65362197742729,"AnchorPoint_X":691.125,"OutPoint_Y":627.32571492135173},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":652.94312722935661,"AnchorPoint_Y":520.03125,"inPoint_Y":573.47664038674202,"OutPoint_X":696.77249458375059,"AnchorPoint_X":677.125,"OutPoint_Y":476.60700859355211},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":726.5119924902765,"AnchorPoint_Y":446.25,"inPoint_Y":448.21010341128022,"OutPoint_X":759.08946439952547,"AnchorPoint_X":757.3125,"OutPoint_Y":446.13691854139921},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":762.86851698699638,"AnchorPoint_Y":474.28125,"inPoint_Y":474.43837802083675,"OutPoint_X":754.14466901989294,"AnchorPoint_X":760.6875,"OutPoint_Y":473.80996082808707},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":750.22023257027763,"AnchorPoint_Y":483.75,"inPoint_Y":477.93162455702696,"OutPoint_X":764.04885389304718,"AnchorPoint_X":752.75,"OutPoint_Y":509.73864314919638},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":783.50140322842162,"AnchorPoint_Y":558.15625,"inPoint_Y":537.01731300933352,"OutPoint_X":811.62714666103511,"AnchorPoint_X":802.96875,"OutPoint_Y":567.55845670110602},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":817.94266762661937,"AnchorPoint_Y":552.875,"inPoint_Y":560.72235130808804,"OutPoint_X":820.55266322849184,"AnchorPoint_X":818.5,"OutPoint_Y":523.98087478992966},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":800.99760026819058,"AnchorPoint_Y":476.375,"inPoint_Y":492.52146451115004,"OutPoint_X":765.34395671015602,"AnchorPoint_X":767.96875,"OutPoint_Y":475.09187233597652},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"},{"[VN]:InitialPointKey":"{0, 0}","[VN]:ElementAdditionalValueKey":0,"[VN]:EndPointKey":"{0, 0}","VNLockedElementKey":false,"WDFillRuleKey":0,"WDNodesKey":[{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":248.75659755419733,"AnchorPoint_Y":521.15625,"inPoint_Y":521.0634198161116,"OutPoint_X":251.1510366473035,"AnchorPoint_X":248.90625,"OutPoint_Y":522.5487027583257},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":260.56068849868643,"AnchorPoint_Y":591.6875,"inPoint_Y":557.53341827330746,"OutPoint_X":316.38632035040814,"AnchorPoint_X":287.125,"OutPoint_Y":629.3091975933819},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":347.20152808146759,"AnchorPoint_Y":645.34375,"inPoint_Y":644.6307678010171,"OutPoint_X":313.75442167695132,"AnchorPoint_X":341.5625,"OutPoint_Y":648.85971397705771},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":285.97508823735279,"AnchorPoint_Y":611.78125,"inPoint_Y":643.86253706856428,"OutPoint_X":239.27208137267576,"AnchorPoint_X":260.6875,"OutPoint_Y":584.61243612064482},"$class":"WDBezierNode"},{"NodeTypeOverride":0,"NodePoints":{"inPoint_X":238.25133229361472,"AnchorPoint_Y":521.34375,"inPoint_Y":546.4247647448683,"OutPoint_X":248.65135268635112,"AnchorPoint_X":248.5625,"OutPoint_Y":521.12762184293683},"$class":"WDBezierNode"}],"VNHiddenElementKey":false,"$class":"WDPath","[VN]:AngleKey":0,"VNIsFreehandCurve":false,"WDClosedKey":true,"[VN]:ElementNameKey":"","WDReversedPathKey":false,"[VN]:ElementTypeDescriptionKey":"(curve)"}]}]}],"ActiveLayer":{"$alias":"WDDrawingKey.ArtboardsKey.0.Layers.0"},"$class":"Vectornator.Artboard"}],"SettingsKey":{"WDIsolateActiveLayer":false,"WDSnapToPoints":false,"WDOutlineMode":false,"WDRulersVisible":true,"WDCMYKEnabledKey":false,"WDSnapToEdges":false,"WDDisplayWhiteBackground":false,"WDShowGrid":true,"WDGridSpacing":36,"WDUnits":"Pixels","WDDynamicGuides":false,"WDSnapToGrid":false},"VNModificationDateKey":{"NS.time":600021692.76304901,"$class":"NSDate"},"ActiveArtboardKey":{"$alias":"WDDrawingKey.ArtboardsKey.0"},"VNVersionKey":"3.1.11","GuidesLayersKey":{"ExpandKey":false,"LockedKey":false,"IsNewFormat2.4":true,"VisibleKey":true,"ElementsKey":[],"$class":"Vectornator.GuideLayer"}},"WDThumbnailKey":{"$data":"\/9j\/4AAQSkZJRgABAQAAkACQAAD\/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAACQAAAAAQAAAJAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAligAwAEAAAAAQAAAlgAAAAA\/+0AOFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAAOEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv\/AABEIAlgCWAMBIgACEQEDEQH\/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv\/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8\/T19vf4+fr\/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv\/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8\/T19vf4+fr\/2wBDAAICAgICAgQCAgQGBAQEBggGBgYGCAoICAgICAoMCgoKCgoKDAwMDAwMDAwODg4ODg4QEBAQEBISEhISEhISEhL\/2wBDAQMDAwUEBQgEBAgTDQsNExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExP\/3QAEACb\/2gAMAwEAAhEDEQA\/AP38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK+a\/jl+15+zz+zrC6fFHxJb2t8F3Lp8BNxetnp+4j3Oobsz7V\/2q\/Iv4u\/8Ftb15JbD4FeD0RBkJe63IWJHr9lt2AHt+\/P0oA\/oIor+Obx\/wD8FIP2y\/iE7i88aXOlwN92HSkjsgg9BJCqzH\/gUhNfKfiP4m\/Ejxi7S+LvEGpaqznLG8u5pyT7mR2oA\/uxuNb0W0fy7q8giYcYeRVP6mrltd2l4nmWkqSqO6MGH6V\/AXVm0vbywmFxYyvDIOjRsVP5jmgD+\/Oiv4ePCH7T\/wC0b4CkR\/CPjnXLJY+kS305i\/GJnMZ\/FTX2x8M\/+Cvf7WPgp44PGEuneLLYEBhfWywzbfRZbXyhn3dH980Af1X0V+SnwT\/4LB\/s7fEOWLSvida3fgq+kwPMn\/0qyLHt58Sh157vEqju1fqd4a8UeGvGeiweJPCOoW2qafdLuhubSVJoZB6q6EqfwNAG7RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf\/9D9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoor4F\/ba\/bz8Bfsk6D\/Y1oses+Mr2ItZ6YG+WJTwJ7oqcpHn7qj55CMLgZdQD6X+Nvx8+FH7PHhB\/GvxY1aLTLXlYYz809xIBny4Il+aRvXAwo5YgZNfzn\/tQ\/8ABWf4zfFuW48MfBgSeC\/D7ZTzomB1KdfV5l4gz12w4YdPMYV+dPxh+NPxK+PPjW48f\/FLVJdT1CfhSxxHDHnIihjHyxxr2VR1yTkkk+WUAWLu7u7+6kvr6V5ppmLySSMWZmY5LMx5JJ6k1XoooAKK9L+HXwZ+LPxcvDY\/DHw3qOuup2ubK3klRD\/tuoKIPdiBX3V4K\/4JIftk+LI0m1bTtN8PK\/I\/tG9QnHutqLgj6EA+ooA\/Mqiv2v07\/giP8Z5YwdW8ZaLA\/cQx3Mo\/Nkj\/AJU3Uv8AgiP8aooydH8Y6JO\/YTJcxD81jk\/lQB+KVFfpd42\/4JLftleEYnn0zStP8QogJJ029jzgei3It3P0AJ9q+E\/iB8Jvif8ACjUBpfxL8P6hoM7HCrfW8kIfHdGdQHHupIoA89r234J\/tF\/Gb9njXx4g+Euu3GlszAzW4O+2nA7TQPmN+OASNw\/hIPNeJUUAf1J\/sif8FV\/hn8bJrXwL8ZUh8J+JpcRxzFiNOu3PACSOSYXY9EkJB4AkLELX601\/AHX6\/fsIf8FOfEvwWuLL4VfHa4m1bwgSsNvetmS600dF9Wlt17py6D7mQAhAP6fqKytC13RfE+jWviLw5dRX1hfRLPb3EDh45Y3GVdGXIIIOQRWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB\/\/0f38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK8l+Ofxl8I\/AD4Wav8V\/G0m2y0qEuI1IDzyt8sUMef45HIUdhnJ4BNAHzD+3n+2voP7JPw\/W20jy73xjrMbDS7NuViUfKbqcA58pDwo6yP8o4DFf5HvF\/i\/xP4+8T33jPxnfS6lqmpStPc3M7bnkdupJ7DsAMAAAAAACu0+N3xk8afH34m6p8VPHs\/m3+py7gik+XBEOI4YgeiRrhQOp6nJJJ8ooAKKK\/Wz9gX\/gmvrP7QP2X4tfGRJdN8Fht9vbDMdxqe0\/wngx2+eDIPmfomPvgA+MP2b\/2Q\/jd+1LrZ0\/4ZaZ\/oEDhLrVLomKyt884aTBLPg52Rhnwc4xzX9CH7PP\/AASZ\/Z3+E0MGsfEuM+ONaTDMb1dlijeiWoJDjt++aQHrtWv0s8I+D\/C3gHw5aeEPBWnwaXpdigjgtrZBHGij0Vcck8k9Sck5Jro6AM7SdI0nQdOi0fQrWGytIF2xQQIscaKOyooCgewFaNFFABRRX5e\/tf8A\/BT3wP8Ass\/EVvhTpnhyfxPrVrFFLegXIs4YPOUSRp5himZnKFXICBQGHzE5AAP1CrH17w9oHirSptB8T2NvqVjcDbLb3USTROPRkcFSPqK\/Mn4G\/wDBW\/8AZq+KVzFovjv7R4J1GUhV+3kS2ZJ6AXUYAX3MqRqPWv1B07UtO1iwh1XSLiO6tbhBJFNC4eN0bkMrKSCCOhBxQB+Tv7Rn\/BIn4GfE2GfXfg1IfBWstlhFGDLp0rejQk7os9MxMFUc+Wa\/ns+Pv7NHxj\/Zp8T\/APCMfFjSXs\/NJ+zXcf7y0uVX+KGYDDdiVOHXI3KM1\/cFXCfEn4ZeA\/i\/4Pu\/AXxJ0uDV9JvVxJBOuRns6MMMjr1V1IZTyCKAP4PqK\/R79u3\/AIJ++LP2U9Xbxj4UaXV\/A95Lthu2GZbN2Pyw3W0Ac9ElACv0IVsA\/nDQB+qf\/BOf9vvUf2dPEcPwr+J908\/gXUpcK7ksdMmkP+uTv5LE5lQdPvqM7g\/9UVtc217bR3lnIs0Myh0dCGVlYZDKRwQRyCOtfwFV\/Q9\/wSP\/AGy59dtF\/ZX+I90XurSNpPD9xK2S8KDdJZknkmJQXi\/2Ay8BFBAP3eooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD\/\/0v38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\/mS\/4K\/wD7TE3xB+K9v8APDVwTo\/hIiS+CH5ZtSkXkHsfs8bbB6O0gPQV\/Qz8cfihpvwW+EHiP4q6oFaPQrCa6VGOBJKq4iiz6ySFUHua\/hv8AEOvat4q1++8T6\/M1zfajcSXVzM\/3pJZmLux92YkmgDHoorsfh54E8Q\/E\/wAdaR8O\/CcXnalrV3FZ269t8rBQWPZVzlj2AJ7UAfoT\/wAE2f2JP+GmvHb+PfiBA3\/CFeHpl89TkC+uhhltQf7gBDTEc7SqjBfK\/wBXVnZ2mn2kVhYRJBBAixxxxqFREUYVVUYAAAwAOAK8u+Bnwe8LfAT4U6L8J\/B6AWmkW6xmTGGnmPzSzP8A7UrlmPpnA4Ar1mgAooooAKKKKACv54P+CyH7MN7Y+ILP9qTwvE0lpfLFp+tBRnypo1CW05\/2XQCJjwAyoOr1\/Q\/XJePPA\/hj4l+DdT8A+M7Vb3StXt3trmFv4kcYOD1DDqrDlWAI5AoA\/gwr69\/Zf\/bZ+N\/7K2rx\/wDCGX5vtCZ91zo14zPaSAn5igzmGQ\/348ZONwYcVyH7VP7OPir9l34xaj8MvEQaW2Q+fp14Rhbqzcny5R23DBVwPuurDkYJ+caAP7W\/2W\/2tvhT+1h4MPiTwDOYNQtQo1DS5yPtNo7eoH342Odki\/K3Q4YFR9Q1\/Cj8H\/jB4++BPxAsfiV8Nr5rHU7Bsg9Y5Yz9+KVOA8bjhlP1GCAR\/Yl+yb+0\/wCDf2rfhPbfELw1i2vYiLfU7Atl7S6ABZfVo2+9G\/8AEvXDBlAB774p8LeHfG\/hy98I+LbOLUNM1GFoLm2mXdHJG4wVYf16g8jmv5AP27P2QNY\/ZK+K7aVZeZc+F9Y33Gj3b8nYCN9vIenmw5AJ\/iUq3GSB\/Y9XzF+17+zlon7UHwO1X4bX6omoBTdaVcN\/ywvolPlNnsr5Mcn+wxxzigD+KCuh8JeKvEHgbxRp\/jPwpcvZ6lpdxHdWs6fejliYMrD1wRyDwRweKo61o2qeHNYu\/D+uQPa3thNJb3EMgw8csTFHRh2KsCD7isygD+3v9l3486L+0n8END+LOkhY5b2Ly72BTnyLyL5Z4uecBxlM8lCp719A1\/NV\/wAEaPj5J4U+Kmq\/AHWZ8WPieJryxVjwt9aplwo\/6awBix\/6ZKK\/pVoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD\/0\/38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/IH\/gs18SZPDH7OOlfD20k2S+KNVQSrn71tZL5zj8JjCa\/mBr9uv+C3fieS7+LPgnwYWylhpE96F9Ddz+WT+P2YflX4i0AFfsf\/AMEZPg\/B4u+OmtfFrUog8HhKxEduSOl3f7o1Yf7sKTA+m4Gvxwr+oH\/gjB4Uh0j9mTV\/FDL+\/wBY16f5vWK3hhRB+DmQ\/jQB+vdFFFABRRRQAUUUUAFFFFAHxd+3F+yNoX7Wvwlk8Px+Xa+JNK33GjXjjhJSPmhkI58qYAK390hXwduD\/Hn4p8LeIfBHiS+8IeLLSSw1PTZnt7m3lGHjljOGUj2PccHqOK\/vdr8k\/wDgpX+wSnx90CT4zfCi0A8aaXD\/AKRbxjB1O3jHCY73EYH7s9XX92c\/JtAP5b6+zv2FP2otR\/Za+Otj4mupW\/4R3VSllrUIyQbZ24mC93gY717kblGA5r42ngmtpntrlGjkjYqysCGVgcEEHkEHqKioA\/v1trm3vbaO8s5FlhlUOjoQysrDIII4II5Bqevzi\/4JZ\/Gq4+L\/AOyjpmmavMZdS8JTNo0xY\/M0UKq9s30ELrHnuUNfo7QB\/K\/\/AMFePgfD8M\/2kIviLo8Hlad42tvtbYGFF7ARHcgf7wMUh9Wdq\/KOv6kv+CyPgCHxL+y5aeNI0zceG9XglL9xBdBrd1+jSNEf+A1\/LbQB6F8JviFqvwm+J2gfEzRSftOhX8F6qg43iJwzIfZ1BU+oJr+6fRNY0\/xDo1pr+kSCa0voY7iFx0aOVQ6MPqCDX8C1f2T\/APBO3xzJ8QP2NPAuq3D75rOybTXz1H2CV7ZAf+2can6GgD7VooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/1P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/lv\/wCCzk0kv7WGmo54j8N2ar9PtN238ya\/JOv2i\/4LZ+FZ7H46+E\/Ge0iHUtDNoD2L2lzK7fiFuE\/SvxdoAK\/rC\/4JFTwTfsZ6dHCQWi1S\/V\/ZvMDc\/wDASK\/k9r+iH\/giX8WbO58KeLvgfeSgXNpcprVqhPLxTIkE+32jaOLPvJQB+7dFFFABRRRQAUUUUAFFFFABRRRQB+Iv\/BSb\/gnOfiGL39oP4DWX\/E+VTNq+lQr\/AMfwHLXECj\/l4A5dB\/reo\/eZEn837o8bmOQFWU4IPBBFf39V+Nf7fH\/BMS1+NF9cfF79n+K3sPFExL3+nMwht79jyZUY4WK4P8W7CSdWKtlmAPmb\/giD4wntvHvjrwAzZjvdPtdQVT2a1laJiPqLgZ+gr+i2vxd\/4JXfsVfF39n3xF4j+KHxm08aNeX1qumWVmZYpZDEZFlmlfymdVBaNAg3ZPzEgDBP7RUAfDn\/AAUmsYdR\/Yj8ewTjIW2tpR9YryBx+q1\/HNX9dH\/BVPxjZ+FP2K\/EtlO4WfW57LT7cH+J2uEmcf8AfqKQ\/hX8i9ABX9S\/\/BGnWZNT\/ZLvbGQ5GneIby3UeitBbTfzkNfy0V\/Tz\/wRUgkT9mDxBcNwsnie4A\/4DZ2f+NAH7B0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/\/V\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKx\/EHiDQvCmiXXiTxPeQ6fp9lG01xc3DiOKKNRks7sQAB6mgDYr86f2uv+CkPwc\/ZkW48KaMy+J\/FyAr\/AGdbSARWzet3MMhCP+eagyHjIUENX5nftr\/8FX\/EPjmS8+GX7Ms0ulaKd0VxreDHd3Q6EWwOGgjP9\/iVuMeXyD+JskkksjSysWZiSSTkknqSaAPoP9or9qL4w\/tReKo\/E\/xW1ETpa7xZWUC+Xa2iyY3LDHkn5tq7mYs7YG5jgY+eaKKACvcf2cfjp4m\/Zw+MWjfFrwuPMk06XFxbk7VubaT5ZoWPP30J2kg7WCtjIFeHUUAf3bfCb4q+CfjZ8P8ATfiZ8PbtbzS9UiEkbDAZG6PHIuTtkjbKup6EfjXo1fxn\/seftq\/En9kXxY1zoedT8OX7qdR0iVyscmOPNibnypgOAwBDDAYEAY\/qr\/Z7\/aj+DP7TfhhfEXwt1VJ5kQNdWE2I7y1J7Sw5JAzwHUsjfwsaAPoWiiigAooooAKKKKACiiigAooooAKKrXt7Z6bZy6hqEqQW8CGSSWRgqIijLMzHAAA5JPAr8C\/2+P8AgqXp93p198Gf2Yb0y+eGg1DxBESFCHKvFZHqSehn6Af6vOQ4APnD\/grN+1Vp3xl+Kdr8HvBFyLjQvB7yC4mjOUuNRb5ZCp7rAo8tT\/eMmMjBr8j6Cc8migAr6L\/Z7\/aq+Nv7Mevf2x8K9XeC3lcPc6fPmWyuccfvYSQM4GN6FXA4DCvnSigD+uD9kT\/gpL8Hf2mPs3hHXivhfxfIAv8AZ9y4MNy\/f7JMcByf+ebYk9A4Bav0cr+AZHeJxLESrKcgjggjoQa\/an9ij\/gq74k+H72nw0\/aWmm1jQwVit9Z5kvLQdAJ+rXEQ\/vcyqM\/f4UAH9KFFYvhzxHoHi\/QrXxP4WvYdR06+jE1vc27iSKVG6MrKSCK2qACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/9b9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiivMvjB8X\/APwJ+H9\/wDEz4k3q2WmWC5J6ySyH7kUSdXkc8Ko+pIAJABP8V\/ix4B+CXgW9+I3xK1CPTdKsFy8j8s7H7scaDl5HPCqvJ+ma\/k\/\/bU\/bz+In7WmvNpEHmaN4NtJN1npatzIV+7NdFeJJT1C\/cj6Lk5duE\/a\/wD2wfiD+1v4\/bXvEDNY6FZMy6XpSPmO3jPG9+geZx99yPYYUAV8iUAFFFFABRRRQAUUUUAFdD4V8W+KfAuv2\/inwZqNxpWpWjb4bq0kaKVD\/suhBGehHccGueooA\/aD4C\/8Flviz4Ohh0P46aRF4rtUwv262K2l6B6soXyZSOw2xk92NfrZ8Kf+ClH7H\/xXSOG38Ux6BeSAZttbX7EVz2Mzk25Psspr+POigD++jRtc0TxHYJqvh68gv7WT7k1vIssbfRkJB\/OtSv4JPDvi7xX4Pu\/7Q8Jand6XP\/z0tJpIH46fNGymvpXw1+3j+2H4TVV0r4h6xIE6fbJhefn9pEufxoA\/tGor+RrTP+CrP7btgALnxRb3uP8Antp1kP8A0XCldCf+Cuf7ZpXb\/aWmA+v2CLP+FAH9YlFfyI6t\/wAFUf239TQxw+LIrNT18jT7IH83gcj8DXg\/i79sn9qvxyjQ+I\/iBrkkT\/eihu5LeNgexSAxqR7EUAf2R+Pvi58LfhXZHUPiT4i07Qotu4G+uY4Sw\/2FdgzH0Cgk1+Zfxs\/4LFfs9+BYptO+Etnd+MtQXIWRVazsgenMsq+a2D\/diIbsw61\/MHd3l3qFy97fyvPNIdzySMWZj6knJJqtQB9hftIftz\/tCftPSPYeONV+xaIW3JpGnhobQYOR5gyXmI6gys2DyoWvj2iigAooooAKKKKACiiigD7u\/Yv\/AG7viN+yV4gXTSZNY8H3km690p2+4T1mtSeI5QOo+7IOG52sv9Ynwk+Lvw\/+OPgSy+I3wz1BNR0u9X5XXh43H3opUPKSJnDKeR16EGv4Ta+s\/wBkX9rz4h\/sk+P18R+GWN7o14yrqmlOxEVzGP4l67JkBOyQDjoQVJBAP7SaK8t+DXxk8AfHr4e2HxM+G16LzTb5e+BJDIPvwzJk7JEPDL9CCVIJ9SoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD\/1\/38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5nxn4x8MfD3wrf+N\/Gd7Hp+laXC1xc3EpwqRoMk+pJ6ADJYkAAkgV\/IJ+29+2X4s\/a3+IzXgMll4V0t3TSdPJxhTwZ5gCQZpB16hB8i55ZvpP8A4Kf\/ALbz\/HPxjJ8E\/hrd58IaBORczRN8uoXkZIL5H3oYjkR9mbL8jYR+SNABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFX9K0rUtd1S20TRreS6vLyVIIIYlLySSSMFREUZJZmIAA5JqhX2\/8A8E3m0BP22vAR8SBGt\/tdwE34x9oNpMLc89xNs2++KAPsf4c\/8EVfjD4i8Oxat8Q\/FNh4cvJkD\/Yo4HvXjyPuyurxIGHfYXHoTXhHx4\/4JVftOfBnTZvEehQQeMNLgBaR9J3tcxqOrPauoc\/9sjJgcnAr+s2igD+AV0eNzHICrKcEHggim1\/Wr+2T\/wAE2\/hZ+0vbXXjHwekXhrxoQXF7EmLe8f8Au3cajknp5yjzB1O8ALX8vPxe+DfxI+BPja5+H\/xR0uXS9St+Qr8pLGSQssUg+WSNscMpI6g4IIAB5hRRRQB9pfsT\/tjeLf2R\/iQuqxeZfeGdTZI9X04H76DgTRAkATR5JU8BhlCQCCP7APA\/jbwt8SPCOn+O\/BN5HqGlarCtxbXEZ+V0b9QQchlOCrAggEEV\/BbX6xf8Exv23pPgJ41T4O\/Em8I8G6\/OBFLK3y6deOQBLk\/dhlOFl7KcPxh9wB\/U1RSAgjIpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD\/9D9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\/I7\/gqr+2LJ8Ffh6vwS8AXfl+J\/FEDfaZYzh7PT2yjsCOVknIKIeoUOwwQpr9JPjJ8V\/CvwP8AhhrPxV8ZybNP0a3ad1BAaR\/uxxJnjfK5VF7ZYZ4r+Jz4x\/FfxX8cPibrPxU8ay+ZqGs3DTOASVjTpHEmeiRoFRR6AZ5oA8zooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAro\/B3inV\/A3i3S\/Gvh+Tyr\/SLuG9t3\/uywOJEP\/fSiucooA\/vI+HHjnRvid4A0X4i+Hm3WWuWUF7DzkhZ0DhT\/tLnBHYgiu0r8ff+COPxvXxv8BtQ+D2qTbr7wddEwKx5NleFpExnk7JhKD2AKD0r9gqACvm\/9pv9lv4X\/tU+An8GfEK32XEIZ7DUYgPtNnKR96Nj1U4G+M\/K4HOCFYfSFFAH8Qn7Sf7NnxH\/AGXfiPP8PfiFBkHMllexg+ReQZwJYifyZD8yNwexPz9X9t\/7UP7M\/gH9qf4X3Pw88aRiKdcy6ffqoM1nc4wsieqnpImQHXjg4Yfxv\/GT4QeN\/gT8R9T+F\/xCtvs2paZJsYjJjljPKSxMQN0ci4ZT6HBAIIAB5hRRRQB\/T9\/wSl\/bFk+MPgI\/Aj4gXXmeJPDEANlLIfnvNPXCrkn70lvkI3coUPJDmv1+r+En4SfFHxX8FfiRo\/xR8EzeTqWjXCzx5ztcDh43x1SRCUcd1Jr+2P4J\/F3wt8d\/hZovxY8GvusdYtxKEJBaKQHbLC+P44pAyN2yMjjFAHqdFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/\/R\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK8k+PHxb0T4E\/B\/xB8WvEGDBolo8yxk482Y\/JDED6ySsqD60Afg7\/AMFjv2mX8S+NbH9mnwvcZsNC2X2rFDxJeSJmGI46iGJtxHTdJzylfiBXReLvFWu+OvFWo+NPFE7XWpatcy3dzK3V5ZmLufbJJ47VztABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB9x\/8E7vjyPgF+1FoWs6lN5Oj6239j6iScKIbplCSN2AimEbk\/3Qw71\/YzX8Adf2R\/8ABPz9oNf2if2aNF8RalP52t6Qv9lark5c3FsoCyt3JmiKSE9NzMB0oA+2aKKKACvzV\/4KT\/sbwftK\/CtvGPg61DeM\/DMTy2ewfPeW4y0loe5J5aHPR\/lGA7Gv0qooA\/gFZWRijghgcEHqDTa\/Vr\/gq7+y3H8FfjOvxV8J23leHvGjyTsqDCW+oL808fHAEufNT3LgDC1+UtABX7Y\/8Edf2mn8I+P739m\/xRcY03xEWu9L3niO\/jT95GM8ATxLn\/fjAAy5r8Tq3PDHiTWvBviTT\/F3hudrXUNLuIru2mXrHNC4dGH0YA0Af3wUV41+z38YtH+P3wY8PfFzRQqJrNosksSnPk3CEpPF\/wBs5VZc9wM969loAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/\/S\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\/A7\/gtV8dDBZeG\/wBnbR5sNOf7a1IKf4FLRWqHHYt5rlT\/AHUPpX74EhQWY4Ar+Jb9r34xyfHn9o\/xZ8S0k8y0u714bE54FnbYht8DtujQMcfxEnvQB820UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABX6if8ABKT9o0fBn9oVPAGvz+XofjcR2D7jhY71Sfskn\/AmZoT\/ANdATwtfl3UsE89rOl1au0csbBkdSQysDkEEcgg9DQB\/fvRXx9+wz+0fb\/tOfs9aT42vJVbW7Ef2fq6DAIu4VGZMdhMpWUdhuK\/wmvsGgAooooA+X\/2x\/gHaftJfs9a\/8NfLVtRaH7Xpbtj5L63BaHBPQPzEx\/uO1fxU3FvPaTva3SNHLExR0YYZWU4IIPIIPUV\/ftX8gn\/BTT4MR\/Bz9rXXRp0Xlad4lC63agDAH2osJwOwxcLJgDopFAH5\/UUUUAfv1\/wRV+OrCXxJ+ztrM3BH9s6YrHoRtiukGfX904Uejn1r+gKv4hP2VvjBN8B\/2hPCnxSVylvp18gvMd7SbMNyMdz5Ttj3wa\/t4jkjmjWWJgyMAVYHIIPQg0APooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD\/9P9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD5O\/bl+Kj\/Bz9lPxp4ztZfKvGsGsbRgcMJ70i2Rl90Mm\/6KTX8Wlf0ff8FtfiKdM+GHg74W28mH1fUZtRmUHny7KPy1DezNcZHqU9q\/nBoAKKKKACiiigAooooAKKK+mP2dP2Rvjl+1DrJsPhfpRaxhcJc6ndExWUHs8uDubHOyMO+OduOaAPmeuh8NeEvFXjPUl0fwfpl3q123SCzhknkP0SMM36V\/TZ8Av+CQXwC+HUMGr\/ABemm8aaquGaOQtb2CN1wsKNvkweMyOVb+4OlfqR4S8E+DfAOkpoHgbSbPRrGP7tvZQRwRjH+xGqj9KAP5APCX\/BOn9tLxnGs+meAr62Ruc38kFiQPdLmSN\/w259q9lsv+CRP7Zd1GHnsNLtj\/dkv4yf\/HAw\/Wv6waKAP5M9T\/4JJfto2EZe10jT70j+GHUIAT\/39MY\/WvCvGP7BP7YngWN5dd+H+qyJHyzWKJfgD1\/0RpuPev7QaKAP4FdX0bWNAv5NK120msrqI4eG4jaORT7qwBH4is2v7xPHXwy+HXxO0w6N8RdCsNctSCBHfW8c4XPdd6nafQjBHavy++OX\/BHf4A+PI5tU+EN5c+DdRbLLEC13YseuDHI3mpk91l2r2Q9KAP5fKK+u\/wBoz9h79oX9mOWS88e6QbrRg21NXsCZ7NsnA3tgNET2EqoSema+RKACiiigAooooAKKKKACiiigAooooAKKKKAP0e\/4JlftQL+zz8fYdC8SXPk+GfF3l2F8WOEhm3H7NcHsAjsUYngI7Mfuiv63q\/gDr+tb\/gmT+1UP2h\/gbH4X8T3PmeKfCKx2V5vOXuLfGLe555JZVKSHk71LHG4UAfpNRRRQAV+Hn\/BbT4aJqXw38IfFu2j\/AHulX8umTsByYryPzULeyvAQPd\/ev3Dr4V\/4KU+D08Z\/sWeNbbZulsIINQjP902s8cjkfWMOPoaAP47aKKKACv7N\/wBgT4qN8X\/2SfBviW5k8y8tLMaZdEnLebYk2+5v9p0RZD\/vV\/GRX9Ff\/BEb4ite+B\/GvwpuZP8AkHXtvqkCk8lbqMwy49lMCZ929zQB+6NFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf\/1P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5av8Agsj43PiL9qm08KRNmLw9o1tAy+k1w8lwx\/FHjH4V+TFfYX7f\/ihvF\/7ZXxB1V23eTqjWX4WKJa4\/Dyq+PaACiiigAooooAKKK\/Wf\/gmf+win7QXiIfGL4p2pPgzR59sNvIMDUrpOSmO8EZx5h6MfkGfnwAav7Av\/AATP1X47R2nxd+OEc2neDyRJaWYJjuNSA6Nnho7c\/wB8YZx9zAIev6YPCvhTwz4G8PWvhPwdYQaZpligjt7a2RY4o1HZVUAe57k8nmtuCCC1gS2tkWOONQqIoAVVAwAAOAAOgqWgAooooAKKKKACiuG+JnxG8K\/CPwBq3xK8bTm30rRrd7m4dRubavRUXjLuxCqM8sQK\/CnV\/wDguHqy+IHbQfh7C+lK+FFxfstw6A9SVhKISO2HA9T1oA\/oPor8\/f2Zf+CkX7PX7SNxD4bS5bwz4jlIVdN1NlXzmPa3nB8uU+inbIeyY5r9AqAK93aWl\/ayWN\/Ek8EylJI5FDI6sMFWU5BBHBB61+LH7Yn\/AAST8I+OIbrx\/wDsypFoes\/NJLozHZY3J6kQE8W7nsv+qPA\/djJr9r6KAP4I\/FfhPxN4G8RXfhHxjYT6ZqdhIYri2uEMckbjsynn3B6EYI4Nc\/X9in7an7DXw\/8A2tvCrXW2PSvF9jERp+qheuORBcheXhJ6dWjJ3L\/ErfyTfEz4aeNfg\/441D4dfEOxfTtW0yQxzQv+aujDhkcYZGHDKQRQBwlFFFABRRRQAUUUUAFFFFABRRRQAV9I\/sn\/ALROv\/swfGzSvijpG+W0jb7PqVqpx9pspSPNj9NwwHTPAdVJ4yK+bqKAP72\/CXivw\/468L6f4z8KXSXumapbx3VrPH92SKVQysPTg8g8g8Hmuhr+eX\/gkL+18NJvz+yt4\/usW1273Hh+WRuEmOXmtMnoJOZIxx8+8cl1Ff0NUAFeI\/tMaSmu\/s5ePtGkGRc+HdUjH1a0kAP1B5r26vLvjhLHb\/BXxhPL91NE1Bjn0FtITQB\/CpRRRQAV+qf\/AAR68bN4a\/a4Hht2xH4i0i8swvYvDsulP1CwuPoTX5WV9X\/sLeKG8Iftf\/DzVw2zzNat7Mn2vSbU\/hiXmgD+02iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/V\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAoopCQBk0Afwp\/G3Wn8SfGfxd4ikbc1\/rV\/ck+pluZHz+teYVc1G7a\/1Ce+c5aaRpCT6sSap0AFFFFABRRRQB75+zL8BPEX7Svxo0b4TeHy0S3snmXlwBkW1pH800x7ZVeFB4Zyq96\/tR8A+BfC\/wx8F6Z8P\/AAVarZaVpFultbQr\/CiDqT3ZjlmY8sxJPJr8p\/8Agj1+zzF4B+DF38ctcg26r4wcpalh80en27FVxnkedKGc9mVYzX7D0AFFFFABRRRQAUUUUAfOH7Xnwov\/AI3\/ALNXjH4Y6Tk3uo2DNaqP47i3ZbiFPo8kaqfY1\/Eo6PG5jkBVlOCDwQRX9\/VfyF\/8FMf2fm+BP7T2qXOlweVonirdq9iVGEVpmP2mIdhsm3EKOiMlAH58AkHIr9fv2Lv+CqPjr4Qz2nw8+Pss\/iLwsNsUV62ZL+xXoPmJzPEvdWy6j7jEAIfyAooA\/vX8HeMvC3xB8MWXjPwTfw6npWoxia3uYG3JIh9D2IPBBwVIIIBBFdLX8fP7Dn7cvjL9kvxiun6g0up+DNRlH9oacDkxk4BubYE4WVR95chZFG1sEKy\/1v8Agvxn4X+InhTT\/HHgu9j1DStUhW4triI5V0Yce4I6MpAKkEEAgigDp6\/PL\/goL+xRpP7VXw6bW\/DMMcHjbQ4mbTp+F+0xjLNZysf4XOTGSfkc5yFZ8\/obRQB\/AfqOnX+kahPpOqwvbXVrI0M0UilXjkQlWRlPIZSCCDyDVOv3H\/4LA\/snw+FfENv+074ItgllrEq2utxxjiO7I\/dXOB0EwG1zwPMAJy0hr8OKACiiigAooooAKKKKACiiigAooooAv6VqmpaHqdtrWjTva3lnKk8E0TFXjkjYMjqw5DKwBBHQ1\/Yf+wd+1rpn7V3wch1fUJI4\/FGjBLXWbZcD97j5LhF7RzgFh2Vgy\/w5P8cNfRP7Lv7R\/jH9lv4uWPxO8J5niT9xf2RYql3aOR5kTHnB4DI2DtcA4IyCAf2518y\/tn+J7fwf+yd8Q9auHEedBvbZGPaS6ia3j\/HfIuPeuk+Bn7Sfwd\/aI8IQ+L\/hlrMF0rRh7i1d1S6tWx8yTwk7kKnjPKt1ViMGvxo\/4K1ftn+EPFfh+L9mj4WajFqSm4S51y6tnDwr5J3RWqupKuwkxJJj7pRVzncAAfghRRRQAV33wq1lvDnxQ8N+IUO02Gq2dwD6GKdH\/pXA0+KR4ZFmjOGQgg+4oA\/v5oqC1nW6to7lOkihh+IzU9ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf\/1v38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKguV3W0i+qkfpU9FAH8AdFa\/iCwOla\/faYw2m2uJYiPTY5X+lZFABRRRQAV2Xw68E6r8SvH2ifD3Qx\/pmuX1vYQ8ZAe4kWME+w3ZPsK42v0p\/4JOfD+Pxx+2PpOp3EfmQ+G7K71RgRxuVBbxk\/7sk6sPcCgD+q\/wb4U0bwJ4R0vwT4cj8nT9HtIbK2T+7FAgjQf98qK6SiigAooooAKKKKACiiigAr87P8Agpp+zc37QH7OV3qWg2\/neIfCRfU7DaMvJGq\/6VAO58yMbgByzxoK\/ROigD+AOiv0H\/4KRfsuv+zf8frq60C28rwx4oMmoaYVGEiYt\/pFsOw8p2yo7RunfNfnxQAV+uX\/AAS1\/bSn+C3j2L4G\/EK7P\/CKeI5wlrJI3y2F9IcKwJ+7FMcLJ2Vtr8DeT+RtHTkUAf3+UV+d\/wDwTS\/adl\/aM\/Z+gsfElwZ\/EvhQpp2os5y80e0\/Zrhu5MiKVYnkyI57iv0QoA84+L3wx8O\/Gf4Y658LPFabrDXLSS2kOMmNmGUlUH+KNwrr\/tKK\/h48feCde+G3jfV\/h\/4oj8rUdFu5rK4Xt5kLlCR6qcZU9wQa\/vOr+Xj\/AILHfCCPwR+0XYfE3TovLtfGNgJJCBgG8stsMuO3MRgJ9SSaAPyKooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+nD9n3\/gsF8CvGEFn4Z+L9hc+D71USL7Vk3dixACgtIirLHuPrGVXu+Oa\/W\/w14o8N+M9Et\/EvhHULfVNOul3w3NpKs0Mi+quhKn8DX8EFfQHwD\/AGn\/AI1fs1eIRr3wp1mS0jdg1xYy5ks7kDtNATtJxwHG11H3WFAH9vlFfnd+xt\/wUU+Fv7U8MXhPVgvh3xkqZfTpXzFclR8z2khxv45MZxIoz95QWr9EaACiiigAooooAKKKKACiiigAooooAKKKKACiiigD\/9f9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+Gr9o7Qn8MftB+OfDrrt+xeINShA\/wBlLqQKR7EYIrxivuf\/AIKT+E38IftqeN7XbiO9uIL+M9mF1bxSsf8AvtmH1FfDFABRRRQAV+6v\/BDzw9Hc+NfiD4rI+eysbC0B9rmSaQj\/AMgCvwqr+hX\/AIIbqg0H4kOPvG40sH6BbrH8zQB+89FFFABRRRQAUUUUAFFFFABRRRQB8lftrfs0ad+1L8CNS8AqqJrNr\/pujzvgeXeRA7VLdklBMb9gG3Yyor+MnWNI1Tw\/q11oOt272t7ZTPBcQygq8csbFXRgeQysCCPWv766\/nj\/AOCvf7IT6Vqi\/tUeAbX\/AEW8ZIPEEUY4jm4SG7wO0nEch\/v7DyXY0Afg\/RRRQB+iv\/BLz44S\/B39qvSNJvZ\/L0rxcP7GulJ+XzJjm1fHTcJwqZ7K7etf1z1\/Alpep32i6nbazpchhubSVJoZF6rJGwZWHuCAa\/u1+GPjO3+I\/wAN\/D\/xBtABFrum2uoKF6AXMSy4\/DdigDuK\/Iv\/AILL+AY\/Ef7MmneNokzP4c1iFy+OkF0jQuPxkMR\/Cv10r4w\/4KHeH08S\/sXeP9PkXd5Wnrdj62s8dwD\/AOQ6AP40qKKKACiiigAooooAKKKKACiiigAooooAKK9i+B\/wF+KP7RPjeHwF8KtMe\/vHw00h+WC2izgyzydEQe\/JPChmIB\/pZ\/Za\/wCCWfwM+B1tbeIviRDF4z8TKAzS3cebGB\/SC2bKttPR5dzZGVCdKAP5w\/hX+yt+0V8bI1uvhj4P1HVLZ+FuhF5NqfpcTFIf\/H6+t9P\/AOCR37Z17bCe50vTbRj\/AMs5b+IsPxj3r+tf1hRRRQRLDCoREAVVUYAA4AAHQCpKAP47vHf\/AATW\/bP8AWr3954Mm1K3QZL6ZNDeMcekMTmY\/wDfuviTVdJ1XQtRm0jW7aWzu7dtksE6NHIjDqGRgGB9iK\/vsrw341fs2fBH9oXSDpPxZ8PWupsFKxXRXy7qH\/rlcJiReecBtp7gjigD+HWiv1w\/a\/8A+CU\/xF+CltdePvgtLN4r8NQhpJrcqDqNpGOSWRABOijq8ahgOSgUFq\/I+gC1Y319pd7DqWmTPb3Nu6yRSxMUdHQ5VlZcFWBGQRyDX9Lf\/BOj\/go8vxjNr8DfjrdJH4qVfL07UXwqaiFHEcnQC5A6HgSj0f738zVWLS7urC6ivrGV4Z4XWSOSNiro6nKsrDBBB5BHINAH9+lFfml\/wTf\/AG1k\/ae+HjeDfHM6jxr4diUXecA3ttwqXaj+9nCzAcByG4DgD9LaACiiigAooooAKKKKACiiigAooooAKKKKAP\/Q\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/mc\/wCC1fgRtG+PPhrx\/Em2LXNHNux\/vTWUzbj\/AN+5ox+FfjNX6Rf8FOP2of8AhoX49y+G\/D0wk8N+DmmsLErys05YC6uMjqHdAiHOCiKwxuNfm7QAUUUUAFfvT\/wQ51yOLW\/iN4bcjdcQaZcoO+IWuUY\/+RFr8Fq\/U\/8A4I++O4\/Cn7XCeG7h8J4l0m7sVBPBki2Xan67YGA+tAH9VtFFFABRRRQAUUUUAFFFFABRRRQAVh+JvDWg+MvDt94T8UWsd7pupQSW1zbyjKSRSKVdSPQg1uUUAfxefto\/sseIP2UPjJdeC7kST6HfbrrRrxh\/rrYn7jEcebETskHHOGwFZa+Rq\/ta\/a6\/Zg8KftW\/CG7+H2ubLbUYc3GlXxGWtboDCk45Mb\/dkXupyPmCkfxsfEP4f+LfhX421L4eeOrN7DVtJnaC4hfsw6FT0ZWBDIw4ZSCODQBxlf2Qf8E4tel8R\/sT+AdQlJJjs57Xn0tbqa3H6Riv436\/r8\/4Jc201t+wz4JE\/Bf+0XAP91tRucfmOfxoA\/QCvmv9shUf9k74kCTp\/wAI3qR\/EWzkfrX0pXx9+37rkfh79jX4hX8p2iTSmtsn1unSAD8TJigD+MSiiigAooooAKKKKACiiigAooooAK+if2Y\/2afiB+1N8Tbf4d+Bo\/KjGJb++kUmGztwcNI+OpPREBBduOBkjyTwF4F8U\/E3xnpvgDwVaNfarq06W1tCnVnc9SegVRlmY8KoJPANf2V\/sjfsu+EP2UfhLa+AtBCXGpT7Z9Vv8Ya6uiMMeeRGn3Yl7LyfmZiQDrf2ef2dfhn+zN8PoPh98NbMRRgB7q6cA3F3MBgyzOByT2HCqOFAFe7UUUAFfH3xH\/b4\/ZI+E3jWf4e+OvGMFtq1q\/l3EMVvc3Kwv3SSS3ikRWB4ZS2VP3gK+wa\/jG\/b0+Dms\/BT9qjxZ4f1Pe9vql5Jq9lM3\/LW2vnaVTk9Sjl4mPdkNAH9gvgL4jeAvil4ej8V\/DnWLTW9OlOFuLOVZUDd1baTtYd1bBHcV2lfwsfCH43fFT4D+KY\/GPwo1q40e9Ujf5TZimUfwTRNlJU\/2XUjuMHmv6XP2Jf+CmPgX9o+S2+HXxLSHw74zYBI1DYs79v+ndnJKSH\/AJ4sST\/AzchQD9S6\/Dj\/AIKN\/wDBNuw8V2N\/8fP2fLAQ6xCGuNW0i3XC3ij5nnt0HScdXjHEvVR5mRJ+49FAH8AZGODRX7Hf8FYP2OLb4TeMk\/aA+HdqIvD\/AIjnKahBEuEtNQfLbwB92O4ALeiyBhwGUV+ONAHr3wI+M\/iz9n74r6P8WPBrkXelTBniJISeFvllgf8A2ZEJU+nBHIBH9snwx+Ivhn4t\/D7R\/iX4Nm8\/TNatY7qBj94BxyjAZw6NlXHZgR2r+D2v6EP+CLn7QUt5p+u\/s26\/OWNoDq+khj0jZgl1EuewcpIqju0hoA\/eyiiigAooooAKKKKACiiigAooooAKKKKAP\/\/R\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAr4j\/AOChPx9k\/Z6\/Zh1zxFpM3k6zq4Gk6YynDLPdKwaRT1BiiWSRT\/eVR3r7cr+aj\/gtL8WpPEPxj8PfB6ykJtvDlgby4UHj7VfHgMO5WGNCD23n15APxaooooAKKKKACvUvgj8Sbv4O\/F\/w18UbIMzaFqNvdui8GSONwZY\/+BpuU+xry2igD++3StU0\/XNLtta0mVZ7W8iSeGVeVeORQysPYggir9flt\/wSc\/aEi+Lf7OUXw61effrXgdlsXDHLPZPk2j\/RVDQ+3ljPWv1JoAKKKKACiiigAooooAKKKKACiiigAr8yP+CiX7B1t+1H4YTx38PI4rfxzpEW2IsQiX9uMn7PI5wA6kkxOeASVbCtuX9N6KAP4jvC37JX7R3i34jRfCyw8HapBq7zCKRbm2lhigGcGSWVlCJGOu8nBHTORn+yD4J\/DDTPgt8JPDvwq0h\/Nh0KxhtTJjHmyIv7yTHYyOWcjtmvUaKACvym\/wCCw\/jyPwx+yaPCaPiXxLq1ra7O5ig3XTN9A8UY+pFfqzX8y\/8AwWd+L8Xiv44aJ8ItOl3weFLEzXIB6Xd\/tcqR\/swpER6bz+IB+NdFFFABRRRQAUUUUAFFFFABRRX0Z+yf8BtR\/aS+POg\/Cq13paXc3nahMnWGyh+ed89ASo2JnjeyjvQB+2f\/AASC\/ZOj8KeEpP2nfG1rjU9aR7fRUkHMNlnEk4B6NOw2qevljIJWQ1+3tZmi6NpXhzR7Tw\/oUCWtlYQx29vDGMJHFEoREUdgqgAe1adABRRRQAV+Un\/BWL9mM\/GP4ID4reGLfzNf8FK9wwQZebT2wbhOOpiwJlz0CuAMtX6t1HLFFPE0Myh0cFWVhkEHggg9QaAP4B6lhmmtpkuLd2jkjYMrKcFSOQQRyCD0Nfef\/BQ39lC5\/Zf+N9wuhW5Xwp4iaS80hwPljBOZbXPrAzAL1zGUJOc4+B6AP6af+CZ\/\/BQSf4zW0PwF+NF5v8VWkR\/s6\/lODqMMYyY5D3uY1Gc9ZEBY\/MrFv2Tr+BrQNf1rwrrln4m8OXMllqGnzJcW08R2vFLGwZHU9ipAIr+zj9jD9pLT\/wBqT4D6X8RRsj1WHNlq0CcCO9hA3kDskgKyIOysBnINAHr\/AMZ\/hV4b+N\/ws1z4U+LE3WWtWrwM2MmJ\/vRSqD\/FFIFdfdRX8PvjvwXrvw58a6t4B8UReTqOjXc1lcJ2EkLlGwe6kjIPcYNf3oV\/Ld\/wWK+EsXgj9pS0+ImnxbLbxhp6TSEDAN3aYglx\/wBs\/JY+pYmgD8lK+hv2Ufi9L8Cv2iPCfxO8wx21hfxpec4zaT\/ubge\/7p2Iz3ANfPNFAH9\/asGAZTkHkEUtfNX7HPxBk+KP7LngXxrcP5k9xpEEM75zunth9nmb8ZI2NfStABRRRQAUUUUAFFFFABRRRQAUUUUAf\/\/S\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAr+KP9tTx3J8SP2r\/AB94qZzIjaxcWsTHvDZn7NER7FIlxX9ql5dQ2NpLe3BxHCjOx9lGT+lfwN6vqdzrWq3WsXp3TXcrzSH1aRix\/U0AZ9T21tcXlzHZ2iGSWVgiIoyWZjgADuSagr6d\/Yt8HQ+PP2r\/AAB4buUEkL61bTyoeQ0dq32h1PsVjIPtQB9Hf8FCf2Mrb9lu38C6z4fjP2PVdIitNRcEsv8Aa1qi\/aHz0UTBgyr6q9fmpX9nH7eHwDP7RX7M+v8AgvT4fO1eyQanpYAy32u1BZUX3lQvF\/wPNfxkEFSVYYIoASiiigD6t\/Yy\/aU1L9lr47aZ8RV3yaTN\/oerW6dZbOUjeQO7xkLIg4yygZwTX9nOg67o\/ijRLPxJ4euUvLDUIUuLaeI7kkilUMjqe4ZSCK\/gZr9x\/wDglV+3Rb+C7u3\/AGZPi1eeXpV5KRoV7M2Ftp5Dk2jk9I5WOYz\/AAyEqeGG0A\/o1ooooAKKKKACiiigAooooAKKKKACiiigAooooA4D4q\/Enw18HvhzrPxO8XyeVp2iWsl1NyAzbR8sa56vIxCIO7ECv4ffif8AELX\/AIsfETWviX4pfff65eS3k2OimViQi\/7KDCqOygCv1w\/4K1ftjW3xE8Sr+zb8O7sS6PoU\/maxPEcrcXyZCwAjqlvzu7GXt+7BP4qUAFFFFABRRRQAUUUUAFFFFABX9J\/\/AARj+A6eGfhfrHx+1iHF54lmNjYMw5WytWxIyn0lnBDD\/pipr+cLRtI1DX9XtdC0iIzXd7MlvDGvV5JGCoo9ySBX90Xwe+HGmfCD4V+Hvhho+PI0KwgswyjG9o0AeQ+8j5c+5NAHpFFFFABRRRQAUUUUAfNf7WH7N3hj9qb4N6h8MteKwXZ\/0jTbwjJtbyMHy5PUqclJAOqMcYOCP4xfH3gTxT8MfGep\/D\/xtaNY6rpE721zC\/8AC6HqD0ZWGGVhwykEcEV\/edX5J\/8ABTz9h1vjz4SPxn+GFnv8YaHDi4giHzajZpk7AB96eIZMfdlynJ2AAH8t9frr\/wAEdvjXceBv2hbr4S382NO8ZWjLGhPAvbNWmib0G6LzVPqSvoK\/ItlZGKsMEcEGva\/2bPFlx4F\/aD8EeLrZipsNcsJHx3j89BIv0ZCVPsaAP7kK\/GP\/AILX+DYtT+A3hfxyibptI1v7NnusV5BIWP03wRj8q\/ZyvzP\/AOCttnFdfsXavPIMm21DT5F+pnCfyY0AfyZ0UUUAf1af8Ef\/ABK+u\/sdwaW7ZGi6xfWaj0DlLrH5zk1+pFfjL\/wRNunf9n3xVZH7sfiFnH1e0twf\/QRX7NUAFFFFABRRRQAUUUUAFFFFABRRRQB\/\/9P9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKAOY8bCQ+DNXEX3zZXG36+W2K\/gqr+\/a4t4rq3ktZxuSRSjD1BGCK\/gf1\/SLnw\/rt7oN6MTWM8lvIP8AaiYof1FAGTX3\/wD8EuoIp\/25\/BAl5C\/2kwHuNNuiPy618AV9qf8ABOvxBF4Z\/bU8AajM20SX0lpn3u7eW3A\/EyAUAf2UV\/Ix\/wAFNv2b3+AX7R17q+i2\/leH\/FxfVLEqMIkrN\/pUA7Dy5G3ADgJIgr+uevjH9u\/9mO3\/AGo\/gHqHhPT41\/4SDTM3+jyHAP2mNTmEt2WdMxnJwGKsfuigD+NGirF5Z3en3cthfxNDPA7RyRuCrI6nDKwPIIIwQehqvQAUA45FFFAH9Cf\/AATv\/wCCmlpe21j8CP2kdQEVzGFt9K1y4bCyKOEgvHPRxwEmPDDhyG+Zv3oBBGRyDX8Alfqz+xl\/wVC+IX7P8Nr8Pfiuk3ifwjFtjiO4G+sUHAELuQJY1HSJyMDAR1A2kA\/qjoryT4O\/Hb4T\/H3wwvi74Ta3b6vaceYsZ2zQMf4JoWxJG3syjPUZHNet0AFFFFABRRRQAUUUUAFFFcB8Svin8O\/g94Xm8Z\/E7WLbRdNg6zXLhdzYzsjXlpHPZEBY9gaAO\/r8Uf8Agop\/wUl034e2N\/8AAv4AX63HiKUNb6lqsDZTTweHihccNc9mYcRdj5n3PkX9sz\/gq94u+K0F38Of2ehP4f8AD8oMU+pN8l\/dr0Ij2n\/R429iZGGMlASp\/Gwkk5NACszOxdySxOST1JptFFABRRRQAUUUUAFFFFABRRRQB9xf8E4fh4nxH\/bJ8Gafcx77bTLl9VlyMhfsMbTRE\/8AbZYx+Nf2NV\/M5\/wRQ8MJf\/H7xP4slGf7N0IwL7Pc3ERz9dsTD8a\/pjoAKKKKACiiigAooooAKKKKAP56f+Cof\/BP+TS7i\/8A2m\/gpZFrWUtPr+nQL\/qmPLXsSj+BjzOo+6f3n3S+38a\/gf4V1bxx8ZfCvhHQommutQ1a0hjVRn70y5Y+gUZZj0ABJ4Ff3UOiyKUcAqRgg9CK8I8Ffsvfs9fDjxzP8SvAvhDTdK1ycODdW8IVk8zh\/KX7kW4EhvLVcgkHg0Ae81+Xf\/BX3WI9M\/Y5ubJzg6jq9jbr7lS82PyiNfqJX4Sf8FvfH0Vv4S8DfC6F8vd3lzqsyD+EW8YgiJ\/3vOkx\/umgD+d6iiigD+m3\/gijp7w\/s4eJdTYYE\/iSWMe\/l2lsf\/Z6\/Y+vzY\/4JN+FH8NfsX6JqEqlG1q9vr4g9cecbdT+Kwgj2r9J6ACiiigAooooAKKKKACiiigAooooA\/\/U\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAr+LP9ujwFJ8Nv2uPHvhsoY45NVlvoh28q+xdIB7BZQPwxX9plfzh\/wDBa34RSaR8R\/DHxssIj9n1m0bTLtgOBcWhLxlj6yRSED2ioA\/D+uv+H\/i+9+H3jzRPHumjNxol\/bX8QzjL20qyqM\/Va5CigD++Xw\/rmmeJ9BsvEuiSiey1G3jubeQdHimUOjD6qQa16\/LX\/gk1+0BB8WP2cIvhzqk4fWfBDCxdWPzNZPlrR\/oqhofbyxnqK\/UqgD+br\/grd+x3J4M8UN+074Atf+JTrUqprcUa8W96\/C3GB0S4PDntLySTIAPxIr+9vxb4T8O+O\/DF\/wCDfF1pHf6ZqcD21zbyjKyRyDDA9xx0I5B5BBr+O\/8AbZ\/ZD8T\/ALJPxTk0CUSXfhzUy82j37D\/AFkQPMUhAwJosgOOMjDgANgAHxpRRRQAUUUUAdh4F+IPjj4Y+IofFvw91a60bUoPuXFpK0T47qSpG5T3U5BHBBr9gPgZ\/wAFn\/id4Yih0b48aHD4lt0AU39iVtLzHdnjx5Eh9lEX1r8T6KAP7Bfhf\/wUw\/Y6+J8ccaeKU0C7fGbfWkNmVz6zNut\/ylNfa3hzxd4U8YWY1Hwlqlpqluf+WtnPHOnP+1GzD9a\/gkq1ZX17ptyt5p0z28yfdeNijD6EYIoA\/vyor+F3Tvj78dtHjEWk+NdetVHQQ6ldIB+CyCp739of4\/6lGYtR8c+ILhT2k1O6cfkZDQB\/cNrGu6J4esm1LX7yCxt0+9LcSLEg+rOQBXx98Tf+Ch\/7H\/wsjkXVvGdpqdynS30jN+7Efw7oN0Sn\/fda\/jr1TWdX1u5+2a1dTXkx\/jndpG\/NiTWbQB+7nxw\/4LVeItSjm0j9nzw0umo2Quo6wRLNg90toz5aMOxaSQeq1+NnxQ+MHxP+NPiJvFfxU1y71y+OQr3LkrGpOSsUYwka5\/hRVX2rzaigAooooAKKKKACiiigAooooAKKKKACiiigD97f+CG1vG2rfEu7I+dIdJQH2Zrwn\/0EV\/QfX86H\/BD7XIrf4gePvDRbD3en2VyF9RbyyIT+HnD86\/ovoAKKKKACiiigAooooAKKKKACiiigAr+QP\/gpn8Z4fjL+1prr6ZL52m+G1XRLVgcqfspYzsOxzcPLgjqoFf0c\/tzftJWf7Mf7Puq+MraZV1y\/U2Gjx8FjdzKcSY7rCoMjdjtC9WFfxlTTS3ErXFwxeRyWZmOSSeSSTySaAI6fHHJLIsUSlmYgAAZJJ6ACmV9p\/wDBPn4MyfG79q7wtoE8Xm6fpU41e\/4yogsiJArf7MkvlxH\/AH6AP6yf2ffh3\/wqb4HeEvhs67ZdG0q1tpsd51jXzm\/4FJuP417BRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/1f38ooooAKKKKACiiigAooooAKKKKACiiigAooooAK+Rv25PgGf2jv2bNf8AAOnxCTVoEGoaXxz9stgWRB6GVS0OewcmvrmigD+AaSOSGRoZlKOhIZSMEEdQR60yv1Z\/4Kr\/ALKc3wW+MjfFzwrbbfDXjKV5jsHyW2on5p4jjgCXmVPXLgDCV+U1AH1B+yD+0rrv7K\/xs074lacr3Gntm11S0Q4+0WchG9RnjehAkjzj51AJwTX9mngrxp4Y+IvhLT\/HPgu8j1DStUgW4triI5V0cce4I6MpwVIIIBBFfwV1+nf\/AAT0\/b71H9l\/Xx8PfiG8t34F1ObdIFBeTT5n4M8S9TG3\/LWMcn76jcCrgH9YNeL\/AB9+A\/gD9o\/4Z33ww+Ilv5tpdDfDMmPOtp1B8ueFiDtdM\/RgSrAqSD6f4d8RaD4u0K08T+F7yHUNOvolmt7mBw8csbjKsrDIINbNAH8RX7TP7NPxF\/Zb+JNx8PvHsO+Nt0lhfIpEF5b5wJIyehHR0JyjcHIwT88V\/cL+0R+zp8Nf2mvh3cfDz4k2vmRtmS1uo8C4tJ8YWWFyDgjuD8rDhgRX8jf7U\/7JnxQ\/ZQ8ct4X8cQ\/aNOuWY6dqkKkW93GPQnOyRRjfGTlT0ypViAfL1FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfo9\/wSo+JcPw7\/bF0axvZBFbeJbW50eRmPG6UCaEfVpoY0Hu1f1vV\/A34e17VvCuv2PijQZjb32m3EV1byr1SWFw6MPcMAa\/tv8A2a\/jn4f\/AGjfgvofxY0BkU6hABdwKc\/Z7uP5Z4T3+V87c\/eUq3QigD3WiiigAooooAKKKKACiiigArH8Q+INE8J6FeeJ\/Et1HY6fp8L3FzcTMFjiijG5nYnoABmk8Q+ItB8JaHdeJvE95Dp+n2MbTXFzcOI4oo1GSzsxAAHvX8uf\/BQz\/gobqH7SN\/J8K\/hXJLZ+B7OXMkhykmpyIcrJIpwVgUjMcZ5Jw7jdtVADwH9u39rXUv2svjFLr1iZIfDOjh7XRrZ8giLPzzuvaScgMw\/hUKnO3J+JqKKACv6df+CPf7O8nw8+Dd78b\/EMOzUvGTBbQMMMmn27EIRnkedJuc9iixkV+HH7Gf7M+s\/tT\/HDTvAFurx6RbkXer3K8eTZxsN4B7SSkiOP\/abdjCnH9nuj6Rpnh\/SLXQdEgS1srGFLe3hjG1I4o1CoijsFUAAelAGjRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/9b9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDyX45fBjwZ+0B8L9V+FXjuHzLHU4tokUDzIJV5jmjJ6PG2COx5BypIP8AGP8AtA\/Afx1+zh8UNQ+Fvj+HZc2bboJ1BEV1bsT5c8RPVHA+qsCpwykV\/clXyJ+2H+yD4F\/a4+HZ8Oa5tsdcsA0mlamq5e3lYco44LwyYAdPowwwBoA\/i+or1T4y\/Bf4i\/APx7d\/Dj4nae9hqNocjvFNGSQs0L9HjfHDD3BAYEDyugD7e\/ZG\/bw+L\/7JmpDTtGcaz4Xnk33OjXLkR5P3nt3wTBIe5AKt\/ErEAj+lP9nb9vL9nL9pG1gtfCutR6ZrcoAbSNSZbe6Dn+GPJ2TexiZjjqF6V\/GdSgkHIoA\/v7rzz4p\/Cn4f\/GrwVd\/D34mabFqmlXo+eKQcqw+7JG4wySLn5XUgj1r+Of4b\/tqftVfCaCOz8EeOdThtohhLe5kF5Ag9FiullRR7BRX0\/pf\/AAV6\/bI0+IR3d5pN8R\/FPYICf+\/TRj9KAMH9tj\/gnT8Q\/wBly8n8Z+FPN1\/wQ7\/JequZ7MMflS7VRgeglUBGOMhGIWvzdr9M\/EX\/AAVp\/a88R6dPpU9xo8MFzG0UqLp0ciujjDKyzmVWBBwQQQRX5pXEzXNw9w4VWkYsQihVBJzwqgAD0AGBQBDRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfeP7Cn7bXiP9kTxzJHqEcmo+EdYdRqdihG9GHC3NvkgCVBwQSBIvykghWX4OooA\/u3+Fvxa+HPxq8IW\/jr4YatBq+mXA4khb5kbGSkqHDxuM8o4DD0r0Wv4Svhl8Xvif8ABnxAPFHws1y80O+GAz2shUSAchZU5SRc\/wALqy+1frH8JP8AgtP8XPDsMWnfGLw3ZeJI1wpurNzY3J9WdQskLH2VIxQB\/SlRX5O+Ef8Agsh+yjr0SjxFba3ocv8AF59qk0YP+y0EsjEfVAfavWov+Cpv7DEkPmP4zeNv7jaZqOf0tiP1oA\/QiivzO13\/AIK3fsX6RGX0\/V9R1QgfdtdPmUn2\/wBIEI\/Wvlzx\/wD8FvPBNtE8Pwt8EX17IchJdUuI7ZV9CY4PPLfTev1oA\/dSvjr9pP8Abo\/Z9\/ZitJrXxjqq6hrqr+70ewKzXZYjjzBnbCp65kK5H3Qx4r+cn40\/8FM\/2s\/jNDLpj64vhrTZgVa10RTa5U9mnLPcHI4IEgU+lfAUsss8rTzsXdyWZmOSSeSST1JoA+0v2tP26\/jH+1lqZs\/EEo0jw1DJvttGtXPkgg\/K878GeQf3mAVf4FXJz8U0UUAFdL4O8H+JviB4psPBXg2zk1DVNTmW3treIZaSRzgD0A7knAAySQATVfwx4Y8ReNPEFn4U8JWU2o6lqEqw29tboXkkduiqo5P9ByeK\/qu\/4J+fsB6P+y3oI8eePViv\/HWoxbZZFw8enxOObeBuhc\/8tZB1+6vyglwD2z9ib9k3QP2S\/hFD4VTy7nxBqW251m9Qf62fHEaE8+VCCVQHGTufALEV9i0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf\/1\/38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD55\/aO\/Zh+E\/7UXgo+D\/ibZb3i3NZ38OFurSRh96KQg8HA3IwKNgZBIBH8tn7V\/7A3xr\/AGV7+bU9TtzrfhcviHWbNCYgCcKtynLQP0HzZQk4V2Oa\/sZqC6tba9tpLO9jWaGVSjxuAysrDBVgeCCOCD1oA\/gKor+qH9ov\/gkn8Avi3LP4h+GDt4H1iXLFbVBJp8jHn5rYlfLz0\/dMijrsJr8YfjF\/wTI\/a4+EcstxD4fPifT48kXWiMboke9vhbgHHX92R7mgD8\/KK09X0XWPD9\/JpWvWk1jdRHDw3EbRSKfdXAI\/EVmUAFFFKqszBVGSeABQAlFfV3wj\/Yg\/ak+NksTeC\/B98lnLj\/Tb5PsdqF\/vCSfYHA9Iwx9q\/Xz4K\/8ABFXwbY6RJd\/H\/wASXF\/fzRFVttGIhgt3YY3edMjPKV6j92i56hhQB\/OrRX69\/tA\/8Effjl8PGn1v4M3UXjPS1ywgG231BF64MbHy5cDuj7mPSMdK\/KPxN4V8T+C9Zm8OeMNOudK1C3OJba8ieCZD\/tJIAw\/EUAYFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRW14e8N+IvF2rw+H\/Clhcanf3B2xW1pE80zn0VEBYn6Cv1X\/Z+\/4JB\/Hn4kNBrfxfni8FaU+GMUgFxqDr14hU7I89P3jhlPVD0oA\/Jezs7vUbuKw0+J555mCRxxqWd2Y4CqoySSeAB1r9fP2V\/+CR3xS+Jz23i34+vL4R0JsOLIAHU519CjArbA+sgLj\/nnzmv3J\/Z4\/Yq\/Z7\/Zltkm+HWirLqoXbJq19ie9fIwcSEARg91iVFPcGvq6gD+MX9s79kXxf8AslfFCXw7fLJd+Hr9ml0fUSvyzQ5z5bkDAmiyFkXjPDAbWFfHtf3Z\/Fr4RfDz44+CLv4efE7TY9T0u7GSj8NG4ztkicfNHIuflZSCOR0JB\/nB\/aa\/4JH\/ABn+GN3c+IvgcW8ZaCCXW3XaupQr\/daLhZ8dAYvmY\/8ALNaAPyKorS1jRtY8PalNouv2k1jeW7bJYLiNopY2HZkcBlPsRWbQAUUUUAFFFFABRRXsXwl\/Z9+NPx01IaZ8J\/Dd9rTbgjywxkW8ZP8Az1nfbFH\/AMDcUAeO179+z9+zL8Yf2mfFQ8L\/AAq0trlYyv2q9lzHaWqn+KabBA4yQoy7YO1TX7Ifs4f8EZLO0lg8SftN6uLojD\/2NpTssZ77Z7ohWPoViC+0hr9wfBHgPwZ8NfDVv4P8AaXbaPpdoMRW1rGscY9TgdWPVmOSTySTQB8jfsdfsIfC79krRv7QsgNZ8V3Uey71eZAGAPWK2Tnyos9eSz\/xEgAL9zUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/9D9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDmvEvgzwf40tPsHjHSbPVoB\/yzvII505\/2ZFYV8\/ax+xD+yJrshlvvh1oSE9fItEtx+UIQV9TUUAfIll+wT+xzYSiaD4eaQxHP7yJpB+Tsw\/SvbvB3wU+Dnw8dZfAXhTR9Fdej2NjBA3\/AH1GinPvmvTaKACiiigArzf4lfB74WfGLSP7D+KPh+x122AIQXcKyNHnqY3I3xn3RgfevSKKAPxr+L\/\/AARh+B3ippdQ+EOtX3hS4bJW3m\/0+0HoAHZJ1+plfHp6\/mb8T\/8Agkt+114AaS48O2Fl4rtEyQ+mXCiTb2zDcCFyfZN\/41\/WNRQB\/CJ44+E3xR+GdybT4ieHNS0OQHGL61lgB+hkUAg9iCQa8+r+\/a4tre8ge1u41likG1kcBlYHsQeCK+ePGX7IP7Lvj5nl8U+AdEnlk+9NHZxwTH6ywhHP\/fVAH8SFFf1s+I\/+CT37FWulmsNAvNJZu9nf3J\/ITvMB+WK8c1X\/AIIq\/sz3TF9J8QeJLQnorT2kij6A2ob82oA\/mJor+kSf\/giJ8JGbNr421dB6NBbt\/ILTYf8AgiJ8JlP+keNtXcf7MEC\/zBoA\/m9or+nLS\/8Agin+zXbsH1bxF4kusdkmtIlP1\/0Vj+Rr2Dw5\/wAEl\/2LdDZW1DRL7Vyv\/P5fzjP1Fu0IoA\/ktruPBfwy+I\/xIu\/sHw+0DUdcmzgpYWstwQffy1bH41\/Zb4O\/Y1\/ZV8BFZPDPgDRI5E+7LPaJcyr7iScSOD9DX0daWdpp9sllYRJBDGMJHGoVVHoAOAKAP5Nvhh\/wSg\/a++ITR3Gt6Xa+FrSTB83VbhQ+3viGASyg+zqn1HWv0y+EH\/BF34M+GWi1D4xa\/e+J51wWtrUfYbU+qsVLzMPdZI\/pX7QUUAeX\/DH4KfCX4L6V\/Y3wr8PWOhQEBXNrCqySY6GWXmSQ+7sTXqFFFABRRRQAUUUUAeT\/ABP+BXwc+NNiLD4qeGtP1xVXaj3MKtNGP+mcwAkj\/wCAMK\/On4h\/8EbP2YfFEkl14IvtX8MytnbHFMt1brn\/AGbhWlOP+u1frdRQB\/O\/4j\/4IeeLIJGPhL4g2l0v8IvLCSAj2Jjmmz9cD6V51L\/wRO\/aHEmIPFPh1l9We7U\/kLY\/zr+mWigD+bfSf+CIvxgmcDXfGmj2y9zBFcTH8mWL+de++Dv+CIPw9s3V\/H\/jvUdRXqyafaRWf4BpWufz2\/hX7l0UAfCHwy\/4Jrfsc\/DCSK7tfCcetXcWP3+sSNe5x6wufs\/5RCvuHTdM03RrGLS9Ht4rS2gXbHDCixxovoqqAAPYCr1FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/\/0f38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/0v38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/0\/38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK\/Jz\/AIKx\/HX4t\/Ar4d+E9W+EmuT6Hc3+ozQ3EkAQmRFh3BTvVuAeeKAP1jor+NH\/AIeGfto\/9FA1D\/vmD\/41X3D\/AME7f25vj947\/am0b4f\/ABf8VXOsaVrkF1apFcCMIlwsRmicFEU7iY9g5\/joA\/pNoorN1jVrHQdIutd1R\/KtrKF55nP8McalmP4AE0AaVFfxya3\/AMFGv2xtS1q81Gw8cX1pBcTySRwIsO2JHYlUXMfRQcD6Vmf8PDP20f8AooGof98wf\/GqAP7LqK8P\/Zm8S674z\/Z18C+LvE9y15qWp6Dp91dTvjdLNLbo7ucADLMSTgCvzX\/4K4\/tD\/Gn4Cn4f\/8ACoPEFxoX9q\/2r9r8gIfN8j7H5e7erfd8x8Yx1NAH7MUV\/Gj\/AMPDP20f+igah\/3zB\/8AGqP+Hhn7aP8A0UDUP++YP\/jVAH9l1Ffxo\/8ADwz9tH\/ooGof98wf\/GqP+Hhn7aP\/AEUDUP8AvmD\/AONUAf2XUV+Of\/BJH9oP4zfHmw8eS\/F7X7jXW0uTTRamcIPKEwuvMxsVfvbFzn0r8+f2zf22f2qfh3+1F408E+CvGl7p+ladqBitraNYtsabFOBujJ6k9TQB\/UlRX8aP\/Dwz9tH\/AKKBqH\/fMH\/xqj\/h4Z+2j\/0UDUP++YP\/AI1QB\/ZdRX8aP\/Dwz9tH\/ooGof8AfMH\/AMao\/wCHhn7aP\/RQNQ\/75g\/+NUAf2XUV\/OL\/AME2v2vP2kvjB+1Npvgj4l+LbzV9KmsryR7aYRBC8cRZD8qKeDz1r60\/4K2ftA\/GT4D6T4Fn+EWv3GhPqc2ordGAIfNES25QHerfd3tjHrQB+w1FfyF\/C79vn9sLW\/iZ4d0bVfHl\/Na3ep2kM0bLDh45JkVlOI84IJFf16UAFFFfld\/wVe+N\/wAVvgZ8JPDWvfCXW59DvLzVzbzSwBCXj+zyNtO9WGNwBoA\/VGiv400\/4KGftoFwD8QNQ6\/3YP8A41X9llABRRRQAUV\/Kj+1P\/wUa\/aJvP2gvFUXwi8X3Wl+G7O+ezsILcRGMx22ITKCyMT5rI0nJ\/ixxXhenf8ABRf9s2w1CC+l8dXtwsMiyGKRYSjhSCVYCMHa3Q+1AH9kVFcX8OPHOjfE7wBovxE8PNustcsoL6HnJCToHCn\/AGlzgjsQRXaUAFFFfynftU\/tx\/tY+B\/2kvHPg\/wp42vrLTNM1q8trW3RYdscUcrKqjMZOABjk0Af1Y0V\/KF+zh\/wU2\/aD8H\/ABl0XVPjN4outc8LyTCDUreZIzthl+UzJsRW3REhwAfmAK96\/q0s7y01Gzi1CwlSeCdFkjkQhldGGVZSOCCDkEdRQBZoor+fD\/gqN+1d+0P8E\/2j7Pwh8K\/FV3oumyaHa3LW8AjKmV5rhWf50Y5IRR17UAf0H0V\/Ox\/wTL\/a2\/aN+M37Tcfgz4n+K7vWNLOl3c5t5hGF8yPZtb5UU5GT3r+iegAor+PLxf8A8FAf2yLDxZqlhZ+PdQjhgu540ULDhVWRgB\/q+wFc9\/w8M\/bR\/wCigah\/3zB\/8aoA\/suor+NH\/h4Z+2j\/ANFA1D\/vmD\/41R\/w8M\/bR\/6KBqH\/AHzB\/wDGqAP7LqK\/jR\/4eGfto\/8ARQNQ\/wC+YP8A41X9i\/h64mu9Asbq4bfJLbxOzHuzICT+dAGvRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB\/\/U\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAr8Qv+C3n\/JKvA\/8A2Frj\/wBEV+3tfiF\/wW8\/5JV4H\/7C1x\/6IoA\/n0+G\/hGb4gfETQPAdu22TW9RtbBW9DczLED+bVtfB3xxdfCf4weGviEAyPoGq2t464IJWCZWdCOvzKCpHvXS\/swHH7S3w7I\/6GbSP\/SyKul\/bJ+H3\/Crv2pvHfgtE8qGDV554E6bYLo\/aYR+EcqigD+1+CaG5hS4t2DxyKGVlOQQRkEH0Ir40\/4KF\/EP\/hWv7HXjjWIn2T31j\/ZcOOCWv3W2bb7iORm+grq\/2JfiH\/wtL9lDwJ4vd\/MmbSorSds8tNZZtZSfcvET+NfnV\/wW1+If9mfCzwf8L4Hw+r6lNqEqg8+XZReWA3sWuMj1K+1AH8+vgTwZc+M7zUY4ciLTNMvNRmYfwrbQsy59mk2L\/wACrh6\/Q39j\/wCH3239nj47\/FKdONN8NR6ZCx6FrydZZMe6i3XPs3vX55UAf24fsf8A\/JqXw2\/7FnS\/\/SWOvyM\/4Lndfhd\/3G\/\/AGwr9c\/2P\/8Ak1L4bf8AYs6X\/wCksdfkZ\/wXO6\/C7\/uN\/wDthQB+I3wg8HWPxE+LPhf4f6pLJBba7q9lp80kWPMSO6nSJmTcCNwDEjIIz1Ff0N\/8OTPgD\/0NfiD87T\/4xX4Bfs8avpfh\/wDaA8Da\/rlxHaWVj4h0y4uJ5WCxxRRXcbu7seAqqCST0Ar+wH\/hs\/8AZL\/6KP4d\/wDBhB\/8VQB+ff8Aw5M+AP8A0NfiD87T\/wCMUf8ADkz4A\/8AQ1+IPztP\/jFfoJ\/w2f8Asl\/9FH8O\/wDgwg\/+Ko\/4bP8A2S\/+ij+Hf\/BhB\/8AFUAcf+yL+xX4C\/Y7g1+38DarqGpjxA1s0xvjEdn2UShdnlRp1805znoMV89fGj\/gk\/8ABn43fFLW\/iv4g8R61aXuuXBuJYbc2\/lIxULhd8LNjjuTX6Y+GfE\/h3xpoNr4p8JX0Opabep5lvc2ziSKVM43I65BGR1FbtAH4xf8OTPgD\/0NfiD87T\/4xX4X\/tcfBjQf2e\/2h\/Efwe8M3Vxe2OjPbrFNdbfNfzraKc7tiqvDSEDAHAFf221\/Hp\/wU2\/5Pk8d\/wDXWx\/9N9tQBzP7Cv7N3hX9qj44H4XeMb6706zGnXF55tn5fmb4WjAH7xXXB3nPGa\/ZT\/hyZ8Af+hr8Qfnaf\/GK\/PX\/AII6\/wDJ3rf9gK9\/9Dhr+qegD83f2av+CZ3wn\/Zj+Klt8WfCWvavqF7awTQLDeGDyis6bGJ8uJGyB05r45\/4Lkf8gP4bf9d9V\/8AQbWv3or8F\/8AguR\/yA\/ht\/131X\/0G1oA\/DT4Nf8AJX\/Cn\/YYsf8A0oSv7s6\/g9+F+qWGifEzw7rWqyiG1s9TtJ5pDnCRxzIzMcZOAATX9eH\/AA8S\/Ys\/6KBYf9+7j\/41QB9pV+LP\/Bbb\/khvhD\/sOn\/0mlr7U\/4eJfsWf9FAsP8Av3cf\/Gq\/LD\/gq5+1B8A\/jt8JPDWgfCTxLba3eWWrm4mihWVSkX2eRNx3ooxuIHFAH4Tp98fWv7+a\/gGT74+tf380AFfLH7avxn\/4UL+zL4r+INrL5WoLaGz08g4b7XdfuYmX1MZbzCPRDX1PX89n\/BbD40fadW8K\/AHTJcpao2tX6g5HmSboLVT6FVEzEHs6mgD8FuvJrU1vRdW8N6xdaBr1u9pe2UrQzwyja8ciHDKw7EEV9FfsZ\/CD\/hef7TXhH4eXEXm2U18tzfAjKm0tQZ5lPpvRCg92FfV3\/BXX4R\/8K9\/anfxrYxbLLxhZRXwIGFFzCPInUe\/yJI3vJQB+nX\/BHP4z\/wDCc\/s833wr1GXfe+DbwpGpOT9jvS00XucSiZfYBRX67V\/JB\/wSy+M\/\/Cpv2sdJ0i\/l8vTvF0baNOCfl82Uh7Y4\/vGdVQHsHNf1v0AFfxQftp\/8nbfEf\/sYb\/8A9HNX9r9fxQftp\/8AJ23xH\/7GG\/8A\/RzUAfMVf05\/8Ei\/2pv+FmfC+X4BeLbnfrfhGMNYlz80+mEhVA9TbMRGfRGjA6GvxV+CP7Ml38cP2b\/iL8RPC8bS654HnsLtIlyTNZSJcG6QL3dQiyr3wjKASwrxf4BfGfxN+z78XNE+LXhQk3Gkzh5Ic4WeBvlmhb\/ZkjJXPYkEcgUAf3N1\/LX\/AMFmf+Ts7D\/sXLP\/ANKLqv6YPh14\/wDDPxU8CaT8RvBs4udL1m2jurd++1xnaw5w6nKsvVWBB5FfzP8A\/BZn\/k7Ow\/7Fyz\/9KLqgDC\/4I+\/8nhxf9ga+\/wDadf1Y1\/Kd\/wAEff8Ak8OL\/sDX3\/tOv6saAP4LvHf\/ACO+s\/8AX9cf+jWr9Lv+CfH7A\/w3\/a98EeIPFHjfWdS0ybSL6O1jSxMIVleIOS3mxuc59CK\/NHx3\/wAjvrP\/AF\/XH\/o1q\/cP\/gkP8dvgx8Jfhh4t0z4neKdM0C4u9Uilhjv7mOBpEEAUsocgkA8ZFAHuP\/Dkz4A\/9DX4g\/O0\/wDjFH\/Dkz4A\/wDQ1+IPztP\/AIxX6Cf8Nn\/sl\/8ARR\/Dv\/gwg\/8AiqP+Gz\/2S\/8Aoo\/h3\/wYQf8AxVAH59\/8OTPgD\/0NfiD87T\/4xX7I6dZR6dp8GnxEssEaxgnqQoAGfyrxvwZ+0x+z38RfEUHhHwH400bWNUuQ5itLS8ilmcRqXfaisSdqqWPoATXuFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB\/9X9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACvxC\/4Lef8kq8D\/wDYWuP\/AERX7e1+IX\/Bbz\/klXgf\/sLXH\/oigD8M\/wBmD\/k5X4ef9jNpP\/pZFX6E\/wDBZv4ff8I5+0npXju3TbD4k0iMu3964s3aJ\/yiMNfnt+zB\/wAnK\/Dz\/sZtJ\/8ASyKv3t\/4LV\/D7+3PgX4a+I0CbpdA1Y27nH3YL6I7jn08yGIfjQBb\/wCCLXxD\/t\/4A+IPh3cPum8O6t5yL\/dt76MMgx\/11imP41+dn\/BYX4h\/8Jb+1ePCMD5h8L6VbWjKDwJp9105+pSWMH\/drp\/+CMfxD\/4Rv9pDVvANzJth8SaRJsXP3rizdZU\/KIzV+d37SnxCPxY\/aA8Y\/EON\/Mh1XV7qW3PX\/RxIVgH4RBR+FAH7Cfs+fD7\/AIRD\/gj\/AOPfFEybZvE6319uI58qKSO1QfTMLMP97PevwNr+tj44fD7\/AIVT\/wAEv9T+HTJ5cukeE4IJx0\/fhYzMf+BSFj+NfyT0Af24fsf\/APJqXw2\/7FnS\/wD0ljr8jP8Agud1+F3\/AHG\/\/bCv1z\/Y\/wD+TUvht\/2LOl\/+ksdfkZ\/wXO6\/C7\/uN\/8AthQB+AVFe3\/syRRT\/tI\/D6GZQ6P4l0lWVhkEG8iBBB6g1\/bd\/wAIp4W\/6Btr\/wB+U\/8AiaAP4IqK\/vd\/4RTwt\/0DbX\/vyn\/xNH\/CKeFv+gba\/wDflP8A4mgD5c\/4J\/8A\/Jmnw9\/7Ba\/+jHr7CqG3t7e0hW2tY1ijQYVUAVQPYDgVNQAV\/Hp\/wU2\/5Pk8d\/8AXWx\/9N9tX9hdfx6f8FNv+T5PHf8A11sf\/TfbUAeyf8Edf+TvW\/7AV7\/6HDX9U9fysf8ABHX\/AJO9b\/sBXv8A6HDX9U9ABX4L\/wDBcj\/kB\/Db\/rvqv\/oNrX70V+C\/\/Bcj\/kB\/Db\/rvqv\/AKDa0Afz2ojyuI4wWZjgAckk9hXQ\/wDCH+Lf+gXd\/wDfiT\/4mum+DX\/JX\/Cn\/YYsf\/ShK\/uzoA\/gm\/4Q\/wAW\/wDQLu\/+\/En\/AMTVC\/0PWtKjWXU7Oe2RjgNLGyAn0BYCv76K\/Fn\/AILbf8kN8If9h0\/+k0tAH81iffH1r+\/mv4Bk++PrX9\/NAEc00NvC9xcMEjjBZmY4AA5JJPQAV\/ET+1T8Ypfj1+0J4q+Ke8vbalfOLPP8NpDiG2GOx8pFJ9yTX9Rn\/BSL40f8KW\/ZM8RXtlL5Wpa+o0WywcHfeBhKQeoKwCVgR0YCv48aAP3r\/wCCJfwg+0ar4u+O2oRfLbpHolk5GRvfbPc49CqiEZ9GI+v1L\/wWK+Ef\/Cb\/ALNlp8SbKLfd+Dr9JXYDJFpeEQSgd\/8AWeSx9Apr8qv2Z\/8Agpv4x\/Zh+Ell8JfCXhHTLyC1lmnkup5ZllnlmcuWcLhchdqDH8KivRPid\/wV7+IHxW+Het\/DXxJ4J0n7DrtlPZTFZp9yrMhTeuTjchO5T2IFAH5H6VqmoaJqltrWkytBdWcqTwypwySRsGVh7ggEV\/cl8Bfinp\/xt+DXhr4radtC65YRXEiLyI5sbZo\/+2coZPwr+F6v6R\/+CLPxn\/t\/4Y+Ifgdqcubjw\/dDULJWPP2W84kVR6RzKWPvKKAP21r+KD9tP\/k7b4j\/APYw3\/8A6Oav7X6\/ig\/bT\/5O2+I\/\/Yw3\/wD6OagD9df+CHSLJoHxJRwCpn0sEHoRsuq\/Ob\/gop+y037Mvx7uYtBtzH4Y8R77\/SSB8kYLfvrYf9cHOFH\/ADzZCTkmv0b\/AOCG\/wDyAviR\/wBd9K\/9Buq\/SP8Abl\/Zls\/2pPgJqPg21jT+3tPzfaPK2Btuo1P7st2SZcxtngEhuSooA\/Kz\/gjn+1N\/ZuqXf7LfjC5xBeGS+0JnPCzAbrm2GezqDKg4GVk7sK8D\/wCCzP8AydnYf9i5Z\/8ApRdV+YOg654q+GvjO18QaPJLpmtaHdrNExBWSC4t3yMqehVlwQR7Gvrz9vf4+aF+0r8RvC3xY0ULHLeeGLOK+t1Ofs95FcXKzxc84DcoTyUKt3oA9l\/4I+\/8nhxf9ga+\/wDadf1Y1\/Kd\/wAEff8Ak8OL\/sDX3\/tOv6saAP4LvHf\/ACO+s\/8AX9cf+jWrlK6vx3\/yO+s\/9f1x\/wCjWr+gj\/gilo2kan8JfGkmpWsNwy6vCAZEVyB5A4GQaAP5zKK\/vd\/4RTwt\/wBA21\/78p\/8TR\/winhb\/oG2v\/flP\/iaAP5Mv+CVf\/J8XhH\/AK5al\/6QXFf12VkWugaDYzi6sbK3hlXOHSNVYZ4OCAD0rXoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/W\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAr8Qv+C3n\/JKvA\/8A2Frj\/wBEV+3tfiF\/wW8\/5JV4H\/7C1x\/6IoA\/DP8AZg\/5OV+Hn\/YzaT\/6WRV\/Wl+3f8Pv+FmfsiePPDUaeZNFpj38IH3jJYEXahfdvK2++cd6\/kt\/Zg\/5OV+Hn\/YzaT\/6WRV\/b\/fWNpqdjNpt+glguEaKRG6MjjDA+xBxQB\/Cp8Jfib4g+Dvj6y+InhZtl\/YJcJEc4x9ogkgbkf7Mhruf2U\/h9\/wtT9pHwT4DdPMhv9XtvtC4zm3icSz\/APkJGrzf4meDLv4cfEfX\/h9fZ87Q9RurByepNvK0efx25r9Lv+COPw9\/4Sj9qa58aXEeYfDGk3E6P6T3JW2QfjG8p\/CgD92P2+v+TN\/iF\/2CX\/8AQ1r+MGv7Pv2+v+TN\/iF\/2CX\/APQ1r+MGgD+3D9j\/AP5NS+G3\/Ys6X\/6Sx1+Rn\/Bc7r8Lv+43\/wC2Ffrn+x\/\/AMmpfDb\/ALFnS\/8A0ljr8jP+C53X4Xf9xv8A9sKAPxc+AfiHRvCPx18FeK\/EU4tdP0zXtNu7qZgSI4YbqOSRyFBJCqpOACfQV\/WD\/wAPJP2JP+h9tf8AwGvP\/jFfxyUUAf2N\/wDDyT9iT\/ofbX\/wGvP\/AIxR\/wAPJP2JP+h9tf8AwGvP\/jFfxyUUAf20\/CX9r79nD46eKH8F\/CjxRDrGqJA900EcNxGREhVWbMsaLwXUYznmvpOv5Zv+CNX\/ACdref8AYvXn\/o+2r+pmgAr+PT\/gpt\/yfJ47\/wCutj\/6b7av7C6\/j0\/4Kbf8nyeO\/wDrrY\/+m+2oA9k\/4I6\/8net\/wBgK9\/9Dhr+qev5WP8Agjr\/AMnet\/2Ar3\/0OGv6p6ACvwX\/AOC5H\/ID+G3\/AF31X\/0G1r96K\/Bf\/guR\/wAgP4bf9d9V\/wDQbWgD8NPg1\/yV\/wAKf9hix\/8AShK\/uzr+Ez4Nf8lf8Kf9hix\/9KEr+7OgAr8Wf+C23\/JDfCH\/AGHT\/wCk0tftNX4s\/wDBbb\/khvhD\/sOn\/wBJpaAP5rE++PrX9\/NfwDJ98fWv749f1zS\/DGhXviXXJRb2WnQSXNxK3RIoVLux9goJoA\/m7\/4LP\/Gf\/hJ\/jDofwU0yXdbeF7T7VdqD\/wAvl6AwVh6pAqMp\/wCmhr8vfgN8FPFv7Q\/xW0r4ReCGij1DVWk2y3BYQxJFG0rvIUVmChVPQHJwOprL+M\/xL1T4yfFfxD8UtZyJ9dv5rvYTny0dj5cY9o02oPYCv2V\/4Im\/B37Z4g8WfHfUYspZRJo1ixGR5ku2e5I9GVFiGfRyKAPMv+HJ37RX\/Q0eHP8Av5d\/\/I1H\/Dk79or\/AKGjw5\/38u\/\/AJGr+miigD+KP9qr9k\/4hfsj+NLDwX4\/ubS+fUrMXkFzYmRoWXzGjZMyJG29SuSMYwy88133\/BO74z\/8KS\/ax8M61eS+Vp2sSnRr4k4Xyr0hEZj2VJhHIT6Ka\/Zf\/gsz8JP+Et+AGk\/Faxi3XPhLUAkzAdLS\/wBsTk\/SZYQPqa\/mMR3jcSRkqynII4II7igD+\/qv4oP20\/8Ak7b4j\/8AYw3\/AP6Oav60f2R\/jInx7\/Zz8KfE6SQSXl7ZLFfeovLcmG4yO2ZEZgP7pBr+S79tP\/k7b4j\/APYw3\/8A6OagD9d\/+CG\/\/IC+JH\/XfSv\/AEG6r96K\/Bf\/AIIb\/wDIC+JH\/XfSv\/Qbqv3ooA\/mT\/4K7fssf8K3+JkP7QXhG22aL4slKagqD5YNSALFj6C5UF\/d1kJ6ivxvr+6H47fBzwv8ffhPrXwm8XL\/AKJq9uY1lAy0Ey\/NFMn+1HIFYeuMHgmv4l\/iZ8O\/FHwk+IGr\/DXxnB9n1PRbl7WdexKHh1J6o64ZD3Ug96AP0S\/4I+\/8nhxf9ga+\/wDadf1Y1\/Kd\/wAEff8Ak8OL\/sDX3\/tOv6saAP4LvHf\/ACO+s\/8AX9cf+jWr9mv+CU37U3wC+AHw38U6J8X\/ABHDol1f6lFPbxyRTyF41hClgYo3A545INfjL47\/AOR31n\/r+uP\/AEa1cpQB\/Y3\/AMPJP2JP+h9tf\/Aa8\/8AjFH\/AA8k\/Yk\/6H21\/wDAa8\/+MV\/HJRQB\/Y3\/AMPJP2JP+h9tf\/Aa8\/8AjFfWvgXxz4U+JfhKx8d+B7xdQ0nU4\/NtrhFZRImSMgOFYcg9QK\/gvr+zX\/gn1\/yZl8Pv+wZ\/7VkoA+x6KKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/\/X\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigApCAetLRQAm1fSloooATavpQAB0paKACk2r6UtFABSEA9aWigBNq+lG1fSlooATavpRtX0paKAEAA6CloooAKTaD1FLRQAgAHQUtFFABSEA9aWigBNq+lLRRQAUhAPWlooATavpS0UUAJtX0oAA6UtFABRRRQAdaTavpS0UAAAHSk2r6UtFACAAdKWiigApNoPUUtFACAAdBS0UUAJtX0o2r6UtFACbV9KNq+lLRQAm1fSloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP\/9D9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiviH9tX9tLTf2NtI0DVtR8Py6+NdmnhVY7gW\/leQqNkkxybs7\/bGKAPt6ivxY+IP\/BZz4beHPCGi33g\/wxLq+ualbC5u7M3axwWJZiFiecRMZJdoDFVjAAYAtuyB6d+yp\/wVZ+F\/7QXjK1+G3jbSJPCOt6g4isS84ubS4lP3YhLsiaOR+iKybWPyhtxUEA\/VmioLq6trK2kvbyRYYYVLyO5CqqqMlmJ4AA5JPSvxH+Nv\/BaPwT4V8S3Hh34LeGW8R29s5jOpXdwbaCQqcEwxKjuyHszFCf7uOaAP2\/or8Nfg1\/wWp8IeIvEdvoXxo8KtoFpcOEOpWNwbmOLccbpYWjVwg6lkZ2x0Q1+v3xI+Iy+CvhHrHxX8O2g16LTNNl1SKCCUKLqGKMzfu5Arj5kGVIBzxjrQB6ZRX5xfsZf8FE\/Df7YHjrVPANn4bl8P3enWP29DJdLcCWNZUicACOPG0yL65zXD\/tU\/8FR\/C\/7Mfxkvvg9J4Tm12fT4beSa4jvFgCvcRiUJsMTnhGU5z36UAfqrRXzv4+\/aM8NeBf2Z5v2mntmutNXSLfVobcSBGlF0qGGPfggFmkVc4PXpXiP7FX7cK\/tlT+IH0zwpNoFpoC24eeW6W4EklwX2ooEUfRYyScnGRxzQB97UV+cn7X3\/AAUl+E\/7K+tnwHa2UvifxQiLJLY28qwxWyuNyfaJyr7XYEMEVGO3ltoK5+K\/A\/8AwW\/0251yO2+IvgJ7TTpGAe40+9E8sa+vkyxRh\/8Av4tAH730Vxvw++IHg\/4qeDNO+IPgK+TUdI1WITW1xHnDKeCCDgqykFWUgFWBBAIIr83PEX\/BUvwZ4T\/aXvP2fPEfhp7O20\/U30+51mW9VYYo48l52j8rIVQCSN340AfqrRX5X\/s9\/wDBTjQv2kv2loPgn4I8MyW2jTx3UkWp3VxiaQW8bOG+zLHhA2OhkJA5ODxX0L+1v+298Jv2RNJtk8WiXVNd1BDJZ6ValRK6AkebK7cRRbht3EEk52q2GwAfZdFfz9aV\/wAFxrltZX+3Ph0qaezYbyNSLTIvqN1uquR6fLn1Ffs18Av2gPhr+0n8PIPiT8MLtp7ORjFNDKAk9tMoBaGZATtcAg8EqQQVJBBoA9ror45\/a5\/bX+Fn7IWg2s\/i1JdU1rUgzWWl2pUSyKvBkkduIogeNxBJPCq2Gx+ePw1\/4LZ+Ftc8YQaT8TvBb6HpFzIEa+tbw3bW4JxukiMMRdR1YqdwHRWPFAH1r8Ev+CmPwh+Onxzs\/gJ4c0LWLTU7yW7iS4uVtxADZxSzOSUmZ8EREL8vUjOK\/R+v5K\/+Cc1zb3v\/AAUX8PXlo4kilutadHXkMrWN2QQfQiv61KACiivzx\/bI\/wCCinwz\/ZK1KLwYthJ4k8UTRCc2EMohjt42+41xMVfYX6qiozEcnaCpIB+h1FfiH8If+C0fgrxXq02jfFHwo3h\/dDI1rdQ3nnwvMqFkil3RI0QcgKJBvAJG4BckfTn7Gf8AwUQ0j9sHx\/qfgTT\/AArNoL6bp5vzNJdrcBwJY4tm0RJj\/WZznt0oA\/SCivz9\/bV\/b00r9jbV9A0nUfDUuvnXYZ5laO6W38ryGRcEGOTdnf7YxXy\/8ZP+Cx\/gTwNZaJa\/D\/wy2vanqGmWeoXyvdiK3spLuBJ\/s3mLE5mljD7ZMKiqeM7gyqAftFRXkHxx+OXw9\/Z5+HF58UfiZdNbadabUVI13zTzPnZDCmRukfBwCQAAWYhQSPxf13\/guMy6oyeGvh1vslb5WutS2SuvqVS3ZUPtub60Afv\/AEV+d\/7IP\/BRz4U\/tYa83gOPT7jw54mELTpZXDrNFOiDL+ROoXeyDllZEO3JAIDY9S\/bM\/azsP2P\/h7pvj7UNEk11NR1FdPEMc4tyhaKSXfuKPkfu8Yx360AfX1Ffi54q\/4LOfDDR\/hpo3iTQ\/DE9\/4i1VZpJdK+1qsdlHHM8SGe5ERy8gTesax52kFiuVJ6X9mv\/grx8MfjF4ztPAHxM0N\/B95qMiwWl19pF1ZvK5wqSOY4miLEgKSrLn7zLQB+qnjvxbYeAPBGs+O9VjkmtdEsbi\/mSIAyNHbRNKyoGIG4hSBkgZ6kV8f\/ALKf7fvwr\/a58W6l4P8AAWk6rp9xpdoLyR9QSBUZDIseF8qaQ7ssDyAMd69\/\/aV\/5Nz8f\/8AYt6r\/wCkctfzDf8ABOv9p3wB+yl4n8Y\/ETx2s1yZtIS1srO3A825uGuEYICcKqhVLM7cADgFiFIB\/XJRX4HeGf8AguFp9x4jSHxh8PntdJd8NLaX4muI0z18t4YkkOO29PrX7ieA\/HPhb4meDdN8f+Cbtb7StWgS5tp0yAyOO4OCrA8MpAKkEEAigD8+tR\/4Kb\/DvTv2mV\/Zkk8N6i2otrsWg\/bBJD5HmyzLAJMZ3bAWzjGcV+mVfgprfx5\/ZNg\/b1TwHdfCJZfFp8X29mNf\/tGUEXrXSIt35G3b8rkPszg4xX7sa1rOk+HNHuvEGvXMdnY2MLz3E8rBY4oo1LO7MeAqqCST2oA06K\/DX4qf8FsfBOheIp9I+Eng+bXrKFygv726+xrLg43RwiKV9h6guytjqoPFex\/sxf8ABWf4V\/HTxnZfDnx3os3hHVtTkWCzkadbq0mmY4WMy7ImjdzgIChUnjcCRkA\/WeiuR8e+O\/Cnwy8G6j4\/8cXiafpOlQtcXM75wiL6AZLMSQqqASzEAAkgV+HnjX\/gt1EuuTWvw08Atd6fETsuL+88uWRB\/EYYonEf\/fxqAP3xor8sf2Tf+Cp3wy\/aO8Z2vwx8VaPL4U1+\/JSzDTi5tbiQDPlrLsjZJGA+VWTBPyhixAP6nUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH\/\/R\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAr8J\/+C4f\/Im\/D3\/r91D\/ANFwV+7FfhP\/AMFw\/wDkTfh7\/wBfuof+i4KAPc\/+CZv7KfwYsf2XdF+Ifijw7p+s634nWa6uLi+t47kpF5rxxQx+arBE2ICwGNzE5zgY\/IL\/AIKZfBTwt+zp+1SIPhhCuk2OrWFtrVtb23yJaytLLEyxAfcXzIC6gcLuwuAAB9ffsOf8FNPh\/wDAP4H6f8HfjlpepxtpKyPpl5ZwrKtxazSPIFZXeMhldmVWGVKgAkFTn4c+OvxF8Zf8FFv2urZvAOmSw\/2mYNL0u2kwzwWcRZjLOVJUAF5JpMEhASMnGSAftt+3\/wDGXxHZf8E7IfFlk5gvfGVppdtO6cFUvo1mnUezorRkejGvln\/gjN8Avh54i8IeJPjf4p0231PU4NSGlWRuY1lFssUMc0jxqwIDyeco3YyAuAQC2f0d\/bG\/Zsn+Ln7IGo\/BfwUnmX+lWltJpSHALy6eF2R88ZljVowScAsCeK\/Dr\/gnX+3PoH7INz4g+GXxgsL0aNqNyLjfbx7p7O8jXypRJC5QlXVVDY+ZGT7pycAH17\/wWW+AXw80X4d6B8cPDOmW2m6t\/ai6XdvbRrF9pinhllRpAoAZ42hwG64YgkgDH1P\/AMEovGt\/8S\/2M7bQfE5+1x6HfXeijzfm324VJkQ56qqT+WB2VQO1flP\/AMFGv28\/C\/7Wdpofws+EFlef2Lp939slmuYwkt1dlGiiWKJWYhUWRxz8zM2No25b9vP+CfPwG1n9nn9mDRPB3imIwazfvJqeoQnrFNc42xt\/tRxLGj\/7QPagD8J\/2NYLr9mP\/gpbD8M9RcpAmp6h4ectwZI5Q62rfR3WFh7GuA+Mvg6\/\/aY+MXx\/+M1kzSweEzJdW7LyHSK\/htI93t9jjlf6qK98\/wCCrXhfV\/gn+2XoXx18KAQzarBZ6pDKR8ov9MdYzx3wscDH13V9N\/8ABKb4Jx+Nv2TviXe60Mv48muNIMj8loorVkD5\/wCulzJ+IoA+c\/ix8fP7W\/4JF+CfB4n3X17qw0S4TP8Ayw02SSdf++VW2496\/Sz\/AIJTfDOP4X\/se2firUI\/LufE9zcavLkfMIR+5hH0McQkX\/fPrX8xukHx34x\/sP8AZ\/tgcjW5Ra2xzkX2o\/ZrVwf+\/EYA7c+tf2++CvBuj+BfA+k+ANHQfYNHsYLCFSP+WUEaxLkf7q80AfxlfC34x+A2\/aXX44\/tEaXP4l0+a\/udTvLGMI\/n3Eu941cSlUaNZGDFTwQu3GCRX2v+2b+2\/wDsrftM\/CSTwv4Y8B3mkeJLOSGTTdRaG0jEIV1EsbtE5cxvFuGzBG\/accV4p4dXU\/8Agnd+2o6fErQm1TSNNnuITFJGrfbNNuNyxXEBk+RmA2uBkDepjYqckfo58cv+Cqv7Nei+EYX\/AGf\/AAnba1rk7qWGqacsFtBH1fftZXdz0UIdvUluAGAN3\/giR431bVfhh418A3kjPa6NqFrdW6sc7Ptsciuq+gzbhsdMknqTX5X\/ALRvgf8A4Wb\/AMFFNf8AhuZTAPEHjBNNMoGSgurhIiwB\/u7s1\/Rp+wl8Rvid8YfhA\/xR+JPhbS\/Cg1afOnQadA8BntUX5Z5A7McOxby+mVG4ZDA1+B\/i\/wD5S1Q\/9lDsf\/S6KgD+jD4P\/sefs4fAm8stX+Gnha1sdTsYmiS\/YtLdMHXY5aVySS4Jz0HPAAwK\/mE\/bF+IeleMv28vE+vfE5Li+0TSvEH9n3NvAwEjWOnSiB4oiSoVnSNsHI+Zieua\/sTr+U79ubwB4t\/ZV\/bpb41HTBe6Pqerx+IbFplzb3LF1lurZzggN5m9WXkhGVscigD3D42f8FB\/2K\/iz8FNS+ENv8M7yxRrKSHTJI7eyj+xXAQiCWMpJuTY+CwX7y5UggkVj\/8ABE\/xtq1h8c\/FHw9WRv7P1PRDfPHnjz7S4iRGx\/uTuCfpX0\/44\/4KqfsiWnwzm1r4e+Ezd+J5YcW+nXmnwxxRTEdZ5VJUxqeT5ZLN0+XOR75\/wTs+P\/xZ\/aWg1jx\/4t8F6H4a0C1UW1neadbSQy3VwWzIqs7sGjjAG8gffIAOVYAA\/GP9sufUv2gv+Cjd\/wCAtTuWjhuddsPDduc58iLfHbHbn\/bZ5P8AeY1\/Rlr\/AOxV+zHrvwrk+EQ8H6Za6cbYwRTQ20a3ULbcLOtxt83zgfmLliWOd2QSD\/P5\/wAFJ\/hj42\/Z6\/bKPxs0aFlsdbvLfW9MuipMYu7cxtLEx\/vLMm\/HHyOvvX6F6x\/wWe+DM3wya+8MaDqr+MJ7fZDp8kcZtkumGAWnWTLxBuRtTewwNqk8AH5ff8E1NHn8Pf8ABQfwvoF0waWxm1e3cjoWi0+7QkfiK\/rhr+Rv\/gmeNWH\/AAUC8KjXldb7zdX+0iUbXEv9n3e8MD0bdnI9a\/rkoAK\/kE8AaBbftcf8FFRpPxDZp7PxD4jvJrqMsQWtbXzZhbhhghfJhEQwQQvQ5r+vuv5Gf2h\/CfxE\/YR\/bhf4haXaE20WrSa1o8jgiC6tJ3LPBvHdVdoJMfMOuMFSQD98P2tP2QPgH4w\/Zt8S6XpnhbS9Ju9G0q5vNNurK1it5Lea1iaRAHjVTsYrtdTkFSeMgEfkj\/wRN\/5OF8U\/9i6\/\/pXb16x8dv8AgrTY\/Gr4Q6l8KPgv4R1KDxB4jsprO4kuGjdLeCSNvtDQ+UWaQiLfhmWMIPnP3cV5P\/wRN\/5OF8U\/9i6\/\/pXb0Aegf8Fw\/wDkcvh7\/wBeWof+jIK+pP2Df2BP2cL39nDw58QviN4ct\/EWt+I7UX0019ukSNJSTFHFHnYoVMZOCxYk5xgD5b\/4Lh\/8jl8Pf+vLUP8A0ZBX7AfsR\/8AJovw5\/7ANn\/6LFAHlH\/BQr4X\/s9fEH4TWOq\/tKeKb7wxoGiXZniNi8Ye4uZIyiRiN4ZmkcLu2qi5ALE\/KCR+aPwz\/wCCgX7Gf7O3w5j+EHwS8Aav4nQNIGuNVjs4pr+SVyczPGJGcchFBiGFAG3iur\/4Lh2nilv+Fe3yrIdET+0IyVz5Yum8ggP23GNTsz2D471u\/soft0\/sMfs8\/sy6NBDbG28YWdntv7O209zeXd2M73N3s8plkPKlpvlUhcDGKAPzm\/YN1G4n\/wCCg\/hbUVsV0d59Wvy1lGpRbYSQXG6AKcFQgJTB5AGDX6z\/APBbD\/k3Pwx\/2Mkf\/pHc1+Tn7Fevanrf\/BRPw54j8TW5sL6\/12+muYJAUaKeeO4LRkMAQVdtuCAc8YzX6x\/8FsP+Tc\/DH\/YyR\/8ApHc0AZ\/\/AASf\/Zc+EN5+zvH8YvGOhWOt6x4gu7lUlvoI7gQW9tIYBHGsgYJudHZmABbIBOAK\/Pb\/AIKyfs\/+A\/gj8ddL1n4b2MOlaf4msDcyWVsojhiuYZCkjRIuFRHUodqgANuI64r1z\/gn7\/wUY8F\/s1fCcfCP416ZqI09Zpr3Sb6ziWQNFK582Nkd0OBMr7XUsCSykDbk\/K37Xnx+8Qft\/ftI6Va\/C\/R7kW\/lx6TotlIFNxIWdneWUKWVCzNlsMVRFBJ4JoA\/oWsvF+qePv8AgnJL4x1x2lvtQ+H88txI3JeY6awkc5\/vMC341+G3\/BI\/4N+Bviv+0Zf6h49sIdTt\/D2lPe29tcIJIjctNHEjujZVtis5UEHDbW6gV+\/3jrwHB8Lf2H9c+Gtu4lXQPBF3p\/mDgObfTnjL8\/3ipP41+LH\/AARJ\/wCS5eL\/APsBL\/6UxUAezf8ABab4XeA9E8GeDfH2haXbWOptfTWMstvEkRlhaLzFWTYBu2Mny56bmx1r7U\/4JR3U9x+xH4ZjmYsIbnUUTPZftkrY\/NjXzX\/wW4\/5Ix4N\/wCw1J\/6TPX0Z\/wSc\/5Mn8P\/APX5qP8A6VSUAfir4n\/5Szxf9lFs\/wD0vjr9gf8AgsB471Xwf+yMdG0qQx\/8JHrFpps5U4JhCS3TDPoWgUH1BI6E1+P3if8A5Szxf9lFs\/8A0vjr9xP+CnXwT1\/43fspalY+FLd7vU\/D91DrUFvGCXlFuskcyqByWEMsjBRksVAAyRQB8e\/8Edv2ffhpq3we1n4x+KdItNU1e81SSwgkuokm8i3t4omxGHBCs7yNvI5ICjtXqfx5\/wCCSHgD4sfFm6+KHgPxJ\/whSXflSmxstPV4kuEHzSxlZoghcgMQq\/eyc818B\/8ABN3\/AIKC\/Dv9mPwTq\/wp+L1veDTrm9bUbK7tIxMUkkjSOWKRNysFPlqyFQeS2ccGtrxb+3r+1L+1F+1JB4E\/ZL1i+0TRdUmhtLK3e3t3ZY0A8+7n3JIUUfM7DccIAOvFAH6tf8FIPhZ8Rvil+x\/q\/hXwHHLqmqWslpdzW8CnzLuO3cNKEjGcsP8AWBBknbhctgH8If2Lf2\/ta\/Yy0vVPA954QtdZtL+9NxcOZDaXyOEWIxtIUkDImzKxsg2sW5+bj+gD9u74q\/HX4CfAAfEr4HxQX93pN1D\/AGmbuAz4sijq821GTlZfLLEcBSxOACa\/ML4Vft3fsffHzwbc2\/7ePhvTD4lSZwt\/DpTOstuQNgSaDfcRupyGGQCNpB6gAE\/wQ1P\/AIJwftRftEWvjy3TW\/A\/ji81KDULWykmhgspb2JldRbvGjrud1DFXKM7khQSQK\/oUr+LD4i+Gfht8Qv2oYfC37FlrqC6XqN5bRaTHPv81Lg7dzoXLSrEjguGkO5VBLEAcf2nKCFAY5Pc0ALRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB\/9L9\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACvwn\/4Lh\/8ib8Pf+v3UP8A0XBX7sV4t8Zf2d\/gz+0FaWFj8YtDj1uLTHkktVkkmj8tpQA5HlOhOQo656UAfBX7IP7L\/wABP2hv2IPh0fjF4attZltLS6SGctJBcIhvbg7BPA8cuzJzt3bc84r7p+Df7M3wH\/Z+jmX4P+GbTRZLldks6b5bh1zna08zPKVzztL4zzivQvh78PfB3wq8HWPw\/wDh\/Yrpuj6arJbWyM7iMO7SMA0jMxyzE8k9a7OgAr5X+L\/7E37Lvx11h\/EnxK8I2t1qcv8ArLyB5bSeQjgGR7Z4zIccZfdxxX1RRQB8n\/CT9h39lb4H63H4m+Hfg+1t9ThO6K7uXmvJo2\/vRtcvJ5be6bTX1hRRQB5P8UvgV8H\/AI2R2UXxY8PWevLppkNr9rTf5Rl279vIxu2Ln1wK6TwB8O\/A\/wAK\/DEPgv4d6XBo+lW7O8dtbLtjVpGLuQPUsSTXaUUAfOml\/sj\/ALNOi+NY\/iLpXgvTINciujfJeLFiRbgtv80HOA245zjrX0XRRQB5Z8Vvgj8JfjjoieHvizoFnrtrESYhcJ+8iLdTFKuJIycclGBPevnfwd\/wTk\/Yu8C63H4g0TwNbS3MLB0+2z3V7GpByP3VzNJGcHplSa+26KAGRxpEixRKFVRgAcAAdABXgVx+yt+ztd\/EEfFa58Iac\/iMXi6gNQMZ877UjB1l3Z+8GAIPqK+gKKACuP8AHXw+8D\/E7w5N4R+Iek2utaZPy9tdxLKmR0YBgdrDPDDDDsRXYUUAfCOn\/wDBM39iDTdYGtweBYnkVt4jlvL2WEH\/AK5PcNGR7FSPavtvRtF0fw5pVvoXh+0hsbG0QRwW9uixRRovRURAFUDsAMVp0UAcP8Q\/hr4B+LPhibwZ8SdItta0uchmt7pA6hh0ZT1VxnhlIYdjXzt8Nv2Bv2RfhL4qh8beB\/BdtBqds4kgmuJ7m78lxyGjW5llRGU8qwAYHoa+waKAPBPC37Ln7Pfgjx2vxO8J+EtPsPECSTSi+ijImD3CssrZz1dXYH6mve6KKACvwp\/ap\/4KIaf4S+MOqfs+ftD\/AAksdY0LTtRA826lE7SWTN+7vIIpYNvmNCdygOMNld4wTX7rV458XP2ffgt8eLGLT\/i54bs9cWAERSTIVmiB6iOZCsqA9wrAHvQB+L\/xO\/a\/\/wCCdnwz+DHiax\/Zc0C3XxT4j0y402J4NNkt5IBdxmJ2kuJ1BCIGLbI2YMwAxjkVf+CJfwr8RRaz4v8AjPfW7w6ZJbR6TaysCFnkMgmm2HuI9kYY9MtjqDj9HNG\/4JlfsQaFqC6la+BopZEOVW4vb6eMfWOW4ZGHswNfbehaDofhfSLfw\/4as4NPsLRBHBbW0axRRIOioiAKo9gKAPM\/ij+z78FfjXc2d58V\/Ddlr0unq6WzXabzGshBYLyMZKjP0r0Xwx4Y8P8Agvw9ZeE\/CtpHYabp0SwW1vEMJFGgwqqOwArdooA4zx\/8O\/A3xT8L3Hgr4i6VbazpV1jzLa6QOhI6MM8qynlWUhgeQRXzZ8PP+Cf\/AOyB8LfE8XjHwd4JtY9Rt3EkMl1Nc3giccho0uZZUVlPKsFyD0NfY1FAHzrf\/skfs16p42k+I994M02TXZbv7c195ZExud+\/zdwI+fd82fXmvz2\/4LYf8m5+GP8AsZI\/\/SO5r9k68l+MHwL+FHx90C28L\/F7R49asLS4F1DDJJLGFmCMgfMTofuuwwTjnpQB+ZH\/AAT8\/Z2+Cn7QX7DHhvSvjF4dttbjtb\/UjA8m+OaLdctuEc0TJKgbAyFcA4Gegr9C\/g1+yh+zv+z9cyah8I\/CtppN3KuxrrMlxcbD1UT3DySBT3UMAe4r0T4X\/Cr4f\/BfwfD4C+GOmppOkW7ySR2yPI4VpWLud0jO3LHPWvQqAMzW9F0rxHo134e12BLqxv4ZLa4hcZWSKVSjow9GUkH2ryf4Yfs4\/Az4L6pca38K\/DFjoV3dxeRNLapsZ49wbaeTxuANe10UAeZfE\/4M\/Cz40aZbaP8AFXQ7XXbWzlM0MV0u9UkKlSw5HODitn4f\/DrwP8K\/DEPgz4d6ZBpGlW7O8drbrtjVpGLOQOerEk12lFAHz9P+yr+zrc\/EAfFW48Iac\/iMXi6gNQMZ877UjiRZd2fvBgDn1r6BoooA+NfiT\/wT7\/ZA+K+vTeKPF3gu2GoXDF5ZrKa4svMY8szpbSRozMeSxUknnOTXq3wY\/Zo+BP7PdtNb\/B\/w1a6M9woWadd8txIoOQrzzM8rLnnaWxnnFe6UUARTwQ3ML21yiyRyKVZWAKspGCCDwQR1FfEHi7\/gm3+xV401WTWdT8DW9vPK25vsNxdWceT1xFbyxxD8EFfclFAHz38G\/wBlL9nj9n+d734SeFbTSbuRSjXXzz3Ow9V8+dpJQp7qGAPpX0JRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf\/\/T\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/\/U\/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA\/\/Z","$class":"NSData"},"Author":"CC4A1102-2FCB-4B7D-ADBE-D5E669D70FE3"} \ No newline at end of file diff --git a/Resources/Images/Logo/MethaneLogoWatermark.png b/Resources/Images/Logo/MethaneLogoWatermark.png new file mode 100644 index 0000000000000000000000000000000000000000..1611177aa56270a73b9fdf7d99f6c423140fbf5d GIT binary patch literal 27409 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 + + + + + + + + + + + + + + + + + + From aeb8365483143780223b8e4e62ef6f9ff1e937d6 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 7 Jan 2020 16:44:47 +0300 Subject: [PATCH 082/129] Screen-quad graphics extension initial implementation. --- .../Primitives/Include/Methane/Data/Types.h | 12 ++ .../Core/Include/Methane/Graphics/Types.h | 4 +- .../Core/Sources/Methane/Graphics/Types.cpp | 22 ++- Modules/Graphics/Extensions/CMakeLists.txt | 3 + .../Include/Methane/Graphics/Extensions.h | 1 + .../Include/Methane/Graphics/ScreenQuad.h | 79 ++++++++ .../Include/Methane/Graphics/SkyBox.h | 3 +- .../Extensions/Shaders/ScreenQuad.cfg | 2 + .../Extensions/Shaders/ScreenQuad.hlsl | 34 ++++ .../Graphics/Extensions/Shaders/SkyBox.hlsl | 29 +-- .../Sources/Methane/Graphics/ScreenQuad.cpp | 176 ++++++++++++++++++ .../Sources/Methane/Graphics/SkyBox.cpp | 4 +- 12 files changed, 351 insertions(+), 18 deletions(-) create mode 100644 Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h create mode 100644 Modules/Graphics/Extensions/Shaders/ScreenQuad.cfg create mode 100644 Modules/Graphics/Extensions/Shaders/ScreenQuad.hlsl create mode 100644 Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp diff --git a/Modules/Data/Primitives/Include/Methane/Data/Types.h b/Modules/Data/Primitives/Include/Methane/Data/Types.h index 6ff4c5660..430cc292e 100644 --- a/Modules/Data/Primitives/Include/Methane/Data/Types.h +++ b/Modules/Data/Primitives/Include/Methane/Data/Types.h @@ -74,6 +74,18 @@ struct Rect bool operator!=(const Size& other) const noexcept { return std::tie(width, height) != std::tie(other.height, other.width); } + Size& operator*(D multiplier) + { + width *= multiplier; height *= multiplier; + return *this; + } + + Size& operator/(D divisor) + { + width /= divisor; height /= divisor; + return *this; + } + D GetPixelsCount() const noexcept { return width * height; } D GetLongestSide() const noexcept { return std::max(width, height); } diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h index f7013663e..899e62a87 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h @@ -46,7 +46,8 @@ using FrameRect = Data::FrameRect; using FrameSize = Data::FrameSize; using ScissorRect = Rect; using ScissorRects = std::vector; - + +ScissorRect GetFrameScissorRect(const FrameRect& frame_rect); ScissorRect GetFrameScissorRect(const FrameSize& frame_size); template @@ -123,6 +124,7 @@ using Viewport = Volume; using Viewports = std::vector; Viewport GetFrameViewport(const FrameSize& frame_size); +Viewport GetFrameViewport(const FrameRect& frame_rect); class Color3f : public Vector3f { diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Types.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Types.cpp index 8e3cfdbae..f9885e25b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Types.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Types.cpp @@ -29,15 +29,35 @@ Methane primitive graphics types. namespace Methane::Graphics { +ScissorRect GetFrameScissorRect(const FrameRect& frame_rect) +{ + ITT_FUNCTION_TASK(); + return ScissorRect{ + ScissorRect::Point(static_cast(std::max(0, frame_rect.origin.x())), + static_cast(std::max(0, frame_rect.origin.y()))), + ScissorRect::Size(frame_rect.size.width + frame_rect.origin.x(), + frame_rect.size.height + frame_rect.origin.y()) + }; +} + ScissorRect GetFrameScissorRect(const FrameSize& frame_size) { ITT_FUNCTION_TASK(); return ScissorRect { - ScissorRect::Point(0, 0), + ScissorRect::Point(0u, 0u), ScissorRect::Size(frame_size.width, frame_size.height) }; } +Viewport GetFrameViewport(const FrameRect& frame_rect) +{ + ITT_FUNCTION_TASK(); + return Viewport{ + Viewport::Point(static_cast(frame_rect.origin.x()), static_cast(frame_rect.origin.y()), 0.0), + Viewport::Size(static_cast(frame_rect.size.width), static_cast(frame_rect.size.height), 1.0) + }; +} + Viewport GetFrameViewport(const FrameSize& frame_size) { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Extensions/CMakeLists.txt b/Modules/Graphics/Extensions/CMakeLists.txt index 4a1a9dfea..20c35e52d 100644 --- a/Modules/Graphics/Extensions/CMakeLists.txt +++ b/Modules/Graphics/Extensions/CMakeLists.txt @@ -9,15 +9,18 @@ set(HEADERS ${INCLUDE_DIR}/ImageLoader.h ${INCLUDE_DIR}/MeshBuffers.hpp ${INCLUDE_DIR}/SkyBox.h + ${INCLUDE_DIR}/ScreenQuad.h ) set(SOURCES ${SOURCES_DIR}/ImageLoader.cpp ${SOURCES_DIR}/SkyBox.cpp + ${SOURCES_DIR}/ScreenQuad.cpp ) set(HLSL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Shaders/SkyBox.hlsl + ${CMAKE_CURRENT_SOURCE_DIR}/Shaders/ScreenQuad.hlsl ) add_library(${TARGET} STATIC diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/Extensions.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/Extensions.h index 39f2f5af9..fc4c95d42 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/Extensions.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/Extensions.h @@ -26,3 +26,4 @@ Methane graphics extensions: all headers under one umbrella. #include "ImageLoader.h" #include "MeshBuffers.hpp" #include "SkyBox.h" +#include "ScreenQuad.h" diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h new file mode 100644 index 000000000..ac905056f --- /dev/null +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h @@ -0,0 +1,79 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/ScreenQuad.h +ScreenQuad rendering primitive. + +******************************************************************************/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace Methane::Graphics +{ + +class RenderCommandList; + +class ScreenQuad +{ +public: + using Ptr = std::shared_ptr; + + struct Settings + { + const std::string name; + FrameRect screen_rect; + Color4f blend_color = Color4f(1.f, 1.f, 1.f, 1.f); + }; + + ScreenQuad(Context& context, Texture::Ptr sp_texture, Settings settings); + + void SetBlendColor(const Color4f& blend_color); + void SetScreenRect(const FrameRect& screen_rect); + + void Draw(RenderCommandList& cmd_list) const; + +private: + struct SHADER_STRUCT_ALIGN Constants + { + SHADER_FIELD_ALIGN Color4f blend_color; + }; + + Settings m_settings; + Constants m_constants; + const std::string m_debug_region_name; + RenderState::Ptr m_sp_state; + Buffer::Ptr m_sp_vertex_buffer; + Buffer::Ptr m_sp_index_buffer; + Buffer::Ptr m_sp_const_buffer; + Texture::Ptr m_sp_texture; + Sampler::Ptr m_sp_texture_sampler; + Program::ResourceBindings::Ptr m_sp_const_resource_bindings; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h index 6b4443f53..e6db7b671 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h @@ -16,7 +16,7 @@ limitations under the License. ******************************************************************************* -FILE: SkyBox.h +FILE: Methane/Graphics/SkyBox.h SkyBox rendering primitive ******************************************************************************/ @@ -76,7 +76,6 @@ class SkyBox TheTexturedMeshBuffers m_mesh_buffers; Sampler::Ptr m_sp_texture_sampler; RenderState::Ptr m_sp_state; - RenderCommandList::Ptr m_sp_command_list; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Extensions/Shaders/ScreenQuad.cfg b/Modules/Graphics/Extensions/Shaders/ScreenQuad.cfg new file mode 100644 index 000000000..7cb3d8f04 --- /dev/null +++ b/Modules/Graphics/Extensions/Shaders/ScreenQuad.cfg @@ -0,0 +1,2 @@ +frag=ScreenQuadPS +vert=ScreenQuadVS \ No newline at end of file diff --git a/Modules/Graphics/Extensions/Shaders/ScreenQuad.hlsl b/Modules/Graphics/Extensions/Shaders/ScreenQuad.hlsl new file mode 100644 index 000000000..6c477192d --- /dev/null +++ b/Modules/Graphics/Extensions/Shaders/ScreenQuad.hlsl @@ -0,0 +1,34 @@ +struct VSInput +{ + float3 position : POSITION; + float2 texcoord : TEXCOORD; +}; + +struct PSInput +{ + float4 position : SV_POSITION; + float2 texcoord : TEXCOORD; +}; + +struct Constants +{ + float4 blend_color; +}; + +ConstantBuffer g_constants : register(b1); +Texture2D g_texture : register(t0); +SamplerState g_sampler : register(s0); + +PSInput ScreenQuadVS(VSInput input) +{ + PSInput output; + output.position = float4(input.position, 1.0f); + output.texcoord = input.texcoord; + return output; +} + +float4 ScreenQuadPS(PSInput input) : SV_TARGET +{ + const float4 texel_color = g_texture.Sample(g_sampler, input.texcoord); + return texel_color * g_constants.blend_color; +} diff --git a/Modules/Graphics/Extensions/Shaders/SkyBox.hlsl b/Modules/Graphics/Extensions/Shaders/SkyBox.hlsl index 2e2cb92b9..7fcd0835e 100644 --- a/Modules/Graphics/Extensions/Shaders/SkyBox.hlsl +++ b/Modules/Graphics/Extensions/Shaders/SkyBox.hlsl @@ -1,30 +1,35 @@ -struct SkyboxUniforms +struct VSInput { - float4x4 mvp_matrix; + float3 position : POSITION; }; -ConstantBuffer g_skybox_uniforms : register(b1); -TextureCube g_skybox_texture : register(t1); -SamplerState g_texture_sampler : register(s1); - -struct SkyboxVSOut +struct PSInput { float4 position : SV_POSITION; float3 uvw : UVFACE; }; -SkyboxVSOut SkyboxVS(float3 in_position : POSITION) +struct Uniforms +{ + float4x4 mvp_matrix; +}; + +ConstantBuffer g_skybox_uniforms : register(b1); +TextureCube g_skybox_texture : register(t1); +SamplerState g_texture_sampler : register(s1); + +PSInput SkyboxVS(VSInput input) { - SkyboxVSOut output; + PSInput output; - output.position = mul(g_skybox_uniforms.mvp_matrix, float4(in_position, 0.0f)); + output.position = mul(g_skybox_uniforms.mvp_matrix, float4(input.position, 0.0f)); output.position.z = 0.0f; - output.uvw = in_position; + output.uvw = input.position; return output; } -float4 SkyboxPS(SkyboxVSOut input) : SV_TARGET +float4 SkyboxPS(PSInput input) : SV_TARGET { const float4 texel_color = g_skybox_texture.Sample(g_texture_sampler, input.uvw); return float4(texel_color.xyz, 1.f); diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp new file mode 100644 index 000000000..6bf43f5db --- /dev/null +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp @@ -0,0 +1,176 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/ScreenQuad.cpp +Screen Quad rendering primitive. + +******************************************************************************/ + +#include + +#include +#include +#include +#include + +namespace Methane::Graphics +{ + +struct ScreenQuadVertex +{ + Mesh::Position position; + Mesh::TexCoord texcoord; + + using FieldsArray = std::array; + static constexpr const FieldsArray layout = { + Mesh::VertexField::Position, + Mesh::VertexField::TexCoord, + }; +}; + +ScreenQuad::ScreenQuad(Context& context, Texture::Ptr sp_texture, Settings settings) + : m_settings(std::move(settings)) + , m_constants({ + m_settings.blend_color + }) + , m_debug_region_name(m_settings.name + " Screen-Quad rendering") + , m_sp_texture(std::move(sp_texture)) +{ + ITT_FUNCTION_TASK(); + + if (!m_sp_texture) + throw std::invalid_argument("Screen-quad texture can not be empty."); + + const Context::Settings& context_settings = context.GetSettings(); + + RenderState::Settings state_settings; + state_settings.sp_program = Program::Create(context, { + { + Shader::CreateVertex(context, { Data::ShaderProvider::Get(), { "ScreenQuad", "ScreenQuadVS" }, { } }), + Shader::CreatePixel( context, { Data::ShaderProvider::Get(), { "ScreenQuad", "ScreenQuadPS" }, { } }), + }, + { { { + { "input_position", "POSITION" }, + { "input_texcoord", "TEXCOORD" }, + } } }, + { "g_constants", "g_texture", "g_sampler" }, + { }, + { context_settings.color_format }, + context_settings.depth_stencil_format + }); + state_settings.sp_program->SetName(m_settings.name + " Screen-Quad Shading"); + state_settings.viewports = { GetFrameViewport(settings.screen_rect) }; + state_settings.scissor_rects = { GetFrameScissorRect(settings.screen_rect) }; + state_settings.depth.enabled = false; + state_settings.depth.write_enabled = false; + state_settings.rasterizer.is_front_counter_clockwise = true; + + // TODO: temporary solution, to be replaced with RT-blending state + state_settings.rasterizer.alpha_to_coverage_enabled = true; + + m_sp_state = RenderState::Create(context, state_settings); + m_sp_state->SetName(m_settings.name + " Screen-Quad Render State"); + + m_sp_texture_sampler = Sampler::Create(context, { + { Sampler::Filter::MinMag::Linear }, + { Sampler::Address::Mode::ClampToZero }, + }); + m_sp_texture_sampler->SetName(m_settings.name + " Screen-Quad Texture Sampler"); + m_sp_texture->SetName(m_settings.name + " Screen-Quad Texture"); + + RectMesh quad_mesh(Mesh::VertexLayoutFromArray(ScreenQuadVertex::layout), 2.f, 2.f); + + m_sp_vertex_buffer = Buffer::CreateVertexBuffer(context, static_cast(quad_mesh.GetVertexDataSize()), + static_cast(quad_mesh.GetVertexSize())); + m_sp_vertex_buffer->SetName(m_settings.name + " Screen-Quad Vertex Buffer"); + m_sp_vertex_buffer->SetData({ + { + reinterpret_cast(quad_mesh.GetVertices().data()), + static_cast(quad_mesh.GetVertexDataSize()) + } + }); + + m_sp_index_buffer = Buffer::CreateIndexBuffer(context, static_cast(quad_mesh.GetIndexDataSize()), + GetIndexFormat(quad_mesh.GetIndex(0))); + m_sp_index_buffer->SetName(m_settings.name + " Screen-Quad Index Buffer"); + m_sp_index_buffer->SetData({ + { + reinterpret_cast(quad_mesh.GetIndices().data()), + static_cast(quad_mesh.GetIndexDataSize()) + } + }); + + const Data::Size const_buffer_size = static_cast(sizeof(m_constants)); + m_sp_const_buffer = Buffer::CreateConstantBuffer(context, Buffer::GetAlignedBufferSize(const_buffer_size)); + m_sp_const_buffer->SetName(m_settings.name + " Screen-Quad Constants Buffer"); + m_sp_const_buffer->SetData({ + { + reinterpret_cast(&m_constants), + static_cast(sizeof(m_constants)) + } + }); + + m_sp_const_resource_bindings = Program::ResourceBindings::Create(state_settings.sp_program, { + { { Shader::Type::Pixel, "g_constants" }, { { m_sp_const_buffer } } }, + { { Shader::Type::Pixel, "g_texture" }, { { m_sp_texture } } }, + { { Shader::Type::Pixel, "g_sampler" }, { { m_sp_texture_sampler } } }, + }); +} + +void ScreenQuad::SetBlendColor(const Color4f& blend_color) +{ + ITT_FUNCTION_TASK(); + + if (m_settings.blend_color == blend_color) + return; + + m_settings.blend_color = blend_color; + m_constants.blend_color = blend_color; + + m_sp_const_buffer->SetData({ + { + reinterpret_cast(&m_constants), + static_cast(sizeof(m_constants)) + } + }); +} + +void ScreenQuad::SetScreenRect(const FrameRect& screen_rect) +{ + ITT_FUNCTION_TASK(); + + if (m_settings.screen_rect == screen_rect) + return; + + m_settings.screen_rect = screen_rect; + + m_sp_state->SetViewports({ GetFrameViewport(screen_rect) }); + m_sp_state->SetScissorRects({ GetFrameScissorRect(screen_rect) }); +} + +void ScreenQuad::Draw(RenderCommandList& cmd_list) const +{ + ITT_FUNCTION_TASK(); + + cmd_list.Reset(m_sp_state, m_debug_region_name); + cmd_list.SetResourceBindings(*m_sp_const_resource_bindings); + cmd_list.SetVertexBuffers({ *m_sp_vertex_buffer }); + cmd_list.DrawIndexed(RenderCommandList::Primitive::Triangle, *m_sp_index_buffer); +} + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp index 8f88d06b0..8d84cc8da 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp @@ -16,7 +16,7 @@ limitations under the License. ******************************************************************************* -FILE: SkyBox.cpp +FILE: Methane/Graphics/SkyBox.cpp SkyBox rendering primitive ******************************************************************************/ @@ -58,7 +58,7 @@ SkyBox::SkyBox(Context& context, ImageLoader& image_loader, const Settings& sett Shader::CreatePixel( context, { Data::ShaderProvider::Get(), { "SkyBox", "SkyboxPS" }, { } }), }, { { { - { "in_position", "POSITION" }, + { "input_position", "POSITION" }, } } }, { "g_skybox_texture", "g_texture_sampler" }, { }, From 7621f9750dc13b249cde55572f9c48d9472adf08 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 7 Jan 2020 20:07:07 +0300 Subject: [PATCH 083/129] Logo-badge extension implemented and integrated in tutorials and samples. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 11 ++- Apps/Samples/Asteroids/AsteroidsApp.h | 3 +- .../01-HelloTriangle/HelloTriangleApp.cpp | 15 +++- .../01-HelloTriangle/HelloTriangleApp.h | 1 + .../02-TexturedCube/TexturedCubeApp.cpp | 13 ++- .../02-TexturedCube/TexturedCubeApp.h | 1 + .../Tutorials/03-ShadowCube/ShadowCubeApp.cpp | 17 ++++ Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h | 1 + Modules/Graphics/Extensions/CMakeLists.txt | 9 ++ .../Include/Methane/Graphics/Extensions.h | 1 + .../Include/Methane/Graphics/LogoBadge.h | 67 +++++++++++++++ .../Sources/Methane/Graphics/LogoBadge.cpp | 86 +++++++++++++++++++ 12 files changed, 219 insertions(+), 6 deletions(-) create mode 100644 Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h create mode 100644 Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index cb224e4ee..cb0b7bb0d 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -185,6 +185,9 @@ void AsteroidsApp::Init() m_view_camera.Resize(static_cast(context_settings.frame_size.width), static_cast(context_settings.frame_size.height)); + // Create Methane logo badge + m_sp_logo_badge = std::make_shared(context); + // Create sky-box m_sp_sky_box = std::make_shared(context, m_image_loader, gfx::SkyBox::Settings{ m_view_camera, @@ -209,7 +212,7 @@ void AsteroidsApp::Init() m_scene_scale * 3.f, // scale 0.1f, // spin_velocity_rps true, // depth_reversed - true, // mipmapped + true, // mip-mapped -1.f, // lod_bias }); @@ -316,6 +319,7 @@ bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) frame.sp_final_screen_pass->Update(final_pass_settings); } + m_sp_logo_badge->Resize(frame_size); m_sp_sky_box->Resize(frame_size); m_sp_planet->Resize(frame_size); m_sp_asteroids_array->Resize(frame_size); @@ -385,6 +389,10 @@ bool AsteroidsApp::Render() assert(!!m_sp_sky_box); m_sp_sky_box->Draw(*frame.sp_final_cmd_list, frame.skybox); + // Logo-badge rendering + assert(!!m_sp_logo_badge); + m_sp_logo_badge->Draw(*frame.sp_final_cmd_list); + frame.sp_final_cmd_list->Commit(true); execute_cmd_lists.push_back(*frame.sp_final_cmd_list); @@ -405,6 +413,7 @@ void AsteroidsApp::OnContextReleased() } m_animations.clear(); + m_sp_logo_badge.reset(); m_sp_sky_box.reset(); m_sp_planet.reset(); m_sp_asteroids_array.reset(); diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 8132dc8b9..2927779b2 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -25,10 +25,8 @@ Sample demonstrating parallel rendering of the distinct asteroids massive #include "Planet.h" #include "AsteroidsArray.h" -#include "AsteroidsAppController.h" #include -#include namespace Methane::Samples { @@ -98,6 +96,7 @@ class AsteroidsApp final : public GraphicsApp SceneUniforms m_scene_uniforms = { }; gfx::Buffer::Ptr m_sp_const_buffer; + gfx::LogoBadge::Ptr m_sp_logo_badge; gfx::SkyBox::Ptr m_sp_sky_box; Planet::Ptr m_sp_planet; AsteroidsArray::Ptr m_sp_asteroids_array; diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp index 67867d5b0..8eb5c45a1 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp @@ -49,7 +49,7 @@ static const GraphicsApp::Settings g_app_settings = // Application settings }; HelloTriangleApp::HelloTriangleApp() - : GraphicsApp(g_app_settings, gfx::RenderPass::Access::None) + : GraphicsApp(g_app_settings, gfx::RenderPass::Access::ShaderResources | gfx::RenderPass::Access::Samplers) , m_triangle_vertices({{ { { 0.0f, 0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f } }, { { 0.5f, -0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f } }, @@ -70,6 +70,9 @@ void HelloTriangleApp::Init() assert(m_sp_context); + // Create Methane logo badge + m_sp_logo_badge = std::make_shared(*m_sp_context); + // Create triangle shading program m_sp_program = gfx::Program::Create(*m_sp_context, { { // shaders @@ -131,6 +134,8 @@ bool HelloTriangleApp::Resize(const gfx::FrameSize& frame_size, bool is_minimize assert(m_sp_state); m_sp_state->SetViewports( { gfx::GetFrameViewport(frame_size) } ); m_sp_state->SetScissorRects( { gfx::GetFrameScissorRect(frame_size) } ); + m_sp_logo_badge->Resize(frame_size); + return true; } @@ -153,9 +158,15 @@ bool HelloTriangleApp::Render() frame.sp_cmd_list->Reset(m_sp_state, "Cube redering"); frame.sp_cmd_list->SetVertexBuffers({ *m_sp_vertex_buffer }); frame.sp_cmd_list->Draw(gfx::RenderCommandList::Primitive::Triangle, static_cast(m_triangle_vertices.size())); + + // Draw Methane logo badge + assert(!!m_sp_logo_badge); + m_sp_logo_badge->Draw(*frame.sp_cmd_list); + + // Commit command list with present flag frame.sp_cmd_list->Commit(true); - // Present frame to screen + // Execute command list on render queue and present frame to screen m_sp_context->GetRenderCommandQueue().Execute({ *frame.sp_cmd_list }); m_sp_context->Present(); diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h index cfbc635a4..ca766a193 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h @@ -66,6 +66,7 @@ class HelloTriangleApp final : public GraphicsApp using Vertices = std::array; const Vertices m_triangle_vertices; + gfx::LogoBadge::Ptr m_sp_logo_badge; gfx::Program::Ptr m_sp_program; gfx::RenderState::Ptr m_sp_state; gfx::Buffer::Ptr m_sp_vertex_buffer; diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp index 58f8dc5a3..921862b04 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp @@ -93,6 +93,9 @@ void TexturedCubeApp::Init() m_camera.Resize(static_cast(context_settings.frame_size.width), static_cast(context_settings.frame_size.height)); + // Create Methane logo badge + m_sp_logo_badge = std::make_shared(*m_sp_context); + // Create cube shading program m_sp_program = gfx::Program::Create(*m_sp_context, { { // shaders @@ -198,6 +201,8 @@ bool TexturedCubeApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized m_sp_state->SetScissorRects({ gfx::GetFrameScissorRect(frame_size) }); m_camera.Resize(static_cast(frame_size.width), static_cast(frame_size.height)); + m_sp_logo_badge->Resize(frame_size); + return true; } @@ -245,9 +250,15 @@ bool TexturedCubeApp::Render() frame.sp_cmd_list->SetResourceBindings(*frame.sp_resource_bindings); frame.sp_cmd_list->SetVertexBuffers({ *m_sp_vertex_buffer }); frame.sp_cmd_list->DrawIndexed(gfx::RenderCommandList::Primitive::Triangle, *m_sp_index_buffer); + + // Draw Methane logo badge + assert(!!m_sp_logo_badge); + m_sp_logo_badge->Draw(*frame.sp_cmd_list); + + // Commit command list with present flag frame.sp_cmd_list->Commit(true); - // Present frame to screen + // Execute command list on render queue and present frame to screen m_sp_context->GetRenderCommandQueue().Execute({ *frame.sp_cmd_list }); m_sp_context->Present(); diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h index 34ac44f7d..9f12b5981 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h @@ -97,6 +97,7 @@ class TexturedCubeApp final : public GraphicsApp gfx::Camera m_camera; gfx::BoxMesh m_cube_mesh; float m_cube_scale; + gfx::LogoBadge::Ptr m_sp_logo_badge; gfx::Program::Ptr m_sp_program; gfx::RenderState::Ptr m_sp_state; gfx::Buffer::Ptr m_sp_vertex_buffer; diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp index 8710e7032..740998310 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp @@ -96,6 +96,9 @@ void ShadowCubeApp::Init() assert(m_sp_context); const gfx::Context::Settings& context_settings = m_sp_context->GetSettings(); + // Create Methane logo badge + m_sp_logo_badge = std::make_shared(*m_sp_context); + // Load textures, vertex and index buffers for cube and floor meshes m_sp_cube_buffers = std::make_unique(*m_sp_context, m_cube_mesh, "Cube"); m_sp_cube_buffers->SetSubsetTexture(m_image_loader.LoadImageToTexture2D(*m_sp_context, "Textures/MethaneBubbles.jpg", true)); @@ -327,6 +330,10 @@ bool ShadowCubeApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) m_final_pass.sp_state->SetScissorRects({ gfx::GetFrameScissorRect(frame_size) }); m_view_camera.Resize(static_cast(frame_size.width), static_cast(frame_size.height)); + + assert(!!m_sp_logo_badge); + m_sp_logo_badge->Resize(frame_size); + return true; } @@ -426,6 +433,7 @@ void ShadowCubeApp::RenderScene(const RenderPass &render_pass, ShadowCubeFrame:: assert(!!render_pass_resources.sp_cmd_list); gfx::RenderCommandList& cmd_list = *render_pass_resources.sp_cmd_list; + // Reset command list with initial rendering state assert(!!render_pass.sp_state); cmd_list.Reset(render_pass.sp_state, render_pass.command_group_name); @@ -439,6 +447,14 @@ void ShadowCubeApp::RenderScene(const RenderPass &render_pass, ShadowCubeFrame:: assert(!!m_sp_floor_buffers); m_sp_floor_buffers->Draw(cmd_list, *render_pass_resources.floor.sp_resource_bindings); + if (render_pass.is_final_pass) + { + // Draw Methane logo badge + assert(!!m_sp_logo_badge); + m_sp_logo_badge->Draw(cmd_list); + } + + // Commit command list with present flag in case of final render pass cmd_list.Commit(render_pass.is_final_pass); } @@ -447,6 +463,7 @@ void ShadowCubeApp::OnContextReleased() m_final_pass.Release(); m_shadow_pass.Release(); + m_sp_logo_badge.reset(); m_sp_floor_buffers.reset(); m_sp_cube_buffers.reset(); m_sp_shadow_sampler.reset(); diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h index c61aba385..2023d672d 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h @@ -141,6 +141,7 @@ class ShadowCubeApp final : public GraphicsApp gfx::Camera m_view_camera; gfx::Camera m_light_camera; + gfx::LogoBadge::Ptr m_sp_logo_badge; gfx::Buffer::Ptr m_sp_const_buffer; gfx::Sampler::Ptr m_sp_texture_sampler; gfx::Sampler::Ptr m_sp_shadow_sampler; diff --git a/Modules/Graphics/Extensions/CMakeLists.txt b/Modules/Graphics/Extensions/CMakeLists.txt index 20c35e52d..632c91f33 100644 --- a/Modules/Graphics/Extensions/CMakeLists.txt +++ b/Modules/Graphics/Extensions/CMakeLists.txt @@ -1,6 +1,7 @@ set(TARGET MethaneGraphicsExtensions) include(MethaneShaders) +include(MethaneResources) get_module_dirs("Methane/Graphics") @@ -10,12 +11,14 @@ set(HEADERS ${INCLUDE_DIR}/MeshBuffers.hpp ${INCLUDE_DIR}/SkyBox.h ${INCLUDE_DIR}/ScreenQuad.h + ${INCLUDE_DIR}/LogoBadge.h ) set(SOURCES ${SOURCES_DIR}/ImageLoader.cpp ${SOURCES_DIR}/SkyBox.cpp ${SOURCES_DIR}/ScreenQuad.cpp + ${SOURCES_DIR}/LogoBadge.cpp ) set(HLSL_SOURCES @@ -23,12 +26,18 @@ set(HLSL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Shaders/ScreenQuad.hlsl ) +set(IMAGES_DIR ${RESOURCES_DIR}/Images) +set(TEXTURES + ${IMAGES_DIR}/Logo/MethaneLogoNameWatermark.png +) + add_library(${TARGET} STATIC ${HEADERS} ${SOURCES} ) add_methane_shaders(${TARGET} "${HLSL_SOURCES}") +add_methane_embedded_textures(${TARGET} "${IMAGES_DIR}" "${TEXTURES}") target_link_libraries(${TARGET} MethanePlatformUtils diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/Extensions.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/Extensions.h index fc4c95d42..14a8b893c 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/Extensions.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/Extensions.h @@ -27,3 +27,4 @@ Methane graphics extensions: all headers under one umbrella. #include "MeshBuffers.hpp" #include "SkyBox.h" #include "ScreenQuad.h" +#include "LogoBadge.h" diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h new file mode 100644 index 000000000..1cce6452d --- /dev/null +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h @@ -0,0 +1,67 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/LogoBadge.h +Logo badge rendering primitive. + +******************************************************************************/ + +#pragma once + +#include "ScreenQuad.h" + +#include + +namespace Methane::Graphics +{ + +class ImageLoader; + +class LogoBadge : public ScreenQuad +{ +public: + using Ptr = std::shared_ptr; + + enum class FrameCorner : uint32_t + { + TopLeft = 0u, + TopRight, + BottomRight, + BottomLeft + }; + + struct Settings + { + FrameSize size = FrameSize(128u, 128u); + FrameCorner corner = FrameCorner::TopRight; + uint32_t margins = 10u; + }; + + LogoBadge(Context& context, Settings settings = Settings()); + LogoBadge(Context& context, Texture::Ptr sp_texture, Settings settings = Settings()); + + void Resize(const FrameSize& frame_size); + +private: + static FrameRect GetBadgeRectInFrame(const FrameSize& frame_size, FrameCorner frame_corner, + const FrameSize& badge_size, uint32_t badge_margins); + + const Settings m_settings; +}; + +} // namespace Methane::Graphics diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp new file mode 100644 index 000000000..386b4ef28 --- /dev/null +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp @@ -0,0 +1,86 @@ +/****************************************************************************** + +Copyright 2019 Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: Methane/Graphics/ScreenQuad.cpp +Logo badge rendering primitive. + +******************************************************************************/ + +#include + +#include +#include +#include + +namespace Methane::Graphics +{ + +LogoBadge::LogoBadge(Context& context, Settings settings) + : LogoBadge(context, + ImageLoader(Data::TextureProvider::Get()).LoadImageToTexture2D(context, "Logo/MethaneLogoNameWatermark.png", true), + settings) +{ + ITT_FUNCTION_TASK(); +} + +LogoBadge::LogoBadge(Context& context, Texture::Ptr sp_texture, Settings settings) + : ScreenQuad(context, std::move(sp_texture), + ScreenQuad::Settings + { + "Logo Badge", + GetBadgeRectInFrame(context.GetSettings().frame_size, settings.corner, settings.size, settings.margins), + Color4f(1.f, 1.f, 1.f, 1.f) + }) + , m_settings(std::move(settings)) +{ + ITT_FUNCTION_TASK(); +} + +void LogoBadge::Resize(const FrameSize& frame_size) +{ + ITT_FUNCTION_TASK(); + SetScreenRect(GetBadgeRectInFrame(frame_size, m_settings.corner, m_settings.size, m_settings.margins)); +} + +FrameRect LogoBadge::GetBadgeRectInFrame(const FrameSize& frame_size, FrameCorner frame_corner, + const FrameSize& badge_size, uint32_t badge_margins) +{ + ITT_FUNCTION_TASK(); + + switch(frame_corner) + { + case FrameCorner::TopLeft: + return FrameRect{ FrameRect::Point(badge_margins, badge_margins), badge_size }; + + case FrameCorner::TopRight: + return FrameRect{ FrameRect::Point(frame_size.width - badge_size.width - badge_margins, badge_margins), badge_size }; + + case FrameCorner::BottomLeft: + return FrameRect{ FrameRect::Point(badge_margins, frame_size.height - badge_size.height - badge_margins), badge_size }; + + case FrameCorner::BottomRight: + return FrameRect{ + FrameRect::Point( + frame_size.width - badge_size.width - badge_margins, + frame_size.height - badge_size.height - badge_margins), + badge_size + }; + } +} + +} // namespace Methane::Graphics From 35ebdb5627e0dab2a854534cd773bcd559637500 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 7 Jan 2020 20:42:09 +0300 Subject: [PATCH 084/129] Fixed MacOS build and scissor rect usage. --- .../Sources/Methane/Graphics/DirectX12/TypesDX.cpp | 3 ++- .../Graphics/Core/Sources/Methane/Graphics/Types.cpp | 6 +++--- .../Extensions/Include/Methane/Graphics/LogoBadge.h | 12 +++++++++--- .../Extensions/Include/Methane/Graphics/ScreenQuad.h | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TypesDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TypesDX.cpp index e5dabeeb3..fd92f28f9 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TypesDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/TypesDX.cpp @@ -42,7 +42,8 @@ CD3DX12_RECT TypeConverterDX::ScissorRectToD3D(const ScissorRect& scissor_rect) { ITT_FUNCTION_TASK(); return CD3DX12_RECT(static_cast(scissor_rect.origin.x()), static_cast(scissor_rect.origin.y()), - static_cast(scissor_rect.size.width), static_cast(scissor_rect.size.height)); + static_cast(scissor_rect.origin.x() + scissor_rect.size.width), + static_cast(scissor_rect.origin.y() + scissor_rect.size.height)); } std::vector TypeConverterDX::ViewportsToD3D(const Viewports& viewports) noexcept diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Types.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Types.cpp index f9885e25b..d6817d075 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Types.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Types.cpp @@ -33,10 +33,10 @@ ScissorRect GetFrameScissorRect(const FrameRect& frame_rect) { ITT_FUNCTION_TASK(); return ScissorRect{ - ScissorRect::Point(static_cast(std::max(0, frame_rect.origin.x())), + ScissorRect::Point(static_cast(std::max(0, frame_rect.origin.x())), static_cast(std::max(0, frame_rect.origin.y()))), - ScissorRect::Size(frame_rect.size.width + frame_rect.origin.x(), - frame_rect.size.height + frame_rect.origin.y()) + ScissorRect::Size(frame_rect.origin.x() >= 0 ? frame_rect.size.width : frame_rect.size.width + frame_rect.origin.x(), + frame_rect.origin.y() >= 0 ? frame_rect.size.height : frame_rect.size.height + frame_rect.origin.y()) }; } diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h index 1cce6452d..3a34500a7 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h @@ -47,9 +47,15 @@ class LogoBadge : public ScreenQuad struct Settings { - FrameSize size = FrameSize(128u, 128u); - FrameCorner corner = FrameCorner::TopRight; - uint32_t margins = 10u; + FrameSize size; + FrameCorner corner; + uint32_t margins; + + Settings() + : size(128u, 128u) + , corner(FrameCorner::TopRight) + , margins(10u) + { } }; LogoBadge(Context& context, Settings settings = Settings()); diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h index ac905056f..ba58b9f57 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h @@ -37,7 +37,7 @@ ScreenQuad rendering primitive. namespace Methane::Graphics { -class RenderCommandList; +struct RenderCommandList; class ScreenQuad { From be0fc2707316729f3ab9400eb64e421de94e2330 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 7 Jan 2020 21:09:10 +0300 Subject: [PATCH 085/129] Fixed Windows build in VS2017. --- .../Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h index ba58b9f57..c4b7f0271 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h @@ -59,7 +59,7 @@ class ScreenQuad void Draw(RenderCommandList& cmd_list) const; private: - struct SHADER_STRUCT_ALIGN Constants + struct Constants { SHADER_FIELD_ALIGN Color4f blend_color; }; From e94a18e803562bfcfaf900d6813787bc81b7ecaf Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 7 Jan 2020 22:28:01 +0300 Subject: [PATCH 086/129] Finally fixed Windows build in VS2017. --- .../Include/Methane/Graphics/ScreenQuad.h | 6 +-- .../Sources/Methane/Graphics/LogoBadge.cpp | 2 + .../Sources/Methane/Graphics/ScreenQuad.cpp | 40 +++++++++++-------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h index c4b7f0271..898809bc6 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h @@ -59,13 +59,9 @@ class ScreenQuad void Draw(RenderCommandList& cmd_list) const; private: - struct Constants - { - SHADER_FIELD_ALIGN Color4f blend_color; - }; + void UpdateConstantsBuffer() const; Settings m_settings; - Constants m_constants; const std::string m_debug_region_name; RenderState::Ptr m_sp_state; Buffer::Ptr m_sp_vertex_buffer; diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp index 386b4ef28..ad36cae4f 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp @@ -81,6 +81,8 @@ FrameRect LogoBadge::GetBadgeRectInFrame(const FrameSize& frame_size, FrameCorne badge_size }; } + + return FrameRect(); } } // namespace Methane::Graphics diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp index 6bf43f5db..4d86bb21c 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp @@ -31,6 +31,11 @@ Screen Quad rendering primitive. namespace Methane::Graphics { +struct SHADER_STRUCT_ALIGN ScreenQuadConstants +{ + SHADER_FIELD_ALIGN Color4f blend_color; +}; + struct ScreenQuadVertex { Mesh::Position position; @@ -45,9 +50,6 @@ struct ScreenQuadVertex ScreenQuad::ScreenQuad(Context& context, Texture::Ptr sp_texture, Settings settings) : m_settings(std::move(settings)) - , m_constants({ - m_settings.blend_color - }) , m_debug_region_name(m_settings.name + " Screen-Quad rendering") , m_sp_texture(std::move(sp_texture)) { @@ -115,21 +117,17 @@ ScreenQuad::ScreenQuad(Context& context, Texture::Ptr sp_texture, Settings setti } }); - const Data::Size const_buffer_size = static_cast(sizeof(m_constants)); + const Data::Size const_buffer_size = static_cast(sizeof(ScreenQuadConstants)); m_sp_const_buffer = Buffer::CreateConstantBuffer(context, Buffer::GetAlignedBufferSize(const_buffer_size)); m_sp_const_buffer->SetName(m_settings.name + " Screen-Quad Constants Buffer"); - m_sp_const_buffer->SetData({ - { - reinterpret_cast(&m_constants), - static_cast(sizeof(m_constants)) - } - }); m_sp_const_resource_bindings = Program::ResourceBindings::Create(state_settings.sp_program, { { { Shader::Type::Pixel, "g_constants" }, { { m_sp_const_buffer } } }, { { Shader::Type::Pixel, "g_texture" }, { { m_sp_texture } } }, { { Shader::Type::Pixel, "g_sampler" }, { { m_sp_texture_sampler } } }, }); + + UpdateConstantsBuffer(); } void ScreenQuad::SetBlendColor(const Color4f& blend_color) @@ -140,14 +138,8 @@ void ScreenQuad::SetBlendColor(const Color4f& blend_color) return; m_settings.blend_color = blend_color; - m_constants.blend_color = blend_color; - m_sp_const_buffer->SetData({ - { - reinterpret_cast(&m_constants), - static_cast(sizeof(m_constants)) - } - }); + UpdateConstantsBuffer(); } void ScreenQuad::SetScreenRect(const FrameRect& screen_rect) @@ -173,4 +165,18 @@ void ScreenQuad::Draw(RenderCommandList& cmd_list) const cmd_list.DrawIndexed(RenderCommandList::Primitive::Triangle, *m_sp_index_buffer); } +void ScreenQuad::UpdateConstantsBuffer() const +{ + ScreenQuadConstants constants = { + m_settings.blend_color + }; + + m_sp_const_buffer->SetData({ + { + reinterpret_cast(&constants), + static_cast(sizeof(constants)) + } + }); +} + } // namespace Methane::Graphics From 8c6289c52957a39acf6c388cd65436c9773d4056 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 16:19:23 +0300 Subject: [PATCH 087/129] Blending state settings added to RenderState and enabled with DirectX on Windows. --- .../Include/Methane/Graphics/RenderState.h | 90 ++++++++++++++- .../Core/Include/Methane/Graphics/Types.h | 4 +- .../Graphics/DirectX12/RenderStateDX.cpp | 106 +++++++++++++++++- .../Graphics/DirectX12/RenderStateDX.h | 1 + .../Methane/Graphics/RenderStateBase.cpp | 62 ++++++++-- 5 files changed, 241 insertions(+), 22 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h b/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h index 3158604b7..19c23ca0f 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h @@ -62,11 +62,83 @@ struct RenderState : virtual Object FillMode fill_mode = FillMode::Solid; uint32_t sample_count = 1; bool alpha_to_coverage_enabled = false; - bool alpha_to_one_enabled = false; bool operator==(const Rasterizer& other) const noexcept; bool operator!=(const Rasterizer& other) const noexcept; }; + + struct Blending + { + struct ColorChannel + { + using Mask = uint32_t; + enum Value : Mask + { + None = 0u, + Red = 1u << 0u, + Green = 1u << 1u, + Blue = 1u << 2u, + Alpha = 1u << 3u, + All = ~0u, + }; + + ColorChannel() = delete; + }; + + enum class Operation : uint32_t + { + Add = 0u, + Subtract, + ReverseSubtract, + Minimum, + Maximum, + }; + + enum class Factor : uint32_t + { + Zero = 0u, + One, + SourceColor, + OneMinusSourceColor, + SourceAlpha, + OneMinusSourceAlpha, + DestinationColor, + OneMinusDestinationColor, + DestinationAlpha, + OneMinusDestinationAlpha, + SourceAlphaSaturated, + BlendColor, + OneMinusBlendColor, + BlendAlpha, + OneMinusBlendAlpha, + Source1Color, + OneMinusSource1Color, + Source1Alpha, + OneMinusSource1Alpha + }; + + struct RenderTarget + { + bool blend_enabled = false; + ColorChannel::Mask write_mask = ColorChannel::All; + Operation rgb_blend_op = Operation::Add; + Operation alpha_blend_op = Operation::Add; + Factor source_rgb_blend_factor = Factor::One; + Factor source_alpha_blend_factor = Factor::One; + Factor dest_rgb_blend_factor = Factor::Zero; + Factor dest_alpha_blend_factor = Factor::Zero; + + bool operator==(const RenderTarget& other) const noexcept; + bool operator!=(const RenderTarget& other) const noexcept; + }; + + // NOTE: If is_independent set to false, only the render_targets[0] members are used + bool is_independent = false; + std::array render_targets; + + bool operator==(const Blending& other) const noexcept; + bool operator!=(const Blending& other) const noexcept; + }; struct Depth { @@ -121,11 +193,12 @@ struct RenderState : virtual Object { None = 0u, Program = 1u << 0u, - ProgramBindingsOnly = 1u << 1u, - Rasterizer = 1u << 2u, - DepthStencil = 1u << 3u, - Viewports = 1u << 4u, - ScissorRects = 1u << 5u, + Rasterizer = 1u << 1u, + Blending = 1u << 2u, + BlendingColor = 1u << 3u, + DepthStencil = 1u << 4u, + Viewports = 1u << 5u, + ScissorRects = 1u << 6u, All = ~0u }; @@ -134,12 +207,17 @@ struct RenderState : virtual Object struct Settings { + // NOTE: members are ordered by the usage frequency, + // for convenient setup with initializer lists + // (default states may be skipped at initialization) Program::Ptr sp_program; Viewports viewports; ScissorRects scissor_rects; Rasterizer rasterizer; Depth depth; Stencil stencil; + Blending blending; + Color4f blending_color; static Group::Mask Compare(const Settings& left, const Settings& right, Group::Mask compare_groups = Group::All) noexcept; }; diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h index 899e62a87..39bc8312e 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Types.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Types.h @@ -156,8 +156,8 @@ class Color4f : public Vector4f public: using Vector4f::Vector4f; using Vector4f::operator=; - - Color4f() = default; + + Color4f() : Vector4f(0.f, 0.f, 0.f, 0.f) { } Color4f(float r, float g, float b, float a) : Vector4f(r, g, b, a) { } float r() const noexcept { return (*this)[0]; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp index c7dde8230..5c4c4f956 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp @@ -84,6 +84,74 @@ static D3D12_CULL_MODE ConvertRasterizerCullModeToD3D12(RenderState::Rasterizer: return D3D12_CULL_MODE_NONE; } +static UINT8 ConvertRenderTargetWriteMaskToD3D12(RenderState::Blending::ColorChannel::Mask rt_write_mask) +{ + ITT_FUNCTION_TASK(); + + using ColorChannel = RenderState::Blending::ColorChannel; + + UINT8 d3d12_color_write_mask = 0; + if (rt_write_mask & ColorChannel::Red) + d3d12_color_write_mask |= D3D12_COLOR_WRITE_ENABLE_RED; + if (rt_write_mask & ColorChannel::Green) + d3d12_color_write_mask |= D3D12_COLOR_WRITE_ENABLE_GREEN; + if (rt_write_mask & ColorChannel::Blue) + d3d12_color_write_mask |= D3D12_COLOR_WRITE_ENABLE_BLUE; + if (rt_write_mask & ColorChannel::Alpha) + d3d12_color_write_mask |= D3D12_COLOR_WRITE_ENABLE_ALPHA; + return d3d12_color_write_mask; +}; + +static D3D12_BLEND_OP ConvertBlendingOperationToD3D12(RenderState::Blending::Operation blend_operation) +{ + ITT_FUNCTION_TASK(); + + using BlendOp = RenderState::Blending::Operation; + + switch(blend_operation) + { + case BlendOp::Add: return D3D12_BLEND_OP_ADD; + case BlendOp::Subtract: return D3D12_BLEND_OP_SUBTRACT; + case BlendOp::ReverseSubtract: return D3D12_BLEND_OP_REV_SUBTRACT; + case BlendOp::Minimum: return D3D12_BLEND_OP_MIN; + case BlendOp::Maximum: return D3D12_BLEND_OP_MAX; + default: assert(0); + } + return D3D12_BLEND_OP_ADD; +} + +static D3D12_BLEND ConvertBlendingFactorToD3D12(RenderState::Blending::Factor blend_factor) +{ + ITT_FUNCTION_TASK(); + + using BlendFactor = RenderState::Blending::Factor; + + switch (blend_factor) + { + case BlendFactor::Zero: return D3D12_BLEND_ZERO; + case BlendFactor::One: return D3D12_BLEND_ONE; + case BlendFactor::SourceColor: return D3D12_BLEND_SRC_COLOR; + case BlendFactor::OneMinusSourceColor: return D3D12_BLEND_INV_SRC_COLOR; + case BlendFactor::SourceAlpha: return D3D12_BLEND_SRC_ALPHA; + case BlendFactor::OneMinusSourceAlpha: return D3D12_BLEND_INV_SRC_ALPHA; + case BlendFactor::DestinationColor: return D3D12_BLEND_DEST_COLOR; + case BlendFactor::OneMinusDestinationColor: return D3D12_BLEND_INV_DEST_COLOR; + case BlendFactor::DestinationAlpha: return D3D12_BLEND_DEST_ALPHA; + case BlendFactor::OneMinusDestinationAlpha: return D3D12_BLEND_INV_DEST_ALPHA; + case BlendFactor::SourceAlphaSaturated: return D3D12_BLEND_SRC_ALPHA_SAT; + case BlendFactor::BlendColor: return D3D12_BLEND_BLEND_FACTOR; + case BlendFactor::OneMinusBlendColor: return D3D12_BLEND_INV_BLEND_FACTOR; + case BlendFactor::BlendAlpha: return D3D12_BLEND_BLEND_FACTOR; + case BlendFactor::OneMinusBlendAlpha: return D3D12_BLEND_INV_BLEND_FACTOR; + case BlendFactor::Source1Color: return D3D12_BLEND_SRC1_COLOR; + case BlendFactor::OneMinusSource1Color: return D3D12_BLEND_INV_SRC1_COLOR; + case BlendFactor::Source1Alpha: return D3D12_BLEND_SRC1_ALPHA; + case BlendFactor::OneMinusSource1Alpha: return D3D12_BLEND_INV_SRC1_ALPHA; + default: assert(0); + } + return D3D12_BLEND_ZERO; +} + static D3D12_STENCIL_OP ConvertStencilOperationToD3D12(RenderState::Stencil::Operation operation) { ITT_FUNCTION_TASK(); @@ -148,10 +216,32 @@ void RenderStateDX::Reset(const Settings& settings) rasterizer_desc.MultisampleEnable = m_settings.rasterizer.sample_count > 1; rasterizer_desc.ForcedSampleCount = !m_settings.depth.enabled && !m_settings.stencil.enabled ? m_settings.rasterizer.sample_count : 0; + // Set Blending state descriptor CD3DX12_BLEND_DESC blend_desc(D3D12_DEFAULT); blend_desc.AlphaToCoverageEnable = m_settings.rasterizer.alpha_to_coverage_enabled; - blend_desc.IndependentBlendEnable = FALSE; - // TODO: impulate setting m_settings.rasterizer.alpha_to_one_enabled + blend_desc.IndependentBlendEnable = m_settings.blending.is_independent; + + uint32_t rt_index = 0; + for (const Blending::RenderTarget& render_target : m_settings.blending.render_targets) + { + // Set render target blending descriptor + D3D12_RENDER_TARGET_BLEND_DESC& rt_blend_desc = blend_desc.RenderTarget[rt_index++]; + rt_blend_desc.BlendEnable = render_target.blend_enabled; + rt_blend_desc.RenderTargetWriteMask = ConvertRenderTargetWriteMaskToD3D12(render_target.write_mask); + rt_blend_desc.BlendOp = ConvertBlendingOperationToD3D12(render_target.rgb_blend_op); + rt_blend_desc.BlendOpAlpha = ConvertBlendingOperationToD3D12(render_target.alpha_blend_op); + rt_blend_desc.SrcBlend = ConvertBlendingFactorToD3D12(render_target.source_rgb_blend_factor); + rt_blend_desc.SrcBlendAlpha = ConvertBlendingFactorToD3D12(render_target.source_alpha_blend_factor); + rt_blend_desc.DestBlend = ConvertBlendingFactorToD3D12(render_target.dest_rgb_blend_factor); + rt_blend_desc.DestBlendAlpha = ConvertBlendingFactorToD3D12(render_target.dest_alpha_blend_factor); + } + + // Set blending factor + assert(m_settings.blending_color.size() <= 4); + for (uint32_t component_index = 0; component_index < m_settings.blending_color.size(); ++component_index) + { + m_blend_factor[component_index] = m_settings.blending_color[component_index]; + } // Set depth and stencil state descriptor CD3DX12_DEPTH_STENCIL_DESC depth_stencil_desc(D3D12_DEFAULT); @@ -206,14 +296,14 @@ void RenderStateDX::Apply(RenderCommandListBase& command_list, Group::Mask state if (state_groups & Group::Program || state_groups & Group::Rasterizer || + state_groups & Group::Blending || state_groups & Group::DepthStencil) { cp_dx_command_list->SetPipelineState(GetNativePipelineState().Get()); } - if (state_groups & Group::ProgramBindingsOnly) - { - cp_dx_command_list->SetGraphicsRootSignature(GetProgramDX().GetNativeRootSignature().Get()); - } + + cp_dx_command_list->SetGraphicsRootSignature(GetProgramDX().GetNativeRootSignature().Get()); + if (state_groups & Group::Viewports) { cp_dx_command_list->RSSetViewports(static_cast(m_viewports.size()), m_viewports.data()); @@ -222,6 +312,10 @@ void RenderStateDX::Apply(RenderCommandListBase& command_list, Group::Mask state { cp_dx_command_list->RSSetScissorRects(static_cast(m_scissor_rects.size()), m_scissor_rects.data()); } + if (state_groups & Group::BlendingColor) + { + cp_dx_command_list->OMSetBlendFactor(m_blend_factor); + } } void RenderStateDX::SetViewports(const Viewports& viewports) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.h index 6c46a5ad8..587f19324 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.h @@ -65,6 +65,7 @@ class RenderStateDX final : public RenderStateBase wrl::ComPtr m_cp_pipeline_state; std::vector m_viewports; std::vector m_scissor_rects; + float m_blend_factor[4] = { 0.0, 0.0, 0.0, 0.0 }; }; } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp index a00954ed6..cc9f326e4 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/RenderStateBase.cpp @@ -32,43 +32,79 @@ namespace Methane::Graphics bool RenderState::Rasterizer::operator==(const Rasterizer& other) const noexcept { - return std::tie(is_front_counter_clockwise, cull_mode, fill_mode, sample_count, alpha_to_coverage_enabled, alpha_to_one_enabled) == - std::tie(other.is_front_counter_clockwise, other.cull_mode, other.fill_mode, other.sample_count, other.alpha_to_coverage_enabled, other.alpha_to_one_enabled); + ITT_FUNCTION_TASK(); + return std::tie(is_front_counter_clockwise, cull_mode, fill_mode, sample_count, alpha_to_coverage_enabled) == + std::tie(other.is_front_counter_clockwise, other.cull_mode, other.fill_mode, other.sample_count, other.alpha_to_coverage_enabled); } bool RenderState::Rasterizer::operator!=(const Rasterizer& other) const noexcept { + ITT_FUNCTION_TASK(); + return !operator==(other); +} + +bool RenderState::Blending::RenderTarget::operator==(const RenderTarget& other) const noexcept +{ + ITT_FUNCTION_TASK(); + return std::tie(blend_enabled, write_mask, rgb_blend_op, alpha_blend_op, + source_rgb_blend_factor, source_alpha_blend_factor, dest_rgb_blend_factor, dest_alpha_blend_factor) == + std::tie(other.blend_enabled, other.write_mask, other.rgb_blend_op, other.alpha_blend_op, + other.source_rgb_blend_factor, other.source_alpha_blend_factor, other.dest_rgb_blend_factor, other.dest_alpha_blend_factor); +} + +bool RenderState::Blending::RenderTarget::operator!=(const RenderTarget& other) const noexcept +{ + ITT_FUNCTION_TASK(); + return !operator==(other); +} + +bool RenderState::Blending::operator==(const Blending& other) const noexcept +{ + ITT_FUNCTION_TASK(); + return std::tie(is_independent, render_targets) == + std::tie(other.is_independent, other.render_targets); +} + +bool RenderState::Blending::operator!=(const Blending& other) const noexcept +{ + ITT_FUNCTION_TASK(); return !operator==(other); } bool RenderState::Depth::operator==(const Depth& other) const noexcept { + ITT_FUNCTION_TASK(); return std::tie(enabled, write_enabled, compare) == std::tie(other.enabled, other.write_enabled, other.compare); } bool RenderState::Depth::operator!=(const Depth& other) const noexcept { + ITT_FUNCTION_TASK(); return !operator==(other); } bool RenderState::Stencil::FaceOperations::operator==(const FaceOperations& other) const noexcept { + ITT_FUNCTION_TASK(); return std::tie(stencil_failure, stencil_pass, depth_failure, depth_stencil_pass, compare) == std::tie(other.stencil_failure, other.stencil_pass, other.depth_failure, other.depth_stencil_pass, other.compare); } bool RenderState::Stencil::FaceOperations::operator!=(const FaceOperations& other) const noexcept { + ITT_FUNCTION_TASK(); return !operator==(other); } bool RenderState::Stencil::operator==(const Stencil& other) const noexcept { + ITT_FUNCTION_TASK(); return std::tie(enabled, read_mask, write_mask, front_face, back_face) == std::tie(other.enabled, other.read_mask, other.write_mask, other.front_face, other.back_face); } bool RenderState::Stencil::operator!=(const Stencil& other) const noexcept { + ITT_FUNCTION_TASK(); return !operator==(other); } @@ -76,24 +112,34 @@ RenderState::Group::Mask RenderState::Settings::Compare(const Settings& left, co { ITT_FUNCTION_TASK(); - Group::Mask changed_state_groups = Group::ProgramBindingsOnly; + Group::Mask changed_state_groups = Group::None; if (compare_groups & Group::Program && left.sp_program.get() != right.sp_program.get()) { changed_state_groups |= Group::Program; } + if (compare_groups & Group::Rasterizer && + left.rasterizer != right.rasterizer) + { + changed_state_groups |= Group::Rasterizer; + } + if (compare_groups & Group::Blending && + left.blending != right.blending) + { + changed_state_groups |= Group::Blending; + } + if (compare_groups & Group::BlendingColor && + left.blending_color != right.blending_color) + { + changed_state_groups |= Group::BlendingColor; + } if (compare_groups & Group::DepthStencil && ( left.depth != right.depth || left.stencil != right.stencil)) { changed_state_groups |= Group::DepthStencil; } - if (compare_groups & Group::Rasterizer && - left.rasterizer != right.rasterizer) - { - changed_state_groups |= Group::Rasterizer; - } if (compare_groups & Group::Viewports && left.viewports != right.viewports) { From 8e9f1ecb1bdfa27fe419d1903eb6bc7ea9809977 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 16:20:01 +0300 Subject: [PATCH 088/129] Alpha-blending done right for logo-badge with screen-quad. --- .../Include/Methane/Graphics/ScreenQuad.h | 2 ++ .../Sources/Methane/Graphics/LogoBadge.cpp | 3 ++- .../Sources/Methane/Graphics/ScreenQuad.cpp | 22 ++++++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h index 898809bc6..7b2d23428 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/ScreenQuad.h @@ -48,6 +48,7 @@ class ScreenQuad { const std::string name; FrameRect screen_rect; + bool alpha_blending_enabled = false; Color4f blend_color = Color4f(1.f, 1.f, 1.f, 1.f); }; @@ -55,6 +56,7 @@ class ScreenQuad void SetBlendColor(const Color4f& blend_color); void SetScreenRect(const FrameRect& screen_rect); + void SetAlphaBlendingEnabled(bool alpha_blending_enabled); void Draw(RenderCommandList& cmd_list) const; diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp index ad36cae4f..8f5476c36 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp @@ -44,7 +44,8 @@ LogoBadge::LogoBadge(Context& context, Texture::Ptr sp_texture, Settings setting { "Logo Badge", GetBadgeRectInFrame(context.GetSettings().frame_size, settings.corner, settings.size, settings.margins), - Color4f(1.f, 1.f, 1.f, 1.f) + true, + Color4f(1.f, 1.f, 1.f, 0.3f) }) , m_settings(std::move(settings)) { diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp index 4d86bb21c..b92892812 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/ScreenQuad.cpp @@ -81,9 +81,11 @@ ScreenQuad::ScreenQuad(Context& context, Texture::Ptr sp_texture, Settings setti state_settings.depth.enabled = false; state_settings.depth.write_enabled = false; state_settings.rasterizer.is_front_counter_clockwise = true; - - // TODO: temporary solution, to be replaced with RT-blending state - state_settings.rasterizer.alpha_to_coverage_enabled = true; + state_settings.blending.render_targets[0].blend_enabled = m_settings.alpha_blending_enabled; + state_settings.blending.render_targets[0].source_rgb_blend_factor = RenderState::Blending::Factor::SourceAlpha; + state_settings.blending.render_targets[0].dest_rgb_blend_factor = RenderState::Blending::Factor::OneMinusSourceAlpha; + state_settings.blending.render_targets[0].source_alpha_blend_factor = RenderState::Blending::Factor::Zero; + state_settings.blending.render_targets[0].dest_alpha_blend_factor = RenderState::Blending::Factor::Zero; m_sp_state = RenderState::Create(context, state_settings); m_sp_state->SetName(m_settings.name + " Screen-Quad Render State"); @@ -155,6 +157,20 @@ void ScreenQuad::SetScreenRect(const FrameRect& screen_rect) m_sp_state->SetScissorRects({ GetFrameScissorRect(screen_rect) }); } +void ScreenQuad::SetAlphaBlendingEnabled(bool alpha_blending_enabled) +{ + ITT_FUNCTION_TASK(); + + if (m_settings.alpha_blending_enabled == alpha_blending_enabled) + return; + + m_settings.alpha_blending_enabled = alpha_blending_enabled; + + RenderState::Settings state_settings = m_sp_state->GetSettings(); + state_settings.blending.render_targets[0].blend_enabled = alpha_blending_enabled; + m_sp_state->Reset(state_settings); +} + void ScreenQuad::Draw(RenderCommandList& cmd_list) const { ITT_FUNCTION_TASK(); From 62bbfd117b882e4ea0daeba63cb33283b9aaff62 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 17:16:29 +0300 Subject: [PATCH 089/129] Blending state setup implemented with Metal on MacOS. --- .../Methane/Graphics/Metal/RenderStateMT.mm | 105 ++++++++++++++++-- 1 file changed, 95 insertions(+), 10 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm index a237c6c20..e8d8e5fe1 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm @@ -68,6 +68,74 @@ static MTLTriangleFillMode ConvertRasterizerFillModeToMetal(RenderState::Rasteri } return MTLTriangleFillModeFill; } + +static MTLColorWriteMask ConvertRenderTargetWriteMaskToMetal(RenderState::Blending::ColorChannel::Mask rt_write_mask) +{ + ITT_FUNCTION_TASK(); + + using ColorChannel = RenderState::Blending::ColorChannel; + + MTLColorWriteMask mtl_color_write_mask = 0; + if (rt_write_mask & ColorChannel::Red) + mtl_color_write_mask |= MTLColorWriteMaskRed; + if (rt_write_mask & ColorChannel::Green) + mtl_color_write_mask |= MTLColorWriteMaskGreen; + if (rt_write_mask & ColorChannel::Blue) + mtl_color_write_mask |= MTLColorWriteMaskBlue; + if (rt_write_mask & ColorChannel::Alpha) + mtl_color_write_mask |= MTLColorWriteMaskAlpha; + return mtl_color_write_mask; +}; + +static MTLBlendOperation ConvertBlendingOperationToMetal(RenderState::Blending::Operation blend_operation) +{ + ITT_FUNCTION_TASK(); + + using BlendOp = RenderState::Blending::Operation; + + switch(blend_operation) + { + case BlendOp::Add: return MTLBlendOperationAdd; + case BlendOp::Subtract: return MTLBlendOperationSubtract; + case BlendOp::ReverseSubtract: return MTLBlendOperationReverseSubtract; + case BlendOp::Minimum: return MTLBlendOperationMin; + case BlendOp::Maximum: return MTLBlendOperationMax; + default: assert(0); + } + return MTLBlendOperationAdd; +} + +static MTLBlendFactor ConvertBlendingFactorToMetal(RenderState::Blending::Factor blend_factor) +{ + ITT_FUNCTION_TASK(); + + using BlendFactor = RenderState::Blending::Factor; + + switch (blend_factor) + { + case BlendFactor::Zero: return MTLBlendFactorZero; + case BlendFactor::One: return MTLBlendFactorOne; + case BlendFactor::SourceColor: return MTLBlendFactorSourceColor; + case BlendFactor::OneMinusSourceColor: return MTLBlendFactorOneMinusSourceColor; + case BlendFactor::SourceAlpha: return MTLBlendFactorSourceAlpha; + case BlendFactor::OneMinusSourceAlpha: return MTLBlendFactorOneMinusSourceAlpha; + case BlendFactor::DestinationColor: return MTLBlendFactorDestinationColor; + case BlendFactor::OneMinusDestinationColor: return MTLBlendFactorOneMinusDestinationColor; + case BlendFactor::DestinationAlpha: return MTLBlendFactorDestinationAlpha; + case BlendFactor::OneMinusDestinationAlpha: return MTLBlendFactorOneMinusDestinationAlpha; + case BlendFactor::SourceAlphaSaturated: return MTLBlendFactorSourceAlphaSaturated; + case BlendFactor::BlendColor: return MTLBlendFactorBlendColor; + case BlendFactor::OneMinusBlendColor: return MTLBlendFactorOneMinusBlendColor; + case BlendFactor::BlendAlpha: return MTLBlendFactorBlendAlpha; + case BlendFactor::OneMinusBlendAlpha: return MTLBlendFactorOneMinusBlendAlpha; + case BlendFactor::Source1Color: return MTLBlendFactorSource1Color; + case BlendFactor::OneMinusSource1Color: return MTLBlendFactorOneMinusSource1Color; + case BlendFactor::Source1Alpha: return MTLBlendFactorSource1Alpha; + case BlendFactor::OneMinusSource1Alpha: return MTLBlendFactorOneMinusSource1Alpha; + default: assert(0); + } + return MTLBlendFactorZero; +} static MTLStencilOperation ConvertStencilOperationToMetal(RenderState::Stencil::Operation operation) noexcept { @@ -158,21 +226,38 @@ static MTLWinding ConvertRasterizerFrontWindingToMetal(bool is_front_counter_clo m_mtl_pipeline_state_desc.fragmentFunction = metal_program.GetNativeShaderFunction(Shader::Type::Pixel); m_mtl_pipeline_state_desc.vertexDescriptor = metal_program.GetNativeVertexDescriptor(); - // Color, depth, stencil attachment formats state from program settings - uint32_t attachment_index = 0; - for (PixelFormat color_format : metal_program.GetSettings().color_formats) + // Rasterizer state + m_mtl_pipeline_state_desc.sampleCount = m_settings.rasterizer.sample_count; + m_mtl_pipeline_state_desc.alphaToCoverageEnabled = m_settings.rasterizer.alpha_to_coverage_enabled ? YES : NO; + m_mtl_pipeline_state_desc.alphaToOneEnabled = NO; // not supported by Methane + + // Blending state + const std::vector& rt_color_formats = metal_program.GetSettings().color_formats; + for (uint32_t rt_index = 0; rt_index < m_settings.blending.render_targets.size(); ++rt_index) { - m_mtl_pipeline_state_desc.colorAttachments[attachment_index++].pixelFormat = TypeConverterMT::DataFormatToMetalPixelType(color_format); + const Blending::RenderTarget& render_target = m_settings.blending.is_independent + ? m_settings.blending.render_targets[rt_index] + : m_settings.blending.render_targets[0]; + + // Set render target blending state for color attachment + MTLRenderPipelineColorAttachmentDescriptor* mtl_color_attach = m_mtl_pipeline_state_desc.colorAttachments[rt_index]; + mtl_color_attach.pixelFormat = rt_index < rt_color_formats.size() + ? TypeConverterMT::DataFormatToMetalPixelType(rt_color_formats[rt_index]) + : MTLPixelFormatInvalid; + mtl_color_attach.blendingEnabled = render_target.blend_enabled && rt_index < rt_color_formats.size() ? YES : NO; + mtl_color_attach.writeMask = ConvertRenderTargetWriteMaskToMetal(render_target.write_mask); + mtl_color_attach.rgbBlendOperation = ConvertBlendingOperationToMetal(render_target.rgb_blend_op); + mtl_color_attach.alphaBlendOperation = ConvertBlendingOperationToMetal(render_target.alpha_blend_op); + mtl_color_attach.sourceRGBBlendFactor = ConvertBlendingFactorToMetal(render_target.source_rgb_blend_factor); + mtl_color_attach.sourceAlphaBlendFactor = ConvertBlendingFactorToMetal(render_target.source_alpha_blend_factor); + mtl_color_attach.destinationRGBBlendFactor = ConvertBlendingFactorToMetal(render_target.dest_rgb_blend_factor); + mtl_color_attach.destinationAlphaBlendFactor= ConvertBlendingFactorToMetal(render_target.dest_alpha_blend_factor); } - m_mtl_pipeline_state_desc.colorAttachments[attachment_index].pixelFormat = MTLPixelFormatInvalid; + + // Color, depth, stencil attachment formats state from program settings m_mtl_pipeline_state_desc.depthAttachmentPixelFormat = TypeConverterMT::DataFormatToMetalPixelType(metal_program.GetSettings().depth_format); m_mtl_pipeline_state_desc.stencilAttachmentPixelFormat = MTLPixelFormatInvalid; // TODO: stencil not supported yet - // Rasterizer state - m_mtl_pipeline_state_desc.sampleCount = m_settings.rasterizer.sample_count; - m_mtl_pipeline_state_desc.alphaToCoverageEnabled = m_settings.rasterizer.alpha_to_coverage_enabled ? YES : NO; - m_mtl_pipeline_state_desc.alphaToOneEnabled = m_settings.rasterizer.alpha_to_one_enabled ? YES : NO; - // Depth-stencil state m_mtl_depth_stencil_state_desc = [[MTLDepthStencilDescriptor alloc] init]; m_mtl_depth_stencil_state_desc.depthWriteEnabled = m_settings.depth.write_enabled ? YES : NO; From 96255945fbf569c3e6c155d09030c8bb746ab642 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 17:54:32 +0300 Subject: [PATCH 090/129] Fixed depth and blending state setup issue with Metal on MacOS. --- .../Methane/Graphics/Metal/RenderStateMT.hh | 2 +- .../Methane/Graphics/Metal/RenderStateMT.mm | 62 +++++++++++-------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.hh index 8f42e7913..fce875a33 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.hh @@ -52,7 +52,7 @@ public: void SetName(const std::string& name) override; id& GetNativePipelineState(); - id& GetNativeDepthState(); + id& GetNativeDepthStencilState(); MTLCullMode GetNativeCullMode() const noexcept { return m_mtl_cull_mode; } MTLWinding GetNativeFrontFaceWinding() const noexcept { return m_mtl_front_face_winding; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm index e8d8e5fe1..416ef627e 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/RenderStateMT.mm @@ -29,11 +29,10 @@ #include "ShaderMT.hh" #include "TypesMT.hh" +#include +#include #include -#import -#import - #include namespace Methane::Graphics @@ -235,33 +234,36 @@ static MTLWinding ConvertRasterizerFrontWindingToMetal(bool is_front_counter_clo const std::vector& rt_color_formats = metal_program.GetSettings().color_formats; for (uint32_t rt_index = 0; rt_index < m_settings.blending.render_targets.size(); ++rt_index) { - const Blending::RenderTarget& render_target = m_settings.blending.is_independent - ? m_settings.blending.render_targets[rt_index] - : m_settings.blending.render_targets[0]; + const Blending::RenderTarget& render_target = m_settings.blending.is_independent + ? m_settings.blending.render_targets[rt_index] + : m_settings.blending.render_targets[0]; // Set render target blending state for color attachment MTLRenderPipelineColorAttachmentDescriptor* mtl_color_attach = m_mtl_pipeline_state_desc.colorAttachments[rt_index]; - mtl_color_attach.pixelFormat = rt_index < rt_color_formats.size() - ? TypeConverterMT::DataFormatToMetalPixelType(rt_color_formats[rt_index]) - : MTLPixelFormatInvalid; - mtl_color_attach.blendingEnabled = render_target.blend_enabled && rt_index < rt_color_formats.size() ? YES : NO; - mtl_color_attach.writeMask = ConvertRenderTargetWriteMaskToMetal(render_target.write_mask); - mtl_color_attach.rgbBlendOperation = ConvertBlendingOperationToMetal(render_target.rgb_blend_op); - mtl_color_attach.alphaBlendOperation = ConvertBlendingOperationToMetal(render_target.alpha_blend_op); - mtl_color_attach.sourceRGBBlendFactor = ConvertBlendingFactorToMetal(render_target.source_rgb_blend_factor); - mtl_color_attach.sourceAlphaBlendFactor = ConvertBlendingFactorToMetal(render_target.source_alpha_blend_factor); - mtl_color_attach.destinationRGBBlendFactor = ConvertBlendingFactorToMetal(render_target.dest_rgb_blend_factor); - mtl_color_attach.destinationAlphaBlendFactor= ConvertBlendingFactorToMetal(render_target.dest_alpha_blend_factor); + mtl_color_attach.pixelFormat = rt_index < rt_color_formats.size() + ? TypeConverterMT::DataFormatToMetalPixelType(rt_color_formats[rt_index]) + : MTLPixelFormatInvalid; + mtl_color_attach.blendingEnabled = render_target.blend_enabled && rt_index < rt_color_formats.size() ? YES : NO; + mtl_color_attach.writeMask = ConvertRenderTargetWriteMaskToMetal(render_target.write_mask); + mtl_color_attach.rgbBlendOperation = ConvertBlendingOperationToMetal(render_target.rgb_blend_op); + mtl_color_attach.alphaBlendOperation = ConvertBlendingOperationToMetal(render_target.alpha_blend_op); + mtl_color_attach.sourceRGBBlendFactor = ConvertBlendingFactorToMetal(render_target.source_rgb_blend_factor); + mtl_color_attach.sourceAlphaBlendFactor = ConvertBlendingFactorToMetal(render_target.source_alpha_blend_factor); + mtl_color_attach.destinationRGBBlendFactor = ConvertBlendingFactorToMetal(render_target.dest_rgb_blend_factor); + mtl_color_attach.destinationAlphaBlendFactor = ConvertBlendingFactorToMetal(render_target.dest_alpha_blend_factor); } // Color, depth, stencil attachment formats state from program settings - m_mtl_pipeline_state_desc.depthAttachmentPixelFormat = TypeConverterMT::DataFormatToMetalPixelType(metal_program.GetSettings().depth_format); + const PixelFormat depth_format = metal_program.GetSettings().depth_format; + m_mtl_pipeline_state_desc.depthAttachmentPixelFormat = TypeConverterMT::DataFormatToMetalPixelType(depth_format); m_mtl_pipeline_state_desc.stencilAttachmentPixelFormat = MTLPixelFormatInvalid; // TODO: stencil not supported yet // Depth-stencil state m_mtl_depth_stencil_state_desc = [[MTLDepthStencilDescriptor alloc] init]; - m_mtl_depth_stencil_state_desc.depthWriteEnabled = m_settings.depth.write_enabled ? YES : NO; - m_mtl_depth_stencil_state_desc.depthCompareFunction = TypeConverterMT::CompareFunctionToMetal(m_settings.depth.compare); + m_mtl_depth_stencil_state_desc.depthWriteEnabled = m_settings.depth.write_enabled && depth_format != PixelFormat::Unknown ? YES : NO; + m_mtl_depth_stencil_state_desc.depthCompareFunction = m_settings.depth.enabled && depth_format != PixelFormat::Unknown + ? TypeConverterMT::CompareFunctionToMetal(m_settings.depth.compare) + : MTLCompareFunctionAlways; m_mtl_depth_stencil_state_desc.backFaceStencil = ConvertStencilDescriptorToMetal(m_settings.stencil, false); m_mtl_depth_stencil_state_desc.frontFaceStencil = ConvertStencilDescriptorToMetal(m_settings.stencil, true); @@ -289,14 +291,15 @@ static MTLWinding ConvertRasterizerFrontWindingToMetal(bool is_front_counter_clo RenderCommandListMT& metal_command_list = static_cast(command_list); id& mtl_cmd_encoder = metal_command_list.GetNativeRenderEncoder(); - if (state_groups & Group::Program || - state_groups & Group::Rasterizer) + if (state_groups & Group::Program || + state_groups & Group::Rasterizer || + state_groups & Group::Blending) { [mtl_cmd_encoder setRenderPipelineState: GetNativePipelineState()]; } - if (state_groups & Group::DepthStencil && m_settings.depth.enabled) + if (state_groups & Group::DepthStencil) { - [mtl_cmd_encoder setDepthStencilState: GetNativeDepthState()]; + [mtl_cmd_encoder setDepthStencilState: GetNativeDepthStencilState()]; } if (state_groups & Group::Rasterizer) { @@ -312,6 +315,13 @@ static MTLWinding ConvertRasterizerFrontWindingToMetal(bool is_front_counter_clo { [mtl_cmd_encoder setScissorRects: m_mtl_scissor_rects.data() count:static_cast(m_mtl_scissor_rects.size())]; } + if (state_groups & Group::BlendingColor) + { + [mtl_cmd_encoder setBlendColorRed:m_settings.blending_color.r() + green:m_settings.blending_color.g() + blue:m_settings.blending_color.b() + alpha:m_settings.blending_color.a()]; + } } void RenderStateMT::SetViewports(const Viewports& viewports) @@ -382,10 +392,10 @@ static MTLWinding ConvertRasterizerFrontWindingToMetal(bool is_front_counter_clo return m_mtl_pipeline_state; } -id& RenderStateMT::GetNativeDepthState() +id& RenderStateMT::GetNativeDepthStencilState() { ITT_FUNCTION_TASK(); - + if (!m_mtl_depth_state) { assert(m_mtl_depth_stencil_state_desc != nil); From 8d2c63fc435d4ca3e5abd371bdf428b94c628588 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 18:24:48 +0300 Subject: [PATCH 091/129] Getter of content scaling factor added to Context interface and used for correct scaling of Logo badge on MacOS. --- .../Core/Include/Methane/Graphics/Context.h | 1 + .../Methane/Graphics/DirectX12/ContextDX.h | 1 + .../Sources/Methane/Graphics/Metal/ContextMT.hh | 15 ++++++++------- .../Sources/Methane/Graphics/Metal/ContextMT.mm | 6 ++++++ .../Sources/Methane/Graphics/Vulkan/ContextVK.h | 1 + .../Include/Methane/Graphics/LogoBadge.h | 2 ++ .../Sources/Methane/Graphics/LogoBadge.cpp | 13 +++++++++++-- 7 files changed, 30 insertions(+), 9 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Context.h b/Modules/Graphics/Core/Include/Methane/Graphics/Context.h index d292a5eff..b9e94a991 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Context.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Context.h @@ -97,6 +97,7 @@ struct Context : virtual Object virtual RenderCommandList& GetUploadCommandList() = 0; virtual const Settings& GetSettings() const = 0; virtual uint32_t GetFrameBufferIndex() const = 0; + virtual float GetContentScalingFactor() const = 0; virtual const FpsCounter& GetFpsCounter() const = 0; virtual bool SetVSyncEnabled(bool vsync_enabled) = 0; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.h index 779ca9fde..3f789da69 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.h @@ -54,6 +54,7 @@ class ContextDX final : public ContextBase void Resize(const FrameSize& frame_size) override; void Present() override; Platform::AppView GetAppView() const override { return { nullptr }; } + float GetContentScalingFactor() const override { return 1.f; } // ContextBase interface void OnCommandQueueCompleted(CommandQueue& cmd_list, uint32_t frame_index) override; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh index 875b1443e..c9e6964fb 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.hh @@ -63,13 +63,14 @@ public: ~ContextMT() override; // Context interface - bool ReadyToRender() const override; - void OnCommandQueueCompleted(CommandQueue& cmd_queue, uint32_t frame_index) override; - void WaitForGpu(WaitFor wait_for) override; - void Resize(const FrameSize& frame_size) override; - void Present() override; - bool SetVSyncEnabled(bool vsync_enabled) override; - bool SetFrameBuffersCount(uint32_t frame_buffers_count) override; + bool ReadyToRender() const override; + void OnCommandQueueCompleted(CommandQueue& cmd_queue, uint32_t frame_index) override; + void WaitForGpu(WaitFor wait_for) override; + void Resize(const FrameSize& frame_size) override; + void Present() override; + bool SetVSyncEnabled(bool vsync_enabled) override; + bool SetFrameBuffersCount(uint32_t frame_buffers_count) override; + float GetContentScalingFactor() const override; Platform::AppView GetAppView() const override { return { m_app_view }; } id GetNativeDrawable() { return m_app_view.currentDrawable; } diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm index 6c1b8a92e..13d5931ce 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Metal/ContextMT.mm @@ -170,6 +170,12 @@ return false; } +float ContextMT::GetContentScalingFactor() const +{ + ITT_FUNCTION_TASK(); + return m_app_view.appWindow.backingScaleFactor; +} + DeviceMT& ContextMT::GetDeviceMT() { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h index 7da9e0fa7..5d93eca95 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h @@ -47,6 +47,7 @@ class ContextVK : public ContextBase bool SetVSyncEnabled(bool vsync_enabled) override; bool SetFrameBuffersCount(uint32_t frame_buffers_count) override; Platform::AppView GetAppView() const override { return { nullptr }; } + float GetBackingScaleFactor() const override { return 1.f; } DeviceVK& GetDeviceVK(); diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h index 3a34500a7..45ca72bfb 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h @@ -50,11 +50,13 @@ class LogoBadge : public ScreenQuad FrameSize size; FrameCorner corner; uint32_t margins; + float opacity; Settings() : size(128u, 128u) , corner(FrameCorner::TopRight) , margins(10u) + , opacity(0.15f) { } }; diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp index 8f5476c36..538b6fa97 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp @@ -27,13 +27,22 @@ Logo badge rendering primitive. #include #include +#include + namespace Methane::Graphics { +static LogoBadge::Settings ScaleBadgeSize(LogoBadge::Settings settings, float scale_factor) +{ + settings.size.width = static_cast(std::round(scale_factor * settings.size.width)); + settings.size.height = static_cast(std::round(scale_factor * settings.size.height)); + return settings; +} + LogoBadge::LogoBadge(Context& context, Settings settings) : LogoBadge(context, ImageLoader(Data::TextureProvider::Get()).LoadImageToTexture2D(context, "Logo/MethaneLogoNameWatermark.png", true), - settings) + ScaleBadgeSize(settings, context.GetContentScalingFactor())) { ITT_FUNCTION_TASK(); } @@ -45,7 +54,7 @@ LogoBadge::LogoBadge(Context& context, Texture::Ptr sp_texture, Settings setting "Logo Badge", GetBadgeRectInFrame(context.GetSettings().frame_size, settings.corner, settings.size, settings.margins), true, - Color4f(1.f, 1.f, 1.f, 0.3f) + Color4f(1.f, 1.f, 1.f, settings.opacity) }) , m_settings(std::move(settings)) { From ad9d1e4cf3393f79021f6f04e7b030d7bdf617a2 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 18:35:33 +0300 Subject: [PATCH 092/129] Fixed Linux build. --- .../Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h index 5d93eca95..18585323c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/ContextVK.h @@ -47,7 +47,7 @@ class ContextVK : public ContextBase bool SetVSyncEnabled(bool vsync_enabled) override; bool SetFrameBuffersCount(uint32_t frame_buffers_count) override; Platform::AppView GetAppView() const override { return { nullptr }; } - float GetBackingScaleFactor() const override { return 1.f; } + float GetContentScalingFactor() const override { return 1.f; } DeviceVK& GetDeviceVK(); From 8992dc8c56a725551b6978a27799cbc60f917682 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 18:51:32 +0300 Subject: [PATCH 093/129] Adjusted watermark logo images with cropping and updated badge size. --- .../Include/Methane/Graphics/LogoBadge.h | 4 +- .../Sources/Methane/Graphics/LogoBadge.cpp | 1 + .../Images/Logo/MethaneLogoNameWatermark.png | Bin 31196 -> 26063 bytes .../Images/Logo/MethaneLogoNameWatermark.svg | 253 +++++++++++++++--- .../Images/Logo/MethaneLogoWatermark.png | Bin 27409 -> 23873 bytes .../Images/Logo/MethaneLogoWatermark.svg | 102 +++++-- 6 files changed, 296 insertions(+), 64 deletions(-) diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h b/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h index 45ca72bfb..2bfd8c6cf 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/LogoBadge.h @@ -53,9 +53,9 @@ class LogoBadge : public ScreenQuad float opacity; Settings() - : size(128u, 128u) + : size(96u, 128u) , corner(FrameCorner::TopRight) - , margins(10u) + , margins(16u) , opacity(0.15f) { } }; diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp index 538b6fa97..b8564acac 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/LogoBadge.cpp @@ -36,6 +36,7 @@ static LogoBadge::Settings ScaleBadgeSize(LogoBadge::Settings settings, float sc { settings.size.width = static_cast(std::round(scale_factor * settings.size.width)); settings.size.height = static_cast(std::round(scale_factor * settings.size.height)); + settings.margins = static_cast(std::round(scale_factor * settings.margins)); return settings; } diff --git a/Resources/Images/Logo/MethaneLogoNameWatermark.png b/Resources/Images/Logo/MethaneLogoNameWatermark.png index 783b9ab1c564a1e354950a938fe35b26b154ca92..0e6ad370d97974c31736250180ed2b1bae877309 100644 GIT binary patch literal 26063 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 c22dB`mFX8C)Z(N2|z(0 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 V3ZZt6FTw(NuBNA2^UONpe*wSR@=5>z literal 31196 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 diff --git a/Resources/Images/Logo/MethaneLogoNameWatermark.svg b/Resources/Images/Logo/MethaneLogoNameWatermark.svg index 3f9a35cc5..1dfb15545 100644 --- a/Resources/Images/Logo/MethaneLogoNameWatermark.svg +++ b/Resources/Images/Logo/MethaneLogoNameWatermark.svg @@ -1,47 +1,212 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +image/svg+xml + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - + \ No newline at end of file diff --git a/Resources/Images/Logo/MethaneLogoWatermark.png b/Resources/Images/Logo/MethaneLogoWatermark.png index 1611177aa56270a73b9fdf7d99f6c423140fbf5d..a3b7cf21174ca0fa0ef7e84bd11306438b5f39f3 100644 GIT binary patch literal 23873 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 literal 27409 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 - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +image/svg+xml + + + - + \ No newline at end of file From e870c36ca1a104c38ca2cc862d0da4b49de706aa Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 18:58:40 +0300 Subject: [PATCH 094/129] Fixed device switching in tutorials by releasing badge resources. --- Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp | 1 + Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp index 8eb5c45a1..b3ae2166c 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp @@ -178,6 +178,7 @@ void HelloTriangleApp::OnContextReleased() m_sp_vertex_buffer.reset(); m_sp_state.reset(); m_sp_program.reset(); + m_sp_logo_badge.reset(); GraphicsApp::OnContextReleased(); } diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp index 921862b04..39174d2c3 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp @@ -274,6 +274,7 @@ void TexturedCubeApp::OnContextReleased() m_sp_vertex_buffer.reset(); m_sp_state.reset(); m_sp_program.reset(); + m_sp_logo_badge.reset(); GraphicsApp::OnContextReleased(); } From d0a471547b4fd7c6657d36874d60f6f274f0bd25 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 19:16:02 +0300 Subject: [PATCH 095/129] Content scaling factor getter implemented on Windows. --- Modules/Graphics/Core/CMakeLists.txt | 1 + .../Methane/Graphics/DirectX12/ContextDX.cpp | 31 +++++++++++++++++++ .../Methane/Graphics/DirectX12/ContextDX.h | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Modules/Graphics/Core/CMakeLists.txt b/Modules/Graphics/Core/CMakeLists.txt index 948453388..3a55de8a9 100644 --- a/Modules/Graphics/Core/CMakeLists.txt +++ b/Modules/Graphics/Core/CMakeLists.txt @@ -46,6 +46,7 @@ if (WIN32) dxgi dxguid d3dcompiler + Shcore ) set(EXTRA_COMPILE_OPTIONS diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp index 3ef0c12f7..3b2dcc576 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.cpp @@ -35,6 +35,7 @@ DirectX 12 implementation of the context interface. #include #endif +#include #include #include @@ -268,6 +269,36 @@ void ContextDX::Present() m_frame_buffer_index = m_cp_swap_chain->GetCurrentBackBufferIndex(); } +float ContextDX::GetContentScalingFactor() const +{ + DEVICE_SCALE_FACTOR device_scale_factor = DEVICE_SCALE_FACTOR_INVALID; + HMONITOR monitor_handle = MonitorFromWindow(m_platform_env.window_handle, MONITOR_DEFAULTTONEAREST); + ThrowIfFailed(GetScaleFactorForMonitor(monitor_handle, &device_scale_factor)); + + switch(device_scale_factor) + { + case SCALE_100_PERCENT: return 1.0f; + case SCALE_120_PERCENT: return 1.2f; + case SCALE_125_PERCENT: return 1.25f; + case SCALE_140_PERCENT: return 1.4f; + case SCALE_150_PERCENT: return 1.5f; + case SCALE_160_PERCENT: return 1.6f; + case SCALE_175_PERCENT: return 1.75f; + case SCALE_180_PERCENT: return 1.8f; + case SCALE_200_PERCENT: return 2.f; + case SCALE_225_PERCENT: return 2.25f; + case SCALE_250_PERCENT: return 2.5f; + case SCALE_300_PERCENT: return 3.f; + case SCALE_350_PERCENT: return 3.5f; + case SCALE_400_PERCENT: return 4.f; + case SCALE_450_PERCENT: return 4.5f; + case SCALE_500_PERCENT: return 5.f; + default: assert(0); + } + + return 1.f; +} + CommandQueueDX& ContextDX::GetUploadCommandQueueDX() { ITT_FUNCTION_TASK(); diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.h index 3f789da69..fd6ce562b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ContextDX.h @@ -54,7 +54,7 @@ class ContextDX final : public ContextBase void Resize(const FrameSize& frame_size) override; void Present() override; Platform::AppView GetAppView() const override { return { nullptr }; } - float GetContentScalingFactor() const override { return 1.f; } + float GetContentScalingFactor() const override; // ContextBase interface void OnCommandQueueCompleted(CommandQueue& cmd_list, uint32_t frame_index) override; From c4ee5cf660e294dbbdb47aec96cef1e5f5bc705c Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 8 Jan 2020 19:16:20 +0300 Subject: [PATCH 096/129] Fixed compiler warning. --- .../Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp index 5c4c4f956..3792b2334 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderStateDX.cpp @@ -238,7 +238,7 @@ void RenderStateDX::Reset(const Settings& settings) // Set blending factor assert(m_settings.blending_color.size() <= 4); - for (uint32_t component_index = 0; component_index < m_settings.blending_color.size(); ++component_index) + for (uint32_t component_index = 0; component_index < static_cast(m_settings.blending_color.size()); ++component_index) { m_blend_factor[component_index] = m_settings.blending_color[component_index]; } From ca524533978b842758c324b8f27c9d5010cc902e Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 9 Jan 2020 14:17:55 +0300 Subject: [PATCH 097/129] Adjusted asteroids simulation parameters and hot-keys. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 38 ++++++++++--------- Apps/Samples/Asteroids/Shaders/Asteroids.cfg | 12 +----- .../Methane/Graphics/AppCameraController.h | 4 +- 3 files changed, 23 insertions(+), 31 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index cb0b7bb0d..3820626e0 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -65,25 +65,25 @@ inline ValueT GetParamValueByComplexity(const ParamValues& param_valu return GetParamValue(param_values_by_complexity, GetComplexity()); } -constexpr size_t g_max_cores_count = 11; -static const ParamValues g_instaces_count = { +constexpr uint32_t g_max_complexity = 11; +static const ParamValues g_instaces_count = { // [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 500u, 1000u, 2000u, 3000u, 4000u, 5000u, 10000u, 15000u, 20000u, 35000u, 50000u, }; -static const ParamValues g_mesh_count = { - 50u, 70u, 100u, 150u, 200u, 400u, 600u, 800u, 1000u, 1500u, 2000u, +static const ParamValues g_mesh_count = { + 25u, 35u, 50u, 75u, 100u, 200u, 300u, 400u, 500u, 740u, 1000u, }; -static const ParamValues g_textures_count = { - 5u, 10u, 20u, 30u, 40u, 50u, 60u, 70u, 80u, 90u, 100u +static const ParamValues g_textures_count = { + 5u, 10u, 10u, 20u, 20u, 30u, 30u, 40u, 40u, 50u, 50u }; -static const ParamValues g_scale_ratio = { - 0.6f, 0.55f, 0.5f, 0.45f, 0.4f, 0.35f, 0.3f, 0.25f, 0.2f, 0.15f, 0.1f +static const ParamValues g_scale_ratio = { + 0.8f, 0.6f, 0.5f, 0.45f, 0.4f, 0.33f, 0.3f, 0.27f, 0.23f, 0.2f, 0.17f }; static const std::map g_asteroids_action_by_keyboard_state = { - { { pal::Keyboard::Key::RightAlt, pal::Keyboard::Key::RightBracket }, AsteroidsAppAction::IncreaseComplexity }, - { { pal::Keyboard::Key::RightAlt, pal::Keyboard::Key::LeftBracket }, AsteroidsAppAction::DecreaseComplexity }, - { { pal::Keyboard::Key::RightAlt, pal::Keyboard::Key::P }, AsteroidsAppAction::SwitchParallelRendering }, + { { pal::Keyboard::Key::RightBracket }, AsteroidsAppAction::IncreaseComplexity }, + { { pal::Keyboard::Key::LeftBracket }, AsteroidsAppAction::DecreaseComplexity }, + { { pal::Keyboard::Key::P }, AsteroidsAppAction::SwitchParallelRendering }, }; // Common application settings @@ -102,7 +102,7 @@ static const GraphicsApp::Settings g_app_settings = // Application settings: { /* color clearing disabled */ }, // - clear_color gfx::DepthStencil{ 0.f, 0u }, // - clear_depth_stencil 3u, // - frame_buffers_count - true, // - vsync_enabled + false, // - vsync_enabled }, // true // show_hud_in_window_title }; @@ -126,7 +126,7 @@ AsteroidsApp::AsteroidsApp() GetParamValueByComplexity(g_instaces_count), // - instance_count GetParamValueByComplexity(g_mesh_count), // - unique_mesh_count 0u, // - minimum_subdivision - 3u, // - subdivisions_count + 4u, // - subdivisions_count GetParamValueByComplexity(g_textures_count), // - textures_count { 256u, 256u }, // - texture_dimensions 1123u, // - random_seed @@ -159,7 +159,7 @@ AsteroidsApp::AsteroidsApp() std::make_shared(m_view_camera, "VIEW CAMERA"), std::make_shared(m_light_camera, "LIGHT SOURCE", gfx::AppCameraController::ActionByMouseButton { { pal::Mouse::Button::Right, gfx::ActionCamera::MouseAction::Rotate } }, - gfx::AppCameraController::ActionByKeyboardState { { { pal::Keyboard::Key::L }, gfx::ActionCamera::KeyboardAction::Reset } }, + gfx::AppCameraController::ActionByKeyboardState { { { pal::Keyboard::Key::LeftControl, pal::Keyboard::Key::L }, gfx::ActionCamera::KeyboardAction::Reset } }, gfx::AppCameraController::ActionByKeyboardKey { }), }); } @@ -425,6 +425,8 @@ void AsteroidsApp::OnContextReleased() void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) { ITT_FUNCTION_TASK(); + + asteroids_complexity = std::min(g_max_complexity, asteroids_complexity); if (m_asteroids_complexity == asteroids_complexity) return; @@ -432,10 +434,10 @@ void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) m_asteroids_complexity = asteroids_complexity; m_asteroids_array_settings.instance_count = GetParamValue(g_instaces_count, m_asteroids_complexity); - m_asteroids_array_settings.unique_mesh_count = GetParamValue(g_mesh_count, m_asteroids_complexity); + m_asteroids_array_settings.unique_mesh_count = GetParamValue(g_mesh_count, m_asteroids_complexity); m_asteroids_array_settings.textures_count = GetParamValue(g_textures_count, m_asteroids_complexity); - m_asteroids_array_settings.min_asteroid_scale_ratio = GetParamValue(g_scale_ratio, m_asteroids_complexity) / 10.f; - m_asteroids_array_settings.max_asteroid_scale_ratio = GetParamValue(g_scale_ratio, m_asteroids_complexity); + m_asteroids_array_settings.min_asteroid_scale_ratio = GetParamValue(g_scale_ratio, m_asteroids_complexity) / 10.f; + m_asteroids_array_settings.max_asteroid_scale_ratio = GetParamValue(g_scale_ratio, m_asteroids_complexity); m_sp_asteroids_array.reset(); m_sp_asteroids_array_state.reset(); @@ -443,7 +445,7 @@ void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) assert(!!m_sp_context); m_sp_context->Reset(); } - + void AsteroidsApp::SetParallelRnderingEnabled(bool is_parallel_rendering_enabled) { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/Shaders/Asteroids.cfg b/Apps/Samples/Asteroids/Shaders/Asteroids.cfg index 68f7f5420..7cfb01167 100644 --- a/Apps/Samples/Asteroids/Shaders/Asteroids.cfg +++ b/Apps/Samples/Asteroids/Shaders/Asteroids.cfg @@ -11,14 +11,4 @@ frag=AsteroidPS:TEXTURES_COUNT=30 vert=AsteroidVS:TEXTURES_COUNT=40 frag=AsteroidPS:TEXTURES_COUNT=40 vert=AsteroidVS:TEXTURES_COUNT=50 -frag=AsteroidPS:TEXTURES_COUNT=50 -vert=AsteroidVS:TEXTURES_COUNT=60 -frag=AsteroidPS:TEXTURES_COUNT=60 -vert=AsteroidVS:TEXTURES_COUNT=70 -frag=AsteroidPS:TEXTURES_COUNT=70 -vert=AsteroidVS:TEXTURES_COUNT=80 -frag=AsteroidPS:TEXTURES_COUNT=80 -vert=AsteroidVS:TEXTURES_COUNT=90 -frag=AsteroidPS:TEXTURES_COUNT=90 -vert=AsteroidVS:TEXTURES_COUNT=100 -frag=AsteroidPS:TEXTURES_COUNT=100 +frag=AsteroidPS:TEXTURES_COUNT=50 \ No newline at end of file diff --git a/Modules/Graphics/App/Include/Methane/Graphics/AppCameraController.h b/Modules/Graphics/App/Include/Methane/Graphics/AppCameraController.h index 5919a55b4..e2e295d81 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/AppCameraController.h +++ b/Modules/Graphics/App/Include/Methane/Graphics/AppCameraController.h @@ -67,8 +67,8 @@ class AppCameraController final inline static const ActionByKeyboardState default_actions_by_keyboard_state = { // Other - { { Platform::Keyboard::Key::R }, ActionCamera::KeyboardAction::Reset }, - { { Platform::Keyboard::Key::P }, ActionCamera::KeyboardAction::ChangePivot }, + { { Platform::Keyboard::Key::LeftControl, Platform::Keyboard::Key::R }, ActionCamera::KeyboardAction::Reset }, + { { Platform::Keyboard::Key::LeftControl, Platform::Keyboard::Key::P }, ActionCamera::KeyboardAction::ChangePivot }, }; AppCameraController(ActionCamera& action_camera, const std::string& camera_name, From b47814fae0b21e996360bf565b7df7f63a740390 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 9 Jan 2020 21:06:38 +0300 Subject: [PATCH 098/129] Use cml::matrix types using Methane::Graphics::MatrixXXf --- .../Graphics/Helpers/Include/Methane/Graphics/Mesh.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h index e4ac146be..8cf9ace2c 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h @@ -560,11 +560,11 @@ class SphereMesh : public BaseMesh const float texcoord_long_spacing = 1.f / (actual_long_lines_count - 1); const float texcoord_lat_spacing = 1.f / (m_lat_lines_count + 1); - cml::matrix33f pitch_step_matrix = { }, yaw_step_matrix = { }; + Matrix33f pitch_step_matrix = { }, yaw_step_matrix = { }; cml::matrix_rotation_world_x(pitch_step_matrix, cml::constants::pi() / (m_lat_lines_count - 1)); cml::matrix_rotation_world_y(yaw_step_matrix, 2.0 * cml::constants::pi() / m_long_lines_count); - cml::matrix33f pitch_matrix = cml::identity_3x3(); + Matrix33f pitch_matrix = cml::identity_3x3(); if (!has_texcoord) pitch_matrix = pitch_step_matrix; @@ -574,12 +574,12 @@ class SphereMesh : public BaseMesh for (uint32_t lat_line_index = first_lat_line_index; lat_line_index < actual_lat_lines_count; ++lat_line_index) { - cml::matrix33f yaw_matrix = cml::identity_3x3(); + Matrix33f yaw_matrix = cml::identity_3x3(); for(uint32_t long_line_index = 0; long_line_index < actual_long_lines_count; ++long_line_index) { - const cml::matrix33f rotation_matrix = pitch_matrix * yaw_matrix; - const uint32_t vertex_index = (lat_line_index - first_lat_line_index) * actual_long_lines_count + long_line_index + first_vertex_index; + const Matrix33f rotation_matrix = pitch_matrix * yaw_matrix; + const uint32_t vertex_index = (lat_line_index - first_lat_line_index) * actual_long_lines_count + long_line_index + first_vertex_index; VType& vertex = BaseMeshT::m_vertices[vertex_index]; { From e25f5b37fb69d321e9d39898e68626265e5f630f Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 9 Jan 2020 22:40:07 +0300 Subject: [PATCH 099/129] Fixed sphere mesh generation. --- .../Graphics/Helpers/Include/Methane/Graphics/Mesh.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h index 8cf9ace2c..a0b2dc390 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h @@ -561,10 +561,12 @@ class SphereMesh : public BaseMesh const float texcoord_lat_spacing = 1.f / (m_lat_lines_count + 1); Matrix33f pitch_step_matrix = { }, yaw_step_matrix = { }; - cml::matrix_rotation_world_x(pitch_step_matrix, cml::constants::pi() / (m_lat_lines_count - 1)); - cml::matrix_rotation_world_y(yaw_step_matrix, 2.0 * cml::constants::pi() / m_long_lines_count); + cml::matrix_rotation_world_x(pitch_step_matrix, -cml::constants::pi() / (m_lat_lines_count - 1)); + cml::matrix_rotation_world_y(yaw_step_matrix, -2.0 * cml::constants::pi() / m_long_lines_count); + + Matrix33f pitch_matrix = { }, yaw_matrix = { };; + pitch_matrix.identity(); - Matrix33f pitch_matrix = cml::identity_3x3(); if (!has_texcoord) pitch_matrix = pitch_step_matrix; @@ -574,7 +576,7 @@ class SphereMesh : public BaseMesh for (uint32_t lat_line_index = first_lat_line_index; lat_line_index < actual_lat_lines_count; ++lat_line_index) { - Matrix33f yaw_matrix = cml::identity_3x3(); + yaw_matrix.identity(); for(uint32_t long_line_index = 0; long_line_index < actual_long_lines_count; ++long_line_index) { From 1175ee3554acc36cc796b73fbe3a423b003f67d6 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 11 Jan 2020 17:14:57 +0300 Subject: [PATCH 100/129] Externals updated with CML SSE optimized matrix product specialization. --- Externals | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Externals b/Externals index 04c6ff71e..8881719da 160000 --- a/Externals +++ b/Externals @@ -1 +1 @@ -Subproject commit 04c6ff71ecbe7f5ab585a1486c58c2837a04a9ea +Subproject commit 8881719da29f01397d00dcc7f8c20def1023606e From 1addc29aa168920431870cb5fe7d5f29642f9232 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 11 Jan 2020 18:53:15 +0300 Subject: [PATCH 101/129] Updated Externals/CML with removal of SSE optimized matrix product for 3x3 matrices, keeping it only for 4x4 matrices. --- Externals | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Externals b/Externals index 8881719da..523cb0625 160000 --- a/Externals +++ b/Externals @@ -1 +1 @@ -Subproject commit 8881719da29f01397d00dcc7f8c20def1023606e +Subproject commit 523cb06254b7814d3aedab497ffce7bf770ca426 From 92a2f5de11e5654747b7354ead1ea68316aff107 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sat, 11 Jan 2020 19:48:44 +0300 Subject: [PATCH 102/129] Printing of asteroids simulation parameters and scope timings on user switching parameters or releasing render context. --- Apps/Samples/Asteroids/Asteroid.cpp | 2 +- Apps/Samples/Asteroids/Asteroid.h | 2 +- Apps/Samples/Asteroids/AsteroidsApp.cpp | 60 +++++++++++++------ Apps/Samples/Asteroids/AsteroidsApp.h | 6 +- .../Asteroids/AsteroidsAppController.cpp | 4 +- .../Asteroids/AsteroidsAppController.h | 2 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 +- Apps/Samples/Asteroids/AsteroidsArray.h | 2 +- Apps/Samples/Asteroids/Planet.cpp | 2 +- Apps/Samples/Asteroids/Planet.h | 2 +- .../Include/Methane/Data/ScopeTimer.h | 3 + .../Sources/Methane/Data/ScopeTimer.cpp | 6 ++ 12 files changed, 64 insertions(+), 29 deletions(-) diff --git a/Apps/Samples/Asteroids/Asteroid.cpp b/Apps/Samples/Asteroids/Asteroid.cpp index 8f5c4dbcd..82d543e78 100644 --- a/Apps/Samples/Asteroids/Asteroid.cpp +++ b/Apps/Samples/Asteroids/Asteroid.cpp @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Apps/Samples/Asteroids/Asteroid.h b/Apps/Samples/Asteroids/Asteroid.h index a6b20e3f5..2af39b7cd 100644 --- a/Apps/Samples/Asteroids/Asteroid.h +++ b/Apps/Samples/Asteroids/Asteroid.h @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 3820626e0..b0426cb05 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -34,10 +34,9 @@ Sample demonstrating parallel rendering of the distinct asteroids massive #include #include #include +#include #include -#define PARALLEL_RENDERING_ENABLED 1 - namespace Methane::Samples { @@ -53,9 +52,10 @@ inline ValueT GetParamValue(const ParamValues& param_values, size_t p inline size_t GetComplexity() { #ifdef _DEBUG - return 2; + return 1; #else - return std::thread::hardware_concurrency() / 2; + const size_t hw_cores_count = std::thread::hardware_concurrency() / 2; + return hw_cores_count > 0u ? hw_cores_count - 1u : 0u; #endif } @@ -65,19 +65,19 @@ inline ValueT GetParamValueByComplexity(const ParamValues& param_valu return GetParamValue(param_values_by_complexity, GetComplexity()); } -constexpr uint32_t g_max_complexity = 11; -static const ParamValues g_instaces_count = { -// [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] - 500u, 1000u, 2000u, 3000u, 4000u, 5000u, 10000u, 15000u, 20000u, 35000u, 50000u, +constexpr uint32_t g_max_complexity = 9; +static const ParamValues g_instaces_count = { +// [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] + 1000u, 2000u, 3000u, 4000u, 5000u, 10000u, 15000u, 20000u, 35000u, 50000u, }; -static const ParamValues g_mesh_count = { - 25u, 35u, 50u, 75u, 100u, 200u, 300u, 400u, 500u, 740u, 1000u, +static const ParamValues g_mesh_count = { + 35u, 50u, 75u, 100u, 200u, 300u, 400u, 500u, 600u, 750u, }; -static const ParamValues g_textures_count = { - 5u, 10u, 10u, 20u, 20u, 30u, 30u, 40u, 40u, 50u, 50u +static const ParamValues g_textures_count = { + 10u, 10u, 20u, 20u, 30u, 30u, 40u, 40u, 50u, 50u }; -static const ParamValues g_scale_ratio = { - 0.8f, 0.6f, 0.5f, 0.45f, 0.4f, 0.33f, 0.3f, 0.27f, 0.23f, 0.2f, 0.17f +static const ParamValues g_scale_ratio = { + 0.6f, 0.5f, 0.45f, 0.4f, 0.33f, 0.3f, 0.27f, 0.23f, 0.2f, 0.17f }; static const std::map g_asteroids_action_by_keyboard_state = { @@ -293,6 +293,8 @@ void AsteroidsApp::Init() // - allocate deferred descriptor heaps with calculated sizes // - execute commands to upload resources to GPU context.CompleteInitialization(); + + PrintParameters(); } bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) @@ -406,6 +408,7 @@ bool AsteroidsApp::Render() void AsteroidsApp::OnContextReleased() { ITT_FUNCTION_TASK(); + FLUSH_SCOPE_TIMINGS(); if (m_sp_asteroids_array) { @@ -431,14 +434,15 @@ void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) return; m_sp_context->WaitForGpu(gfx::Context::WaitFor::RenderComplete); + m_asteroids_complexity = asteroids_complexity; - + m_asteroids_array_settings.instance_count = GetParamValue(g_instaces_count, m_asteroids_complexity); m_asteroids_array_settings.unique_mesh_count = GetParamValue(g_mesh_count, m_asteroids_complexity); m_asteroids_array_settings.textures_count = GetParamValue(g_textures_count, m_asteroids_complexity); m_asteroids_array_settings.min_asteroid_scale_ratio = GetParamValue(g_scale_ratio, m_asteroids_complexity) / 10.f; m_asteroids_array_settings.max_asteroid_scale_ratio = GetParamValue(g_scale_ratio, m_asteroids_complexity); - + m_sp_asteroids_array.reset(); m_sp_asteroids_array_state.reset(); @@ -446,10 +450,30 @@ void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) m_sp_context->Reset(); } -void AsteroidsApp::SetParallelRnderingEnabled(bool is_parallel_rendering_enabled) +void AsteroidsApp::SetParallelRenderingEnabled(bool is_parallel_rendering_enabled) { ITT_FUNCTION_TASK(); + FLUSH_SCOPE_TIMINGS(); + m_is_parallel_rendering_enabled = is_parallel_rendering_enabled; + + PrintParameters(); +} + +void AsteroidsApp::PrintParameters() +{ + ITT_FUNCTION_TASK(); + + std::stringstream ss; + ss << std::endl << "Asteroids simulation parameters:" + << std::endl << " - simulation complexity: " << m_asteroids_complexity + << std::endl << " - parallel rendering: " << (m_is_parallel_rendering_enabled ? "enabled" : "disabled") + << std::endl << " - asteroid instances count: " << m_asteroids_array_settings.instance_count + << std::endl << " - unique meshes count: " << m_asteroids_array_settings.unique_mesh_count + << std::endl << " - mesh subdivisions count: " << m_asteroids_array_settings.subdivisions_count + << std::endl << " - unique textures count: " << m_asteroids_array_settings.textures_count << " " + << static_cast(m_asteroids_array_settings.texture_dimensions); + pal::PrintToDebugOutput(ss.str()); } } // namespace Methane::Samples diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 2927779b2..5ee13329d 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -69,7 +69,9 @@ class AsteroidsApp final : public GraphicsApp void SetAsteroidsComplexity(uint32_t asteroids_complexity); bool IsParallelRenderingEnabled() const { return m_is_parallel_rendering_enabled; } - void SetParallelRnderingEnabled(bool is_parallel_rendering_enabled); + void SetParallelRenderingEnabled(bool is_parallel_rendering_enabled); + + void PrintParameters(); private: struct SHADER_STRUCT_ALIGN Constants diff --git a/Apps/Samples/Asteroids/AsteroidsAppController.cpp b/Apps/Samples/Asteroids/AsteroidsAppController.cpp index e3b9c9456..ca8c6330c 100644 --- a/Apps/Samples/Asteroids/AsteroidsAppController.cpp +++ b/Apps/Samples/Asteroids/AsteroidsAppController.cpp @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -61,7 +61,7 @@ void AsteroidsAppController::OnKeyboardStateAction(AsteroidsAppAction action) break; case AsteroidsAppAction::SwitchParallelRendering: - m_asteroids_app.SetParallelRnderingEnabled(!m_asteroids_app.IsParallelRenderingEnabled()); + m_asteroids_app.SetParallelRenderingEnabled(!m_asteroids_app.IsParallelRenderingEnabled()); break; default: diff --git a/Apps/Samples/Asteroids/AsteroidsAppController.h b/Apps/Samples/Asteroids/AsteroidsAppController.h index efe5511f5..5d168f505 100644 --- a/Apps/Samples/Asteroids/AsteroidsAppController.h +++ b/Apps/Samples/Asteroids/AsteroidsAppController.h @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 3285f7d37..dff3bb7ee 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index 5031ce092..401c1a0e1 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Apps/Samples/Asteroids/Planet.cpp b/Apps/Samples/Asteroids/Planet.cpp index a42c784a1..516cace00 100644 --- a/Apps/Samples/Asteroids/Planet.cpp +++ b/Apps/Samples/Asteroids/Planet.cpp @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Apps/Samples/Asteroids/Planet.h b/Apps/Samples/Asteroids/Planet.h index ed4d0cc7f..9a725d079 100644 --- a/Apps/Samples/Asteroids/Planet.h +++ b/Apps/Samples/Asteroids/Planet.h @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Modules/Data/Instrumentation/Include/Methane/Data/ScopeTimer.h b/Modules/Data/Instrumentation/Include/Methane/Data/ScopeTimer.h index d2d5775ad..efa7d197c 100644 --- a/Modules/Data/Instrumentation/Include/Methane/Data/ScopeTimer.h +++ b/Modules/Data/Instrumentation/Include/Methane/Data/ScopeTimer.h @@ -54,6 +54,7 @@ class ScopeTimer : protected Timer const Timing& GetScopeTiming(const std::string& scope_name) const; void LogTimings(ILogger& logger); + void Flush(); private: Aggregator() = default; @@ -83,11 +84,13 @@ class ScopeTimer : protected Timer #define SCOPE_TIMER(SCOPE_NAME) Methane::Data::ScopeTimer scope_timer(SCOPE_NAME) #define FUNCTION_SCOPE_TIMER() SCOPE_TIMER(__func__) +#define FLUSH_SCOPE_TIMINGS() Methane::Data::ScopeTimer::Aggregator::Get().Flush() #else #define SCOPE_TIMER(SCOPE_NAME) #define FUNCTION_SCOPE_TIMER() +#define FLUSH_SCOPE_TIMINGS() #endif diff --git a/Modules/Data/Instrumentation/Sources/Methane/Data/ScopeTimer.cpp b/Modules/Data/Instrumentation/Sources/Methane/Data/ScopeTimer.cpp index c252182c8..6ccedd075 100644 --- a/Modules/Data/Instrumentation/Sources/Methane/Data/ScopeTimer.cpp +++ b/Modules/Data/Instrumentation/Sources/Methane/Data/ScopeTimer.cpp @@ -41,10 +41,16 @@ ScopeTimer::Aggregator& ScopeTimer::Aggregator::Get() ScopeTimer::Aggregator::~Aggregator() { ITT_FUNCTION_TASK(); + Flush(); +} + +void ScopeTimer::Aggregator::Flush() +{ if (m_sp_logger) { LogTimings(*m_sp_logger); } + m_timing_by_scope_name.clear(); } void ScopeTimer::Aggregator::LogTimings(ILogger& logger) From eab13bd5dae9496a4f5775e856628af2082f3ffc Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 12 Jan 2020 14:30:35 +0300 Subject: [PATCH 103/129] Asteroids dynamic mesh LODs with estimating visible size implemented with x2 frame rate increase. --- Apps/Samples/Asteroids/Asteroid.h | 4 +- Apps/Samples/Asteroids/AsteroidsApp.cpp | 3 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 106 ++++++++++-------- Apps/Samples/Asteroids/AsteroidsArray.h | 22 ++-- .../Include/Methane/Graphics/MeshBuffers.hpp | 4 +- 5 files changed, 76 insertions(+), 63 deletions(-) diff --git a/Apps/Samples/Asteroids/Asteroid.h b/Apps/Samples/Asteroids/Asteroid.h index 2af39b7cd..65617a7ee 100644 --- a/Apps/Samples/Asteroids/Asteroid.h +++ b/Apps/Samples/Asteroids/Asteroid.h @@ -81,12 +81,12 @@ class Asteroid final : public gfx::TexturedMeshBuffers struct Parameters { const uint32_t index; - const uint32_t subset_index; + const uint32_t mesh_instance_index; const uint32_t texture_index; - const gfx::Vector2f depth_range; const Colors colors; const gfx::Matrix44f scale_translate_matrix; const gfx::Point3f spin_axis; + const float scale; const float orbit_speed; const float spin_speed; const float spin_angle_rad; diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index b0426cb05..d3f1983a5 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -71,7 +71,7 @@ static const ParamValues g_instaces_count = { 1000u, 2000u, 3000u, 4000u, 5000u, 10000u, 15000u, 20000u, 35000u, 50000u, }; static const ParamValues g_mesh_count = { - 35u, 50u, 75u, 100u, 200u, 300u, 400u, 500u, 600u, 750u, + 35u, 50u, 75u, 100u, 200u, 300u, 400u, 500u, 750u, 1000u, }; static const ParamValues g_textures_count = { 10u, 10u, 20u, 20u, 30u, 30u, 40u, 40u, 50u, 50u @@ -125,7 +125,6 @@ AsteroidsApp::AsteroidsApp() m_scene_scale, // - scale GetParamValueByComplexity(g_instaces_count), // - instance_count GetParamValueByComplexity(g_mesh_count), // - unique_mesh_count - 0u, // - minimum_subdivision 4u, // - subdivisions_count GetParamValueByComplexity(g_textures_count), // - textures_count { 256u, 256u }, // - texture_dimensions diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index dff3bb7ee..0804ef7f3 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -46,11 +46,10 @@ static gfx::Point3f GetRandomDirection(std::mt19937& rng) return cml::normalize(direction); } -AsteroidsArray::UberMesh::UberMesh(uint32_t instance_count, uint32_t subdivisions_count, uint32_t min_subdivision, uint32_t random_seed) +AsteroidsArray::UberMesh::UberMesh(uint32_t instance_count, uint32_t subdivisions_count, uint32_t random_seed) : gfx::UberMesh(gfx::Mesh::VertexLayoutFromArray(Asteroid::Vertex::layout)) , m_instance_count(instance_count) , m_subdivisions_count(subdivisions_count) - , m_min_subdivision(min_subdivision) { ITT_FUNCTION_TASK(); SCOPE_TIMER("AsteroidsArray::UberMesh::UberMesh"); @@ -58,33 +57,36 @@ AsteroidsArray::UberMesh::UberMesh(uint32_t instance_count, uint32_t subdivision std::mt19937 rng(random_seed); m_depth_ranges.reserve(static_cast(m_instance_count) * m_subdivisions_count); - for (uint32_t subdivision_index = m_min_subdivision; subdivision_index <= m_subdivisions_count; ++subdivision_index) + + std::mutex data_mutex; + for (uint32_t subdivision_index = 0; subdivision_index < m_subdivisions_count; ++subdivision_index) { Asteroid::Mesh base_mesh(subdivision_index, false); base_mesh.Spherify(); - std::mutex data_mutex; Data::ParallelFor(0u, m_instance_count, [&](uint32_t) - { - Asteroid::Mesh asteroid_mesh(base_mesh); - asteroid_mesh.Randomize(rng()); + { + Asteroid::Mesh asteroid_mesh(base_mesh); + asteroid_mesh.Randomize(rng()); - std::lock_guard lock_guard(data_mutex); - m_depth_ranges.emplace_back(asteroid_mesh.GetDepthRange()); - AddSubMesh(asteroid_mesh, false); - }); + std::lock_guard lock_guard(data_mutex); + m_depth_ranges.emplace_back(asteroid_mesh.GetDepthRange()); + AddSubMesh(asteroid_mesh, false); + }); } } -const gfx::Vector2f& AsteroidsArray::UberMesh::GetSubsetDepthRange(uint32_t subset_index) const +uint32_t AsteroidsArray::UberMesh::GetSubsetIndex(uint32_t instance_index, uint32_t subdivision_index) { ITT_FUNCTION_TASK(); - if (subset_index >= GetSubsetCount()) - throw std::invalid_argument("Subset index is out of range."); + if (instance_index >= m_instance_count) + throw std::invalid_argument("Uber-mesh instance index is out of range."); - assert(subset_index < m_depth_ranges.size()); - return m_depth_ranges[subset_index]; + if (subdivision_index >= m_subdivisions_count) + throw std::invalid_argument("Uber-mesh subdivision index is out of range."); + + return subdivision_index * m_instance_count + instance_index; } uint32_t AsteroidsArray::UberMesh::GetSubsetSubdivision(uint32_t subset_index) const @@ -97,11 +99,22 @@ uint32_t AsteroidsArray::UberMesh::GetSubsetSubdivision(uint32_t subset_index) c const uint32_t subdivision_index = subset_index / m_instance_count; assert(subdivision_index < m_subdivisions_count); - return m_min_subdivision + subdivision_index; + return subdivision_index; +} + +const gfx::Vector2f& AsteroidsArray::UberMesh::GetSubsetDepthRange(uint32_t subset_index) const +{ + ITT_FUNCTION_TASK(); + + if (subset_index >= GetSubsetCount()) + throw std::invalid_argument("Subset index is out of range."); + + assert(subset_index < m_depth_ranges.size()); + return m_depth_ranges[subset_index]; } AsteroidsArray::ContentState::ContentState(const Settings& settings) - : uber_mesh(settings.unique_mesh_count, settings.subdivisions_count, settings.minimum_subdivision, settings.random_seed) + : uber_mesh(settings.unique_mesh_count, settings.subdivisions_count, settings.random_seed) { ITT_FUNCTION_TASK(); SCOPE_TIMER("AsteroidsArray::ContentState::ContentState"); @@ -134,42 +147,27 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) } // Randomly generate parameters of each asteroid in array - const uint32_t subset_count = settings.unique_mesh_count * settings.subdivisions_count; const float orbit_radius = settings.orbit_radius_ratio * settings.scale; const float disc_radius = settings.disc_radius_ratio * settings.scale; std::normal_distribution normal_distribution; - std::uniform_int_distribution subset_distribution(0u, subset_count - 1); + std::uniform_int_distribution mesh_distribution(0u, settings.unique_mesh_count - 1); std::uniform_int_distribution colors_distribution(0, static_cast(Asteroid::color_schema_size - 1)); + std::uniform_real_distribution scale_distribution(settings.min_asteroid_scale_ratio, settings.max_asteroid_scale_ratio); std::uniform_real_distribution scale_proportion_distribution(0.8f, 1.2f); std::uniform_real_distribution spin_velocity_distribution(-2.f, 2.f); std::uniform_real_distribution orbit_velocity_distribution(3.f, 10.f); std::normal_distribution orbit_radius_distribution(orbit_radius, 0.6f * disc_radius); std::normal_distribution orbit_height_distribution(0.0f, 0.4f * disc_radius); - assert(settings.min_asteroid_scale_ratio < settings.max_asteroid_scale_ratio); - const float scale_range_step = (settings.max_asteroid_scale_ratio - settings.min_asteroid_scale_ratio) / settings.subdivisions_count; - - // Separate scale distributions for different mesh subdivisions - // for less-detailed meshes be rendered with smaller scale - std::vector> subdivision_scale_distributions; - for(uint32_t subdivision_index = 0; subdivision_index < settings.subdivisions_count; ++subdivision_index) - { - subdivision_scale_distributions.emplace_back( - settings.min_asteroid_scale_ratio + scale_range_step * (subdivision_index), - settings.min_asteroid_scale_ratio + scale_range_step * (subdivision_index + 1) - ); - } - parameters.reserve(settings.instance_count); for (uint32_t asteroid_index = 0; asteroid_index < settings.instance_count; ++asteroid_index) { - const uint32_t asteroid_subset_index = subset_distribution(rng); - const uint32_t asteroid_subdivision = uber_mesh.GetSubsetSubdivision(asteroid_subset_index) - uber_mesh.GetMinSubdivision(); + const uint32_t asteroid_mesh_index = mesh_distribution(rng); const float asteroid_orbit_radius = orbit_radius_distribution(rng); const float asteroid_orbit_height = orbit_height_distribution(rng); - const float asteroid_scale_ratio = subdivision_scale_distributions[asteroid_subdivision](rng); + const float asteroid_scale_ratio = scale_distribution(rng); const float asteroid_scale = asteroid_scale_ratio * settings.scale; const gfx::Vector3f asteroid_scale_ratios = gfx::Vector3f(scale_proportion_distribution(rng), scale_proportion_distribution(rng), @@ -191,12 +189,12 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) Asteroid::Parameters { asteroid_index, - asteroid_subset_index, + asteroid_mesh_index, settings.textures_array_enabled ? textures_distribution(rng) : 0u, - uber_mesh.GetSubsetDepthRange(asteroid_subset_index), std::move(asteroid_colors), std::move(scale_translate_matrix), GetRandomDirection(rng), + asteroid_scale, orbit_velocity_distribution(rng) / (asteroid_scale * asteroid_orbit_radius), spin_velocity_distribution(rng) / asteroid_scale, cml::constants::pi() * normal_distribution(rng), @@ -216,6 +214,7 @@ AsteroidsArray::AsteroidsArray(gfx::Context& context, Settings settings, Content : BaseBuffers(context, state.uber_mesh, "Asteroids Array") , m_settings(std::move(settings)) , m_sp_content_state(state.shared_from_this()) + , m_mesh_subset_by_instance_index(m_settings.instance_count, 0u) { ITT_FUNCTION_TASK(); SCOPE_TIMER("AsteroidsArray::AsteroidsArray"); @@ -336,12 +335,13 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) gfx::Matrix44f view_matrix, proj_matrix; m_settings.view_camera.GetViewProjMatrices(view_matrix, proj_matrix); + const gfx::Vector3f& eye_position = m_settings.view_camera.GetOrientation().eye; const gfx::Matrix44f view_proj_matrix = view_matrix * proj_matrix; const float elapsed_radians = cml::constants::pi()* static_cast(elapsed_seconds); - Data::ParallelForEach(m_sp_content_state->parameters.begin(), m_sp_content_state->parameters.end(), - [this, &view_proj_matrix, elapsed_radians](const Asteroid::Parameters& asteroid_parameters) + Data::ParallelForEach(m_sp_content_state->parameters.begin(), m_sp_content_state->parameters.end(), + [this, &view_proj_matrix, elapsed_radians, &eye_position](Asteroid::Parameters& asteroid_parameters) { ITT_FUNCTION_TASK(); @@ -357,6 +357,19 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) const gfx::Matrix44f model_matrix = spin_rotation_matrix * asteroid_parameters.scale_translate_matrix * orbit_rotation_matrix; const gfx::Matrix44f mvp_matrix = model_matrix * view_proj_matrix; + const gfx::Vector3f asteroid_position(model_matrix(3, 0), model_matrix(3, 1), model_matrix(3, 2)); + const float distance_to_eye = (eye_position - asteroid_position).length(); + const float relative_screen_size = asteroid_parameters.scale / std::sqrtf(distance_to_eye); + const float relative_screen_size_log2 = std::logf(relative_screen_size); + + static const float min_subdiv_size_log2 = std::log2f(0.08); + const float mesh_subdiv_float = std::roundf(relative_screen_size_log2 - min_subdiv_size_log2); + const uint32_t mesh_subdivision_index = std::min(m_settings.subdivisions_count - 1, static_cast(std::max(0.0f, mesh_subdiv_float))); + const uint32_t mesh_subset_index = m_sp_content_state->uber_mesh.GetSubsetIndex(asteroid_parameters.mesh_instance_index, mesh_subdivision_index); + const gfx::Vector2f& mesh_subset_depth_range = m_sp_content_state->uber_mesh.GetSubsetDepthRange(mesh_subset_index); + + m_mesh_subset_by_instance_index[asteroid_parameters.index] = mesh_subset_index; + SetFinalPassUniforms( AsteroidUniforms { @@ -364,7 +377,7 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) mvp_matrix, asteroid_parameters.colors.deep, asteroid_parameters.colors.shallow, - asteroid_parameters.depth_range, + mesh_subset_depth_range, asteroid_parameters.texture_index }, asteroid_parameters.index @@ -405,17 +418,16 @@ void AsteroidsArray::DrawParallel(gfx::ParallelRenderCommandList& parallel_cmd_l parallel_cmd_list.Reset(m_sp_render_state, "Asteroids Rendering"); assert(buffer_bindings.resource_bindings_per_instance.size() == m_settings.instance_count); - BaseBuffers::Draw(parallel_cmd_list, buffer_bindings.resource_bindings_per_instance, - gfx::Program::ResourceBindings::ApplyBehavior::ConstantOnce); + BaseBuffers::DrawParallel(parallel_cmd_list, buffer_bindings.resource_bindings_per_instance, + gfx::Program::ResourceBindings::ApplyBehavior::ConstantOnce); } uint32_t AsteroidsArray::GetSubsetByInstanceIndex(uint32_t instance_index) const { ITT_FUNCTION_TASK(); - assert(!!m_sp_content_state); - assert(instance_index < m_sp_content_state->parameters.size()); - return m_sp_content_state->parameters[instance_index].subset_index; + assert(instance_index < m_mesh_subset_by_instance_index.size()); + return m_mesh_subset_by_instance_index[instance_index]; } } // namespace Methane::Samples diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index 401c1a0e1..7af6875fd 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -49,7 +49,6 @@ class AsteroidsArray final : protected gfx::TexturedMeshBuffers { public: - UberMesh(uint32_t instance_count, uint32_t subdivisions_count, uint32_t min_subdivision, uint32_t random_seed); + UberMesh(uint32_t instance_count, uint32_t subdivisions_count, uint32_t random_seed); uint32_t GetInstanceCount() const { return m_instance_count; } uint32_t GetSubdivisionsCount() const { return m_subdivisions_count; } - uint32_t GetMinSubdivision() const { return m_min_subdivision; } - const gfx::Vector2f& GetSubsetDepthRange(uint32_t subset_index) const; + uint32_t GetSubsetIndex(uint32_t instance_index, uint32_t subdivision_index); uint32_t GetSubsetSubdivision(uint32_t subset_index) const; + const gfx::Vector2f& GetSubsetDepthRange(uint32_t subset_index) const; private: const uint32_t m_instance_count; const uint32_t m_subdivisions_count; - const uint32_t m_min_subdivision; std::vector m_depth_ranges; }; @@ -118,11 +116,15 @@ class AsteroidsArray final : protected gfx::TexturedMeshBuffers; + + const Settings m_settings; + ContentState::Ptr m_sp_content_state; + Textures m_unique_textures; + gfx::Sampler::Ptr m_sp_texture_sampler; + gfx::RenderState::Ptr m_sp_render_state; + MeshSubsetByInstanceIndex m_mesh_subset_by_instance_index; + }; } // namespace Methane::Samples diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp index e36c7c8fa..09e963442 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp @@ -154,8 +154,8 @@ class MeshBuffers } } - void Draw(ParallelRenderCommandList& parallel_cmd_list, const MeshBufferBindings::ResourceBindingsArray& instance_resource_bindings, - Program::ResourceBindings::ApplyBehavior::Mask bindings_apply_behavior = Program::ResourceBindings::ApplyBehavior::AllIncremental) + void DrawParallel(ParallelRenderCommandList& parallel_cmd_list, const MeshBufferBindings::ResourceBindingsArray& instance_resource_bindings, + Program::ResourceBindings::ApplyBehavior::Mask bindings_apply_behavior = Program::ResourceBindings::ApplyBehavior::AllIncremental) { ITT_FUNCTION_TASK(); From 04746193bc595af9affa0b4c250497196cbdd415 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 12 Jan 2020 15:47:23 +0300 Subject: [PATCH 104/129] Fixed Linux build. --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 0804ef7f3..602477ea6 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -29,6 +29,8 @@ Random generated asteroids array with uber mesh and textures ready for rendering #include #include +#include + namespace Methane::Samples { @@ -359,10 +361,10 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) const gfx::Vector3f asteroid_position(model_matrix(3, 0), model_matrix(3, 1), model_matrix(3, 2)); const float distance_to_eye = (eye_position - asteroid_position).length(); - const float relative_screen_size = asteroid_parameters.scale / std::sqrtf(distance_to_eye); - const float relative_screen_size_log2 = std::logf(relative_screen_size); + const float relative_screen_size = asteroid_parameters.scale / std::sqrt(distance_to_eye); + const float relative_screen_size_log2 = std::log2(relative_screen_size); - static const float min_subdiv_size_log2 = std::log2f(0.08); + static const float min_subdiv_size_log2 = std::log2(0.08f); const float mesh_subdiv_float = std::roundf(relative_screen_size_log2 - min_subdiv_size_log2); const uint32_t mesh_subdivision_index = std::min(m_settings.subdivisions_count - 1, static_cast(std::max(0.0f, mesh_subdiv_float))); const uint32_t mesh_subset_index = m_sp_content_state->uber_mesh.GetSubsetIndex(asteroid_parameters.mesh_instance_index, mesh_subdivision_index); From e1550f6f9372c025f71b37a6f5ff6152936f50d4 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 12 Jan 2020 17:29:11 +0300 Subject: [PATCH 105/129] Asteroids mesh LOD visualization switching and complexity controls added. --- Apps/Samples/Asteroids/Asteroid.cpp | 35 +++++++++++++++-- Apps/Samples/Asteroids/Asteroid.h | 1 + Apps/Samples/Asteroids/AsteroidsApp.cpp | 16 ++++++-- Apps/Samples/Asteroids/AsteroidsApp.h | 4 +- .../Asteroids/AsteroidsAppController.cpp | 21 ++++++++-- .../Asteroids/AsteroidsAppController.h | 5 ++- Apps/Samples/Asteroids/AsteroidsArray.cpp | 39 ++++++++++++------- Apps/Samples/Asteroids/AsteroidsArray.h | 8 ++++ 8 files changed, 104 insertions(+), 25 deletions(-) diff --git a/Apps/Samples/Asteroids/Asteroid.cpp b/Apps/Samples/Asteroids/Asteroid.cpp index 82d543e78..4abd621b0 100644 --- a/Apps/Samples/Asteroids/Asteroid.cpp +++ b/Apps/Samples/Asteroids/Asteroid.cpp @@ -175,8 +175,7 @@ Asteroid::Colors Asteroid::GetAsteroidRockColors(uint32_t deep_color_index, uint } }; static const AsteroidColorSchema s_linear_shallow_rock_colors = TransformSRGBToLinear(s_srgb_shallow_rock_colors); - if (deep_color_index >= s_linear_deep_rock_colors.size() || - shallow_color_index >= s_linear_shallow_rock_colors.size()) + if (deep_color_index >= s_linear_deep_rock_colors.size() || shallow_color_index >= s_linear_shallow_rock_colors.size()) throw std::invalid_argument("Deep or shallow color indices are out of boundaries for asteroids color schema."); return Asteroid::Colors{ s_linear_deep_rock_colors[deep_color_index], s_linear_shallow_rock_colors[shallow_color_index] }; @@ -206,13 +205,41 @@ Asteroid::Colors Asteroid::GetAsteroidIceColors(uint32_t deep_color_index, uint3 } }; static const AsteroidColorSchema s_linear_shallow_ice_colors = TransformSRGBToLinear(s_srgb_shallow_ice_colors); - if (deep_color_index >= s_linear_deep_ice_colors.size() || - shallow_color_index >= s_linear_shallow_ice_colors.size()) + if (deep_color_index >= s_linear_deep_ice_colors.size() || shallow_color_index >= s_linear_shallow_ice_colors.size()) throw std::invalid_argument("Deep or shallow color indices are out of boundaries for asteroids color schema."); return Asteroid::Colors{ s_linear_deep_ice_colors[deep_color_index], s_linear_shallow_ice_colors[shallow_color_index] }; } +Asteroid::Colors Asteroid::GetAsteroidLodColors(uint32_t lod_index) +{ + ITT_FUNCTION_TASK(); + static const AsteroidColorSchema s_srgb_lod_deep_colors = { { + { 0.f, 128.f, 0.f }, // LOD-0: green + { 0.f, 64.f, 128.f }, // LOD-1: blue + { 96.f, 0.f, 128.f }, // LOD-2: purple + { 128.f, 0.f, 0.f }, // LOD-3: red + { 128.f, 128.f, 0.f }, // LOD-4: yellow + { 128.f, 64.f, 0.f }, // LOD-5: orange + } }; + static const AsteroidColorSchema s_linear_lod_deep_colors = TransformSRGBToLinear(s_srgb_lod_deep_colors); + + static const AsteroidColorSchema s_srgb_lod_shallow_colors = { { + { 0.f, 255.f, 0.f }, // LOD-0: green + { 0.f, 128.f, 255.f }, // LOD-1: blue + { 196.f, 0.f, 255.f }, // LOD-2: purple + { 255.f, 0.f, 0.f }, // LOD-3: red + { 255.f, 255.f, 0.f }, // LOD-4: yellow + { 255.f, 128.f, 0.f }, // LOD-5: orange + } }; + static const AsteroidColorSchema s_linear_lod_shallow_colors = TransformSRGBToLinear(s_srgb_lod_shallow_colors); + + if (lod_index >= s_linear_lod_deep_colors.size() || lod_index >= s_linear_lod_shallow_colors.size()) + throw std::invalid_argument("LOD index is out of boundaries for asteroids color schema."); + + return Asteroid::Colors{ s_linear_lod_deep_colors[lod_index], s_linear_lod_shallow_colors[lod_index] }; +} + void Asteroid::FillPerlinNoiseToTexture(Data::Bytes& texture_data, const gfx::Dimensions& dimensions, uint32_t pixel_size, uint32_t row_stride, float random_seed, float persistence, float noise_scale, float noise_strength, uint32_t array_index) { diff --git a/Apps/Samples/Asteroids/Asteroid.h b/Apps/Samples/Asteroids/Asteroid.h index 65617a7ee..758227962 100644 --- a/Apps/Samples/Asteroids/Asteroid.h +++ b/Apps/Samples/Asteroids/Asteroid.h @@ -109,6 +109,7 @@ class Asteroid final : public gfx::TexturedMeshBuffers static constexpr size_t color_schema_size = 6u; static Colors GetAsteroidRockColors(uint32_t deep_color_index, uint32_t shallow_color_index); static Colors GetAsteroidIceColors(uint32_t deep_color_index, uint32_t shallow_color_index); + static Colors GetAsteroidLodColors(uint32_t lod_index); private: static void FillPerlinNoiseToTexture(Data::Bytes& texture_data, const gfx::Dimensions& dimensions, uint32_t pixel_size, uint32_t row_stride, diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index d3f1983a5..b0b346928 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -81,9 +81,12 @@ static const ParamValues g_scale_ratio = { }; static const std::map g_asteroids_action_by_keyboard_state = { - { { pal::Keyboard::Key::RightBracket }, AsteroidsAppAction::IncreaseComplexity }, - { { pal::Keyboard::Key::LeftBracket }, AsteroidsAppAction::DecreaseComplexity }, - { { pal::Keyboard::Key::P }, AsteroidsAppAction::SwitchParallelRendering }, + { { pal::Keyboard::Key::RightBracket }, AsteroidsAppAction::IncreaseComplexity }, + { { pal::Keyboard::Key::LeftBracket }, AsteroidsAppAction::DecreaseComplexity }, + { { pal::Keyboard::Key::P }, AsteroidsAppAction::SwitchParallelRendering }, + { { pal::Keyboard::Key::L }, AsteroidsAppAction::SwitchMeshLodsColoring }, + { { pal::Keyboard::Key::Apostrophe }, AsteroidsAppAction::IncreaseMeshLodComplexity }, + { { pal::Keyboard::Key::Semicolon }, AsteroidsAppAction::DecreaseMeshLodComplexity }, }; // Common application settings @@ -424,6 +427,13 @@ void AsteroidsApp::OnContextReleased() GraphicsApp::OnContextReleased(); } +AsteroidsArray& AsteroidsApp::GetAsterpodsArray() +{ + ITT_FUNCTION_TASK(); + assert(!!m_sp_asteroids_array); + return *m_sp_asteroids_array; +} + void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 5ee13329d..41a87e577 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -64,7 +64,9 @@ class AsteroidsApp final : public GraphicsApp // Context::Callback overrides void OnContextReleased() override; - + + AsteroidsArray& GetAsterpodsArray(); + uint32_t GetAsteroidsComplexity() const { return m_asteroids_complexity; } void SetAsteroidsComplexity(uint32_t asteroids_complexity); diff --git a/Apps/Samples/Asteroids/AsteroidsAppController.cpp b/Apps/Samples/Asteroids/AsteroidsAppController.cpp index ca8c6330c..6273278f9 100644 --- a/Apps/Samples/Asteroids/AsteroidsAppController.cpp +++ b/Apps/Samples/Asteroids/AsteroidsAppController.cpp @@ -63,6 +63,18 @@ void AsteroidsAppController::OnKeyboardStateAction(AsteroidsAppAction action) case AsteroidsAppAction::SwitchParallelRendering: m_asteroids_app.SetParallelRenderingEnabled(!m_asteroids_app.IsParallelRenderingEnabled()); break; + + case AsteroidsAppAction::SwitchMeshLodsColoring: + m_asteroids_app.GetAsterpodsArray().SetMeshLodColoringEnabled(!m_asteroids_app.GetAsterpodsArray().IsMeshLodColoringEnabled()); + break; + + case AsteroidsAppAction::IncreaseMeshLodComplexity: + m_asteroids_app.GetAsterpodsArray().SetMinMeshLodScreenSize(m_asteroids_app.GetAsterpodsArray().GetMinMeshLodScreenSize() / 2.f); + break; + + case AsteroidsAppAction::DecreaseMeshLodComplexity: + m_asteroids_app.GetAsterpodsArray().SetMinMeshLodScreenSize(m_asteroids_app.GetAsterpodsArray().GetMinMeshLodScreenSize() * 2.f); + break; default: assert(0); @@ -74,9 +86,12 @@ std::string AsteroidsAppController::GetKeyboardActionName(AsteroidsAppAction act ITT_FUNCTION_TASK(); switch(action) { - case AsteroidsAppAction::IncreaseComplexity: return "increase scene complexity"; - case AsteroidsAppAction::DecreaseComplexity: return "decrease scene complexity"; - case AsteroidsAppAction::SwitchParallelRendering: return "switch parallel rendering"; + case AsteroidsAppAction::IncreaseComplexity: return "increase scene complexity"; + case AsteroidsAppAction::DecreaseComplexity: return "decrease scene complexity"; + case AsteroidsAppAction::SwitchParallelRendering: return "switch parallel rendering"; + case AsteroidsAppAction::SwitchMeshLodsColoring: return "switch mesh LOD coloring"; + case AsteroidsAppAction::IncreaseMeshLodComplexity: return "increase mesh LOD complexity"; + case AsteroidsAppAction::DecreaseMeshLodComplexity: return "decrease mesh LOD complexity"; default: assert(0); } return ""; diff --git a/Apps/Samples/Asteroids/AsteroidsAppController.h b/Apps/Samples/Asteroids/AsteroidsAppController.h index 5d168f505..b4706bc49 100644 --- a/Apps/Samples/Asteroids/AsteroidsAppController.h +++ b/Apps/Samples/Asteroids/AsteroidsAppController.h @@ -38,7 +38,10 @@ enum class AsteroidsAppAction : uint32_t IncreaseComplexity, DecreaseComplexity, SwitchParallelRendering, - + SwitchMeshLodsColoring, + IncreaseMeshLodComplexity, + DecreaseMeshLodComplexity, + Count }; diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 602477ea6..683dc4f95 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -217,6 +217,7 @@ AsteroidsArray::AsteroidsArray(gfx::Context& context, Settings settings, Content , m_settings(std::move(settings)) , m_sp_content_state(state.shared_from_this()) , m_mesh_subset_by_instance_index(m_settings.instance_count, 0u) + , m_min_mesh_lod_screen_size_log2(std::log2(0.08f)) { ITT_FUNCTION_TASK(); SCOPE_TIMER("AsteroidsArray::AsteroidsArray"); @@ -356,19 +357,19 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) gfx::Matrix44f orbit_rotation_matrix; cml::matrix_rotation_world_y(orbit_rotation_matrix, orbit_angle_rad); - const gfx::Matrix44f model_matrix = spin_rotation_matrix * asteroid_parameters.scale_translate_matrix * orbit_rotation_matrix; - const gfx::Matrix44f mvp_matrix = model_matrix * view_proj_matrix; + const gfx::Matrix44f model_matrix = spin_rotation_matrix * asteroid_parameters.scale_translate_matrix * orbit_rotation_matrix; + const gfx::Matrix44f mvp_matrix = model_matrix * view_proj_matrix; - const gfx::Vector3f asteroid_position(model_matrix(3, 0), model_matrix(3, 1), model_matrix(3, 2)); - const float distance_to_eye = (eye_position - asteroid_position).length(); - const float relative_screen_size = asteroid_parameters.scale / std::sqrt(distance_to_eye); - const float relative_screen_size_log2 = std::log2(relative_screen_size); + const gfx::Vector3f asteroid_position(model_matrix(3, 0), model_matrix(3, 1), model_matrix(3, 2)); + const float distance_to_eye = (eye_position - asteroid_position).length(); + const float relative_screen_size_log2 = std::log2(asteroid_parameters.scale / std::sqrt(distance_to_eye)); - static const float min_subdiv_size_log2 = std::log2(0.08f); - const float mesh_subdiv_float = std::roundf(relative_screen_size_log2 - min_subdiv_size_log2); - const uint32_t mesh_subdivision_index = std::min(m_settings.subdivisions_count - 1, static_cast(std::max(0.0f, mesh_subdiv_float))); - const uint32_t mesh_subset_index = m_sp_content_state->uber_mesh.GetSubsetIndex(asteroid_parameters.mesh_instance_index, mesh_subdivision_index); - const gfx::Vector2f& mesh_subset_depth_range = m_sp_content_state->uber_mesh.GetSubsetDepthRange(mesh_subset_index); + const float mesh_subdiv_float = std::roundf(relative_screen_size_log2 - m_min_mesh_lod_screen_size_log2); + const uint32_t mesh_subdivision_index = std::min(m_settings.subdivisions_count - 1, static_cast(std::max(0.0f, mesh_subdiv_float))); + const uint32_t mesh_subset_index = m_sp_content_state->uber_mesh.GetSubsetIndex(asteroid_parameters.mesh_instance_index, mesh_subdivision_index); + const gfx::Vector2f& mesh_subset_depth_range = m_sp_content_state->uber_mesh.GetSubsetDepthRange(mesh_subset_index); + const Asteroid::Colors& asteroid_colors = m_mesh_lod_coloring_enabled ? Asteroid::GetAsteroidLodColors(mesh_subdivision_index) + : asteroid_parameters.colors; m_mesh_subset_by_instance_index[asteroid_parameters.index] = mesh_subset_index; @@ -377,8 +378,8 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) { model_matrix, mvp_matrix, - asteroid_parameters.colors.deep, - asteroid_parameters.colors.shallow, + asteroid_colors.deep, + asteroid_colors.shallow, mesh_subset_depth_range, asteroid_parameters.texture_index }, @@ -424,6 +425,18 @@ void AsteroidsArray::DrawParallel(gfx::ParallelRenderCommandList& parallel_cmd_l gfx::Program::ResourceBindings::ApplyBehavior::ConstantOnce); } +float AsteroidsArray::GetMinMeshLodScreenSize() const +{ + ITT_FUNCTION_TASK(); + return std::pow(2.f, m_min_mesh_lod_screen_size_log2); +} + +void AsteroidsArray::SetMinMeshLodScreenSize(float mesh_lod_min_screen_size) +{ + ITT_FUNCTION_TASK(); + m_min_mesh_lod_screen_size_log2 = std::log2(mesh_lod_min_screen_size); +} + uint32_t AsteroidsArray::GetSubsetByInstanceIndex(uint32_t instance_index) const { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index 7af6875fd..0fabf73bf 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -111,6 +111,12 @@ class AsteroidsArray final : protected gfx::TexturedMeshBuffers Date: Sun, 12 Jan 2020 17:56:01 +0300 Subject: [PATCH 106/129] Externals updated with CML fix of Linux build warning. --- Externals | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Externals b/Externals index 523cb0625..ae7ddc840 160000 --- a/Externals +++ b/Externals @@ -1 +1 @@ -Subproject commit 523cb06254b7814d3aedab497ffce7bf770ca426 +Subproject commit ae7ddc8405111b589c061fb9de52faa161a6fdd3 From cc9ae12ec5cffbccdf211eee06b96315903a05c6 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 12 Jan 2020 18:28:44 +0300 Subject: [PATCH 107/129] Fixed textured sphere mesh indices and added function for mesh data validation. --- .../Helpers/Include/Methane/Graphics/Mesh.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h index a0b2dc390..14d349631 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h @@ -289,6 +289,18 @@ class BaseMesh : public Mesh } } + void ValidateMeshData() + { + for(size_t index = 0; index < m_indices.size(); ++index) + { + const Index vertex_index = m_indices[index]; + if (vertex_index >= m_vertices.size()) + throw std::logic_error("Mesh index buffer value " + std::to_string(vertex_index) + + " at position " + std::to_string(index) + + " is out of vertex buffer size " + std::to_string(m_vertices.size())); + } + } + Vertices m_vertices; }; @@ -640,7 +652,7 @@ class SphereMesh : public BaseMesh const uint32_t vertices_count = static_cast(BaseMeshT::m_vertices.size()); const uint32_t index_lat_lines_count = has_texcoord ? m_lat_lines_count - 1 : m_lat_lines_count - 3; - const uint32_t index_long_lines_count = has_texcoord ? m_long_lines_count + 1 : m_long_lines_count - 1; + const uint32_t index_long_lines_count = has_texcoord ? m_long_lines_count : m_long_lines_count - 1; const uint32_t first_vertex_index = has_texcoord ? 0 : 1; for (uint32_t lat_line_index = 0; lat_line_index < index_lat_lines_count; ++lat_line_index) From f83bb4e1877b149c1e143303889105993f6d7581 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 12 Jan 2020 18:58:30 +0300 Subject: [PATCH 108/129] Asteroids simulation parameters adjustments. --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 10 +++++----- Apps/Samples/Asteroids/Planet.cpp | 2 +- Apps/Samples/Asteroids/Shaders/Asteroids.hlsl | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 683dc4f95..3c9bb9c3a 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -157,8 +157,8 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) std::uniform_int_distribution colors_distribution(0, static_cast(Asteroid::color_schema_size - 1)); std::uniform_real_distribution scale_distribution(settings.min_asteroid_scale_ratio, settings.max_asteroid_scale_ratio); std::uniform_real_distribution scale_proportion_distribution(0.8f, 1.2f); - std::uniform_real_distribution spin_velocity_distribution(-2.f, 2.f); - std::uniform_real_distribution orbit_velocity_distribution(3.f, 10.f); + std::uniform_real_distribution spin_velocity_distribution(-1.7f, 1.7f); + std::uniform_real_distribution orbit_velocity_distribution(1.5f, 5.f); std::normal_distribution orbit_radius_distribution(orbit_radius, 0.6f * disc_radius); std::normal_distribution orbit_height_distribution(0.0f, 0.4f * disc_radius); @@ -181,7 +181,7 @@ AsteroidsArray::ContentState::ContentState(const Settings& settings) gfx::Matrix44f scale_matrix; cml::matrix_scale(scale_matrix, asteroid_scale_ratios * settings.scale); - const gfx::Matrix44f scale_translate_matrix = scale_matrix * translation_matrix; + gfx::Matrix44f scale_translate_matrix = scale_matrix * translation_matrix; Asteroid::Colors asteroid_colors = normal_distribution(rng) <= 1.f ? Asteroid::GetAsteroidIceColors(colors_distribution(rng), colors_distribution(rng)) @@ -217,7 +217,7 @@ AsteroidsArray::AsteroidsArray(gfx::Context& context, Settings settings, Content , m_settings(std::move(settings)) , m_sp_content_state(state.shared_from_this()) , m_mesh_subset_by_instance_index(m_settings.instance_count, 0u) - , m_min_mesh_lod_screen_size_log2(std::log2(0.08f)) + , m_min_mesh_lod_screen_size_log2(std::log2(0.04f)) { ITT_FUNCTION_TASK(); SCOPE_TIMER("AsteroidsArray::AsteroidsArray"); @@ -349,7 +349,7 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) ITT_FUNCTION_TASK(); const float spin_angle_rad = asteroid_parameters.spin_angle_rad + asteroid_parameters.spin_speed * elapsed_radians; - const float orbit_angle_rad = asteroid_parameters.orbit_angle_rad + asteroid_parameters.orbit_speed * elapsed_radians; + const float orbit_angle_rad = asteroid_parameters.orbit_angle_rad - asteroid_parameters.orbit_speed * elapsed_radians; gfx::Matrix44f spin_rotation_matrix; cml::matrix_rotation_axis_angle(spin_rotation_matrix, asteroid_parameters.spin_axis, spin_angle_rad); diff --git a/Apps/Samples/Asteroids/Planet.cpp b/Apps/Samples/Asteroids/Planet.cpp index 516cace00..6fb3da271 100644 --- a/Apps/Samples/Asteroids/Planet.cpp +++ b/Apps/Samples/Asteroids/Planet.cpp @@ -121,7 +121,7 @@ bool Planet::Update(double elapsed_seconds, double) m_settings.view_camera.GetViewProjMatrices(scene_view_matrix, scene_proj_matrix); cml::matrix_uniform_scale(model_scale_matrix, m_settings.scale); cml::matrix_translation(model_translate_matrix, m_settings.position); - cml::matrix_rotation_world_y(model_rotation_matrix, m_settings.spin_velocity_rps * elapsed_seconds); + cml::matrix_rotation_world_y(model_rotation_matrix, -m_settings.spin_velocity_rps * elapsed_seconds); Uniforms uniforms = {}; uniforms.eye_position = gfx::Vector4f(m_settings.view_camera.GetOrientation().eye, 1.f); diff --git a/Apps/Samples/Asteroids/Shaders/Asteroids.hlsl b/Apps/Samples/Asteroids/Shaders/Asteroids.hlsl index 16164e7ed..a10420bab 100644 --- a/Apps/Samples/Asteroids/Shaders/Asteroids.hlsl +++ b/Apps/Samples/Asteroids/Shaders/Asteroids.hlsl @@ -94,6 +94,7 @@ float4 AsteroidPS(PSInput input) : SV_TARGET const float specular_part = pow(clamp(dot(fragment_to_eye, light_reflected_from_fragment), 0.0, 1.0), g_constants.light_specular_factor); const float4 specular_color = base_color * specular_part; + const float fading_ratio = saturate(input.position.z * 20000.0f); - return ambient_color + diffuse_color + specular_color; + return (ambient_color + diffuse_color + specular_color) * fading_ratio; } From b1cc9bf0ccab39aa73773ee6ee8153077145d9be Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 12 Jan 2020 19:54:17 +0300 Subject: [PATCH 109/129] Camera orientation parameters printing to debug output. --- .../Helpers/Include/Methane/Graphics/Camera.h | 2 ++ .../Sources/Methane/Graphics/ActionCamera.cpp | 2 ++ .../Methane/Graphics/ArcBallCamera.cpp | 1 + .../Sources/Methane/Graphics/Camera.cpp | 19 +++++++++++++++++++ 4 files changed, 24 insertions(+) diff --git a/Modules/Graphics/Helpers/Include/Methane/Graphics/Camera.h b/Modules/Graphics/Helpers/Include/Methane/Graphics/Camera.h index d05712342..b4bff63c5 100644 --- a/Modules/Graphics/Helpers/Include/Methane/Graphics/Camera.h +++ b/Modules/Graphics/Helpers/Include/Methane/Graphics/Camera.h @@ -86,6 +86,8 @@ class Camera Vector4f TransformWorldToView(const Vector4f& world_pos) const noexcept { return TransformWorldToView(world_pos, m_current_orientation); } Vector4f TransformViewToWorld(const Vector4f& view_pos) const noexcept { return TransformViewToWorld(view_pos, m_current_orientation); } + void PrintOrientation(); + protected: float GetFOVAngleY() const noexcept; diff --git a/Modules/Graphics/Helpers/Sources/Methane/Graphics/ActionCamera.cpp b/Modules/Graphics/Helpers/Sources/Methane/Graphics/ActionCamera.cpp index 5a24ce012..358b31ca5 100644 --- a/Modules/Graphics/Helpers/Sources/Methane/Graphics/ActionCamera.cpp +++ b/Modules/Graphics/Helpers/Sources/Methane/Graphics/ActionCamera.cpp @@ -157,6 +157,7 @@ void ActionCamera::Move(const Vector3f& move_vector) ITT_FUNCTION_TASK(); m_current_orientation.aim += move_vector; m_current_orientation.eye += move_vector; + PrintOrientation(); } void ActionCamera::Zoom(float zoom_factor) @@ -165,6 +166,7 @@ void ActionCamera::Zoom(float zoom_factor) const Vector3f look_dir = GetLookDirection(m_current_orientation); const float zoom_distance = std::min(std::max(look_dir.length() * zoom_factor, m_zoom_distance_range.first), m_zoom_distance_range.second); ApplyLookDirection(cml::normalize(look_dir) * zoom_distance); + PrintOrientation(); } void ActionCamera::StartRotateAction(KeyboardAction rotate_action, const Vector3f& rotation_axis_in_view, double duration_sec) diff --git a/Modules/Graphics/Helpers/Sources/Methane/Graphics/ArcBallCamera.cpp b/Modules/Graphics/Helpers/Sources/Methane/Graphics/ArcBallCamera.cpp index 725d27a06..8d1780e7a 100644 --- a/Modules/Graphics/Helpers/Sources/Methane/Graphics/ArcBallCamera.cpp +++ b/Modules/Graphics/Helpers/Sources/Methane/Graphics/ArcBallCamera.cpp @@ -132,6 +132,7 @@ void ArcBallCamera::ApplyLookDirection(const Vector3f& look_dir) case Pivot::Aim: m_current_orientation.eye = m_current_orientation.aim - look_dir; break; case Pivot::Eye: m_current_orientation.aim = m_current_orientation.eye + look_dir; break; } + PrintOrientation(); } void ArcBallCamera::Rotate(const Vector3f& view_axis, float angle_rad, const Orientation& base_orientation) diff --git a/Modules/Graphics/Helpers/Sources/Methane/Graphics/Camera.cpp b/Modules/Graphics/Helpers/Sources/Methane/Graphics/Camera.cpp index b74540a47..0dcbbaa02 100644 --- a/Modules/Graphics/Helpers/Sources/Methane/Graphics/Camera.cpp +++ b/Modules/Graphics/Helpers/Sources/Methane/Graphics/Camera.cpp @@ -26,6 +26,13 @@ Camera helper implementation allowing to generate view and projectrion matrices. #include +//#define PRINT_CAMERA_ORIENTATION + +#ifdef PRINT_CAMERA_ORIENTATION +#include +#include +#endif + namespace Methane::Graphics { @@ -151,4 +158,16 @@ float Camera::GetFOVAngleY() const noexcept return fov_angle_y; } +void Camera::PrintOrientation() +{ +#ifdef PRINT_CAMERA_ORIENTATION + std::stringstream ss; + ss << std::endl << "Camera orientation:" + << std::endl << " - eye: " << VectorToString(m_current_orientation.eye) + << std::endl << " - aim: " << VectorToString(m_current_orientation.aim) + << std::endl << " - up: " << VectorToString(m_current_orientation.up); + Platform::PrintToDebugOutput(ss.str()); +#endif +} + } // namespace Methane::Graphics From 3007c906b35121e34f2e0231d8eb8ce2939116c4 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Sun, 12 Jan 2020 19:55:18 +0300 Subject: [PATCH 110/129] Updated asteroids default camera orientation and added sample screenshot. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 2 +- .../Screenshots/AsteroidsWinDirectX12.jpg | Bin 0 -> 201100 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index b0b346928..1cc3550c6 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -147,7 +147,7 @@ AsteroidsApp::AsteroidsApp() // NOTE: Near and Far values are swapped in camera parameters (1st value is near = max depth, 2nd value is far = min depth) // for Reversed-Z buffer values range [ near: 1, far 0], instead of [ near 0, far 1] // which is used for "from near to far" drawing order for reducing pixels overdraw - m_view_camera.SetOrientation({ { 0.f, 60.f, 250.f }, { 0.f, 0.f, 0.f }, { 0.f, 1.f, 0.f } }); + m_view_camera.SetOrientation({ { -110.f, 75.f, 210.f }, { 0.f, -60.f, 25.f }, { 0.f, 1.f, 0.f } }); m_view_camera.SetParamters({ 600.f /* near = max depth */, 0.01f /*far = min depth*/, 90.f /* FOV */ }); m_view_camera.SetZoomDistanceRange({ 60.f , 400.f }); diff --git a/Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg b/Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6cab3edaa06f3d7537e7f2f3cc3c79c574b4490 GIT binary patch literal 201100 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

#anzT`Ppxh`a^$MOLOY^RI~0Y3SVf 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�M~sJ$Pk88dIG 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

3*%?Pp5%S+Ni-0W51+(f3&l^S#Is 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 Date: Sun, 12 Jan 2020 21:10:22 +0300 Subject: [PATCH 111/129] Asteroids simulation parameters in message box. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 40 +++++----- Apps/Samples/Asteroids/AsteroidsApp.h | 5 +- .../Asteroids/AsteroidsAppController.cpp | 75 ++++++++++-------- .../Asteroids/AsteroidsAppController.h | 3 +- .../Screenshots/AsteroidsWinDirectX12.jpg | Bin 201100 -> 225194 bytes 5 files changed, 68 insertions(+), 55 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 1cc3550c6..7f3df383f 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -81,6 +81,7 @@ static const ParamValues g_scale_ratio = { }; static const std::map g_asteroids_action_by_keyboard_state = { + { { pal::Keyboard::Key::F2 }, AsteroidsAppAction::ShowParameters }, { { pal::Keyboard::Key::RightBracket }, AsteroidsAppAction::IncreaseComplexity }, { { pal::Keyboard::Key::LeftBracket }, AsteroidsAppAction::DecreaseComplexity }, { { pal::Keyboard::Key::P }, AsteroidsAppAction::SwitchParallelRendering }, @@ -296,7 +297,7 @@ void AsteroidsApp::Init() // - execute commands to upload resources to GPU context.CompleteInitialization(); - PrintParameters(); + pal::PrintToDebugOutput(GetParametersString()); } bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) @@ -427,13 +428,6 @@ void AsteroidsApp::OnContextReleased() GraphicsApp::OnContextReleased(); } -AsteroidsArray& AsteroidsApp::GetAsterpodsArray() -{ - ITT_FUNCTION_TASK(); - assert(!!m_sp_asteroids_array); - return *m_sp_asteroids_array; -} - void AsteroidsApp::SetAsteroidsComplexity(uint32_t asteroids_complexity) { ITT_FUNCTION_TASK(); @@ -466,23 +460,33 @@ void AsteroidsApp::SetParallelRenderingEnabled(bool is_parallel_rendering_enable m_is_parallel_rendering_enabled = is_parallel_rendering_enabled; - PrintParameters(); + pal::PrintToDebugOutput(GetParametersString()); +} + + +AsteroidsArray& AsteroidsApp::GetAsteroidsArray() const +{ + ITT_FUNCTION_TASK(); + assert(!!m_sp_asteroids_array); + return *m_sp_asteroids_array; } -void AsteroidsApp::PrintParameters() +std::string AsteroidsApp::GetParametersString() const { ITT_FUNCTION_TASK(); std::stringstream ss; ss << std::endl << "Asteroids simulation parameters:" - << std::endl << " - simulation complexity: " << m_asteroids_complexity - << std::endl << " - parallel rendering: " << (m_is_parallel_rendering_enabled ? "enabled" : "disabled") - << std::endl << " - asteroid instances count: " << m_asteroids_array_settings.instance_count - << std::endl << " - unique meshes count: " << m_asteroids_array_settings.unique_mesh_count - << std::endl << " - mesh subdivisions count: " << m_asteroids_array_settings.subdivisions_count - << std::endl << " - unique textures count: " << m_asteroids_array_settings.textures_count << " " - << static_cast(m_asteroids_array_settings.texture_dimensions); - pal::PrintToDebugOutput(ss.str()); + << std::endl << " - simulation complexity: " << m_asteroids_complexity + << std::endl << " - asteroid instances count: " << m_asteroids_array_settings.instance_count + << std::endl << " - unique meshes count: " << m_asteroids_array_settings.unique_mesh_count + << std::endl << " - mesh subdivisions count: " << m_asteroids_array_settings.subdivisions_count + << std::endl << " - unique textures count: " << m_asteroids_array_settings.textures_count << " " + << static_cast(m_asteroids_array_settings.texture_dimensions) + << std::endl << " - parallel rendering: " << (m_is_parallel_rendering_enabled ? "enabled" : "disabled") + << std::endl << " - CPU hardware thread count: " << std::thread::hardware_concurrency(); + + return ss.str(); } } // namespace Methane::Samples diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index 41a87e577..a73a9a344 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -65,15 +65,14 @@ class AsteroidsApp final : public GraphicsApp // Context::Callback overrides void OnContextReleased() override; - AsteroidsArray& GetAsterpodsArray(); - uint32_t GetAsteroidsComplexity() const { return m_asteroids_complexity; } void SetAsteroidsComplexity(uint32_t asteroids_complexity); bool IsParallelRenderingEnabled() const { return m_is_parallel_rendering_enabled; } void SetParallelRenderingEnabled(bool is_parallel_rendering_enabled); - void PrintParameters(); + AsteroidsArray& GetAsteroidsArray() const; + std::string GetParametersString() const; private: struct SHADER_STRUCT_ALIGN Constants diff --git a/Apps/Samples/Asteroids/AsteroidsAppController.cpp b/Apps/Samples/Asteroids/AsteroidsAppController.cpp index 6273278f9..57f78e288 100644 --- a/Apps/Samples/Asteroids/AsteroidsAppController.cpp +++ b/Apps/Samples/Asteroids/AsteroidsAppController.cpp @@ -52,32 +52,40 @@ void AsteroidsAppController::OnKeyboardStateAction(AsteroidsAppAction action) const uint32_t asteroids_complexity = m_asteroids_app.GetAsteroidsComplexity(); switch(action) { - case AsteroidsAppAction::IncreaseComplexity: - m_asteroids_app.SetAsteroidsComplexity(asteroids_complexity + 1); - break; - - case AsteroidsAppAction::DecreaseComplexity: - m_asteroids_app.SetAsteroidsComplexity(asteroids_complexity > 1 ? asteroids_complexity - 1 : 0); - break; - - case AsteroidsAppAction::SwitchParallelRendering: - m_asteroids_app.SetParallelRenderingEnabled(!m_asteroids_app.IsParallelRenderingEnabled()); - break; - - case AsteroidsAppAction::SwitchMeshLodsColoring: - m_asteroids_app.GetAsterpodsArray().SetMeshLodColoringEnabled(!m_asteroids_app.GetAsterpodsArray().IsMeshLodColoringEnabled()); - break; - - case AsteroidsAppAction::IncreaseMeshLodComplexity: - m_asteroids_app.GetAsterpodsArray().SetMinMeshLodScreenSize(m_asteroids_app.GetAsterpodsArray().GetMinMeshLodScreenSize() / 2.f); - break; - - case AsteroidsAppAction::DecreaseMeshLodComplexity: - m_asteroids_app.GetAsterpodsArray().SetMinMeshLodScreenSize(m_asteroids_app.GetAsterpodsArray().GetMinMeshLodScreenSize() * 2.f); - break; - - default: - assert(0); + case AsteroidsAppAction::ShowParameters: + m_asteroids_app.Alert({ + pal::AppBase::Message::Type::Information, + "Methane Asteroids", + m_asteroids_app.GetParametersString() + }); + break; + + case AsteroidsAppAction::IncreaseComplexity: + m_asteroids_app.SetAsteroidsComplexity(asteroids_complexity + 1); + break; + + case AsteroidsAppAction::DecreaseComplexity: + m_asteroids_app.SetAsteroidsComplexity(asteroids_complexity > 1 ? asteroids_complexity - 1 : 0); + break; + + case AsteroidsAppAction::SwitchParallelRendering: + m_asteroids_app.SetParallelRenderingEnabled(!m_asteroids_app.IsParallelRenderingEnabled()); + break; + + case AsteroidsAppAction::SwitchMeshLodsColoring: + m_asteroids_app.GetAsteroidsArray().SetMeshLodColoringEnabled(!m_asteroids_app.GetAsteroidsArray().IsMeshLodColoringEnabled()); + break; + + case AsteroidsAppAction::IncreaseMeshLodComplexity: + m_asteroids_app.GetAsteroidsArray().SetMinMeshLodScreenSize(m_asteroids_app.GetAsteroidsArray().GetMinMeshLodScreenSize() / 2.f); + break; + + case AsteroidsAppAction::DecreaseMeshLodComplexity: + m_asteroids_app.GetAsteroidsArray().SetMinMeshLodScreenSize(m_asteroids_app.GetAsteroidsArray().GetMinMeshLodScreenSize() * 2.f); + break; + + default: + assert(0); } } @@ -86,13 +94,14 @@ std::string AsteroidsAppController::GetKeyboardActionName(AsteroidsAppAction act ITT_FUNCTION_TASK(); switch(action) { - case AsteroidsAppAction::IncreaseComplexity: return "increase scene complexity"; - case AsteroidsAppAction::DecreaseComplexity: return "decrease scene complexity"; - case AsteroidsAppAction::SwitchParallelRendering: return "switch parallel rendering"; - case AsteroidsAppAction::SwitchMeshLodsColoring: return "switch mesh LOD coloring"; - case AsteroidsAppAction::IncreaseMeshLodComplexity: return "increase mesh LOD complexity"; - case AsteroidsAppAction::DecreaseMeshLodComplexity: return "decrease mesh LOD complexity"; - default: assert(0); + case AsteroidsAppAction::ShowParameters: return "show simulation parameters"; + case AsteroidsAppAction::IncreaseComplexity: return "increase scene complexity"; + case AsteroidsAppAction::DecreaseComplexity: return "decrease scene complexity"; + case AsteroidsAppAction::SwitchParallelRendering: return "switch parallel rendering"; + case AsteroidsAppAction::SwitchMeshLodsColoring: return "switch mesh LOD coloring"; + case AsteroidsAppAction::IncreaseMeshLodComplexity: return "increase mesh LOD complexity"; + case AsteroidsAppAction::DecreaseMeshLodComplexity: return "decrease mesh LOD complexity"; + default: assert(0); } return ""; } diff --git a/Apps/Samples/Asteroids/AsteroidsAppController.h b/Apps/Samples/Asteroids/AsteroidsAppController.h index b4706bc49..54aecdcaf 100644 --- a/Apps/Samples/Asteroids/AsteroidsAppController.h +++ b/Apps/Samples/Asteroids/AsteroidsAppController.h @@ -34,7 +34,8 @@ class AsteroidsApp; enum class AsteroidsAppAction : uint32_t { None = 0u, - + + ShowParameters, IncreaseComplexity, DecreaseComplexity, SwitchParallelRendering, diff --git a/Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg b/Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg index c6cab3edaa06f3d7537e7f2f3cc3c79c574b4490..5c3ccda485db3f3c52acdc4274fa688601414bda 100644 GIT binary patch literal 225194 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 literal 201100 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

#anzT`Ppxh`a^$MOLOY^RI~0Y3SVf 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�M~sJ$Pk88dIG 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

3*%?Pp5%S+Ni-0W51+(f3&l^S#Is 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 Date: Sun, 12 Jan 2020 22:19:23 +0300 Subject: [PATCH 112/129] Logo badge rendering moved from tutorial & samples code to base graphics application. --- Apps/Samples/Asteroids/AsteroidsApp.cpp | 12 +++------ Apps/Samples/Asteroids/AsteroidsApp.h | 1 - .../01-HelloTriangle/HelloTriangleApp.cpp | 12 +++------ .../01-HelloTriangle/HelloTriangleApp.h | 1 - .../HelloTriangleAppSimple.cpp | 3 ++- .../02-TexturedCube/TexturedCubeApp.cpp | 12 +++------ .../02-TexturedCube/TexturedCubeApp.h | 1 - .../Tutorials/03-ShadowCube/ShadowCubeApp.cpp | 14 +++-------- Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h | 1 - .../App/Include/Methane/Graphics/App.hpp | 25 +++++++++++++++++-- 10 files changed, 37 insertions(+), 45 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsApp.cpp b/Apps/Samples/Asteroids/AsteroidsApp.cpp index 7f3df383f..0632496c3 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.cpp +++ b/Apps/Samples/Asteroids/AsteroidsApp.cpp @@ -108,7 +108,8 @@ static const GraphicsApp::Settings g_app_settings = // Application settings: 3u, // - frame_buffers_count false, // - vsync_enabled }, // - true // show_hud_in_window_title + true, // show_hud_in_window_title + true // show_logo_badge }; AsteroidsApp::AsteroidsApp() @@ -188,9 +189,6 @@ void AsteroidsApp::Init() m_view_camera.Resize(static_cast(context_settings.frame_size.width), static_cast(context_settings.frame_size.height)); - // Create Methane logo badge - m_sp_logo_badge = std::make_shared(context); - // Create sky-box m_sp_sky_box = std::make_shared(context, m_image_loader, gfx::SkyBox::Settings{ m_view_camera, @@ -324,7 +322,6 @@ bool AsteroidsApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) frame.sp_final_screen_pass->Update(final_pass_settings); } - m_sp_logo_badge->Resize(frame_size); m_sp_sky_box->Resize(frame_size); m_sp_planet->Resize(frame_size); m_sp_asteroids_array->Resize(frame_size); @@ -394,9 +391,7 @@ bool AsteroidsApp::Render() assert(!!m_sp_sky_box); m_sp_sky_box->Draw(*frame.sp_final_cmd_list, frame.skybox); - // Logo-badge rendering - assert(!!m_sp_logo_badge); - m_sp_logo_badge->Draw(*frame.sp_final_cmd_list); + RenderOverlay(*frame.sp_final_cmd_list); frame.sp_final_cmd_list->Commit(true); execute_cmd_lists.push_back(*frame.sp_final_cmd_list); @@ -419,7 +414,6 @@ void AsteroidsApp::OnContextReleased() } m_animations.clear(); - m_sp_logo_badge.reset(); m_sp_sky_box.reset(); m_sp_planet.reset(); m_sp_asteroids_array.reset(); diff --git a/Apps/Samples/Asteroids/AsteroidsApp.h b/Apps/Samples/Asteroids/AsteroidsApp.h index a73a9a344..f6c4b2016 100644 --- a/Apps/Samples/Asteroids/AsteroidsApp.h +++ b/Apps/Samples/Asteroids/AsteroidsApp.h @@ -99,7 +99,6 @@ class AsteroidsApp final : public GraphicsApp SceneUniforms m_scene_uniforms = { }; gfx::Buffer::Ptr m_sp_const_buffer; - gfx::LogoBadge::Ptr m_sp_logo_badge; gfx::SkyBox::Ptr m_sp_sky_box; Planet::Ptr m_sp_planet; AsteroidsArray::Ptr m_sp_asteroids_array; diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp index b3ae2166c..8381ed7ac 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.cpp @@ -45,7 +45,8 @@ static const GraphicsApp::Settings g_app_settings = // Application settings 3, // - frame_buffers_count true, // - vsync_enabled }, // - true // show_hud_in_window_title + true, // show_hud_in_window_title + true // show_logo_badge }; HelloTriangleApp::HelloTriangleApp() @@ -70,9 +71,6 @@ void HelloTriangleApp::Init() assert(m_sp_context); - // Create Methane logo badge - m_sp_logo_badge = std::make_shared(*m_sp_context); - // Create triangle shading program m_sp_program = gfx::Program::Create(*m_sp_context, { { // shaders @@ -134,7 +132,6 @@ bool HelloTriangleApp::Resize(const gfx::FrameSize& frame_size, bool is_minimize assert(m_sp_state); m_sp_state->SetViewports( { gfx::GetFrameViewport(frame_size) } ); m_sp_state->SetScissorRects( { gfx::GetFrameScissorRect(frame_size) } ); - m_sp_logo_badge->Resize(frame_size); return true; } @@ -159,9 +156,7 @@ bool HelloTriangleApp::Render() frame.sp_cmd_list->SetVertexBuffers({ *m_sp_vertex_buffer }); frame.sp_cmd_list->Draw(gfx::RenderCommandList::Primitive::Triangle, static_cast(m_triangle_vertices.size())); - // Draw Methane logo badge - assert(!!m_sp_logo_badge); - m_sp_logo_badge->Draw(*frame.sp_cmd_list); + RenderOverlay(*frame.sp_cmd_list); // Commit command list with present flag frame.sp_cmd_list->Commit(true); @@ -178,7 +173,6 @@ void HelloTriangleApp::OnContextReleased() m_sp_vertex_buffer.reset(); m_sp_state.reset(); m_sp_program.reset(); - m_sp_logo_badge.reset(); GraphicsApp::OnContextReleased(); } diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h index ca766a193..cfbc635a4 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleApp.h @@ -66,7 +66,6 @@ class HelloTriangleApp final : public GraphicsApp using Vertices = std::array; const Vertices m_triangle_vertices; - gfx::LogoBadge::Ptr m_sp_logo_badge; gfx::Program::Ptr m_sp_program; gfx::RenderState::Ptr m_sp_state; gfx::Buffer::Ptr m_sp_vertex_buffer; diff --git a/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp b/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp index af86d129b..147b36b47 100644 --- a/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp +++ b/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp @@ -52,7 +52,8 @@ class HelloTriangleApp final : public GraphicsApp PixelFormat::Unknown, // - depth_stencil_format Color4f(0.0f, 0.2f, 0.4f, 1.0f), // - clear_color }, // - true // show_hud_in_window_title + true, // show_hud_in_window_title + false // show_logo_badge }, RenderPass::Access::None) // screen_pass_access (program access to resources) { } diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp index 39174d2c3..a174f0b7b 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.cpp @@ -48,7 +48,8 @@ static const GraphicsApp::Settings g_app_settings = // Application settings 3, // - frame_buffers_count true, // - vsync_enabled }, // - true // show_hud_in_window_title + true, // show_hud_in_window_title + true // show_logo_badge }; TexturedCubeApp::TexturedCubeApp() @@ -93,9 +94,6 @@ void TexturedCubeApp::Init() m_camera.Resize(static_cast(context_settings.frame_size.width), static_cast(context_settings.frame_size.height)); - // Create Methane logo badge - m_sp_logo_badge = std::make_shared(*m_sp_context); - // Create cube shading program m_sp_program = gfx::Program::Create(*m_sp_context, { { // shaders @@ -201,7 +199,6 @@ bool TexturedCubeApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized m_sp_state->SetScissorRects({ gfx::GetFrameScissorRect(frame_size) }); m_camera.Resize(static_cast(frame_size.width), static_cast(frame_size.height)); - m_sp_logo_badge->Resize(frame_size); return true; } @@ -251,9 +248,7 @@ bool TexturedCubeApp::Render() frame.sp_cmd_list->SetVertexBuffers({ *m_sp_vertex_buffer }); frame.sp_cmd_list->DrawIndexed(gfx::RenderCommandList::Primitive::Triangle, *m_sp_index_buffer); - // Draw Methane logo badge - assert(!!m_sp_logo_badge); - m_sp_logo_badge->Draw(*frame.sp_cmd_list); + RenderOverlay(*frame.sp_cmd_list); // Commit command list with present flag frame.sp_cmd_list->Commit(true); @@ -274,7 +269,6 @@ void TexturedCubeApp::OnContextReleased() m_sp_vertex_buffer.reset(); m_sp_state.reset(); m_sp_program.reset(); - m_sp_logo_badge.reset(); GraphicsApp::OnContextReleased(); } diff --git a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h index 9f12b5981..34ac44f7d 100644 --- a/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h +++ b/Apps/Tutorials/02-TexturedCube/TexturedCubeApp.h @@ -97,7 +97,6 @@ class TexturedCubeApp final : public GraphicsApp gfx::Camera m_camera; gfx::BoxMesh m_cube_mesh; float m_cube_scale; - gfx::LogoBadge::Ptr m_sp_logo_badge; gfx::Program::Ptr m_sp_program; gfx::RenderState::Ptr m_sp_state; gfx::Buffer::Ptr m_sp_vertex_buffer; diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp index 740998310..f627fd371 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp @@ -50,7 +50,8 @@ static const GraphicsApp::Settings g_app_settings = // Application settings 3, // - frame_buffers_count true, // - vsync_enabled }, // - true // show_hud_in_window_title + true, // show_hud_in_window_title + true // show_logo_badge }; ShadowCubeApp::ShadowCubeApp() @@ -96,9 +97,6 @@ void ShadowCubeApp::Init() assert(m_sp_context); const gfx::Context::Settings& context_settings = m_sp_context->GetSettings(); - // Create Methane logo badge - m_sp_logo_badge = std::make_shared(*m_sp_context); - // Load textures, vertex and index buffers for cube and floor meshes m_sp_cube_buffers = std::make_unique(*m_sp_context, m_cube_mesh, "Cube"); m_sp_cube_buffers->SetSubsetTexture(m_image_loader.LoadImageToTexture2D(*m_sp_context, "Textures/MethaneBubbles.jpg", true)); @@ -331,9 +329,6 @@ bool ShadowCubeApp::Resize(const gfx::FrameSize& frame_size, bool is_minimized) m_view_camera.Resize(static_cast(frame_size.width), static_cast(frame_size.height)); - assert(!!m_sp_logo_badge); - m_sp_logo_badge->Resize(frame_size); - return true; } @@ -449,9 +444,7 @@ void ShadowCubeApp::RenderScene(const RenderPass &render_pass, ShadowCubeFrame:: if (render_pass.is_final_pass) { - // Draw Methane logo badge - assert(!!m_sp_logo_badge); - m_sp_logo_badge->Draw(cmd_list); + RenderOverlay(cmd_list); } // Commit command list with present flag in case of final render pass @@ -463,7 +456,6 @@ void ShadowCubeApp::OnContextReleased() m_final_pass.Release(); m_shadow_pass.Release(); - m_sp_logo_badge.reset(); m_sp_floor_buffers.reset(); m_sp_cube_buffers.reset(); m_sp_shadow_sampler.reset(); diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h index 2023d672d..c61aba385 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.h @@ -141,7 +141,6 @@ class ShadowCubeApp final : public GraphicsApp gfx::Camera m_view_camera; gfx::Camera m_light_camera; - gfx::LogoBadge::Ptr m_sp_logo_badge; gfx::Buffer::Ptr m_sp_const_buffer; gfx::Sampler::Ptr m_sp_texture_sampler; gfx::Sampler::Ptr m_sp_shadow_sampler; diff --git a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp index 7ac2d125c..e17a8e619 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp +++ b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp @@ -1,6 +1,6 @@ /****************************************************************************** -Copyright 2019 Evgeny Gorodetskiy +Copyright 2019-2020 Evgeny Gorodetskiy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -36,8 +36,10 @@ Base frame class provides frame buffer management with resize handling. #include #include #include +#include #include #include +#include #include #include @@ -70,6 +72,7 @@ class App Platform::App::Settings app; Context::Settings context; bool show_hud_in_window_title; + bool show_logo_badge; }; App(const Settings& settings, RenderPass::Access::Mask screen_pass_access, @@ -79,6 +82,7 @@ class App , m_initial_context_settings(settings.context) , m_screen_pass_access(screen_pass_access) , m_show_hud_in_window_title(settings.show_hud_in_window_title) + , m_show_logo_badge(settings.show_logo_badge) { ITT_FUNCTION_TASK(); m_cmd_options.add_options() @@ -116,7 +120,7 @@ class App // Create render context of the current window size m_initial_context_settings.frame_size = frame_size; m_sp_context = Context::Create(env, *sp_device, m_initial_context_settings); - m_sp_context->SetName("App Gfx Context"); + m_sp_context->SetName("App Graphics Context"); m_sp_context->AddCallback(*this); m_input_state.AddControllers({ std::make_shared(*m_sp_context) }); @@ -180,6 +184,10 @@ class App m_frames.emplace_back(std::move(frame)); } + + // Create Methane logo badge + if (m_show_logo_badge) + m_sp_logo_badge = std::make_shared(*m_sp_context); Platform::App::Init(); } @@ -243,6 +251,9 @@ class App frame.sp_screen_pass->Update(pass_settings); } + + if (m_sp_logo_badge) + m_sp_logo_badge->Resize(frame_size); return true; } @@ -301,6 +312,13 @@ class App return true; } + void RenderOverlay(RenderCommandList& cmd_list) + { + ITT_FUNCTION_TASK(); + if (m_sp_logo_badge) + m_sp_logo_badge->Draw(cmd_list); + } + bool SetFullScreen(bool is_full_screen) override { ITT_FUNCTION_TASK(); @@ -316,6 +334,7 @@ class App ITT_FUNCTION_TASK(); m_frames.clear(); m_sp_depth_texture.reset(); + m_sp_logo_badge.reset(); m_initialized = false; } @@ -383,6 +402,7 @@ class App Context::Ptr m_sp_context; ImageLoader m_image_loader; Texture::Ptr m_sp_depth_texture; + LogoBadge::Ptr m_sp_logo_badge; std::vector m_frames; Data::AnimationsPool m_animations; @@ -391,6 +411,7 @@ class App int32_t m_default_device_index = 0; const RenderPass::Access::Mask m_screen_pass_access; bool m_show_hud_in_window_title; + bool m_show_logo_badge; Data::Timer m_title_update_timer; static constexpr double g_title_update_interval_sec = 1; From 7c240f585b50e1022a2cc768b1bdb222d741b5cf Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 13 Jan 2020 18:50:29 +0300 Subject: [PATCH 113/129] ReadMe.md major update --- README.md | 109 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 86 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index cf6de1946..1be0baf13 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,13 @@ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) [![Contributions Welcome](https://img.shields.io/badge/contributions-welcome-purple.svg?style=flat)](https://github.com/egorodet/MethaneKit/issues) [![Join the chat at https://gitter.im/MethaneKit/community](https://badges.gitter.im/MethaneKit/community.svg)](https://gitter.im/MethaneKit/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Total lines](https://tokei.rs/b1/github/egorodet/MethaneKit)](https://github.com/egorodet/MethaneKit) **Easy to use modern 3D graphics abstraction API in C++17 for cross-platform applications development:** - **Built on top of modern native 3D graphics APIs**: DirectX 12 on Windows and Metal on MacOS. - **Simplifies modern graphics programming** with object-oriented graphics API inspired by simplicity of Apple's Metal. - **Provides cross-platform application infrastructure** from CMake-based toolchain to application and user input classes. -Note that project is in Alpha stage and is under active development. -Check out the codebase right away in a familiar "VS Code" IDE environment in your web-browser using the "Open in Gitpod" button above. +Click on **"Open in Gitpod" button** to check out the codebase right away in a familiar VSCode-like IDE environment in your web-browser. | Platform | Master Build Status | Develop Build Status | | ---------------- | --------------------- | --------------------- | @@ -25,8 +23,32 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you [![CodeFactor](https://www.codefactor.io/repository/github/egorodet/methanekit/badge)](https://www.codefactor.io/repository/github/egorodet/methanekit) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=alert_status)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) -[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=ncloc)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) -[![HitCount](http://hits.dwyl.io/egorodet/MethaneKit.svg)](http://hits.dwyl.io/egorodet/MethaneKit) +[![Total lines](https://tokei.rs/b1/github/egorodet/MethaneKit)](https://github.com/egorodet/MethaneKit) + +

+
+
Asteroids sample demonstrating multi-threaded rendering with Methane Graphics API +

+ +## Table of Contents + +1. [Features](#features) +1. [Development Plans](#development-plans) +1. [Getting Started](#getting-started) + 1. [Prerequisites](#prerequisites) + 1. [Fetch Sources](#fetch-sources) + 1. [Windows Build](#windows-build) + 1. [MacOS Build](#macos-build) +1. [Demo Applications](#demo-applications) + 1. [Tutorials](#tutorials) + 1. [Hello Triangle](#hello-triangle) + 1. [Textured Cube](#textured-cube) + 1. [Shadow Cube](#shadow-cube) + 1. [Samples](#samples) + 1. [Asteroids](#asteroids) +1. [Development Tools](#development-tools) +1. [External Dependencies](#external-dependencies) +1. [License](#license) ## Features @@ -36,6 +58,10 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - MacOS 10.13 with Metal API - Application infrastructure: - [Methane CMake modules](/CMake) implement toolchain for cross-platform graphics applications build setup. + - [Mouse](/Modules/Platform/Input/Include/Methane/Platform/Mouse.h) and [Keyboard](/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h) input classes with platform abstractions of input states. + - [Resources Provider](Modules/Data/Primitives/Include/Methane/Data/ResourceProvider.hpp) allows loading shaders and textures from embedded application resources. + - [Animations](Modules/Data/Animation/Include/Methane/Data/Animation.h) execution infrastructure. + - [Paralel](/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp) execution primitives. - [Base application class](/Modules/Platform/App/Include/Methane/Platform/AppBase.h) and platform-specific implementations are completely GLFW free! - [Graphics application base template class](/Modules/Graphics/App/Include/Methane/Graphics/App.hpp) with basic multi-frame swap-chain management. - **One shader code for all APIs** @@ -44,12 +70,13 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - Shaders are compiled at build time and embedded in application resources as bytecode (with all variations of preprocessor definitions) - **Easy to use object-oriented graphics API** - [Core graphics interfaces](/Modules/Graphics/Core/Include/Methane/Graphics): - - [Context](/Modules/Graphics/Core/Include/Methane/Graphics/Context.h) unifies Device and Swap-Chain under one umbrella + - [Context](/Modules/Graphics/Core/Include/Methane/Graphics/Context.h) and [Device](/Modules/Graphics/Core/Include/Methane/Graphics/Device.h) classes with frame-buffers management and swap-chain logic. - [Resource](/Modules/Graphics/Core/Include/Methane/Graphics/Resource.h) derived interfaces [Buffer](/Modules/Graphics/Core/Include/Methane/Graphics/Buffer.h), [Texture](/Modules/Graphics/Core/Include/Methane/Graphics/Texture.h), [Sampler](/Modules/Graphics/Core/Include/Methane/Graphics/Sampler.h) to work with GPU memory resources - [Shader](/Modules/Graphics/Core/Include/Methane/Graphics/Shader.h) and [Program](/Modules/Graphics/Core/Include/Methane/Graphics/Program.h) providing unified access to compiled shaders with input layout and uniform variables reflection - [Program::ResourceBindings](/Modules/Graphics/Core/Include/Methane/Graphics/Program.h) simplifies binding resources to programs by uniform variable names and enables fast bindings switching at runtime - [RenderState](/Modules/Graphics/Core/Include/Methane/Graphics/RenderState.h) and [RenderPass](/Modules/Graphics/Core/Include/Methane/Graphics/RenderPass.h) used for inputs and outputs configuration of the graphics pipeline - [RenderCommandList](/Modules/Graphics/Core/Include/Methane/Graphics/RenderCommandList.h) and [CommandQueue](/Modules/Graphics/Core/Include/Methane/Graphics/CommandQueue.h) for render commands encoding and execution + - [ParallelRenderCommandList](/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h) for parallel render commands encoding contributing into single render pass. - [Core interface extensions](/Modules/Graphics/Extensions/Include/Methane/Graphics) like: ImageLoader for loading images to textures, SkyBox renderer, etc. - [Common 3D graphics helpers](/Modules/Graphics/Helpers/Include/Methane/Graphics) like: Camera, Timer, Mesh generator, etc. - **Lightweight**: @@ -59,7 +86,7 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - Triple frame buffering swap-chain by default - Builtin API instrumentation with [Intel ITT API](https://software.intel.com/en-us/vtune-amplifier-help-instrumentation-and-tracing-technology-apis) for performance analysis with [Intel Vtune Amplifier](https://software.intel.com/en-us/vtune) and [Intel Graphics Trace Analyzer](https://software.intel.com/en-us/gpa/graphics-trace-analyzer) -## Development plans +## Development Plans - [x] Continous integration system - [x] Application user input with mouse and keyboard @@ -86,9 +113,7 @@ Check out the codebase right away in a familiar "VS Code" IDE environment in you - MacOS 10.13 "El Capitan" or later - XCode 9 or later with Command Line tools -### Build - -#### Fetch Sources +### Fetch Sources **IMPORTANT:** Do not download source code via Zip archive, since it does not include content of External submodules. Use git as described below. @@ -102,7 +127,7 @@ git clone --recurse-submodules --depth 1 https://github.com/egorodet/MethaneKit. git pull && git submodule update --init --depth 1 --recursive ``` -#### Windows Build +### Windows Build Start **"x64 Native Tools Command Prompt for VS2017"** (it initializes environment with VS path to Windows SDK, etc), then go to MethaneKit root directory (see instructions above to initialize repository and get latest code with submodules) and either start auxiliary build script [Build/Windows/Build.bat](Build/Windows/Build.bat) or build with cmake manually: ```console @@ -115,7 +140,7 @@ Alternatively you can open root [CMakeLists.txt](CMakeLists.txt) directly in Vis Run applications from the installation directory `Build\Output\VisualStudio\Install\Apps`. -#### MacOS Build +### MacOS Build Start terminal, then go to MethaneKit root directory (see instructions above to initialize repository and get latest code with submodules) and either start auxiliary build script [Build/MacOS/Build.sh](Build/MacOS/Build.sh) or build with cmake manually: ```console @@ -128,15 +153,17 @@ Alternatively you can open root [CMakeLists.txt](CMakeLists.txt) directly in QtC Run applications from the installation directory `Build/Output/XCode/Install/Apps` +## Demo Applications + ### Tutorials -| Tutorial / Platform | Windows (DirectX 12) | MacOS (Metal) | -| ------------------- | -------------------- | ------------- | -| [Hello Triangle](/Apps/Tutorials/01-HelloTriangle) | ![Hello Triangle on Windows](/Apps/Tutorials/01-HelloTriangle/Screenshots/HelloTriangleWinDirectX12.jpg) | ![Hello Triangle on MacOS](/Apps/Tutorials/01-HelloTriangle/Screenshots/HelloTriangleMacMetal.jpg) | -| [Textured Cube](/Apps/Tutorials/02-TexturedCube) | ![Textured Cube on Windows](/Apps/Tutorials/02-TexturedCube/Screenshots/TexturedCubeWinDirectX12.jpg) | ![Textured Cube on MacOS](/Apps/Tutorials/02-TexturedCube/Screenshots/TexturedCubeMacMetal.jpg) | -| [Shadow Cube](/Apps/Tutorials/03-ShadowCube) | ![Shadow Cube on Windows](/Apps/Tutorials/03-ShadowCube/Screenshots/ShadowCubeWinDirectX12.jpg) | ![Shadow Cube on MacOS](/Apps/Tutorials/03-ShadowCube/Screenshots/ShadowCubeMacMetal.jpg) | +#### Hello Triangle -### Hello Triangle +| Windows (DirectX 12) | MacOS (Metal) | +| -------------------- | ------------- | +| ![Hello Triangle on Windows](/Apps/Tutorials/01-HelloTriangle/Screenshots/HelloTriangleWinDirectX12.jpg) | ![Hello Triangle on MacOS](/Apps/Tutorials/01-HelloTriangle/Screenshots/HelloTriangleMacMetal.jpg) | + +[Full source code](/Apps/Tutorials/01-HelloTriangle) See how triangle rendering application is implemented in 120 lines of C++ code using Methane Kit ([HelloTriangleAppSimple.cpp](/Apps/Tutorials/01-HelloTriangle/HelloTriangleAppSimple.cpp)): ```cpp @@ -171,7 +198,8 @@ public: PixelFormat::Unknown, // - depth_stencil_format Color4f(0.0f, 0.2f, 0.4f, 1.0f), // - clear_color }, // - true // show_hud_in_window_title + true, // show_hud_in_window_title + false // show_logo_badge }, RenderPass::Access::None) // screen_pass_access (program access to resources) { } @@ -240,7 +268,7 @@ public: m_sp_context->WaitForGpu(Context::WaitFor::FramePresented); HelloTriangleFrame& frame = GetCurrentFrame(); - frame.sp_cmd_list->Reset(*m_sp_state); + frame.sp_cmd_list->Reset(m_sp_state); frame.sp_cmd_list->SetVertexBuffers({ *m_sp_vertex_buffer }); frame.sp_cmd_list->Draw(RenderCommandList::Primitive::Triangle, 3); frame.sp_cmd_list->Commit(true); @@ -323,15 +351,50 @@ add_methane_shaders(MethaneHelloTriangle Now you have all in one application executable/bundle running on Windows/MacOS, which is rendering colored triangle in window with support of resizing the frame buffer. -## External Dependencies +#### Textured Cube -All external dependencies of Methane Kit are listed in [MethaneExternals](https://github.com/egorodet/MethaneExternals) repository. See [MethaneExternals/README.md](https://github.com/egorodet/MethaneExternals/blob/master/README.md) for more details. +| Windows (DirectX 12) | MacOS (Metal) | +| -------------------- | ------------- | +| ![Textured Cube on Windows](/Apps/Tutorials/02-TexturedCube/Screenshots/TexturedCubeWinDirectX12.jpg) | ![Textured Cube on MacOS](/Apps/Tutorials/02-TexturedCube/Screenshots/TexturedCubeMacMetal.jpg) | + +[Full source code](/Apps/Tutorials/02-TexturedCube) + +#### Shadow Cube + +| Windows (DirectX 12) | MacOS (Metal) | +| -------------------- | ------------- | +| ![Shadow Cube on Windows](/Apps/Tutorials/03-ShadowCube/Screenshots/ShadowCubeWinDirectX12.jpg) | ![Shadow Cube on MacOS](/Apps/Tutorials/03-ShadowCube/Screenshots/ShadowCubeMacMetal.jpg) | + +[Full source code](/Apps/Tutorials/03-ShadowCube) + +### Samples + +#### Asteroids + +![Asteroids on Windows](/Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg) + +[Full source code](/Apps/Samples/Asteroids) ## Development Tools -Methane Kit is being developed with support of [Jet Brains](https://www.jetbrains.com/?from=MethaneKit) development tools: CLion IDE and ReSharper C++. +Supported development environments +- Microsoft Visual Studio 2017-2019 + - Solutions and projects generator (generate with [Build.bat](/Build/Windows/Build.bat)) + - Ninja generator by direct opening CMakeList.txt (pre-configured with [CMakeSettings.json](/CMakeSettings.json)) +- Apple XCode 10, 11 + - XCode workspace and projects generator (generate with [Build.sh](/Build/Posix/Build.sh)) +- Microsoft VS Code (pre-configured with [.vscode/settings.json](/.vscode/settings.json)) +- Jet Brains CLion (pre-configured with [.idea](/.idea)) +- Jet Brains ReSharper C++ +- Qt Creator + +Methane Kit is being developed with support of [Jet Brains](https://www.jetbrains.com/?from=MethaneKit) development tools. Open source project development license is provided free of charge for all key contributors of Methane Kit project. +## External Dependencies + +All external dependencies of Methane Kit are listed in [MethaneExternals](https://github.com/egorodet/MethaneExternals) repository. See [MethaneExternals/README.md](https://github.com/egorodet/MethaneExternals/blob/master/README.md) for more details. + ## License Methane Kit is distributed under [Apache 2.0 License](LICENSE): it is free to use and open for contributions! From d4bef92f83aed6fbedc95265b1fd61eeea2270e3 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 13 Jan 2020 20:43:39 +0300 Subject: [PATCH 114/129] Build scripts improved, version incremented to 0.2 --- Build/Posix/Build.sh | 25 +++++++++++++++++++------ Build/Windows/Build.bat | 10 ++++++++-- CMakeLists.txt | 10 ++++++---- azure-pipelines.yml | 11 +++++++++-- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/Build/Posix/Build.sh b/Build/Posix/Build.sh index 3e9a7eb72..84d61632d 100755 --- a/Build/Posix/Build.sh +++ b/Build/Posix/Build.sh @@ -11,14 +11,27 @@ do shift done +# Choose CMake generator depending on operating system +UNAME_OUT="$(uname -s)" +case "${UNAME_OUT}" in + Linux*) CMAKE_GENERATOR=Unix\ Makefiles;; + Darwin*) CMAKE_GENERATOR=Xcode;; + *) echo "Unsupported operating system!" 1>&2 && exit 1;; +esac + CONFIG_TYPE=Release -BUILD_VERSION=0.1 +BUILD_VERSION=0.2 SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) SOURCE_DIR=$SCRIPT_DIR/../.. -OUTPUT_DIR=$SCRIPT_DIR/../Output/XCode +OUTPUT_DIR=$SCRIPT_DIR/../Output/$CMAKE_GENERATOR INSTALL_DIR=$OUTPUT_DIR/Install -CMAKE_FLAGS='-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF' +CMAKE_FLAGS="-DMETHANE_VERSION=$BUILD_VERSION \ + -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON \ + -DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON \ + -DMETHANE_SCOPE_TIMERS_ENABLED:BOOL=OFF \ + -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF \ + -DMETHANE_USE_OPEN_IMAGE_IO:BOOL=OFF" if [ "$IS_ANALYZE_BUILD" == true ]; then @@ -61,7 +74,7 @@ if [ "$IS_ANALYZE_BUILD" == true ]; then echo Analyzing code with Sonar Scanner on branch $GITBRANCH... "$SONAR_BUILD_WRAPPER_EXE" --out-dir "$BUILD_DIR" \ - cmake -H"$SOURCE_DIR" -B"$BUILD_DIR" -G Xcode $CMAKE_FLAGS + cmake -H"$SOURCE_DIR" -B"$BUILD_DIR" -G "$CMAKE_GENERATOR" $CMAKE_FLAGS "$SONAR_SCANNER_EXE" \ -Dsonar.projectKey=egorodet_MethaneKit \ @@ -74,8 +87,8 @@ if [ "$IS_ANALYZE_BUILD" == true ]; then -Dsonar.login=6e1dbce6af614f59d75f1d78f0609aaaa60caee1 else - echo Building with XCode... - cmake -H"$SOURCE_DIR" -B"$BUILD_DIR" -G Xcode -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" $CMAKE_FLAGS + echo Building with $CMAKE_GENERATOR... + cmake -H"$SOURCE_DIR" -B"$BUILD_DIR" -G "$CMAKE_GENERATOR" -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" $CMAKE_FLAGS cmake --build "$BUILD_DIR" --config $CONFIG_TYPE --target install echo Running unit-tests... diff --git a/Build/Windows/Build.bat b/Build/Windows/Build.bat index 99caea692..6480faf1a 100644 --- a/Build/Windows/Build.bat +++ b/Build/Windows/Build.bat @@ -4,8 +4,14 @@ SETLOCAL ENABLEDELAYEDEXPANSION SET PLATFORM_TYPE=Win64 SET CONFIG_TYPE=Release -SET BUILD_VERSION=0.1 -SET CMAKE_FLAGS=-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF +SET BUILD_VERSION=0.2s +SET CMAKE_FLAGS= ^ + -DMETHANE_VERSION=%BUILD_VERSION% ^ + -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON ^ + -DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON ^ + -DMETHANE_SCOPE_TIMERS_ENABLED:BOOL=OFF ^ + -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF ^ + -DMETHANE_USE_OPEN_IMAGE_IO:BOOL=OFF SET CONFIG_DIR=%~dp0..\Output\VisualStudio\%PLATFORM_TYPE%-%CONFIG_TYPE% SET INSTALL_DIR=%CONFIG_DIR%\Install diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ee2f6215..14e07b757 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,11 +10,11 @@ option(METHANE_SCOPE_TIMERS_ENABLED "Enable low-overhead profiling with scope-ti option(METHANE_SHADERS_CODEVIEW_ENABLED "Enable shaders code symbols viewing in debug tools)" OFF) option(METHANE_RUN_TESTS_DURING_BUILD "Run tests during build" ON) -set(METHANE_VERSION "0.1" CACHE STRING "Methane release major-minor version number") +set(METHANE_VERSION "0.2" CACHE STRING "Methane release major-minor version number") set(METHANE_BUILD_NUMBER "000000" CACHE STRING "Methane release build number") set(METHANE_PRODUCT_NAME "Methane Kit (https://github.com/egorodet/MethaneKit)") -set(METHANE_COPYRIGHT "Copyright 2019 Evgeny Gorodetskiy") +set(METHANE_COPYRIGHT "Copyright 2019-2020 Evgeny Gorodetskiy") include_directories($ENV{INCLUDE}) link_directories($ENV{LIB} ${CMAKE_LIBRARY_INPUT_DIRECTORY}) @@ -51,17 +51,19 @@ elseif(APPLE) endif() +message(STATUS "Methane Kit version ${METHANE_VERSION}, build number ${METHANE_BUILD_NUMBER}") + if(METHANE_USE_OPEN_IMAGE_IO) message(STATUS "Methane Kit OpenImageIO media-library is enbabled.") endif() if(METHANE_ITT_INSTRUMENTATION_ENABLED) - message(STATUS "Methane ITT Instrumentation is enabled") + message(STATUS "Methane ITT instrumentation is enabled") add_definitions(-DITT_INSTRUMENTATION_ENABLED) endif() if(METHANE_SCOPE_TIMERS_ENABLED) - message(STATUS "Methane Scope Timers are enabled") + message(STATUS "Methane scope timers are enabled") add_definitions(-DSCOPE_TIMERS_ENABLED) endif() diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 05e77c165..d7ef6d029 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -8,9 +8,11 @@ trigger: - develop paths: exclude: + - Build/Windows/Build.bat + - Build/Windows/Build.sh + - CMakeSettings.json - README.md - LICENSE - - CMakeSettings.json pr: branches: @@ -29,7 +31,12 @@ resources: submodules: recursive variables: - buildCmakeFlags: '-DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF -DMETHANE_BUILD_NUMBER=$(Build.BuildNumber)' + buildCmakeFlags: '-DMETHANE_BUILD_NUMBER=$(Build.BuildNumber) + -DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON + -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON + -DMETHANE_SCOPE_TIMERS_ENABLED:BOOL=OFF + -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF + -DMETHANE_USE_OPEN_IMAGE_IO:BOOL=OFF' jobs: From dc2910e73d74fb0188e8ba23c3eb1a4b037545f4 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Mon, 13 Jan 2020 22:56:05 +0300 Subject: [PATCH 115/129] Minor fixes in build script. --- Build/Windows/Build.bat | 2 +- CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Build/Windows/Build.bat b/Build/Windows/Build.bat index 6480faf1a..5594b8afe 100644 --- a/Build/Windows/Build.bat +++ b/Build/Windows/Build.bat @@ -4,7 +4,7 @@ SETLOCAL ENABLEDELAYEDEXPANSION SET PLATFORM_TYPE=Win64 SET CONFIG_TYPE=Release -SET BUILD_VERSION=0.2s +SET BUILD_VERSION=0.2 SET CMAKE_FLAGS= ^ -DMETHANE_VERSION=%BUILD_VERSION% ^ -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON ^ diff --git a/CMakeLists.txt b/CMakeLists.txt index 14e07b757..473e54642 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ elseif(APPLE) endif() -message(STATUS "Methane Kit version ${METHANE_VERSION}, build number ${METHANE_BUILD_NUMBER}") +message(STATUS "Methane Kit version ${METHANE_VERSION} build number ${METHANE_BUILD_NUMBER}") if(METHANE_USE_OPEN_IMAGE_IO) message(STATUS "Methane Kit OpenImageIO media-library is enbabled.") From 901ed7abff3f24a4ca7dfc011981cdb0059e55ce Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 14 Jan 2020 00:06:56 +0300 Subject: [PATCH 116/129] Added ReSharper C++ configuration file back to project folder. --- .gitignore | 1 - Folder.DotSettings | 100 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 Folder.DotSettings diff --git a/.gitignore b/.gitignore index 3da20be35..088a0b204 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,4 @@ /.scannerwork /.sonarqube /out -/Folder.DotSettings /CMakeLists.txt.user diff --git a/Folder.DotSettings b/Folder.DotSettings new file mode 100644 index 000000000..33b2bdf69 --- /dev/null +++ b/Folder.DotSettings @@ -0,0 +1,100 @@ + + NEXT_LINE + Double + True + ON_SINGLE_LINE + ON_SINGLE_LINE + True + True + True + 1 + 1 + True + NEXT_LINE + None + True + True + ON_SINGLE_LINE + LINE_BREAK + ON_SINGLE_LINE + ON_SINGLE_LINE + False + CHOP_IF_LONG + True + True + CHOP_IF_LONG + CHOP_ALWAYS + ForNonProjectFiles + Never + True + /****************************************************************************** + +Copyright $CURRENT_YEAR$ Evgeny Gorodetskiy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* + +FILE: $FILENAME$ +...File description... + +******************************************************************************/ + <NamingElement Priority="10"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="class field" /><type Name="struct field" /></Descriptor><Policy Inspect="True" Prefix="m_" Suffix="" Style="aa_bb" /></NamingElement> + <NamingElement Priority="9"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="member function" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + <NamingElement Priority="1"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="__interface" /><type Name="class" /><type Name="struct" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + <NamingElement Priority="13"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="scoped enumerator" /><type Name="unscoped enumerator" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + <NamingElement Priority="2"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="enum" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + <NamingElement Priority="15"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="True" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="global variable" /></Descriptor><Policy Inspect="True" Prefix="g_" Suffix="" Style="aa_bb" /></NamingElement> + <NamingElement Priority="8"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="global function" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + <NamingElement Priority="7"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="global variable" /></Descriptor><Policy Inspect="True" Prefix="g_" Suffix="" Style="aa_bb" /></NamingElement> + <NamingElement Priority="16"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="namespace" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + <NamingElement Priority="17"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="namespace alias" /></Descriptor><Policy Inspect="False" Prefix="" Suffix="" Style="aa_bb" /></NamingElement> + <NamingElement Priority="17"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="type alias" /><type Name="typedef" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + <NamingElement Priority="12"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="union member" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + <NamingElement Priority="3"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="union" /></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></NamingElement> + True + True + True + False + False + True + False + True + True + True + LIVE_MONITOR + LIVE_MONITOR + LIVE_MONITOR + DO_NOTHING + LIVE_MONITOR + LIVE_MONITOR + LIVE_MONITOR + LIVE_MONITOR + LIVE_MONITOR + LIVE_MONITOR + LIVE_MONITOR + LIVE_MONITOR + DO_NOTHING + LIVE_MONITOR + False + True + True + True + True + True + True + True + True + FixMe + (?<=\W|^)(?<TAG>FIXME)(\W|$)(.*) + Warning \ No newline at end of file From 00ac91a99c92d529ccb208dcd4b1578d04d82d85 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 14 Jan 2020 18:42:49 +0300 Subject: [PATCH 117/129] Updated Externals with CML improved matrix product template specialization --- Externals | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Externals b/Externals index ae7ddc840..af5ec9172 160000 --- a/Externals +++ b/Externals @@ -1 +1 @@ -Subproject commit ae7ddc8405111b589c061fb9de52faa161a6fdd3 +Subproject commit af5ec9172be0d5a11e35b7ccd0869dfea126044b From 60c5d263aca26e49c3de0045e03dd0812acb1fd2 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Tue, 14 Jan 2020 20:52:06 +0300 Subject: [PATCH 118/129] Asteroids sample screenshot from MacOS is added --- .../Screenshots/AsteroidsMacMetal.jpg | Bin 0 -> 476634 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Apps/Samples/Asteroids/Screenshots/AsteroidsMacMetal.jpg diff --git a/Apps/Samples/Asteroids/Screenshots/AsteroidsMacMetal.jpg b/Apps/Samples/Asteroids/Screenshots/AsteroidsMacMetal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b74f27a83a8c8c62884f27e6d66431db8b3c772f GIT binary patch literal 476634 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%0A9w5lIlUpK8D2x{z41==y5=&)St9h$`W z6i#^mUa2>4GJD&!@;dyBx4_p=Z;4U`6+x@VJUh(s#Y6Jbun-$qFosfGo_3N3EuF7{YX zcYEZI|&_q=t9F>e>i5k&Gqxq}B`@Y9_8=*q$ZC;be&dv9t+Mr>@G4HBD9 z^#c)EF&OscYhJ=xR&VA9#sO`*ut18Cn`O*Yg;TgmTh6Njle)|~LZ-Kr84bJmXA35y)y4dIi#fC?)Ow-0N+@$Y4oi_pyOS_-l~w1}z-q1ABI#1Vs^9ynom2wUXjYUdtV-*MjkNM#Rc3QG@m8El8hh4f%)S6Qd?t%-bQ9s_b4x`xF3~ za6jVhsEDXrojc9k{FT<2%7pTv_-D$%Me=x~?tc8!zO@|vXaRN)-v+2LJJ=)8KJ4-W5?{c?uTgn&ktXrI zMXB0N&OT062`qf@&o=KTbHRZS(hm;ZEyYM>wNuNvTDj`aa4bZTl6y!JB@J4y3 zHkmZvV0%D5unJNv=6kLY`!e<6GFFSZ^PS4rAizpl>gZmOXCNdtZqS@ko9yw*Jl&J; zizLCR6#jp;!!R?S-l#lDMU^xa>C}ZEgzcfzgCajmYgsXh~$#^}eP5OdTmicc zU<l}AnYF!Qi92ZexH1|k*XiK8~$6vF;3`Q|OGr?mFnC|D2T3OXHb) zXXsiCgl$eysfMWfi;ejQuAeKnBpB86QMfR%dMNA!JqU`LX)k{H?{kr5Pg+Zzb!y^; z&xPiQVlV~xfvTTR|M2NEeojwn2lkyWv$fy z>8XgXvXU~94TOxTsgN&EJf#;j|LR`%fFVEl0ofqq_PHa ztNEmqnoOwa=ey|#f>OsPxa&+z#*V)FpPBTh*&^kxBpyU~3WYvGB}d?NXs*2u@#O2d z^O%l77R>TRqnY>2*cUGUxATI3{Kik9{q8f(%EcoB5BWRYC5?Cf=q*%13!g1I&Mh@8 zF!yc8S5$x)QC~egb=;P=jAmsPVrV1Q=)xBdfJzG6nOa($4+}X4lN5{)YRV{}uH^Z8 z^VP8Qusu7`c*OB@8S7K#lDL{FrslbV!y30wDOl_-D;9hhVIcC|bVO~xN+%eL$ccxg z(bcBLN%sAPH+o3lrcNhq5nm+~6O6%C5(&G#qfG6y9R7nzk3GQe)=H3J`OoPa~OVHYSAQH77nv z2&kd;K2htLv9cyO{|9))K$}>{wm4PqM=@STdj|=Xq1*irFjIM~{pEp5lQ##dKL-t~ zuKhHltGLK(Bj6G1&L@4Nb5g1K<8VXwoXVkZnf(u%kW}WFP`lfL0Fby_YwxvP7f`#w z_Nj8bM6cZHzNV$_iVru54@!VN6kKp}H(}&Q7wbtY4k&}>RojseLaKP8?!?)rDSO55 zsIjk8&VwEWJ*x`3``m#+vwzHvrT%N#@3TKq*IFED9%frFGDKDjqCbO}4XY{pNuF&5 zW}UCJ(^|eNj%MfD!#b2oGUCM!{&epe=v5!y{UCAN+^8dD8~^F8{?H%qFe;tns$%wO zdleHmVbXqEo%Y~8FTz2#^j89p)7kO1-A)boXT`x{{hDuf)mmX?(7jIqwC1!_5)Kgy z6Agb1d|qAETJhSIf3-J$_p{bIK|f@>NUCy$$c>r-Yt;S2Ip>u!W3#@L-;|;smyC&g zNNAGyVb|p;L!#IQ-p+$+GH#?f13`$ZHMUFYYec_Pem`qo087OYaFtbo$i*E@DKl?& zJ_wiExc{A@)p z9<|>$(BfY#a`a-)!u!cr9hEffL{yS85zTw5YODHN;Nf6gG2~l1Sr?wY4m=2)%LrpoRv6sYUB^wJSjUkM1G*`*RU7E%&Mxe zJt_lx-HF?L6%c3s9_pv;SsU78F2}w-Z9KkdxO>gR>3n5p@eUcVhO~=Lo|f4 z3;xywks~kQyGQ$^0k8p%tIO$Pfe(%$>U*>rWWKKOf|?vJ43N-KvNU=i0zJ0hkopfG zWKu9k-?yX|`e$_#IzKc=9JQZwTdy+AT(3u7!s^Si;^_A@0J;OfFQ*Q&ulJ8gVzh&% zjZ#wxuJry%KQOghy-vsF{GJA|x|pe+?@{?(rWzuA-i_onuPi#{$L@lz zFZ8<1l${6OThmQk+@YwPJ^djc-IML-{$2!QVf`Nf#r>qdG2`rh{d`apJ7kW4EHz)Q z;;Vi3?1Kc4cHn^&Z2oH~hI3B1An5jd&qJAR5X2nTS2S9_Sib#E^)m#-b{9R4ZM6Mk zm4n|j+G7vnQ?Jm3gIP4cKWT1rX9osHu|0|=&zDJXdbNZ6TVsm5S(bt+)kiEYeNUR_ zovWwx9t_-Q&ESxv!LF%#dM!i(KAtT*g*om9!={aiNeV8`pdmhCR6)r zRUCxlz2M_&XmB)JRRtiWtoycnce%JESxY&nvSowMoVWimnEn0_Kxkp|9VSMgVEd>a zr^w40v~0H}#)l℞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

sWmmZ@ekA-Ypd~GK6mX` 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 literal 0 HcmV?d00001 From df11f7b2d9f98bfd0aee22b7a89f09e5e9fe3e71 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetskiy Date: Wed, 15 Jan 2020 00:07:14 +0300 Subject: [PATCH 119/129] Updated README.md Added information about Asteroids sample and Linux build. --- README.md | 73 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 1be0baf13..4de5512bb 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ - **Simplifies modern graphics programming** with object-oriented graphics API inspired by simplicity of Apple's Metal. - **Provides cross-platform application infrastructure** from CMake-based toolchain to application and user input classes. -Click on **"Open in Gitpod" button** to check out the codebase right away in a familiar VSCode-like IDE environment in your web-browser. +Click **"Open in Gitpod" button** above to explore Methane Kit codebase right away in a familiar VSCode-like IDE environment in your web-browser with navigation by symbols and even Linux build in cloud. | Platform | Master Build Status | Develop Build Status | | ---------------- | --------------------- | --------------------- | @@ -25,10 +25,8 @@ Click on **"Open in Gitpod" button** to check out the codebase right away in a f [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=egorodet_MethaneKit&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=egorodet_MethaneKit) [![Total lines](https://tokei.rs/b1/github/egorodet/MethaneKit)](https://github.com/egorodet/MethaneKit) -

+![Asteroids sample on Windows](Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg) +

Asteroids sample demonstrating multi-threaded rendering with Methane Graphics API

## Table of Contents @@ -58,11 +56,11 @@ Click on **"Open in Gitpod" button** to check out the codebase right away in a f - MacOS 10.13 with Metal API - Application infrastructure: - [Methane CMake modules](/CMake) implement toolchain for cross-platform graphics applications build setup. + - [Base application class](/Modules/Platform/App/Include/Methane/Platform/AppBase.h) and platform-specific implementations are completely GLFW free! - [Mouse](/Modules/Platform/Input/Include/Methane/Platform/Mouse.h) and [Keyboard](/Modules/Platform/Input/Include/Methane/Platform/Keyboard.h) input classes with platform abstractions of input states. - [Resources Provider](Modules/Data/Primitives/Include/Methane/Data/ResourceProvider.hpp) allows loading shaders and textures from embedded application resources. - [Animations](Modules/Data/Animation/Include/Methane/Data/Animation.h) execution infrastructure. - [Paralel](/Modules/Data/Primitives/Include/Methane/Data/Parallel.hpp) execution primitives. - - [Base application class](/Modules/Platform/App/Include/Methane/Platform/AppBase.h) and platform-specific implementations are completely GLFW free! - [Graphics application base template class](/Modules/Graphics/App/Include/Methane/Graphics/App.hpp) with basic multi-frame swap-chain management. - **One shader code for all APIs** - Shaders are written in HLSL 5.1 @@ -92,8 +90,9 @@ Click on **"Open in Gitpod" button** to check out the codebase right away in a f - [x] Application user input with mouse and keyboard - [x] Parallel command lists - [ ] Text rendering +- [ ] Improved shaders toolset (use DXC & HLSL 6) +- [ ] Post-processing pipeline - [ ] User interface library -- [ ] Improved shader conversion - [ ] Dynamic linking support - [ ] Compute pipeline @@ -112,6 +111,8 @@ Click on **"Open in Gitpod" button** to check out the codebase right away in a f - **MacOS** - MacOS 10.13 "El Capitan" or later - XCode 9 or later with Command Line tools +- **Linux** + - Ubuntu 18.04 or later ### Fetch Sources @@ -142,17 +143,26 @@ Run applications from the installation directory `Build\Output\VisualStudio\Inst ### MacOS Build -Start terminal, then go to MethaneKit root directory (see instructions above to initialize repository and get latest code with submodules) and either start auxiliary build script [Build/MacOS/Build.sh](Build/MacOS/Build.sh) or build with cmake manually: +Start terminal, then go to MethaneKit root directory (see instructions above to initialize repository and get latest code with submodules) and either start auxiliary build script [Build/Posix/Build.sh](Build/Posix/Build.sh) or build with cmake manually: ```console mkdir -p Build/Output/XCode/Build && cd Build/Output/XCode/Build cmake -H../../../.. -B. -G Xcode -DCMAKE_INSTALL_PREFIX="$(pwd)/../Install" cmake --build . --config Release --target install ``` -Alternatively you can open root [CMakeLists.txt](CMakeLists.txt) directly in QtCreator or VSCode or any other IDE of choice and build it from there. +Alternatively you can open root [CMakeLists.txt](CMakeLists.txt) directly in VSCode, CLion or QtCreatoror of choice and build it from there. Run applications from the installation directory `Build/Output/XCode/Install/Apps` +### Linux Build + +Build on Linux with GCC works fine using "Unix Makefiles" generator, but the platform abstraction layer and graphics API implementation are currently stubbed. So in spite of it builds, do not expect anything to work on Linux now. +```console +mkdir -p Build/Output/Linux/Build && cd Build/Output/Linux/Build +cmake -H../../../.. -B. -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$(pwd)/../Install" +cmake --build . --config Release --target install +``` + ## Demo Applications ### Tutorials @@ -371,24 +381,49 @@ Now you have all in one application executable/bundle running on Windows/MacOS, #### Asteroids -![Asteroids on Windows](/Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg) +| Windows (DirectX 12) | MacOS (Metal) | +| -------------------- | ------------- | +| ![Asteroids on Windows](/Apps/Samples/Asteroids/Screenshots/AsteroidsWinDirectX12.jpg) | ![Asteroids on MacOS](/Apps/Samples/Asteroids/Screenshots/AsteroidsMacMetal.jpg) | [Full source code](/Apps/Samples/Asteroids) -## Development Tools +Asteroids sample demontstrates multi-threaded rendering of large number of heterogenous objects with [ParallelRenderCommandList](/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h). Thousands of unique asteroid instances (1000-50000) are drawn with individual Draw-calls in parallel with a random combination of: +- random-generated mesh (from array of up to 1000 unique meshes) +- random generated perlin-noise array texture each with 3 projections (from array of up to 50 unique textures) +- randome combination of coloring (from 2x6x6 combinations) + +Default parameters of asteroids simulation are selected depending on CPU HW cores count and can be displayed by **[F2]** key. +Overall complexity can be reduced / increased by pressing **<[>** / **<]>** keys. +Sample renders galaxy background using [SkyBox](Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h) +Methane graphics extension and planet using generated [Sphere mesh](/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h) with spheric texture coordinates. +It also demonstrates interactive [Arc-Ball camera](/Modules/Graphics/Helpers/Include/Methane/Graphics/ArcBallCamera.h) rotated with mouse and light rotated with , keyboard keys can be seen by pressing **[F1]** key. + +Sample includes the following optimizations and features: +- Asteroid meshes use dynamically selected LODs depending on estimated screen size. +This allows to greatly reduce GPU overhead. Use **[L]** key to enable LODs coloring and **[']** / **[;]** keys to increase / reduce overall LOD level and mesh detalization. +- Parallel rendering of asteroids array with individual draw-calls allows to be less CPU bound. +Multi-threading can be switched off for comparing with single-threaded rendering by pressing **[P]** key. +- All asteroid textures are bound to program uniform all at once as an array of textures to minimize number of program binding calls between draws. +Particular texture is selected on each draw call using index parameter in constants buffer. +Note that each asteroid texture is a texture 2d array itself with 3 mip-mapped textures used for triplanar projection. +- Inverted depth buffer (with values from 1 in foreground to 0 in background and greater-or-equal compare function) is used to minimize frame buffer overdrawing by rendering in order from foreground to background: asteroids array with planet are drawen first and sky-box afterwards. + +Methane Asteroids sample was inspired by [Intel Asteroids D3D12](https://github.com/GameTechDev/asteroids_d3d12), but the whole implementation was re-written from scratch. + +## Development Tools -Supported development environments +Supported development environments: - Microsoft Visual Studio 2017-2019 - - Solutions and projects generator (generate with [Build.bat](/Build/Windows/Build.bat)) - - Ninja generator by direct opening CMakeList.txt (pre-configured with [CMakeSettings.json](/CMakeSettings.json)) + - Solutions and projects build (generate with [Build.bat](/Build/Windows/Build.bat)) + - Ninja build with CMake native support (pre-configured with [CMakeSettings.json](/CMakeSettings.json)) - Apple XCode 10, 11 - - XCode workspace and projects generator (generate with [Build.sh](/Build/Posix/Build.sh)) + - XCode workspace and projects (generate with [Build.sh](/Build/Posix/Build.sh)) - Microsoft VS Code (pre-configured with [.vscode/settings.json](/.vscode/settings.json)) - Jet Brains CLion (pre-configured with [.idea](/.idea)) -- Jet Brains ReSharper C++ -- Qt Creator +- Jet Brains ReSharper C++ (pre-configured with [Folder.DotSettings](/Folder.DotSettings)) +- Qt Creator with CMake native support -Methane Kit is being developed with support of [Jet Brains](https://www.jetbrains.com/?from=MethaneKit) development tools. +**NOTE:** Methane Kit is being developed with support of [Jet Brains](https://www.jetbrains.com/?from=MethaneKit) development tools. Open source project development license is provided free of charge for all key contributors of Methane Kit project. ## External Dependencies @@ -399,4 +434,4 @@ All external dependencies of Methane Kit are listed in [MethaneExternals](https: Methane Kit is distributed under [Apache 2.0 License](LICENSE): it is free to use and open for contributions! -*Copyright 2019 © Evgeny Gorodetskiy* [![Follow](https://img.shields.io/twitter/follow/egorodet.svg?style=social)](https://twitter.com/egorodet) +*Copyright 2019-2020 © Evgeny Gorodetskiy* [![Follow](https://img.shields.io/twitter/follow/egorodet.svg?style=social)](https://twitter.com/egorodet) From 19d467853650ad5248d11a10ac663a5bb6751ac0 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 15 Jan 2020 13:30:44 +0300 Subject: [PATCH 120/129] Updated README.md and asteroids screenshot. --- .../Screenshots/AsteroidsMacMetal.jpg | Bin 476634 -> 187581 bytes README.md | 38 ++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Apps/Samples/Asteroids/Screenshots/AsteroidsMacMetal.jpg b/Apps/Samples/Asteroids/Screenshots/AsteroidsMacMetal.jpg index b74f27a83a8c8c62884f27e6d66431db8b3c772f..85380945eda94e7127dfbd32e16d1e94b62b6857 100644 GIT binary patch literal 187581 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
ul}3wkFyPwTL3;<@0>- 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

5>`$sI@1N82*8(ih-z`%v9Lk756 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�g>ZVsTzRB3Tbn5RWJ7{VG zcC!gBeaipltd#(jb^ZTnc^1?-?yHHUpS+OUOzEEvpfex&;BQ(|(GxK_Ygj%~#VODo z(YbJCE&UImW397NT1VYBB?WqWWJbayvcI!;+FQ;^<^Ul0WT}g#Sb7xinItq>+N(F| z6t^~W&Z~K}ccu{G%^9wKxk2;S&H3;hSHp|Qc%zPx<|6HaR-KgS%89_e+m0Yr$G%Ku znX3b)Uy{?Q(>oD<_4!nQwgK@W)(mW`j&y+t=&OaxnxzJcz=vRVq;WlY04-D=aBx#1 zRcj4Co)1N9mk|t?lcF?Y@Ct<9Fn;-$ZO29ud2kNCEq#aTca*o@RQm8?0-UFX_9|uv zHS2evoh(ce+jC~oNBG-T7wd|y3*}|5?O_;IY6$I|ZjxZVATpkRniVZH#5&g0pvKva z8W6*O)aPctH1eK#O3gEYdiZ6gZqP&8@sZVJQEI!mm5Fy|;igX0`@DYfouu$Zl<@qX zd5nWdw$_-&weJ&Mt1|>de5HUB`RaZP%jMQO{D>tzq_&AJ+ph{{bL<<&Xc>UkLcOdiFz(?0@$a z$^`tak=-ROJP^CyD4*^I5ydS1#Aoc^q482JLkC5zT_yYkLk#BGa&*=z9odqLO94ye z9))Xaul$^MBE9`Y-+nKN)@cgBs)@WZ(a>PTr~?89I(eyb=ck zZH@%_FWU)rx`isfY!jZkwcz>^{I1nr?L)Z>|6!IoPiN~JM*;wg{Mk~@Xu}$p6MP$z#d)$k>i{JEZ0bK&XF0mt8 zemR+pv4!p28_UK`fr<8T(i2Ns{>WU(G*iYxwPb_A9l7FoTiV*>m@H-CFKj$(BF)qr zZ(|d3%ADp!VPeq3>_?a2z5aT}_ZR*(9Ego)Y42kulXY=Pr*$_TZ~3+Cd8BEZ*-lm9(8qDhO-jIrPDKg;cI=(qos^pQCm z)Nxt8-$8m* z>esTMPbn&sB%ap151D(Yvia^DBc61MfbO#)nu6CG;Cbx+(wUPqSc>`x&6&J5bH}&n z1gN#n>i^1j|lb<0S}Gcm))qFDCw;ww3z>C?E(yw{mM+03J`7?0DB z`v<`O-Tw0P4s^erdFFGXbNMN;RPx{T;>6itndadSNwF;=>X;AnQLxIg;vkY|g&&MX z#mNH)OrgPTJx?4P8ZRn#jq@8ZjW53AC{xxHC+O~%e%PT#+d0GJm(V|xRBE7wBQ$m_tqppt zq&RsOPGLx%Ch;oD?$s`8Amy^Yr$ly18t)L8X7^P`Lc?G@|~?8YsD2|d7s z2S~9l+r84(0Z1%$6p6)mMI6 zeQPhyVT9%;e{CtzjuiP0p({kUiO}2(%A1v@iQbP`AbF{bL^5?0EQ-M3E)TAJDxGbK zYo$Q2YsAm=+@%JKD3ADUI7d@CJL8pvaLk{HEE&w(xc_I9NYZ{Odxs z`972&WZMWdQM#MIV_0&h&_GAtD~tNGXW(66i4Wt0-e1>%PXzv~&P!}{?HLyE$04eR zxvIwIcH$wb)#85uxJ+B;e^KEf7b0&jkw)9kuP*MN!%Spe_iSqjh7^wPQrnEDS^L3hD&et;Wb+sH>ebk8On;P6 zERD9Eq~A|zPcHcvMW5(AC+>{;LyoU>E|Dy`o}}n+5WE?_ZU>}qW}AKY9mhz`Nchj#G8YS(}sTlmqtvKGU!h- z!2T@o#QTHj*51z4|p@}q~BtT+$KWOtB5FGD8$qJJYNN^;ftPxx6+ z&L}$n-%Du-Nnm?o5BY!2awr{LPi^$zV^o?X-CZp+)1SH7-_o1*Eh5Jye38)8>&0gT z(qYdUNB8d^{Rc3~dGHSa%>l`)(fO@MM;LNQ`tKP+J}pC1(&pPAzwbS!&y=?!p0gQt zuK#-^Nq_$5U#N*8i`q^166?-t9P6))+Ox25ZLciK^1;xIr^?@M)esoY$~)oUo+pwE zVAiOF!}!yItb1DRfw|g6$9I=|58e=}a@qN&1T&R4iseA^;tTR<#?QrxQt%wy zA$b}=qup-|%3%=0>gHJaWFv8~oJ=TZRwr|Dv|N(HD;h9e5}BuV=u+KWAdo&zt0!ZqqX~tP20zVsAZ{O2jf!0Uc5n9gOyEN8hCchrEvqwWo z^p`!DZo}^qoS9v~@EaW;=HF9t}{PN+L8?R6T)+rkBB{l!TAn7^!2pNcVNc*Z%{ZUz~&nNChO2gR^% z?0+_*Miq=OUwD|6h^rpgRo9UYxQE$Ea}R>%4+LRvn;v-V&(1J3`D!?%DpQP5gMJ%JtSRpGmjga8YcH>tsvZ_O zXbV{6w15|XFn)uo?}+JQ_*zrX`gD8^AX2q^RNhF=>`^?Cd=~a`qFRcasSkDx(ntuU z7pK>$OyS+_hbjytB3OWk-`u3Oq`O6$_|V?|9gq%Fy|rhK8z<(K3uHgJ=H% z*wxE`OO&!)H>Yt@U&zhWQze+ z<2bkRlmYshEm4-Xb3s=4`-&P%YtC8XXAQAIK$7};sYZ1Q#nR%pP1Bpc*>BTl^sgi- z26F_wv5#&aE-gNB{C4pnlU&1QV&33yas0v1%Z3%ILL+ICJ24_1n2TdY>%{Cql0a3> z9jD5vqT`y_PW(%*AaT=XQfwEQn?F*QI~^zmaP*U)j0cF9-Ll;jybuvd@?$q0q=}WT zI(E^M&KRAvq`9Dh5!dpZ$$oEw@WS7eI@!_Nq1zlR2)C9@G_2S+L_&z3j@>vlQHg)^@WDObcjp1us9HgQcQ-fOm1Z9FuGo`MiZXnpCD37PgTLU#Vts$`XHQFibv2!*v7f)o1X6bs?$ml;=;H;&}h#I*H~tctsDX0Gz6R`|(c` zAYe9N_TL}Kt)_psn*QBdzxl5R|FdWP=D+v<=g9wc5c1F__B>(fP$VdPC(Eqz@ zZb!D+@@qGZS&*w<{!=sy;A4Rr7v!(BtF!KqZ06@I|K6efO4p%4rivux@uLIpit4N%rCFZ{w5jb&TOPwp}y$K4w41JakBe>nXDC zR_L(I;jsWUFbCdFgb(6s9R-^k3yuH@X^sb{0< zxZu6CJi=1aqP+fO_ugGfOCp?JdJ~2U4=GTXMk-afG6vd9x=!$fovQT1BpzY27`0y& zv%>0awQtSnC!;YTjHRNq5oy6i+Bu>(6`P%(-+mLXs*5wJY}vc$MU1;5DgyZn#yBf| zzlV<<%_on+UaL@Se5@f5U^@CUw{q+uHM9@=mI;P(z0=uRhVkI7Hcw7Xo+b}RDx=u) z#Yz0t3S<`H|D7^F{0=LVf@32TK*RUt^w_+YV%9^l7^`oCpoV)t6<_4Qy+bo*^Gx~f zfa3YXKGAY>=ar%$mju5-b1UKZBCkfFav6J52zI(Bz{WAQ43%u6y|&bdB8Q}4{$*A~)1Z6kWTsjzsUpAfaJT9v!K(fBk+stx^Q*xcE_r2hO8GTc z^gHoVEa4RUI;cZD>5B=Pqh~M>68W?=PAF7bH|046D{;7vXV^%KyOks)HeDRR6@f9= z$zUg3UmesgkdB%2T2Lx2UQN7Q?ejzCbreGz#62Y(8w39jWp5c2SKq9A4}st=!6i5h z5Znh19^BpC-7N%?5Zq;OcXtT{clUt+gS%@WXP$dMwa-3h?>hCqU)G12s;>X6sx`g3 z`|95nhbbo0< zV;*q-p5&xT?T9JT-Gs56A5l`cVO#n6>YXYBB&d9&l}ACOtvKse0*{9#Yeis^ol|H5 zjuNWAx;Em;+3QT4pe4)*veo(Yv(knnC3fPrg4VjQ;`;p`8Oamh%Fz-+LMu8tIuCjj zXM-ng)#3x0XA!g?i_vDSEZ7{hWfZv{f9wurGPLLm+f?H#4%KzmhogzF>U9l$4Fc`H z*vt->w?ce&ptq%E6w-6dSm}l&vHo<)qm@p`nq-kjH^KOlt{nCk;%gD{u>BXJ-fHH? zw&a;kIxD_@w~;DonmM?X4ceDwDmU@{7NcPKP5KyFD~n`ZTJ;E6ji)UsHF}Sl2}uze zQ8D3ja968(77jA#14cQW0qt?qH6wn>5Iw1BVv{q$>OajtHiNSJ1hOziZFqfPscHn2 zI)t~fX(YGlimZ7W841+Ip{5*&{|i_7z1OMmrG9yfmQ_H?0`YIt>^=K1YdqO_z_^Tw zT@1&(84Pqe!}@k;)b~(+q7^;_Ky_eFf!?`$ia>Ne3{+d-8k)f zDA(~>BE*-!;HMIYtkqvY-|lbdIYueetH?4jI@)uB&3Tpzs1yHVt z-dz2@?wVUsn^IP;a%$V2uA{P-y zo)aX+f!cPO(PU4y#73YG@T6S;hVkCKuqlcsY`{zjAjc$|uk?){xGOTPIrIYJ8AZ7O ze9#)Gerbon49lkhWV%dqom>qVK zcwLH!zd;IENhCI~V7prDn%ey5k&%Osr@I)Wjv`G?dh4h|%Fb0rhI&M%{9dFAXCNS( zbK}r^Iq%`EZ^Q>6dut{+>;x%RiNn0~k1~5`*U3}rN^_nK2#)v_ZIor_y6(Ek_65#; z8Gi%~?^p99i4Db9r?AaL;q|pQfE|lx@8oEQO`E>+1MqqVU5DgXc>*^yBqLgQ8eh!j zB5Niky~RT0+eNNL4~i0Ljv;S+4n5$d8w@Ji3* zS*e{DVY}#x!_MQ1Yx76I&hxA0{uPbHSydm?skrma`JwL6Ce%L?OFDQar7R@58!q+uVs9phlOP`^m;F|i%J(++?D#H!w!blGU$B}hcB2aLO`Z|I6Kd~=}jH{s-GxFndf z8Rg^XP-A&O#Y5^3#u$Xem#umJ1yolU=QT~j=u+yfsbCSQIPq9&S(nhmKjn3)ku}1c6V|hP^Dp`0KL$ILqlxCS{}=%L+q~|d|5iTv z0zN;$>lR0WSKVqhH-Oyc8`fY-=ACBc+OD6(43Th#vH zIX};LLx4S0!{1#ys6T5z%nEfNTl1SERUFr9(NYaUWf?Yw@%nc;z><7wtJPu&WqD(5 z;GIEYtn0Bxbk7y3N6aimTD2`m5tkX;!hyNYeA--~is(jBUcov;NY@a5GepFBtV%x2 zyj|MAESC8|Gbv7-h-wxEbG^;^!*g4qN|!mUYvU#+6F4S!7A}x+FP+*X!;51n65yR7 zBY^az;u|gMeT}PhveQJ^9VYd|rZBwo*BX|yUQ&lL$C#6saDv}rg_IfTd`t1#;J9Tx z%vFPc_)qD=dX=U04_a@C0Ko@SPjYJyqTFQc5cjXp+v@rO#}71K4auDkiSBG7YJw)3 zAHP=+>+Pgexfs1&-Fa&|WOU0~Rgzfjd*06JGs&qun+cISFgd~#qP=1?%Y_4bAT8GM zx$BNe+El@{VDq{8c@|kRuE~xd70Hy_lo^F`ZC1C ze>~L1k3NjVKf#?w{w{TI=nb;z4&TP@YjTOdvp1WAo!kC;c&+SH(_T*QySVqS9T<8T|M*T9{j$@Iz;w?O z5Z`k*;6AUkTkvC^b#Zy1ZtR^w-D!@UhhTEQeI2;daHfr*<0E~9p(0r;hfK@7W`Lhc zh_j#S@h6Nx;smOJN8%mpDi0&_h~Fv;=8@Z)--(-@ht{DnNZmj`XA4vHiVybFQ(Kfc z70$SC&@dpM1+ne(TC;)CBIHUF65mm@qIl2T1YdKqoVpe_&CX`ycm2lgt;-F?N)bme z0RjN8y`rXt$TcEjg5+2Mf^k^utawSQYGRO!@Kz7wQ4#T7D^Y1mp+v31!vz+No zbB<9Q6cRJblt=)1^}Lt~$Ii(7)X%IFyfNNGdd#_J;og6?UBi~5{o*CX@TisjBj4bN zP&SvEY3JO*dbLXG>|>FIUrNj7vCNEk0#Wx2;yZEYaMv|q&zl;7#Q=VX%7KZhp4K14 zmV?AWor?`6F!j!Schvq;voikIn6~|l{sW2IKg{IqxIg&p<%w+4?A%GXgZE*P^hA7prmUW z4UYL$&_T$-JizZsG+LqM#A;_a`X?thHz$=m7Uo4O4LXv=RuBZTt0dU z7;-7pch5O1Le$>SkB08H5Dj8c?X_7lln_lAK!;C0(T!KrUxTd*!++JX^*_bh*@?}} zKH&7{U? z`?{9dhB#$xY>hQf?h;)gQ-%i$n0jNpBoTU5b)&>vNZ+b)0$GkxP}MYTD;P?~%Q@Q{ z81g%5OlsJdM5ql9vbirYv;5H=O`RQbOqhRiLDCk!eB93(Xnj(7%L?4?ueDiKzH83D z*8|r!-UnNeezc>v864PmeN?7cx3fQ|uphJ^2vdrF_uJsBauiLOEz~rt1cZV>4uKKx z;p|l(s@}%L5}dSa{Gjqp*j}$z5w>DjU6aw;FLCy3&%uET_O!q#;{U>;Wl}ajM#`k` zK8Eca&xWx2U=2hKk+}X-I#mAJQ?o7yINX&tXd66>+6UtH!Hk$%o)0wp955y zN!Cxl&9UhTS!K|t>)`D5ho|Ah5PpWYhB47Ca`5P5CYh$bR=X|AsK<*;rz;o%g1s0- zKjapE9Xk6^U3F6B)Fkxd$6drM?g+L{KiYc%PzdO8Bo{S^>>*vC?&3zTDpSt2lzzX> zTSuMVN{mpL3xFss12w7;dy5ZH{cjf^?^D1k`2&4_%zPErJ5x4pB7r zxFcEs5?og^Ntm=)`YC$Q_d;r;LR!WWm_GR!Ja2}CbUa)0+1747}`zKLD<)&ekO2lw= zqI=0P$igN#6||PT-|gRX;$*K!WAXGa5!(_MGSrof-=X1k6+s^SE6eX#m`|%ZUF)}5 zl846o2pXAgE#wVxI!bg6H+WfdIdS_KDEA5G_11L{8&2Aq`Lr?R!?o5LW*U~NVHP0B zh1KKwZBq}iiiQ$2J9-rcj*paQ``IA4&Fxm=JPzJP8XsEr8<@soaCUklvz-`%NJQ@E zF7472`>U24&);zk3`5}W2UHV=9x%cQ0GHhdW%QJWau!3#%8`j_c*;;(LJ<)I$Ws~JZXiDZMQyOX1GGsmOHln=?IM+OC{q|RNNy!v&u|1MXdD5nmeuxdbd2F zmK40V3y-x}{d6IObC-&6N_^l`t@S!`QrKr2cf&(K(k?x%XHcmSC4w2;$!La#2v4yx z#ly$Q=XspC7%#Vj4()o6`CeM$3MRcrER6WT5#eKej-&BqVmZ7LCw~ZF>kh7+a9BIa z*3hTd2~z#lXdjy0y50Okc49pXqwr4Kr4L=g*4mPlrUoY}8&R}M@g?UDBIT4Y;yj-K zTa6E7N8*`INEuXC93|w{uJI%1}@JO7+$WiDnw+48X0oybfN!39m*s2RKdoyKAg5B(S4ESL^&! znz=pX@*@v?OQJ5%^;^7BLKvy(yMh%c4OG;_i?OF9=6L|qdu9Kcu?G? zmKsaJf8^d}BK!W;5E5$y10f|Xv5xzC3Lia$`SS7`!lb1<$cHb$37F*D0DB#S+q%RK zQ9#@ZfS%X`-}QddcRLh`n1AGcfGiS#We3Pbm?Q;0Xg=JcBwNH-ZNzZJtPByb8hFz+ zwuSE_IQhV8Dj)8uY-b=aiO*oBZsh3RK~tVsk(Iq~i$id*mjXrbMJbjcwB?_G7uTD_L(X%rKo#sYLAPUF5NrXUu zNA@Zg(5p0;UcUq_uzE5fu%>~}jW}Xpo!cy3(B!wSw`yX;Q+hf(HkrHJ3|1I~d0k;+ zmf7Sh2QqdgG|seTTgn85#ToVQr6+d;_CeR$#Xk+}d~qI?5Q&qZ-moDHb1lSaECaNy zn$)f27$*9+Bi!2S?_Mq`;gRJyp?FVwcl1$0@} z>^=gL2T2KieId`e0-V)PbA8vmyIzyf4gmqky4_ypFIOB)a0i%&Zd z_{8B5-Bl~4_!ofe6n?jI*8MABr4L0k;91}8)M~AR^xI}L*SQ$Rd?&%yi##b~4fkz4 z%l5mAP?~BQqDM@u@lF^R)fx8X^9)t%T+(^#vnr4#@0$0^Fx6)f6+|R_I9wmRzHceA z87??0;n;)pi6*OSOTZ3{2->KpXwuFz_24@b$E<6ifL25 zKr1;!1!Q;XMX&RWun&i0?5$XdVbC(O=hK^ty}6m-p3|e1J#sd@Z-|z&61Vn+^Yt=h z&~-o}Wr{m$$5MudOw%p$9x+C?@NpS$*}GK4%gYzeiXl`MXTirvA$6S$d2~_?iOkh- zGU{q&wA>OmV$#dH?AXww+MLU2Ti;*8nsc+l(b_bjguKhH(ugYbbVtEN9`n;InMJJp z`pC!0iKOaIb@KHey5Uhyn?JopnuZ^mW#{BXWIiGZOQVFN01TVwYv@%^*yPMEo+#HV3X#MQBNRJwt;qx83{i@K^HEER>5$W#rI$U;f|oTR8jjg@O50iBZgB(ku|@4$Nh+sbG$ z%+`JK11JnRTB9D_J#Rwh#T|lAW{rejd9sXfA*hZW5#@R))^p(_fbU%hpEP@VX8WxH zV{l+qJNH=IYGGNA#bsANPDwCkL3Do)y+EEFQf%#uIR`ZuZmaZnE}yitqXkduT|ffnLIk zpDIC1{xVlb}feI3n<==3&ap)+WYb+ zf%7>`S+g9+53S9~JVOB7y(`=zyyzuPHbW&5gwOsM*sc*J=&={&KL_VW=JuA4SfuL! zKKB9kFGq*gNBN&gGbsc(6~yb4VhI1sND3SwbSm{aMH&V}ot!?R2T>P0&A?jT6n^pF zuip+9SeFDeBuvH7h$lYGX9QIh8jM%CI$XX9y8b|Lw7Wv_e(vrvIdl2mRbY^U^A0z9 z7Q`Ta@sivRWX-2x+99Zp34BLCE4(Zgb2Yz1u=z}KQ5Vx#E~gcA1w!SqEuyq)430nQ zMq7w!*gCdP7s!%H{m_9~a(Vo)xa+J~CdD04&6ZPN!_OAQSRnvQ^#4;@_&+}Dl(}p9 zzW3m45+7B!Kn>;p3rKOB(+|Deg>8+8)2UVR4;67+Tt>a(^O)$xd@JuZ^u|mRR&NG! z^ii^S54?|>svTg)7|I(2*@imHOxHENtE1X;;$h6b=PO18(L_{+Nh^=bqkPjc>y~|hQgco``uww$BGyjkuFG!H zviy^RcN2cWKZIGTie+4#%~Eic;5=l%FaKO82i%Sv8zrO4^@5Y>ALGZRwuT*6g!iy; z-Bb~U=N>8KhHzf?Q}Ggpp0GxnR8_uXYFh#;_}MCr+-Az+y_r*p zweD{xeEGiReI7j-av+d^0<+x>mcJyl^A>LOdy$l+Kz-i(pAuKeb*chQS*cTqdUk-G z_tif0_U6|3VxG?r^X+9(q8o0$JluSQdOzN0xDbMLc5?cPv>TnJCFOt_u09fI>9i?w zA)3*TiHsR;0+ zqU0~$+m#QY4swmKs;#QkGfz}BG|V_x=|M6pd@@4_=Fhb5s2e+FUXt3$ysDtwb1WyL9RInTU8TD+B<#L2)a2pfLXhG=LsJ71_B8LtMz8;}(4zU^5 zC(Y7Rm|JUW`DKD2>Ol$O!gvYLMyDZXjKSV%h6~<6;`QUK9;440BI6epCH7GcAm9#CT(9qZ3jAe&KHk2uo+Hj6|6io1=oL*atP8NYkm{-9b_o&i%v3eGS zxKh*mG09Wzs!@9~8{=~K``qJyx?+OmCCMA^{jUU}PQFjG=BSuHlN{MLtzT)QqT4VR z$&oAcqHhPb^Vd^+@gBg}vt@FtV`dIDZV7b=?z3Qh+WVU_7AL`dQ3I{+L>8Qo2Fagb zaCY~CD&)I^pIKnUl0;K?q=4?Omtq1=XpaEJGHkKm@M|>pR-wVK#hp=2Ep96a4b^p2 z)b)c$b>qATe-R<8GSx$bRK$W@bw3) z#I#H^e~(#MxBv4^RfRa?fw{b51BST3p95kBf>DpiUTKcRBUis%BXwRKF;(L|$8rVv7hl8dyIf%$yOWTs@ypx2$Pc}@YpWe)b6=p%CBlWf zee}~k3B9ttP@-OutZS8}1})3tqOt*>$W?*&`f2%6N#yk>2QX;-RF(TWVFomNZw9aH zO`+vT^@hF=)Xc5xT8~$7Jbv|CiIwA5jyi$0n<^SsIV;VZZqJ>1%58yCp+(0iEF(ry zpY71^b5#^KAzVtdWKKuE^l1Rm8u^sPN&69Ay}ShFvzU^@^HYgdA?$WxC)N21rd|Y- zNRAA@Z<@3oQ^Kxt+0ufuL}zf1zNZs>M3X)s4l%Us)+z3^{U(5*l+AJk0-1N|vl^_# z`&YU``Y-9q1E4+i7tr)}JmuaGA;gMXHwN@7FW{RY{ow01uO`e!F04=*ba7_2n|9B$ zq4VH3!TQcx!?A=;_6T_M(`rkCtR(I?_nK8r--MJy)A70pA^l2_P46qVzt;JWPIb(< zLMB$0kW#6mh0DhcL*}-O0*sx+zW}Zy&hd}7TcFA(5>cc-fsR&|bGP5JSJtDbOy-&$Ea>}~ z85(PIP*RpX0unXHvw}I0&ZY_=lNHM51z6Q9JwQ zAHZeMe+W5LVL}eSmx`Y|1bI16POzyGhL2JTA182JqptU^is|fAtkOl+MtI&B8LV&y z^$4tfMW8f)0nQY+QZQcJoi~3ow?f;EDM1PwnUp14s`~2M!Ze^M1lg6Y=5};b@TnrF zY9=!0G;KKI7bY3Jl!;7L+w4u(3@CKi%&BHlDu{Gt=2+a%`F-S#vo?xQWQFP`K8RH0 z_G!Gofh@a(zH_y~aV1M7Iu0syx{9oN`q6!ia-CMoU_ghyHN^xWrXRkCA+pZaMN{I; z3Cpf<{fs`o&OGQsACI(tSc#Mc)<;pY9}C@s`!Ggzd#ZnJV?I_joKH7&PHP_XV(+ie z*q9topJOAsQKD#ggy*G49+CJqITFt<;1{O4$(a9zy+S`p_|Ika@n~ABkuRKpv17yT zqlmAh9q~J_3{6)xG)dT6nvEwUhr3YcokLKY7w!npsey* zhvvYe%+^Ysge_TQk%RMNl?Hmb-l4@rxG|s$jR9)1@CXqSzri$@rjvPXL*lT>JtsyR zd^ka5g0SK=WfgPGSucUPJTSuNS4_$Lyf)hkT#PumyFB;WJdE~8-2y8VA!0)g^Qo!f zb0%@k=bgbt&J#B2dMEkSDmz+5k=$p+%E?H^dXqvaW7l6(K2;!Z8F6S3XXs+3_WS-h zN@r}W1M^9^4*F}^f5mv&6q+8D`nFGn>%(8ddQyaG%zuCZjO?YI66E4#=O-!(C&~i} zxhreEZ58*DmBe))sx`KcH(zv&cBk)o$3Xbq{=?W7zZZy7TQbrllUqDL5s$QI-* zzC@5`6`?|DPu}UOiEH7}Ofn{u&yzJ;`%R%UyX5dxubs8sE{<7e*UAc*u#WGZcpkIR zsh1M9pU_-d0v%)AoI@}PG z6wZEYZ`<dzUT+Diwd|xrx(0vwcVItM(&_gc;qZzoTa*5(QFhR~3!9IXzZ> z{Lxky#|4>&)d2W9y3{ekK-{4!y=HAobj~upp*r;0#`b5H_+)+)U)m)Fy3_6weD&dH zCu+m+X%pzuMtkYx$mV`D;HQLtogbgY5oEap zh;gE~PCXm?Ejme`Y;J?I1_(^q#YT!$@4YS1ucQBZJ`v>`SrexM&vW4$$4o}yT zicWC9X+pDaFfjn=AX`#mXc3j*hlqXW{txIoKx?&TGMGWHX3Y#U0JtZ*TA-Hp&>%av zoZP4&$*{2UZECAA$g`Uwu|h<%D_td(CDA&bXQ1Dq1)IDNAb86h{Hq$ag{AGeaD+>aM;X3AEaX z?AI5x?-BfKPg^YncCvqpi(!x$e~)4_eKs)1q>-y$*d^Av;@g4JiU>eKWho>w-&mbk zvyp3PzSk5cZ>3!7-#d(bKB1&NMS9-IzJV*-CS`RC^xTBU1;V?(EhIvwa7#_shYEYl$v>=%Kl|+ z+1tLB?%wyJzR$IY7rZB@lOPa)?uXRn8-u{y4P(L$+GVG!^k+H#HL&@}>D*;`iXX#w zT8`!ly74{IVN1qTQc2TH_Yadky~e4#hjZL;Y>9r_f(_D0&C>OK&|EiEX`R;oD0un4? zBx+OHzknN!M!3rfka#g-OiuBXZ--qx(M}yf9bzcv>{?WZ4~@(4pJn$ zBMM4?)eh$rA`h6GN|mLd&KQE}jDjPjP=y6niJztoe;1NczP;*`a#}`H`eP~=y_?^k zU)_J|{sL4fp9>zfg?PC0D(ckUjKYxD^#6&xrUbn%4876`GQ4;PzaVzLSyBd@NqEK9 z$hTG`tVd@C&dOZ9yN25gUF?X3e`p51*%SD{y5q0f_i;0zAH2^H=WeL6KYV7+e+?wf zroY^XE-O5CwB7~cPSG@PiwnHzT+&-&fqtNiyY@kgJMBTF`28KhQ467CCjf9yo6gf_T355z-gqZ;>OeB%y zV2kX6o9*|h?r}tyKc5TQDnSzBAV>uHc=#kFM)p)*--bWAXOd4XzR|k$Fh_oJAbOu> zvCuGYP@@+9CyXM`%t=ZGKkYd{od|~J=7oU4;2;fjlbb^^lpJ{hk=8>o_`sv(=@MD1 z{sdn;zZ|>LF4>eJ@iG}x-`2xTsFMQDQnqN8sqSxxE#G(!9}u-V4M=F&-~CM%;$ zuRPv7b5oiGjeS=d(#+!EoMVIb`zg_AYre8Vf_$Q#nW#7<+W8a(gzQfRG-ugTEbc_R zY+!#9n-qr?yYrpsO*mq*{ole`Jdon;J>6KL;T?_vGNcqpdVrN6}QKh-5 zNEd5#*ORCP1eA+34AU|`80x=^>U+zjT3OB70p0v3R?4s*( z1)6nnr9DmCyozO@6M~BHf$gBiqgiuYnqZWtn1$)ust&0`JQ38DC1bMevnqs0jh?>83C@Q24wZ0+D0RIy(W-XVmotoyySx>GTd*}E z{C1jfI$l89%rMFkw$V;W$)pBr3S@UHBUfu)J?=5Vs0SWNWg9{TJoH6nNPRVrj7G#mF9@eU zZ|s&1vfN0*eXWNmzkYx^@{&f2+AOe&U-glp;NKeD-SKpj)YMfF-_gq-4Nczt1z-i3 zeZZ*frkLlep|JUc^?b}Pnq|3huq0@>xUTfe$4Y(HXE|7K4KJ!J0t^El*Mo%dZL}IH zo1`~l%`5FCPo9)=+}$RI&Y(gv^EU*Dbr_e=;MsU+WM3MW2kFZu-*^1kD}ODV-g z^I2q^_fla8&ToI3&1Q2clG%#gn*#T#xoF3m6|^Ra!;g-h;3yDCL52>H)Q#CZiAgq^ z?*v)A7Z+pS$N&1ai^!R~PaE|PN)DiJdla^H`E1MThlB|0qV$CjGS)1)M=*>QWeRdX z6~kS9Xulq7x;Fi+P?7dNjw#cES&t#Uc9|jnMxf$JG_r8MiHPPMwU7WrI)OMSa6^7< z6iU=*4pRmx#1f1Vu8}*MaL5ShOSSI+8@_7^w?lUgn%$=;^{N=6oW_{f4r_;pHRnx7usLW{z#y3%|-tp6p1_3?zlRn$IbDhpEm%Vr^ zD24CpIvcniO@>Xc19`)T$o=kma^L<1d>K5uLi6tuB${CpnbZ>c+N0qg%b3zL9N@Ks zx;iKP@&0~pwJ5(br5?FjK^`E()&n;*aaDa@fTaiEL3>{Qqi$(!?};Y;VC&dfm;3{X zZ3_HZ=}qWTPU%7E{~#>>w}?3QKSjhtCPA9k%BXCK)V<3+;UbU z!d9O?%Oa7@x3$nO&pSl@&`_;fc{KTgM@4*mA0BvZ`i}*mi=1wj-1@(o0CgHsjaje( zs?om(sNT6)*?$3cbI~6pg&$Pjr^428bvU7JOxLqvlUm;SM!XRK=VIjJd|yH|X*Zx-3P0avtQ_+_7(osML>o$xM!AU5WE+ z)P)@(BJXLdM#;RR9gX}ryD~-6FL$Xkly~M0tts%F(z+Vg$C}>+_AX;a6%e{ET z5mOn2<6rS3DH6GTQEe?8p`d58#=Y(@I?)EPNr{o9*~u6XFZcoO#Fi>5LSfVfXE(D= zb)_C%yq&0=U*+TD{rj5!t0`wkC{TVXH_BCz*;s`VIwp%)h zpO4_^8$J{vD@PKluWo`6UHKp-aBc-m7*w;vT{ z)^PAc~p6Ua_^yoTP}bKFsu-ygm%9%?o0%P)^@hA7$_rGM#R%tjS2Bb*+W#>;leh<8 zw+lcQsZ(ny{pl~j$1FXPWig5^`EPh0x!f99Q_X>E-hD~Vn)GMGM!#IbuRCGk!z>IU7;oXR7N;9mw904bb9_wxF7TSn z8omHg;p+WPAj`szEUI^=?yV(YpxFepPqi(T?8=X}MiOO!->An`tBYlchn243y8eHL z7tz-1TDI1mN7AX2;yM}tNMGUa#p;1`=Lju7U+o!a^!gxHUDUrup7!%^OK;2MDu<>SkVljXVPQvQk#Gi(YtR2G5v&n;gNQmeecVE9|YYNyONfP}IGH{@tKWgEexw}KR2c-@9v&l24vmfC`a!`ty9PiDT;yJI`|O{c zXVLHTYoWk!8rR;_jE-V^?^Ub&&){MXe>>nBgUq|>L$sgw?stn)2PzXL_4JnhtjL?jz>e7jJe`c0M$if zrI>+CUEX{cRcO^k9n`+)c~`Tw#&4alz1@e?x7S|1D547w#>|cWSp*RD|A{F)a7H&f z-h8~D;+9!}5!R8NKD-Z6r|-VFaU+Hb2DE5hJVxS;UB46Qv?e0kzs!9b6O08pGG2}w zuoTYcjoRB{6r-p}mV(a+F4@<2%x@@0j@q0Ak;B{jsEQ)zJ*8V4I1Bjl1 zNH&87ry^bwLd^zU=;`mAD#?SM|XQ>Wg5fID#n2N&37Y*ExQyD6$HYkn(*z` zl&2#{p0g@q)!kp6b>wSEAZa4#YBSr1t;kXRv@ru(>$i?WY5g}aogl!RFN%Bjv%n{B z3wEzK7F~8`kwNSI5Yjmw+H97&{DeabLgu*2aLcQ1xkz?xovBOgessT^TnrF{+7I;> zUurosn;i~0{IRB)uV$h+j|;2+=h(SZ=&qap!TP_})T_{+dS0_A`$g<*dh0xOM2@3< z;9%z3xgi%myrv;|cw!h4yMmbi*hBn%vIS8b-f@QTqf)Sc6xnP?>&e$cHN5iW>OW^$ zu=^*`{Q@hXV}1St)(Mh+{7a5R6912#F7Up5R^_cgc@oU9e(KajY}P}uk7hFHFW_Wp zB8_MSA;AY9eQC~vxW?SpyU_k+787bnko~n#zx4W@+;9GkeJb|T@Z*OiDM5QLOQsv? z*gI*kxmC&}UN$ckAn{BFMhI$}ZG0DIvAFa2RY+5!+;vJE{7T)V@`ENl+r9emFTmud z$0s7={a9yV>mqBMnEW={%8Bh8vMgySL9y1&>1IOJZ=AoXCCV#N=)rQ9DN*lP`mwe7 zOW%KinX59u^H&kYcUhOwHPSlZIvRqrk-AKcjYfcNn@qy!9_8SdH5_DnH{`+q6Ziyw zZAHSb)zlFJ=d>zho6;p`FSawqM|K4C`C5yO$2D{~*t~NI1%Sx?bPB>XX3p%bPy(LZ zxi*beyMD`hAEG?6vK=t2`S3B@9`6clzF5#}qVq~0*F%{p>Vv5yr5DP&n?x8F3Inn} zX~iuZeQMMe^kJcigk$cEct?!U;;6Y8)JGl}u6TtrW=#aD=q@xT5(3XSj!C95i&M^m zt9$qn05Spu`{d>*+sUN%u8O!lZY$hpH|!)s^l@%X093*he7HPRK<8~?2D|UM26g4K z_z-=rnzuE7p=w9ok*HO>wAH33fhUWxwpVLhrxr(CN8NpFkiXUq^b|D5Bx3j}UAVC| zdz}`D9h|yRwWZhGMd~}1$*~G;VY^%?KjBq{BLm921fN8ktC+K2KG&l%Bm$T}q%7=G zwikCQrJ_E;zX!>R?h_O)K;3A%BE>c@^_sourBKhbodf2@SCZ*+6XY$&Ik`BSWd+Vx z8$tx&kw78%B^9kQifFDYKjW;@1c$P6;YN67ZQBvky&Y&%Y^f84i^YZoHt`G==x3)F z*!GOSdwla4`@)-wCX9(B@HXy=OpB_A=CUyn6B!|k)^iD}~q zCBc4gT&E5nwdzwv3RefMa=b3z$3Fc0lBi+ja<6p7^cW+1UupF+o8LrBA*Yy$OnV_$ zS{%tk%jSMtsczFjnuFQ!7l4M=C$gH=@*1u8f?JOLzgH(Tys?Y=vCzlb`P3>orNy6A z5S8k3i|!IJ!W*yjr0^n02Z*km}rUz9oJ=t zoYlqNdE{VXh-&Ni`pim^e2SMaS8Y_FimzW+rirzS`2CCbB4S{yj&p!b9_!JXrj;`0 zN)#3Fd9L@jWi&2G$->gxaybM+E7la1)9dN72lQ6PeAC8pt4;2MWpasba$1QpC%1&O zoG=1qdM?VDFh#@ax?a=uOM(_>zOO=3Tzi{PdwlZYkZ~~@C9;gIuc@%MB}N_H7uRsk zgz~t8p_Bt1hYTkC~G5V`9|E%>1qFqt+Nb@Gr-byW5FRAO0D4bDwOw zAOeIV6Fj3y_Iy!Pza}NahBO*&e7qcjLj~Z8B-zsgz4nC3V8|t144na5VueBcriUD5 zFHa&@9%^Oz??81sC63Z(feY{oXXHIL?PuHROUr0U@f*12qNB<3eu-RnS65dCo=NuJ z?94DhgaQDZG4KC|WMF&@ENlSdVR z%iN9ZdJAe!9?uKk_NBv5qas}5-d7=HghLiX1(hVmnI0#)b^{iIiZm!A<@-+^Inm(>ZeHAeZeu9-)4UHg=M`I2P5)FF&T3aB69bostP9mTmHw0EJ z@x_SPjt()AQ$cX&j!r=p3!F`rj16RHt!%Oj;q+TJ%ec%O*Hsr;in?YK4(3~Ft-Nf` z8%RbdzL}l`22}bBIeaF=a8|x*OOI1C8c-8ybrM=8W8>zshTrG4ek>~dheeVyIM;Sd zXgLq0&o*GW#vV8n$tic_BV*-TUhV@eKe?q>5;_*D^r6|UN;Cpni@yL6DM7x^@8d}h zjJL%(PxsGUl3Ze!j^(rq87jLc$E({_jT^9nxT&ul`i%?R>^Q#H(2JR~yP&zYU_#oksX-qTH{K|@1*~tia^$|S z(G$`;7sfML$mdl(8k#5(6eK>@crPz0oABc=O9SBI? z*iiY5(;JluO}L(|GqvxG|HdM^P(uR@>x;Cz;#0<~E(%EYwZS+$Wh(Kje6Q6zc0gNM z_}#TTP!q7;AflCrA~+Sw4B)w)R+bibl}H1KIB~7upHFdtoLtGVlz1VGE`I?I2uyE@ zN64ivV3r4#ChJqHGD$%g?an=DvdN3lZhINvl^v!r{t2OrB0u9p|3>>aCJaJcHT;pW z;juSzP)JqpjTKR*wH~`ppuFV<7u|ucs}U`*ueYs z=0a5ltiPgPC{_W)j|1{9+?BxV%E7g2l%C5OYT~;e$jnxg-_-IvE)s$Pt1AhCPlmz6Q0u=8zJ&} zlM;xZRLNh-w&q0I6Fh)7WlEN zeoHQ4a1tpdxDj{Yof7u}e2c4fyfYe$b<&Zsf|c3C$KRejU{8oSsz^|5>KL6FNY;aC z+0f|wZb>u~!4CbO zOno&%FTd@Z@1X-9FgZ;_2d0)TVQLWl9+~50`l$b4g9;w|kGR447TFHV`*yBDc4RwY z+&&JiDnTs7+O(ph!hgy{Iy5uNN? z_zZ8uSPS-#YHx}XrQP(65P#62QYPzJjvzc^;)<$dW3r#lk&C>H-q{WI>$a$T&M~Rl z&bH#T5Qz9tK6#G<6O+y$+1I>i_~7fP-d~!T$a(Ee_#&_n#1*iB;4Id>=IWS-E(k?e z>ND?g*cYy(WoyKrPM1dxT)h_SXWn8Ol`LfU3p){ASV6eMeH&5(2K-&K0CplgLmuF% zv~RkzrYPbo^jG}Y>pz1aOVle46k)~f+$;QCd%Rxh0oK3uyT0ACaCe|{m@ z-fX>pNfE(*MpO6;C@L+$22JB{hsR-DCo{#FMkwj^-b^c-CT4pKdD_3tr1k^uO&g=o zx%LjLGhuA}-jA%+F@^!;(uUhoq+NEz^<6a*|CD^t%`K5M{xe9-^)96pACBd} ziO)-p6@DG8tg^I3dDZx-wY-B+@V?s)fOihZCt5B?8Eg!n9DDFit3DtwedpB5W zJS#~NE+@GU40GwOjWVWaFI=_^)E>3cPbcPm(8nKXKT&dW9sBR3v*9c-cwZAb0ZF~4 z+aKng1U&1C;zHjI`?$HFWK6ufn2U3@Tv}ufKevt7}pJmHx_Hr*q$hoPw#cyrxScYTe znRn+h!$NxtiA_nZF`sJ{`j~F91QO?3h1s6WdZIa8cHOvle(c*ITFJTQN2yZs%rnc6 z%X|w;`=mg}ac7@{2|?r%e>i&3vARUO_xy^=VD{8hqq0eAL>9=p=hdL5tdOyE5?Je9e_kGp|Q_;RWukEKQ3CED8#C; z?5BZJ8c#wkWjqp=&N1pKlK@-}hTTok7DD96PUM+tqRxpN72b)|T>-M2GmtNEfpZLX zh^YYk{deh`iqn=y_VaWikCahhuhy|+t)HdoZ7ABN;e(qxxKAJN;O&*_F#Q7{;kCWn zVHj$P)EaRtg-wOA`?Qz$JoIi#%&bCRp?u zs-Tkaxs^-@j1L)Yf!copPKC+<9;=T!#WDMdbdD3tTUcIlbx051kb(X)M7hoU%wJ31 zCw>-G3TffHjkU!ZknDV*m-?6GZ=SLdJVXcXq@iR6vNq9**jXM#*H|VvFBKkna3^M* z$_rd6evn9yEru>2Tj`%pLXRt97XSs6aty+OXF&wF4r6JT@{&8wPGAa=pOujB~M^A>D^?O0**W$a&08iv8>I*lPVW;bNe?-+e?l z#(R5IOz}EocY{1?-_jS3L|=Y1zRVs(g8l+>jne9rYK)FL2k?$bfNU+XAtw6I6G9SW z5dSgAa~0Q#9$ljR-Mr5N{=i59gCLZ+l6Jl%=4bIEaUg*pUzFnd(gKG}Ag1L7>rcC^ z%z+ZX%PZfw@@k0{As|`urlOQWe=Ozgv(_f4wKj(QKGU~+LYLDp!Bvgx?M$GDqE$*# zELT$AatVTB@te#VCG-~UH|7P4>Y~agWsfRpAzx30p-13_Tm^V~(sbZu_pe{Eh9}JJ z3ssyEHXE@0ly_d5)Ccu=TS!~{n<;7TgL+9GgERbgLKe`la4*iV_|g43okDFVA?=FuDlY)ZevCa2C(eM+Ax7=3Yu(jZtsy7aZ+X_Az=n+Q#ERSKF z|M(><%<6Z$%$o1ZNUg)%fo!|2*UCaJLt2%o(S!_9PKC$MA%EJXUs%i}&5hFaWC^pm zbO{UsT!LiU@Z4D2YhZn$6Qwvqi{t=!>A3SiB;rc_A7|x;a^K4IMf7}gQq<%k?a##t z4>Nqt#eOo(v)O(g?`hXFQ2jV0H5q)SCn!koNy~0~imz|;?&c3YjJ{m=YL=9g(ruSrN9`)SW65&w_N*?O zc%nz9u<$QWB(dj3t)$J^O5-Bz(*?e$N@pQ(BSg_rBrFz)c^JpeI&1dj~|Y+e4POMQ;S>tV4SGwihH9qA`0RfloquSSXz)c9Sv=n5O+)2 zXITGkkk#eu@!<374KVT_VC(EYRllGqkRpkCBSWT2OLnD{2tBk<84_2{+zszf%cW5)vwI5v)*uUJmb-K}S#ojZ zeJo6?!)z(tHA`w>2CUDdbdUwZ&YOg8-z3{I?lu1;8&S1L-s4qQ;OxPQzH-_T+AHp> z+Fn`XH^)1g!Ke`#@6Alm_lV&}#CnHBG?7RzNLzeU#$C!3ALO}s#tO|A_!2A6#r03l z%vd{PSB~xtz@OAyFgpW41JQ^`h)D_R3fq#zd8msei>K`S9nak3nB#Iy$ZG`dXuAg~ zkyC;@oy`Axxf%=j2jzJR%h@$I4!isp=II--ds~jvJEX9Xi3=EQl7eXdCZf1e{or9I z#5TPUMtcH6o&|L?!L2{Q-=7h>_wmLPD`@-j3jh>c)9%s|{;6}Uh;6nRJ^V-69G~?+ zJtF^Op}O^<6(fpwozN{HCnRl$1VtZ00R&W!lP$E2B=vYy_uZxGY3dYWE$`&}co6() zKaT)(j9kPmYH$Y<8xK~SaqlQuKI4X5xpjD46Oczc>7Qt-pa;;z3h)eGMcv=Ss)9UB zt9ILiF=7x6j(ePN6t@n>LnQBqANj`pOWDpXP;FfBT|av)g=>7gd0I%bBvAjO_$gmJ zn=Bf^IvKg3m}rVScrZZ0J(uZcSDkW>9)k+5g6*+=d=@E7&Roa4*L9}2%A=edzY1e{ zTO>$1lK_O7iG)P;*_D9b6?1yF3tdcIMT>+5e}!9pi)nCGo1xCA>r!l0*2)L~rDO~p zYIMD=9=S&;UG9pevP^*L?~iE8;$*SwOk{lrNPJ(I=ZQ_jWB6Lsp~NhDB z3pf5fHp?)IN=rT@`G=`i_J%sYUq9J4070JXClOr!7{uj+x{J6)$+`TY#}kPw#o15I zNnbbyZV=KwCc6a2 zLStm=7f&S;lBh=i$YD2JULbQZDEPH?XtG*~P7OCKyfbB`ss6mFvN}sP&^CiA5X2c! z2Xxn)au3p-k#?m=34{H)QcfRfND7?Ykn+&bPc&D&@|!Enc)-Ba-|K0U)uWblNy;cN zeK_YD_O~E?il3V@>N+6nl?hZz4g#^beboNQ7AV0?UOTsK?XT@5INQg|xX6V%d+fGt zfDSE%;uMlMQ_v9q%#8%rilMoJk5ALF4e&$i25pL?VtXG68HGTePm(QmHH<#eNc!*uAM|68ok`r z=*YySKx8fJip1%7*=7q2IrBvRE;%jcabfyeU0}LoQqq5aiF3`3@ChmkE1UA1FCGsf z(W#wCwiQ5}OZ%=}f3T7VME0~8%9H`}5?=}e2^{ahXHN<|jM)iB|d-nT`=@cgbnj-RuhU(KId7UAq zh?ak`%OzzN>Adc!5dpDTsJ1{R=29A{a${-_S%?j8Cn*MX`0tBIqyRkEyNhsCjSzKg-m9#sHoSGcnO#jIc5Vp$ZNfLpuBU+e4{WA9a4&@=Am7I5bsniLqu@ zpL^vf_IYg0mG5_N z5h?OB>pEQ==LUowKz?sE!gJy<`wNNw0z|^dnX|9JJa3AIhA(?#XRHu+lkF z5@Q`Vatt)`{MdYrrNB2QR{{#GTswb}s0pqf1XBPtz)wgcj~biiMc>=Xzh>~JNJXo2 z`Ju5S9{#8HjtUZss`|m+aMdX~A=I{SHwem?6kxY~(9SuDlvg+YW;Z~*w5GUu6 z>2NqNY-`F0%q&fUZ=eEFB@J8V7Zje}uzdX*G^~P3pKSJf9HRaxxThWhyh<1gqx;tS zbGOsvxuuDx=q*EHJ^ILTNJ$7og4RfZiRpZSZ#xrFjCrp zzJPBdHV*)ss)-$T`->mIU_W))FQ4JK`8w1QsSL1S5#(z6{Go%$`eXm@kU}YdM|q*e zKxwxnS;Rl<+d{G|XGv7Y8gUrx7*COAdt%nmZi~sHs0VbGj#gV8MSC;jsgA9o46v#H z;{6Oc+i49bb0{{_Ey2>$ivcta5uWFD9O*a&PNtV#)nw7_?CPuZf&syXT*CIOTuO;R*6w^S}O3Oo^PtH>=Y2A-hTUf5(<| zEUG(YI0dyoBlIVr(A>QWg;7=GJ74wz*qy$9YvW(!c;^RD)TbO^F>aaHw$D`R9>T4q zINcsb1lB6#XIeF|&i-WZzpZBYbjF}dSyBJ}^k1_&%suuGA14#c$C-89k_xBp_|FQ( z`@1R|GXWX4x#@q#m^V(-u4*;+66nxo=~|TUqL~ELr!PQh3rFp~!XcTeb$AnIB?uku z?Zzu4Vv6Y%4I8|6X{13h=@P7>k__nD3#|3=(^|aq&d9sE&R$`J`K0P7hI_a zg0DbV)SJ8z@m6Vjjan7-FHdu-YIwsjUv$azqrRsT&rJqbX;A5`<;Ji2yRf}w#lc+O z1J{^-FsTY~?#qU)c3OCTH8TXoe|p5=0;w~HBfWa1iNr3rk2R9*EgwlscUcWMVN>KK7gq z%7^NyRY!I%?eIDAw?eEcWHCHHBU37uY1ID(R5gH`?T@~8b|Ca33tmWyT9r8SoJbul zgd3WDc5qX6UGW7BF&(16MK=EtPJR*f7qDYyYdB0g%>c)kTYV@|t5mTz>=$VEOBWc1 z{iYj*w|H#Ih^6am(cz3KaT$AoYcGaB!a^51IpIiSx^-u)VCu&%#nFS=PKP-qGh$`q zW3Bm}mNs-zuLCFiOmB>idh%>c55`n+?SVS~oemHE*1Rtb zNM7&FU^N31=QUf29}xB150+37-43uIhb1bLc@VyCf`IAxEZ#-Ou~;g+6w4Lx|J z#}c-*Dn@?{MX9fxva#XokE8tWso$2s>CvKIDCnkAvzRAUGp_b zW6;WYOU%icXSJ@kTgfBkxh;PITs0TC`}Tg-)N$|-q%VH~@S(!FE*>p;;Wn0`6(`dA zQLmF7F6_PVJfO0Ar>CeU6LW{h1VC8t`(cC}3g`6UwOH-}Ll$mqSMimYB!Xdb%jyL(C=yb{h9w$1Tcx#{4 zfp;Buc^dFtG9Kb7DA@tr;Um*zcU50!vT9W@t4XVEg2ML|Cx}6T76*?8EIUz_KIqB( zP42}x7IUtLnlKTj1<*m_3ru13bi!kC=wPtsAxX%35I2z*Xv1?e=q-$|kGnzNHKDJc zNXePQT&^=+5AeP){;@beWlR%n<)q2(qQi{}hvw0ROh&TvTjuRDayNlXFluR#BO}p; zBwtbmmk@7H|Ma#Zf)MXFBt#0Yk(+`y`?+&(Dv%%J@S}hcoB=1QYn}m&wD{Qskrx~m z$UVkt-=N(H*u#1A6#4N~Sea0K$h11wg(RNwDzWDQ9P)?216IprH>cCf3iuE8U8&j_0q zx&DeE!=2Ws1P52gV?~3QyqZ|trm{$%W=LL+U7|ZL$3v6TmR=H?;E10C^a>A*u{ETjqSPC}o4b`KqSg-Ky3jcz9d9u)j087}`~e9Yeg za|Di z+U>43N4OQ}LM>US=<3X+AUv@cBeOYLvj&+SGG!0HkiE^{`g@_cWYjyGy+ebY`yE#c zK!`4BSUQkQmoVfl_%J#-h-gEOYl6CEr3yWIopSQ3hg>}h{34H(3KUsD8#!&M$e`4o~D^?;;l%JiFzKhi#3m8lI zLHKjkd=T@thQ*VBL~zR{K6=Nf?feG>8D{F{^K?Pi()*sE-qF@f$SL(U>FqYZjgg*L zA{rD~R1?u<8+Q@>v9G4+-3eN=931ZZxRh2>KeXPh1F=7jZm9kyuQ-o6!@Tm;DBN|d+)Vm zYKBUebdbKD9VEQfvoYck9_J1~Ak&1Q5s`lZ&8>UiL3_lA(fU@OrxG)N5ZFzj?Ya&L zFGOb-wC2aOVwz0LKU+oFzkG8Z;!hJV&)w+ZCpKc;j|5hWN9H`F?r zmQX&l|5utC<`=8)+0BB1%uBF+10k$d%3oc>nBa>uh$&nki{ojUC(&JKKXbOL?LZ{E z&Ax*UYv6zi+gY<_bSx*B3C>I2laEEKtL7-_89f>cC~zxa^ri; z9mJx)oILCumX;B<#Cp++(-J6yj)Q_(^2+zz2?24#y?u>oYeVgX~QFvZjRKZiE1!ETmGoFI1|GXo`YV6yYUJ^ z_s~z&;D{-6i3(Ag9gQ@`7h2->;G2aQXR|Q8Gcc)Gm0pf$KVoO3tj)a@!AmyOwN-1( z(WEZgZSmi)7){=txg#M^T7yplug%uD?vFF4OPvkk7@&$cdV}R7raMit+(jw``D!hF zc~1u8;X43O&;8ce#!va2f0S{81hQzqA@xMl=CS0yizbc!z-`2~8fNI(W9;ICa>}?g z5l2GYPyqGi0&fVbHMHTFD!LN?1;nWHQwA#ekUDRFG@pjyO`JsW+2tSIC6o`+I(HF< z0Af`vA|o5%mbY;lUYoofk1DuuH#J%XYd0rgWX3$9;tJe}V@bo|F_EWvqy5TccE__6 z0GuEqMa#mD?U!#!Z>ikjh$e;CM>3mn{d@U-zMEL#yZIyMyuA`GudZ|~r$!mOfI*W} zbT=JpJh$pu6r8)%?1Wk|g!{hFnXKWq4p+4S2_hzRW_p{?2j(lQ;XH^-nWhEHBXUh^ ztu*pdq9aoO#u7#_dHOh#lV;QzY zhPL3jPCRIqb!Qa7j~C_?IILW-y&S93>0 zzxIaAdlEN+z4$96NM*s5+T|;?c0Xx#VJAd5CJGhUs389R)_Z@Y5m%r8qlC|!EWR;Q zCe~$5^`N`DuS%`Yp0HZGR}bfAS40}2k~IEIC_wx7rD8pK`}nf+pgsUKn+f7FVjAuX7CcUTRn z+KK6TG)^_8f{@h6T6oGN9XZyoq^xF-44GN9rW3xL7AR!g^>4fB6AHqqhcbO@P4I?$a_1PsPi7P zrH1s0^=TM!*l6%6VAhSkqP33;0`Bhv&g^2;6*-6j(0b!Kt|_lGna(vl4J*a6B=I9s z1;@G91xse7Mwxn#KE7_@oG)YU`!+voW8TRUQ&@)>5i^3Ea`I^LYsxFijmw2qnT9i@ zic+DjL4R0s=1rlZSn|T!csU0tiU@HxJ1HlU2qf6}y@%p3ws}vpl|WcIHV+Y+kDYyz$4?CiGiNAuMq;D)WRX; z9C#fIsE2`7xNGYUF+Su=NsKXZ4z~J2x-71KA3yf+itaijF$3&hEJGZYb?qHLz`2W{g99a6D*f0_6O(iiSaqrb`0d_)L zenvv-laBu+SFFdWO?YJ)exP>s9O6Fs4cBZqA#a#OYYha}r3K3Y z7oz=v`xoO|lt`laYsvm!l^@CfqJ4B=HnYuE@y*joJa@{I{QBqC>uUAtFIz-z7bL9> znY_UCEIq?jXvTz645xWmQJD7i2M$o+BR*fS%q{)#hY<# zpK?#or0>{4_leMWp1=zdSf^}yGR9eO5+O=PQm=Zc)m_UZ?@8YEptIV(*`xN25n3`m zlTer9!+xP&0odR=^jRa?;N&EWUHzh1(OwFfq~#e3c{AtSlASTPo#sPFoh%q*KW3Mw z#3=Zxw^xtYsA>u32gx1RamsoB%m&Yo6*W2{qP094Nk4(t1|(~sIpK%Q_C+q;zOcj| zv3m`yIp+f{{s1j}vPxS}uB;>`?a*2<{>SPEX=TWu^Sk9y8qu3+b*F@$l#k0qgThT3 zvTxN~Wr!!f<_&e8vHP%$oml{M&XiN;85`$K1~D#0Yy3L%l+G0#o83Zv-1vr+`*168 z`2!dm2$t4cjYcWmKTO;tnKX#OW zz1Q#b(8huxyLv;SKRxNYM2Lk7z!6c$?~#egu3%g5M8V>h{Y*5C@i^>Sat(Yy=1y9d zHehO>m>7y*8=kwofe8>_L!fDfS_siDbbIx^(l$h|o~D>E5Fyd!Fp>LDQ{`)!;j@-j zMp>`S{Az!l=t!!K8kiY>PfZID49RCYx)^dwd5GC&<58J&srOz0^7io1{6;yK59v{7 zDQXq$xTYo1Nlwe!j~`U6p%A6)Hq{EoYLhOEw8nD$HSrf*foK<_45 z>+`IAUiI8<<61<{51sn9`E*-Rjb((Dnp0eXJ-rfn@u+WGM51p0-+fj8=_L04AAwk1 zuSxQ69K7d^17Xb~WJm~*0*rW|fo@}C2JGVjU01GUo9#z=qJw=pcz1wnPF`9<)kD43 z90zqPq`B!?A$7LJN#tENb_+^Fx1vzr(bLSE5|ZcfJJHpO>s!>CgvonpRIH22tEZrO z%HL_jZwf*LS1lFxiZOuowCZ)np}vAWYvxhsxb^9=uvn?d?~S(lm8N6Ol(nn34v z_0lIpku^<%By1`4pWRxL4l*ls zgOdLzD)xANR~rmg{~A7>1DiO>>%rN~0j~j7k_-X0>$LqO>7}0yiD_s>^7lsWDpQk< zBjTs#RDU1N)&ATAE&pjp$oD$YSv%%>b0v%0CIWbi{o3j!5dbb7i_H))z-t68aIi|~ zez~F8ueB%feg2%Zhv4Svj@*=RBJ&g5*Lxv-k%`Hk-ts7N@v`o7f5ZBT4!4=&BHCxC zkDCRPUZd5fvm&_yF~u(LhFDZoP_Rq3$K zY^PBYub+qxd_s$eH!OUwhSR2WGTo|#&(`jR5d;P_J0dj5_45a_7;9m+4RxX~0o|qd65S4koG@UrVU}ZD5I=Ho$EBn zkXe(d)GoN*bLOJB-Jed<^XF{gPFdorXVzka-de^EgkSO7O0BZ%{=mu-s+#q=)8-(< z4;S(-BDx8_L$R`JoBWCl5aOEbaVFT7Y7_DO$+Y8;ijIFbd%#~ntjor#5m?|NqDOgL zg8$d>WFBM(vIkje!-yJTMmv49fv+kpTjZqilJNyUERj zCb)KhEPAlf=7XXoG<{|Sm&x-EV<3*qr|Lr7R6@%1++gjynIgRxYw6`G<)6SfppZnG z%vx&^4uls1=WhR2Ub(|^o-8)qVK=LpdUPsq2EL|58i;rc zq|&-==b=0qFjhaePlwA|T@W$EG$+I38f zojE6IXxCAihoHT+N2Oj&ZA{mvw@Aqw+CPN2$(4?=9gkWuEpJ)e7~IVbBx|IGB=4S5 zz^i)R*1t}tg}Wn1z>4FZHS%Izdae-=HemUL0QjR@WIE~h7JwbOgm9ys4`0hDopw`$ zSb`&-J&72NQ9-ED;)q*V#|LgqP7LHcPv2Hd5^ z_61V-J%dMv*(hR%$Npu#havx%Af{ zVWmDYb!yyOg^G%nKNQ0nN!D$jVx;k}iI5M8p;7_6^B9Pg)UqtYD}hE|PYkvtkc zwba!CVicYAb!=NFeZ(=2c@4c?ydHi{92^>oX@wviyd<3_!m47Ei{wUT=q!3oX*-!4 znkGL_+!>wS(UIQtXWpL1Y%P~I)?&Gq-}x0?j<8y@VGqmSxvmmX`jACpG3DMQCldr2X^umgZXp~IyzT`XbzkFzo5 z@uZ$mLD83i{DC_@w!4(_%}MK*8eVNR#ramWuVx*LZUE$l?G@vU{A8_?)l< zwDPA#>o1IP@J6cz=F-^xJy6qYKie4G8aCTLS8I>177JI}lNtRSeqrb1@3OcAl>XoM zgjq{XT2WjsGN1Y7P6CLc7~*djGV@XBUjqg5xyc_NQ2^J9GS;k_Vx~ zZvM$2SK=r`E-uvBx}0G$RK{ASFhLQU_C~rUYuu z#8|1_o$}1@+GUls(^VTW^c^C|zw>?+G<1Me0$h1o6e5tzgtfbuJeLg*UQFl+1>W%} zu6}TGW$B|84K?0lkCV1==|@CBOv#y7VliFG9U*dY_LvjZ>cUK#CfaZ2!z(q57Lftc zDxS0Z0b&UwU_4Cw8y!(Qw*!3Tul%pvnxk;Z=$V0J7zRZSulj&SF>&`jw_4g{;kP>tdP)ZY`gmiM>e?n#M7 zDfzfI$s4^Pomr@~m%HWR$G7s(?&r-mVeN-6wu<#sg2Y&9EM)i0QO(E6faXi~0x5dZ zs0)PraNPco!$EtY=vN_VX3xw!#a8aC?meOr30;a9Tz4blU%l zM{cq}2~$?r8k@e^HMum38QS~&!25|sbxot_Ce7E0(|d>0~c~k{20_> zQ9N6lc{X_KhAbGX)53E0OnHm*7tqOEEl@gAK0g~>*KbJj&k_LEG-G8zIUh`rEQ)?t z978|H`+*Y|aXS2D(7!CJ6rSMR%t~ggDhIgHoXyN=2lTMCba*a}+C?CC%YOWY?xMM7 z#+x+Mix+<$@PaI5Xi`~yYTV)teirZ)j@xQ<)o7?!{QVlkUu}Qskixy?*)bK;nx|6Q0-*b?d6u3eJr_0w>$p{V#(#@DOydvR>YZDH^PlaTzG|l{&xy{ZM(fIU(4v&_= zCeiM?J}-pINu%ze>h5fbJDQ6cnbt97ZYd{!sLOrkJ|~WOT!n1GH?P%ob6+$E?MwkS z$wEsFtPv{lM^R?*dUwj>r6k@9O;Ts8BAV)BG; zAQ$UEUe*CYc3`%gy-?db7l_^|HgB)ceTn8}7?I1kuh5a|Z2>aZdfe@i$|M&jqnHE! z$94O+H@=#Zj(I4%7G^ojppv-`1Z8T8&gX-N1coZEX`M+1-cPsF+bTyJiT#m_2|CJB zWOkdi00ytcTCs36)Ga$A7*9D3l@zNWYIzvJOj*fdNHtI{pinwQE)}CU+I_Et+>G{9 zrI4TTnMxMTz{9pzsETk^E1mwice_zGktS`Zj~Y$f)T(IEcKlr`nYCT}fg%#iC&UP` zXYGoy#+&;KNsKL@gL$0>6h>O1=N1e(((E`a31Mw1XkN~K7#!%2$fcx^DAw8xT)#jm zLx^i;foh^Sp6wg4U={=E@5u`q>tU!+I=k48E*>G4A~DBR0XHuk{aAfgdS7V3d{;28pbu(P z%Jqo`XMDv&Ed;H10Sj*=Y8gsP9DbM%;}HVLr>`OcDTIL=-IPFNEL+cKB}O24p~k9x znXf`zC3s7NIp~!jvzT!oiclMHOFPa0st_64@kmBi#zuZ&;f{=jNrYfJ5|lTAA-r7y zL-K)EVI*r{d2OzwxSO(1-o`>8Hr{}6MXxD&b;tD`s+K=9E60i}ELC7N!-L#&M+fzl zsM@;A=(>yf$K(h_U)Z(f?dF{fD^!Ki}zL z2E9ry=HE^%r1r#6YTNy8?j!jN0CpY}<2=oV+CMKI#zy^`&h(o1bfgWuV04uaNn2n0 zpv=%6R9PS_gnB0`d^WYW+~R{wJPie3H{LiyZR#~liUaX@M1d8O#}{Ra5tHm@^a-?~ z*(ukQdbH)Go;@q#x8L7H-Z7~;&BxA}J~>muUTEHWu9q0_1&R?-&g*AZiMH6jWNPIe z(*>pZho1R+{GJ-7{4Z$yLteh}$AEe7{nRLwQp0mmoFi34qE{*ns7l|FkIQV*w#hxxT~>aS~*!@(3=<(loE$#?FPA8`{~YBX0oIk zH-4`pzMnmPc@#c9g_`iq6_~@M5^Jt~;p{URj~XHIh3Naw`eYQOE4w+*MtU z(v0}#XDnpW8AnTpT;u5%roKDYGia|Rq%XMk+o-!7))YfBgLFO9VY^deRKO0+^A|31 zPC24=vtv^S2SC`GRZU`{NkBSL@lcQ)Rvi=RkRT>>$J=W`%vb=06kLT4g~t*K?P3Er z5^oR@R3%AQ;%4deh%HlM8+nT@y)S0HOkqxmp1I`+uB^5BTV$mVa3x zW&Vc0z>zQI414?xL81pO>NiXG#msz#wgXoAB3n$%}ad1&UPK=4Ywkros)~oVVrm1dAFbFy+T^-UAq=_SV*r(6Ip{m^-x8I?lBY zwORn!BwXUN0sqU{h252Ez5t}ijvuYRMIm^AOlkc8+WYFbsGhIkyDTLlsDRQT4T>V& zi%JShhagHxgLI0!h@j%Kw7^nJH%NCkDqR8svV=%Vx9>&${_=U=_HQP%MLmJ&G-5D%h-Sa-(4@Dy6hd{jAFXWk`9e?8Hglq{eEjA4lFQs2l!KPe=e4y^WK78cU4lpQm^^>VLC>UHMDp65x*KX_f(b7GPL z+i#1HXia9lb=~c6zIe|g5%~VRj8d1WrW>sN>WP?1btxt*20Y2I&1uTV&$iuI$` z>gyf+0h^gpLD%VvukH2hOpM4MI!PBz&I@UkHnOE6w?%rXZG} zR?p>nw}|n@+(%#)rE?a!Z1p;G>rOOX5058LtTofZhg@R)ajjPkp6OkD)_$2ZR&uM| z7RkCWTVwr9SZuMbji#whgrk%hUb^2iN{GC9uPw)FP|D^F6;i8lHjYc;`6Dj8G$h8= zHj#iOI{&Kz51GKaZUL*V$vk-ssTOB8X&dT^{x&@(C++1-pP;HkIE zR*6?NpYIxuCwQezs+E~XaNLo*`2b!;6x|Wj@qK$@k!TywW*IWa;}L@!Qn6GMWPzmJpZ7EqCQoYTA;B zcVwJ>iZc>9U^Y*)mw!R4Sv(`bX3x1j-!5}K7td)KU6zy1$!Ko5YDVK+k|^5ML21bp zU~WT$A3wJcRRva>>chL4yreV;UMrB{!$a+fr9pYr=-shIiaGQz?LVBXmPj*nF27p@U1fHJb!dOquX6{;CZ4*wHwA$s%>y*X4@&pbC!Mhc#2xgw ztfi)9Wg#KTR2OKQFiEtUlkG*tl2>v750jmH9z*@Xp^NsH9ayO@DUOqd@}=3bqN!FD z0NqpLqy!QUPhA(;Ry$YyFaXSH4oU-CE7o@L)t$;P)ehEE5;OcG8o7s-m zc|JlW`&|!=qtKuLdpc)jC7L&HR>L|uf8-aYqiqco zqKqc$YJ2GxdBzqS>h5`OJzO-nxSh>x7o3^6JCTkTOp(00gYAQKE-4_us>U78i_k&z zwqH=942kud)Z~g`7OShD)Y*UwC(F;DQl$^ajdwzM3;J3rg!*aAb#FyU#J?*Kzk=4C z69E=C^JBExjW}~HEA6p|McgECu!#ZpTIh;Q)PSkPZ^L=f%!fOwgnYDicMqmy8 z1ny8B68$QyDTntv6a25*FuyawXRE>(Wq%B7tyJ48p?JakI-Z3DRW-rp=8B;;t`21{ zPgxaLG-$oq+YjbVrpF6UG6>W!y*2jUNp+MXteg<(x^gk`rCSar_$!YFAjc3Oh_sLT z(CMcVa3_97H!5M7_gRUAuP3E4b8J4%k!J8WrBe>6lk99ur|Ti?EeiIuDER_;#htc0 zeJK$SBt-l{o)?yOO_U!H+29|;MgfA%;zgahW{f+~5xaWzMmj7vR~{?6jJOfkL8XTv1K+OXl;3a`XmGrM{*ZK9r%_w^ zboFLkqp85EPVwz83F!E*+jVa^KIJGieOFWdR8ePMdBir&G9_;-|1nQC+iJ-Z*~TJZ zHyJa>_vA3>gh(%(6H~LJ93cZ~NxRb1KV3 zG2`)%pqP4)RLDmHiN{)2km(jB71{9sungB%*j0xD((%MZxJhxv}lq_`{G&)*|Z zocDvKQ?XKD)X#xo-n+MaGrnH47<)NaF5qXB(2HECtU%k-w6@y?_@NaK>75ZRbq~!x zzK%S2(DB{CcOgL}D$DTGQ|8WzYi6R$I*I_9mrVM7UH2Oj-~IG+d0ANeI+x=Ijmt6{si#->TA2<>z#JuK z;8mdi+?L%x`2jtB@&2E1Q~o1v*l*nD{)U^}UX%P7|NlI2tsi@{#9;l<{05aDwoLn) z5b}67Vk@K4Ff;YysgxN=sWImn=?rCx0zZLAMIc+4&e#Y>4(O7f zF^U@y>6m^E%-EDKE}g+UW8({%1#Xb59UxbK@!aE|c`jiCR@MH+HatZ0$uFkg|7WIy zgtPsf>3<{q@je)Jdr^2RM>gqj2P75pmlS>vT@&Q{ZyDJwZnS<0 z(tPH%|Ay`oM>@&Y)PT%J26@QzMFGE@KcdqDV}gGP7xC>k%~V~UA373Qe#CEd%}VT6 z>&tG=l3b#YQq*Yo{RYLr=;lT7lWNtJsqxvJ^ITBqNC?}Nt%nTd8(q9)$&?kFX=u*S z_v%U-;ryR&F#4Am1hd(7NR;erDX{@c%&uVW*BjrK6CQPvA`0OR>m(<5phUnzC@G=A zTs}HuS$G4kDM<%pxo@xXhJOsoDf_eSm3s=1eyP%bOc}H(8-Pya*V>v2vClbo)ch`DAzixRF z{l|9tXd{DOA93^;slmn3C9*FyNi|2qyi9Ma zy7dL23O?G@QRPFn}|Z+fh6sBvX*ox8}gv zVL9l_!1|hrA4W_#u+yZ6SjyJGKEq6dvubR@c0^D7S>RHMTPW0?73J%TTzXKQQ7%_q z>yXTfpVcL`PkjtqH5$yTaus7$-J&P%diG%CWdvV}kPLx5 zKvl+fi2?!10>WGFyHtY@+b9EBptm$X>-0D!s@|Wpa>y6tZx1qD2!5ZJnpGgv+Mgp- z^Hev&ftsx4cp=_{&=gN1NR%^?Xfq$5ONzYST2xF5oUozA!ZXmsg%^--p3q7xz9gd< zgBYa`ZfO-pl3y{sF^dsff{{%eB>Inpo<=@|c+n3O5W*M~o)19=JsnIK(wj?2MaL%1 zk={x3S_Vt}O^%#NC#+7*_il@x?%G-@#JLcqTEgDH90Oo){gC1z-f<86RtnU{S4=Te zPk0Qt#T0NA`?_oAGEnQ;K23*mL($Uqtv7ew*r5$lgq|H=4XfW*msSMHU_6y)5SN?c z3r3EswU5NOzJzg9g^-Qhp#7j(>E~yJawN~RNk{K=*~8m%C>X4pUW?Iu5^R)RR<4bI zPCtawLK$0x(rZCC~$X7wbIKf{-CdymY(B zTg*fy)sd)yTvI>DLZqcN{tTHF_1ns9{5i5%!Hu5)_apx8WMq&c15)aTDm4Q_8757% zIVo)0&?jkt@hz22x=AycwnLT2-u*;Vvhx*~hBNbZzS%qK)E8Frvy>;ZYBDD_Ga*6( z9v(cHQacjI=aJLtvL>LW1LOb3T_w>SHU>!;o}5x*$zi=}1x)OT+>%v9dbXhW8)LR!QEf5pfMS*PS{ouP1@o*c)O^>j^w*u^P$@m z`q`VW_XB7Sk}iZzClZS>?vxtmnQ@o)u<8!Z4;El(+>_R-H>q`m zZVbz6KLNiQPyZvxmVi_q!6yg0YJpD9%uy=#8mZc%o+_jKDCR@WN$UjgQ}xUM^XxXi zOr4!aV{gO3s>c3{sSZP>oA#est6ZvLFLJ0k!e;gsib^!A`rWw3W-_!W^Fol_j!ue% zYMfM6JqGK8-4RU5Em9{)|J$+djWb6X>n;X=Xo+$1>mY_N>EXvsoFVvim%y$bnYmWy+P?KD1p|I_-udSn7Ywl=GaRqpz}W zDv7aI(`K}yTa=0iPCtHPR*c?{MT_|IrVng?;^Cs5<%&(AJ_vdOTi+4t6;m8$b3Wx8 zzBas|Dumx)ah-~?ysdG~Hm+e{bu|+`)$ZGm+e2kiOD!w<Pz zw%xzJ2u9f3_5#@lx%a+w_RaHAbYt$FE?tWuqUtl}AYOvETY(pu$*ds6X;>&m+SHK? z;x1$mG%-I3hUpuWR-nD`LgD&ciww5zUvI4X-G73|ax7hcx-q+bEyz?cwONS4*Sr&4#=Ayw^O@b$dCMig2eibZg13&3`tTCTDPyE6Gx)t}O9)y> z`K0f*39fvcGfaFOJvW2HE~U<3>Xp?I=DNl|NjeZ#!HQNh@R!YTwAS|@L?uQd zb$1+2Bd@J@PUa%j1WE5G0hWG!n#mJkNN4^}cyv42DI7FZuUT0o57iqn9M%j)I~mG( zg+ZZ$+q2nSO`KsXw%DNKHTzdQb?4}Zic-oO+@N>R=g4w9p&Qf%@LAo;&}b=f=y<$( zEb*MCW&AL5=K14i+i6-`WCAdf$#57LL#`AOoevNtZKP|&Z#ohHs@6pDi%#RI+4+jw zkHzZM_+2_V!!)PL&wqaSZFa*KyRrIlmA7p9qVb|Al%^Z4V9*xb9DV0YTE#n>^59lW z{E)3>BZpUJ7@?#1iew6H-lFzB6bQY z?%%(^Dsv*3&^?BRjWw?D7DOcmQmDKz3>+}WOk#aoMPlG^nI2vR)oPK84T;)bcX=y! zz_hf>xoU=&cO~rcng^s7}<8v0RknIj@L-!pBO-1g^pHu%e?J##X?UXY>4(6IB-Fhw{8(pGnU3ZH~P%r zgaW~zuOFJP;aWDh^lhsw?xPW9$bp3#CzxtsRh2jVOOVG!sTzXk^~1CdHv$@^>$v%Y znd2k6KH)nh4gqzQOu^DK^3+}``c(KoP)y2zLm!!lQ;4!}?HxVl@=4M~%22w)8+jgj z_vr^8UYY>QyfVBCu_*otq^WX;L_ysJzS&yk#;A_9{m>0#Pm0fWqZ;D!;3m2N7SNzw zV2({b2z42h%3-fc6S}wV!^*5FN+d~Zt42pZ6PWHa7EZUQL^v4s&DKZE|~Qg7^ua-9t$-v^0w0+ie3XkB3&EvEUTQnsUGXU zo1?}(T*noLySJ!lJ48BM&{Uj| z>u#|HBwP2QpX!sY8Fl=ioYb2KT5OH;R*)ZCejQcW=}wzi2guyuC5KVxuYFV+eZx_e z0>UG6B;V85+S_jrN3D_V(%=}RvL@#JHrF`&w0vHysIs@n5|1ks!lNRtuX7-3;)7x< ziZqNActs*OPSZVmZL++?L_5k%1QekFe`#W@^w6tu?E7VTr?6$%IgG|={2+A|C0Mr7 z28lKIz{ZhUSg?hw3ib&GEKjBJnG+Yd1dP`YK^T3^Q2kAk7D$TBfrOeqP3o!oQi7Qz zWqh8aMaH3(#q1tY(4phkXiS&>z%it6JKOj=T%FM=1isz%^np=1Elk$Qaf^%0XNZJM z0EIrtH3V=0>JY~L48NwGWf+m%B5E7Ec&H8*0g!MM2r;lVlOzE&C0te&>pZb!xlIvE zZ&(Y`BB(m_i^4Cs_IF25xhLCb_DqctC!hivo%b}{uYLSzkDHrS`!-m=B>Jx?7;Hc7^zR{%x^?#I?>nd(D|yBoMqFWm!mh@ ziMosGW+1kzuAYaU&76P@m(*TbvRHI=4<1NC?}0aV|CT?qALH{qDudHCBk|2y)zx|t zv37{D>}lnp?%=*6diR!{L;j9+rU;$p*V5hNy0RZ6~9YN7=b&MdX zam7PY!{Jt^+JM^UVE)*>kvuFRDfs1jdRqPT9~9np6x z1T`+#wr5HZlWY6@M(Bn*PekLx9~c#LP3o9*J10~hkm}S3Zo`!c8PxFNwdgBoXefcC z7G;1nX#k0rYPGX2Pe@2EwFP=r#nGj?r6;Rjz-)lQH@YA34F)$Bj-sO+79?Ivo8Fc8 zYHDf|D!M%R%!AuKg(ihDX!1v!PGza*tYyfJOQNEy-~p}yW$%Z^rq!^iwD2i?Gqln* z*9U|ev5s_;-UD2LiMMm$GXhPI4G0AnqTMNx#A2P;d%MxWPp@^RE^3AP@}~H=UAj+y zKkF{5q#dybi90nJUSvbx;4?5DOBQ*>j?+$;=ssei=p-8L91Kw*3Ha3$&RVqu@e@4zjY zC>B}`k{T-D!P)%S`}g@#WL1jm6}&%Y>u9m@n0K*j9RmXkGVw6ZUlS_?LgsVq-IY3* z@4&8gKM@V9+|G5+d)+86BD0zNLYyELGjUmr?MIN2fTG@vei7bjBi-lzvf0OM$MA;1*f!c4|Iw9{m!77w*VKofLeN8jHWGFn|OTjh~E& zV(~wTp|t@Q#k<~pbzWGa=Yq*&P8gV|vYzw~qqFKcpbCF0-q)JnUxlDaikl9=fxdQd z&(vE+51K`ggL)oZ`gH#DiVr)s99x~*bVk?Ab;7Scn^nKcKqzq6{@%61YwzOh1#$j@{?YwvYx0+ zQ1ASJu=v$h?Ua)1T5DF6K;(K&sDdC8CND5~DM)lL1M&ha1wqkK#~6c!pcP<5Wjx0n zfHPRVg`9}eeGf~}0UmB#25^$}7#OE)4;Q@;i7}K~3Un)|13u1V^41cX5b%I=xj(F? zo*QWl*-3Was*xT`!^;Nfv&5)rR+aq5kZqbZt>i%l`+tpQCRqzX(%x=r8 z4=rH{;sfOp7NNj5tC^%|DQ*-z(oM1t(#C_TFaa~{yV!{~J$=62EV{bfge3}?tRfl@ z(}-K+7Tu;v^~L8K4fbo{UTx=DiQX!|Ja-W1$-HyC^u2;YDO~@dAzSwv@uH|uL;6Gg z-rQSd>enLYS{DhPzpB%=yN6Pvcwjg_T~)%_-9wU?W6PZuhST;i&2G+?l8(APSy_`@ zIkVGa?aAubxt>@W1h~Iv4O`pJhe}s2APKtG z#68lwq`=d+jpE>@QR(1GZOh|XB%c-Tl%rg<^W+fm?M{R2b%ixnF!P8eRQ{5l=@RUU z7MNIE;4HCtUP`ty7j&_AysX^XfQ4!6^RL_^bxD#Dn(gP7sN4<^S+0Ka;o=f=HHnzi&ZlwW#`lW#Av2yl{#rNw5_rlUl(KyORAAURY z#rQ>fjF`^MoExhkFd47eg*r|PTjM$p!RO-4v=MRog!lfk(~>-{w+>=LH)a~TH5J3J zS7s1spP5Oe;m)2ibo-SUr{5@*g@RFBHTj~^xo_tEa3%Q0eV{Jjyr&ou(KHqPc$A3& zjD^u;JyePZmEW+D9bfu>raEkoF)`8{&q*H>z$pk+rm__XzzChYI#t4`i`B6G2~qsof8hI-vP{j*jQr01mikI?eGnh`_SK#tvvII1HIuJ^+QXQj+dr z&x?@s=Uf_Okj?jHT;M8a3wuKvf6J`R`l`hfc2~DYT;aWH{VTy~{mNU@8 zo#!y?HQD(Z#>qvQblaBDEM76U=NE=ndkf&ER%<>?8pZw5=)Vk<~U|^97p7#qf^^0 zie)$(<#=w7vnn$!jL1K1S>f&kSjkR@&ry8STA&S}#WcxXV=2Lrp)I*zPx}^SNT7 zvk^x>H>jQUG>(nwnL5xU?+Eu%k70W;A-kAi1zbRLIgpXt0Qy5!#C1xIfLp;)%N5~q z2c@VBt^Nct#%646oDd^hxWIl~`wTd4>zx_<;mUL}R0ggKvxK=Sn8; zi=J#nvnET~aLD6Bd%R6U`voqf<6QM8NpG2S2|e;dvN_#vpE|(e-S(@0w%TE1MNa|K zC%B1&1xR`iq?ABQE$K0Y5TmP}oiy#%b)H~S>6kVt?IOVV2L^EMWOc^A!grL-93NM5 zI?csDq)_Fv$N%!$h}1!6D3B=By0JRpyP|Yy-Uw1a($@#$T*BubZ*JU2kWY7dXXGB! zfy1xWjqRn=kh99};0(i}cMW@<_w2$?n=CVyq&O&(3ro(szdln_cy-@MPqpQ-flM4N zMKG?iFkTT1HpxwOpzPnknj=tk@56b z80l&AuuD&z*H7TN;W2lM+%WjP3AJB9EWbqr0AjAe4-p^5H^>iXr@z9*9SYvICwZ%# zI6d7+H)e@Y91(FiB3RHjp1rbkplx|~X!l3vBVWlg6z?yUs%iljg!iO=0?yN4l}_H| zSf0vOB<;;NG$SdkFj+F2WVJtmh8w4p>nlcj4l*TA1(xS3_SNw&P-rinvXB0H(?7)~ zY5TADfLHg1eXM_jh_tH4g04IJ>63$}8(835b#A#Kyms%T1rcx|`MXKwV4-3!O#q1M zqLp{%3G}JV`UgY+ci+w(LcxiqpMag=F&A*!I_$IbcW{3n&>&l^V1hbG_SWff#lCj9 zwLu&g)91a0z4@vWUb$0^v>61Kdyh7!ziK$Qmj~xER=X{p z4J%EYF?SmNhse0ffvZOp+Bk9hUw!GPEyLtccx~?)E7SO8iiA`UoxUU&a*Ek?HhTML|_{x53|BxJ6$rodX8KF;6s0k>2QCQgl^SFPHx# ze=h3W6q{ExgN0y#-$M|JIA3n>@%@5!uh}adn`ta$Z*%tkfZ^O_%>4<#eiIG@`h`^J zmque(B+o{om12_??mE%id@&9FgmQPUPQG zOQ-!s*TgS@!pLa(GSMIUN@Q#ef&0S{?X;zH3IwZ z*9WQYYHvtq6SNk|m-K|j6K=ll9mvnk4ZCV-cCJ)PhdS4~B9@3~544z(ez&`Ws=qah ziZCEfhRjBfiC6z&@(%y4(sOAS2E8i zqx@Nkm!?#8_9p4nWXtY^gxFlz3KK9uL zSqmyg4jG~ZjLQVA4GUO#7Z4raUl*GT;cjRy9NWLIU#G6yqbPp|ye)Y}ChWvXJL-#H zRN*s`+;OG(`UK~WEOXR*lLLgb4OPDzTw&LK8h0KMz>$wVe-fOtDD$}@ak>h$;-7%& z_taC9iul83(Bwcp$|67Z|7|c_{caA3StHNeVyz(Wk>KR1V*FBtb9}@jBe&=tPM6bc8 zYA3}eC)@xi4L#5tf4!F|D5Z${30O|~_=AK4B1aTDoJ8;%rd?3=LspEmk_QWVGk?t( zgI3<5&aCh2o^;?hwj639iiFe-iHyK+#u;j3&fR}7P-Q_Qa9D*Pac8qcCDO_}19sY5 z(*-7}ywR})kG?b18bj;*S*G=#s{i(E*jW?S;#y2(cesx8_3W7$^JM+9>}ycG-g75;uLKlsIMg-5M!1x~eeSz;X2 zmH=7ErQXc~?>9;qxl+ygjh=kF$+5}Kmm6IahyWOdFDFT6*XT3wBgU|BUSG(<3i)k3 zwWJo~yN2s*z0j3$fn1vt`bT7;B;y>p(`q%Gr5I(&ej z4lbNh_O95Qec)#h-pFtXVQFX%Tw6Q$K>vZDl$z(QCB1I`PAmPb19c2xL2rAUx4`5C z$OD>*W8Qu1{N+UU63kk+t&#XS-3L!%-PeFcuwH#($&Eo9E`~sE;<}5uV8)W-Ixg(F zM_4BqRT`BhScjS2AoaR3;w6}zO;b_tDEC0en&t5tIJ+}@p0%`9Nx&T**hv$BsFvX| z`Sk?USk4-1%m}at@Zvq`KhT&f+*6o`5rsB-?{to4%agjbCjL6y1M=3M^sv2i4y||2yh`Ma2b1V*CrL ze{KI4RQ>m;{)ReE?*9WS!hU5iuS2QUiy**LLz4&9ho3_LN2=rZqivc=fCK^+FhbUV J3;Of({{m`GER+BM literal 476634 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%0A9w5lIlUpK8D2x{z41==y5=&)St9h$`W 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℞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

sWmmZ@ekA-Ypd~GK6mX` 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 diff --git a/README.md b/README.md index 4de5512bb..f013ed92d 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ [![Join the chat at https://gitter.im/MethaneKit/community](https://badges.gitter.im/MethaneKit/community.svg)](https://gitter.im/MethaneKit/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) **Easy to use modern 3D graphics abstraction API in C++17 for cross-platform applications development:** -- **Built on top of modern native 3D graphics APIs**: DirectX 12 on Windows and Metal on MacOS. +- **Built on top of modern native 3D graphics APIs**: DirectX 12 on Windows and Metal on MacOS, Vulkan on Linux will be enabled soon. - **Simplifies modern graphics programming** with object-oriented graphics API inspired by simplicity of Apple's Metal. - **Provides cross-platform application infrastructure** from CMake-based toolchain to application and user input classes. -Click **"Open in Gitpod" button** above to explore Methane Kit codebase right away in a familiar VSCode-like IDE environment in your web-browser with navigation by symbols and even Linux build in cloud. +Click **"Open in Gitpod" button** above to explore Methane Kit codebase right away in a familiar VSCode-like IDE environment in your web-browser with navigation by symbols and even cloud-build. | Platform | Master Build Status | Develop Build Status | | ---------------- | --------------------- | --------------------- | @@ -37,6 +37,7 @@ Click **"Open in Gitpod" button** above to explore Methane Kit codebase right aw 1. [Fetch Sources](#fetch-sources) 1. [Windows Build](#windows-build) 1. [MacOS Build](#macos-build) + 1. [Linux Build](#linux-build) 1. [Demo Applications](#demo-applications) 1. [Tutorials](#tutorials) 1. [Hello Triangle](#hello-triangle) @@ -387,32 +388,37 @@ Now you have all in one application executable/bundle running on Windows/MacOS, [Full source code](/Apps/Samples/Asteroids) -Asteroids sample demontstrates multi-threaded rendering of large number of heterogenous objects with [ParallelRenderCommandList](/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h). Thousands of unique asteroid instances (1000-50000) are drawn with individual Draw-calls in parallel with a random combination of: +Asteroids sample demontstrates multi-threaded rendering of large number of heterogenous objects with [ParallelRenderCommandList](/Modules/Graphics/Core/Include/Methane/Graphics/ParallelRenderCommandList.h). +Thousands of unique asteroid instances (1000-50000) are drawn with individual Draw-calls in parallel with a random combination of: - random-generated mesh (from array of up to 1000 unique meshes) - random generated perlin-noise array texture each with 3 projections (from array of up to 50 unique textures) -- randome combination of coloring (from 2x6x6 combinations) +- random combination of coloring (from 72 color combinations) -Default parameters of asteroids simulation are selected depending on CPU HW cores count and can be displayed by **[F2]** key. -Overall complexity can be reduced / increased by pressing **<[>** / **<]>** keys. +Default parameters of asteroids simulation are selected depending on CPU HW cores count and can be displayed by `F2` key. +Overall complexity can be reduced / increased by pressing `[` / `]` keys. Sample renders galaxy background using [SkyBox](Modules/Graphics/Extensions/Include/Methane/Graphics/SkyBox.h) -Methane graphics extension and planet using generated [Sphere mesh](/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h) with spheric texture coordinates. -It also demonstrates interactive [Arc-Ball camera](/Modules/Graphics/Helpers/Include/Methane/Graphics/ArcBallCamera.h) rotated with mouse and light rotated with , keyboard keys can be seen by pressing **[F1]** key. +graphics extension and planet using generated [Sphere mesh](/Modules/Graphics/Helpers/Include/Methane/Graphics/Mesh.h) with spheric texture coordinates. +It also uses interactive [Arc-Ball camera](/Modules/Graphics/Helpers/Include/Methane/Graphics/ArcBallCamera.h) +rotated with mouse `LMB` and light rotated with `RMB` with keyboard shotcuts also available by pressing `F1` key. Sample includes the following optimizations and features: -- Asteroid meshes use dynamically selected LODs depending on estimated screen size. -This allows to greatly reduce GPU overhead. Use **[L]** key to enable LODs coloring and **[']** / **[;]** keys to increase / reduce overall LOD level and mesh detalization. -- Parallel rendering of asteroids array with individual draw-calls allows to be less CPU bound. -Multi-threading can be switched off for comparing with single-threaded rendering by pressing **[P]** key. -- All asteroid textures are bound to program uniform all at once as an array of textures to minimize number of program binding calls between draws. +- Asteroid meshes use **dynamically selected LODs** depending on estimated screen size. +This allows to greatly reduce GPU overhead. Use `L` key to enable LODs coloring and `'` / `;` keys to increase / reduce overall LOD level and mesh detalization. +- **Parallel rendering** of asteroids array with individual draw-calls allows to be less CPU bound. +Multi-threading can be switched off for comparing with single-threaded rendering by pressing `P` key. +- All asteroid textures are bound to program uniform all at once as an **array of textures** to minimize number of program binding calls between draws. Particular texture is selected on each draw call using index parameter in constants buffer. Note that each asteroid texture is a texture 2d array itself with 3 mip-mapped textures used for triplanar projection. -- Inverted depth buffer (with values from 1 in foreground to 0 in background and greater-or-equal compare function) is used to minimize frame buffer overdrawing by rendering in order from foreground to background: asteroids array with planet are drawen first and sky-box afterwards. +- **Inverted depth buffer** (with values from 1 in foreground to 0 in background and greater-or-equal compare function) +is used to minimize frame buffer overdrawing by rendering in order from foreground to background: asteroids array with planet +are drawen first and sky-box afterwards. -Methane Asteroids sample was inspired by [Intel Asteroids D3D12](https://github.com/GameTechDev/asteroids_d3d12), but the whole implementation was re-written from scratch. +Methane Asteroids sample was inspired by [Intel Asteroids D3D12](https://github.com/GameTechDev/asteroids_d3d12), +but the whole implementation was re-written from scratch using Methane Kit in cross-platform style. ## Development Tools -Supported development environments: +**Supported development environments**: - Microsoft Visual Studio 2017-2019 - Solutions and projects build (generate with [Build.bat](/Build/Windows/Build.bat)) - Ninja build with CMake native support (pre-configured with [CMakeSettings.json](/CMakeSettings.json)) From 3c706ecd87b04f7681433b44fa381975d90bed29 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 15 Jan 2020 20:35:29 +0300 Subject: [PATCH 121/129] Improved mesh buffers texture setup and naming. --- Apps/Samples/Asteroids/Asteroid.cpp | 2 +- Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 ++ Apps/Samples/Asteroids/Planet.cpp | 2 +- Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp | 4 ++-- .../Include/Methane/Graphics/MeshBuffers.hpp | 18 +++++++++++++----- .../Sources/Methane/Graphics/SkyBox.cpp | 2 +- 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Apps/Samples/Asteroids/Asteroid.cpp b/Apps/Samples/Asteroids/Asteroid.cpp index 4abd621b0..65e6b0906 100644 --- a/Apps/Samples/Asteroids/Asteroid.cpp +++ b/Apps/Samples/Asteroids/Asteroid.cpp @@ -105,7 +105,7 @@ Asteroid::Asteroid(gfx::Context& context) { ITT_FUNCTION_TASK(); - SetSubsetTexture(GenerateTextureArray(context, gfx::Dimensions(256, 256), 1, true, TextureNoiseParameters()), 0); + SetTexture(GenerateTextureArray(context, gfx::Dimensions(256, 256), 1, true, TextureNoiseParameters())); } gfx::Texture::Ptr Asteroid::GenerateTextureArray(gfx::Context& context, const gfx::Dimensions& dimensions, uint32_t array_size, bool mipmapped, diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 3c9bb9c3a..2cea98e65 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -258,11 +258,13 @@ AsteroidsArray::AsteroidsArray(gfx::Context& context, Settings settings, Content SetInstanceCount(m_settings.instance_count); // Create texture arrays initialized with sub-resources data + uint32_t texture_index = 0u; m_unique_textures.reserve(m_settings.textures_count); for(const gfx::Resource::SubResources& texture_subresources : m_sp_content_state->texture_array_subresources) { m_unique_textures.emplace_back(gfx::Texture::CreateImage(context, m_settings.texture_dimensions, static_cast(texture_subresources.size()), gfx::PixelFormat::RGBA8Unorm, true)); m_unique_textures.back()->SetData(texture_subresources); + m_unique_textures.back()->SetName("Asteroid Texture " + std::to_string(texture_index++)); } // Distribute textures between unique mesh subsets diff --git a/Apps/Samples/Asteroids/Planet.cpp b/Apps/Samples/Asteroids/Planet.cpp index 6fb3da271..25d308045 100644 --- a/Apps/Samples/Asteroids/Planet.cpp +++ b/Apps/Samples/Asteroids/Planet.cpp @@ -80,7 +80,7 @@ Planet::Planet(gfx::Context& context, gfx::ImageLoader& image_loader, const Sett m_sp_state = gfx::RenderState::Create(context, state_settings); m_sp_state->SetName("Planet Render State"); - m_mesh_buffers.SetSubsetTexture(image_loader.LoadImageToTexture2D(m_context, m_settings.texture_path, m_settings.mipmapped)); + m_mesh_buffers.SetTexture(image_loader.LoadImageToTexture2D(m_context, m_settings.texture_path, m_settings.mipmapped)); m_sp_texture_sampler = gfx::Sampler::Create(context, { { gfx::Sampler::Filter::MinMag::Linear }, diff --git a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp index f627fd371..266c7deac 100644 --- a/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp +++ b/Apps/Tutorials/03-ShadowCube/ShadowCubeApp.cpp @@ -99,10 +99,10 @@ void ShadowCubeApp::Init() // Load textures, vertex and index buffers for cube and floor meshes m_sp_cube_buffers = std::make_unique(*m_sp_context, m_cube_mesh, "Cube"); - m_sp_cube_buffers->SetSubsetTexture(m_image_loader.LoadImageToTexture2D(*m_sp_context, "Textures/MethaneBubbles.jpg", true)); + m_sp_cube_buffers->SetTexture(m_image_loader.LoadImageToTexture2D(*m_sp_context, "Textures/MethaneBubbles.jpg", true)); m_sp_floor_buffers = std::make_unique(*m_sp_context, m_floor_mesh, "Floor"); - m_sp_floor_buffers->SetSubsetTexture(m_image_loader.LoadImageToTexture2D(*m_sp_context, "Textures/MarbleWhite.jpg", true)); + m_sp_floor_buffers->SetTexture(m_image_loader.LoadImageToTexture2D(*m_sp_context, "Textures/MarbleWhite.jpg", true)); m_view_camera.Resize(static_cast(context_settings.frame_size.width), static_cast(context_settings.frame_size.height)); diff --git a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp index 09e963442..25b4fe3c4 100644 --- a/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp +++ b/Modules/Graphics/Extensions/Include/Methane/Graphics/MeshBuffers.hpp @@ -287,18 +287,26 @@ class TexturedMeshBuffers : public MeshBuffers const uint32_t subset_index = this->GetSubsetByInstanceIndex(instance_index); return GetSubsetTexturePtr(subset_index); } - - void SetSubsetTexture(const Texture::Ptr& sp_texture, uint32_t subset_index = 0) + + void SetTexture(const Texture::Ptr& sp_texture) { ITT_FUNCTION_TASK(); - if (subset_index >= MeshBuffers::GetSubsetsCount()) - throw std::invalid_argument("Subset index is out of bounds."); - + SetSubsetTexture(sp_texture, 0u); + if (sp_texture) { sp_texture->SetName(MeshBuffers::GetMeshName() + " Texture"); } + } + + void SetSubsetTexture(const Texture::Ptr& sp_texture, uint32_t subset_index) + { + ITT_FUNCTION_TASK(); + + if (subset_index >= MeshBuffers::GetSubsetsCount()) + throw std::invalid_argument("Subset index is out of bounds."); + m_subset_textures[subset_index] = sp_texture; } diff --git a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp index 8d84cc8da..6017eb244 100644 --- a/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp +++ b/Modules/Graphics/Extensions/Sources/Methane/Graphics/SkyBox.cpp @@ -47,7 +47,7 @@ SkyBox::SkyBox(Context& context, ImageLoader& image_loader, const Settings& sett { ITT_FUNCTION_TASK(); - m_mesh_buffers.SetSubsetTexture(image_loader.LoadImagesToTextureCube(m_context, m_settings.face_resources, m_settings.mipmapped)); + m_mesh_buffers.SetTexture(image_loader.LoadImagesToTextureCube(m_context, m_settings.face_resources, m_settings.mipmapped)); const Context::Settings& context_settings = context.GetSettings(); From b9211007ba2cf7a4b53f24c6f02094110ca12384 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 15 Jan 2020 20:56:50 +0300 Subject: [PATCH 122/129] Program derived from Object interface with name handling --- .../Core/Include/Methane/Graphics/Program.h | 5 ++--- .../Methane/Graphics/DirectX12/ProgramDX.cpp | 14 +++++++++++--- .../Sources/Methane/Graphics/DirectX12/ProgramDX.h | 8 +++++--- .../Core/Sources/Methane/Graphics/ProgramBase.cpp | 6 +++--- .../Core/Sources/Methane/Graphics/ProgramBase.h | 4 +--- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Modules/Graphics/Core/Include/Methane/Graphics/Program.h b/Modules/Graphics/Core/Include/Methane/Graphics/Program.h index 016e7b587..b528b9b6c 100644 --- a/Modules/Graphics/Core/Include/Methane/Graphics/Program.h +++ b/Modules/Graphics/Core/Include/Methane/Graphics/Program.h @@ -25,6 +25,7 @@ pipeline via state object and used to create resource binding objects. #pragma once #include "Shader.h" +#include "Object.h" #include "Types.h" #include @@ -41,7 +42,7 @@ namespace Methane::Graphics struct Context; struct CommandList; -struct Program +struct Program : virtual Object { using Ptr = std::shared_ptr; @@ -136,8 +137,6 @@ struct Program // Program interface virtual const Settings& GetSettings() const = 0; - virtual void SetName(const std::string& name) = 0; - virtual const std::string& GetName() const = 0; virtual const Shader::Types& GetShaderTypes() const = 0; virtual const Shader::Ptr& GetShader(Shader::Type shader_type) const = 0; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp index 12e471ff6..05b831313 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.cpp @@ -42,7 +42,6 @@ DirectX 12 implementation of the program interface. #include #include #include -#include "../ResourceBase.h" namespace Methane::Graphics { @@ -334,6 +333,16 @@ ProgramDX::ProgramDX(ContextBase& context, const Settings& settings) InitRootSignature(); } +void ProgramDX::SetName(const std::string& name) +{ + ITT_FUNCTION_TASK(); + + ObjectBase::SetName(name); + + assert(!!m_cp_root_signature); + m_cp_root_signature->SetName(nowide::widen(name).c_str()); +} + void ProgramDX::InitRootSignature() { ITT_FUNCTION_TASK(); @@ -407,8 +416,7 @@ void ProgramDX::InitRootSignature() wrl::ComPtr root_signature_blob; wrl::ComPtr error_blob; ThrowIfFailed(D3DX12SerializeVersionedRootSignature(&root_signature_desc, feature_data.HighestVersion, &root_signature_blob, &error_blob), error_blob); - ThrowIfFailed(GetContextDX().GetDeviceDX().GetNativeDevice()->CreateRootSignature(0, root_signature_blob->GetBufferPointer(), root_signature_blob->GetBufferSize(), IID_PPV_ARGS(&m_dx_root_signature))); - m_dx_root_signature->SetName(nowide::widen(m_name + " root signature").c_str()); + ThrowIfFailed(GetContextDX().GetDeviceDX().GetNativeDevice()->CreateRootSignature(0, root_signature_blob->GetBufferPointer(), root_signature_blob->GetBufferSize(), IID_PPV_ARGS(&m_cp_root_signature))); } ContextDX& ProgramDX::GetContextDX() noexcept diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h index 08e3966e9..c30612245 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/ProgramDX.h @@ -29,7 +29,6 @@ DirectX 12 implementation of the program interface. #include #include -#include #include @@ -64,10 +63,13 @@ class ProgramDX final : public ProgramBase ProgramDX(ContextBase& context, const Settings& settings); + // Object interface + void SetName(const std::string& name) override; + ShaderDX& GetVertexShaderDX() noexcept; ShaderDX& GetPixelShaderDX() noexcept; - const wrl::ComPtr& GetNativeRootSignature() const { return m_dx_root_signature; } + const wrl::ComPtr& GetNativeRootSignature() const { return m_cp_root_signature; } D3D12_INPUT_LAYOUT_DESC GetNativeInputLayoutDesc() const noexcept; protected: @@ -76,7 +78,7 @@ class ProgramDX final : public ProgramBase ContextDX& GetContextDX() noexcept; const ContextDX& GetContextDX() const noexcept; - wrl::ComPtr m_dx_root_signature; + wrl::ComPtr m_cp_root_signature; std::vector m_dx_input_layout; }; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp index 03449a21f..ade8f919f 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.cpp @@ -437,7 +437,7 @@ Shader& ProgramBase::GetShaderRef(Shader::Type shader_type) const Shader::Ptr& sp_shader = GetShader(shader_type); if (!sp_shader) { - throw std::runtime_error(Shader::GetTypeName(shader_type) + "shader was not found in program \"" + m_name + "\"."); + throw std::runtime_error(Shader::GetTypeName(shader_type) + "shader was not found in program \"" + GetName() + "\"."); } return *sp_shader; } @@ -458,7 +458,7 @@ uint32_t ProgramBase::GetInputBufferIndexByArgumentName(const std::string& argum return static_cast(buffer_index); } - throw std::runtime_error("Input argument \"" + argument_name + "\" was not found for program \"" + m_name + "\""); + throw std::runtime_error("Input argument \"" + argument_name + "\" was not found for program \"" + GetName() + "\""); } uint32_t ProgramBase::GetInputBufferIndexByArgumentSemantic(const std::string& argument_semantic) const @@ -477,7 +477,7 @@ uint32_t ProgramBase::GetInputBufferIndexByArgumentSemantic(const std::string& a return static_cast(buffer_index); } - throw std::runtime_error("Input argument with semantic \"" + argument_semantic + "\" was not found for program \"" + m_name + "\""); + throw std::runtime_error("Input argument with semantic \"" + argument_semantic + "\" was not found for program \"" + GetName() + "\""); } } // namespace Methane::Graphics diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h index ca099a97a..f2b76aa13 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/ProgramBase.h @@ -41,6 +41,7 @@ class CommandListBase; class ProgramBase : public Program + , public ObjectBase , public std::enable_shared_from_this { friend class ShaderBase; @@ -87,8 +88,6 @@ class ProgramBase // Program interface const Settings& GetSettings() const override { return m_settings; } - void SetName(const std::string& name) override { m_name = name; } - const std::string& GetName() const override { return m_name; } const Shader::Types& GetShaderTypes() const override { return m_shader_types; } const Shader::Ptr& GetShader(Shader::Type shader_type) const override { return m_shaders_by_type[static_cast(shader_type)]; } @@ -120,7 +119,6 @@ class ProgramBase const ShadersByType m_shaders_by_type; const Shader::Types m_shader_types; ResourceBindingByArgument m_resource_binding_by_argument; - std::string m_name; DescriptorRangeByHeapType m_constant_descriptor_range_by_heap_type; std::mutex m_constant_descriptor_ranges_reservation_mutex; }; From db33c0d272d3fd3a7ec0b5d22ad782ad83d9c17a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 15 Jan 2020 22:23:23 +0300 Subject: [PATCH 123/129] Windows-friendly file version generation for application files metadata --- CMake/MethaneApplications.cmake | 2 +- CMake/MethaneUtils.cmake | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CMake/MethaneApplications.cmake b/CMake/MethaneApplications.cmake index 4d42a6fc9..aa5829f66 100644 --- a/CMake/MethaneApplications.cmake +++ b/CMake/MethaneApplications.cmake @@ -31,7 +31,7 @@ function(add_methane_application TARGET SOURCES RESOURCES_DIR INSTALL_DIR APP_NA set(METHANE_APP_DESCRIPTION ${DESCRIPTION}) set(METHANE_APP_COPYRIGHT ${COPYRIGHT}) set(METHANE_APP_SHORT_VERSION ${VERSION}) - set(METHANE_APP_LONG_VERSION "${VERSION}.${BUILD_NUMBER}") + get_full_file_version(${VERSION} ${BUILD_NUMBER} METHANE_APP_LONG_VERSION) if (WIN32) diff --git a/CMake/MethaneUtils.cmake b/CMake/MethaneUtils.cmake index 02029811d..cc996c25f 100644 --- a/CMake/MethaneUtils.cmake +++ b/CMake/MethaneUtils.cmake @@ -63,3 +63,17 @@ function(get_file_name FILE_PATH OUT_FILE_NAME) string(REGEX MATCH "[^/\\]+$" FILE_NAME ${FILE_PATH_NO_EXT}) set(${OUT_FILE_NAME} ${FILE_NAME} PARENT_SCOPE) endfunction() + +function(get_full_file_version MAJOR_MINOR_VERSION BUILD_NUMBER OUT_FULL_VERSION) + string(REPLACE "." "" BUILD_NUMBER_WITHOUT_DOTS ${BUILD_NUMBER}) + string(LENGTH "${BUILD_NUMBER_WITHOUT_DOTS}" BUILD_NUMBER_LENGTH) + if (BUILD_NUMBER_LENGTH LESS 6) + string(JOIN "." FULL_VERSION ${MAJOR_MINOR_VERSION} ${BUILD_NUMBER_WITHOUT_DOTS} "0") + else() + math(EXPR BUILD_NUMBER_MINOR_LENGTH "${BUILD_NUMBER_LENGTH}-6") + string(SUBSTRING ${BUILD_NUMBER_WITHOUT_DOTS} 2 4 BUILD_NUMBER_MAJOR) # skip first two digits of year (2019... -> 19...) + string(SUBSTRING ${BUILD_NUMBER_WITHOUT_DOTS} 6 ${BUILD_NUMBER_MINOR_LENGTH} BUILD_NUMBER_MINOR) + string(JOIN "." FULL_VERSION ${MAJOR_MINOR_VERSION} ${BUILD_NUMBER_MAJOR} ${BUILD_NUMBER_MINOR}) + endif() + set(${OUT_FULL_VERSION} ${FULL_VERSION} PARENT_SCOPE) +endfunction() \ No newline at end of file From 4bbe30a347f8d5c2c5e43f30eea4e2a5cb7932a6 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 15 Jan 2020 22:48:27 +0300 Subject: [PATCH 124/129] Fixed Windows application file version metadata --- CMake/MethaneApplications.cmake | 2 ++ Resources/Configs/Windows/Resource.rc.in | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CMake/MethaneApplications.cmake b/CMake/MethaneApplications.cmake index aa5829f66..24a42768b 100644 --- a/CMake/MethaneApplications.cmake +++ b/CMake/MethaneApplications.cmake @@ -40,6 +40,8 @@ function(add_methane_application TARGET SOURCES RESOURCES_DIR INSTALL_DIR APP_NA set(METHANE_APP_MANIEFEST_FILE_PATH ${RESOURCES_DIR}/Configs/Windows/App.manifest) set(METHANE_APP_ICON_FILE_PATH ${RESOURCES_DIR}/Icons/Windows/Methane.ico) set(RESOURCE_FILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/Resource.rc) + string(REPLACE "." "," METHANE_APP_SHORT_VERSION_CSV ${METHANE_APP_SHORT_VERSION}) + string(REPLACE "." "," METHANE_APP_LONG_VERSION_CSV ${METHANE_APP_LONG_VERSION}) configure_file(${RESOURCES_DIR}/Configs/Windows/Resource.rc.in ${RESOURCE_FILE}) add_executable(${TARGET} WIN32 diff --git a/Resources/Configs/Windows/Resource.rc.in b/Resources/Configs/Windows/Resource.rc.in index ff7bf901e..ee210eeb6 100644 --- a/Resources/Configs/Windows/Resource.rc.in +++ b/Resources/Configs/Windows/Resource.rc.in @@ -42,8 +42,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0 - PRODUCTVERSION 1,0,0 + FILEVERSION @METHANE_APP_LONG_VERSION_CSV@ + PRODUCTVERSION @METHANE_APP_SHORT_VERSION_CSV@ FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L From 92bd3b83cf68f6bf54994c892521fd62c39f95cf Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Wed, 15 Jan 2020 23:12:37 +0300 Subject: [PATCH 125/129] Do not heat CPU while window is minimized --- Modules/Graphics/App/Include/Methane/Graphics/App.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp index e17a8e619..65ef08470 100644 --- a/Modules/Graphics/App/Include/Methane/Graphics/App.hpp +++ b/Modules/Graphics/App/Include/Methane/Graphics/App.hpp @@ -275,7 +275,12 @@ class App ITT_FUNCTION_TASK(); if (m_is_minimized) + { + // No need to render frames while window is minimized. + // Sleep thread for a while to not heat CPU by running the message loop + std::this_thread::sleep_for(std::chrono::milliseconds(100)); return false; + } // Update HUD info in window title if (!m_show_hud_in_window_title || From d07f6b8f67fa4ce9daa3d47486befa3a4c386419 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 16 Jan 2020 15:02:17 +0300 Subject: [PATCH 126/129] Disabled adapters change handling with DirectX on Windows --- .../Sources/Methane/Graphics/DirectX12/DeviceDX.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp index 452488f89..da41f75b5 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/DeviceDX.cpp @@ -34,6 +34,10 @@ DirectX 12 implementation of the device interface. #include #include +// NOTE: Adapters change handling breaks many frame capture tools, +// like VS or RenderDoc, so it's disabled for now +//#define ADAPTERS_CHANGE_HANDLING + namespace Methane::Graphics { @@ -163,6 +167,7 @@ void SystemDX::RegisterAdapterChangeEvent() { ITT_FUNCTION_TASK(); +#ifdef ADAPTERS_CHANGE_HANDLING wrl::ComPtr cp_factory7; if (!SUCCEEDED(m_cp_factory->QueryInterface(IID_PPV_ARGS(&cp_factory7)))) return; @@ -175,12 +180,14 @@ void SystemDX::RegisterAdapterChangeEvent() assert(!!cp_factory7); ThrowIfFailed(cp_factory7->RegisterAdaptersChangedEvent(m_adapter_change_event, &m_adapter_change_registration_cookie)); +#endif } void SystemDX::UnregisterAdapterChangeEvent() { ITT_FUNCTION_TASK(); +#ifdef ADAPTERS_CHANGE_HANDLING wrl::ComPtr cp_factory7; if (m_adapter_change_registration_cookie == 0 || !SUCCEEDED(m_cp_factory->QueryInterface(IID_PPV_ARGS(&cp_factory7)))) @@ -192,11 +199,14 @@ void SystemDX::UnregisterAdapterChangeEvent() CloseHandle(m_adapter_change_event); m_adapter_change_event = NULL; +#endif } void SystemDX::CheckForChanges() { ITT_FUNCTION_TASK(); + +#ifdef ADAPTERS_CHANGE_HANDLING const bool adapters_changed = m_adapter_change_event ? WaitForSingleObject(m_adapter_change_event, 0) == WAIT_OBJECT_0 : !m_cp_factory->IsCurrent(); @@ -225,6 +235,7 @@ void SystemDX::CheckForChanges() prev_device.Notify(Device::Notification::Removed); } } +#endif } const Devices& SystemDX::UpdateGpuDevices(Device::Feature::Mask supported_features) From 886cce8b761686e7e0e7bc0b242a1d9b0b4d0d3b Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 16 Jan 2020 15:37:56 +0300 Subject: [PATCH 127/129] Fixed code analyzer's issues. --- Build/Posix/Build.sh | 2 +- .../Methane/Graphics/Vulkan/RenderPassVK.cpp | 10 ------- .../Methane/Graphics/Vulkan/RenderStateVK.cpp | 2 -- .../Sources/Methane/Graphics/Vulkan/TypesVK.h | 2 -- README.md | 27 ++++++++++--------- azure-pipelines.yml | 10 +++---- 6 files changed, 20 insertions(+), 33 deletions(-) diff --git a/Build/Posix/Build.sh b/Build/Posix/Build.sh index 84d61632d..fd9f19f45 100755 --- a/Build/Posix/Build.sh +++ b/Build/Posix/Build.sh @@ -6,7 +6,7 @@ do arg="$1" case "$arg" in --analyze) IS_ANALYZE_BUILD=true;; - *) IS_UNKNOWN_ARG=true;; + *) echo "Unknown argument!" && exit 1;; esac shift done diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.cpp index 8bc8ab35a..1dedbfc0c 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderPassVK.cpp @@ -73,16 +73,6 @@ void RenderPassVK::Reset() color_attach_index++; } - - if (!m_settings.depth_attachment.wp_texture.expired()) - { - const TextureVK& depth_texture = static_cast(*m_settings.depth_attachment.wp_texture.lock()); - } - - if (!m_settings.stencil_attachment.wp_texture.expired()) - { - const TextureVK& stencil_texture = static_cast(*m_settings.stencil_attachment.wp_texture.lock()); - } } ContextVK& RenderPassVK::GetContextVK() noexcept diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp index 6944cef33..72251af0b 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/RenderStateVK.cpp @@ -81,8 +81,6 @@ void RenderStateVK::Reset(const Settings& settings) void RenderStateVK::Apply(RenderCommandListBase& command_list, Group::Mask state_groups) { ITT_FUNCTION_TASK(); - - RenderCommandListVK& vulkan_command_list = static_cast(command_list); } void RenderStateVK::SetViewports(const Viewports& viewports) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.h index 0f9c6f097..ad8a751c3 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Vulkan/TypesVK.h @@ -30,8 +30,6 @@ namespace Methane::Graphics class TypeConverterVK { -public: - private: TypeConverterVK() = default; }; diff --git a/README.md b/README.md index f013ed92d..7305e41ce 100644 --- a/README.md +++ b/README.md @@ -31,23 +31,23 @@ Click **"Open in Gitpod" button** above to explore Methane Kit codebase right aw ## Table of Contents 1. [Features](#features) -1. [Development Plans](#development-plans) -1. [Getting Started](#getting-started) +2. [Development Plans](#development-plans) +3. [Getting Started](#getting-started) 1. [Prerequisites](#prerequisites) - 1. [Fetch Sources](#fetch-sources) - 1. [Windows Build](#windows-build) - 1. [MacOS Build](#macos-build) - 1. [Linux Build](#linux-build) -1. [Demo Applications](#demo-applications) + 2. [Fetch Sources](#fetch-sources) + 3. [Windows Build](#windows-build) + 4. [MacOS Build](#macos-build) + 5. [Linux Build](#linux-build) +4. [Demo Applications](#demo-applications) 1. [Tutorials](#tutorials) 1. [Hello Triangle](#hello-triangle) - 1. [Textured Cube](#textured-cube) - 1. [Shadow Cube](#shadow-cube) - 1. [Samples](#samples) + 2. [Textured Cube](#textured-cube) + 3. [Shadow Cube](#shadow-cube) + 3. [Samples](#samples) 1. [Asteroids](#asteroids) -1. [Development Tools](#development-tools) -1. [External Dependencies](#external-dependencies) -1. [License](#license) +5. [Development Tools](#development-tools) +6. [External Dependencies](#external-dependencies) +7. [License](#license) ## Features @@ -90,6 +90,7 @@ Click **"Open in Gitpod" button** above to explore Methane Kit codebase right aw - [x] Continous integration system - [x] Application user input with mouse and keyboard - [x] Parallel command lists +- [ ] Mesh loader (Assimp) - [ ] Text rendering - [ ] Improved shaders toolset (use DXC & HLSL 6) - [ ] Post-processing pipeline diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d7ef6d029..8cc6d7c40 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -31,11 +31,11 @@ resources: submodules: recursive variables: - buildCmakeFlags: '-DMETHANE_BUILD_NUMBER=$(Build.BuildNumber) - -DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON - -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON - -DMETHANE_SCOPE_TIMERS_ENABLED:BOOL=OFF - -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF + buildCmakeFlags: '-DMETHANE_BUILD_NUMBER=$(Build.BuildNumber) + -DMETHANE_ITT_INSTRUMENTATION_ENABLED:BOOL=ON + -DMETHANE_SHADERS_CODEVIEW_ENABLED:BOOL=ON + -DMETHANE_SCOPE_TIMERS_ENABLED:BOOL=OFF + -DMETHANE_RUN_TESTS_DURING_BUILD:BOOL=OFF -DMETHANE_USE_OPEN_IMAGE_IO:BOOL=OFF' jobs: From 37300e72142a25feda0844b9e0d1596be921502a Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 16 Jan 2020 18:34:18 +0300 Subject: [PATCH 128/129] Fixed code analysis issues --- Apps/Samples/Asteroids/AsteroidsArray.cpp | 2 +- Apps/Samples/Asteroids/AsteroidsArray.h | 1 - .../Methane/Graphics/DirectX12/ContextDX.cpp | 52 ++++---- .../Graphics/DirectX12/RenderPassDX.cpp | 119 ++++++++++-------- .../Methane/Graphics/DirectX12/RenderPassDX.h | 3 + .../Methane/Graphics/Native/RenderPassNT.h | 2 +- README.md | 2 +- 7 files changed, 102 insertions(+), 79 deletions(-) diff --git a/Apps/Samples/Asteroids/AsteroidsArray.cpp b/Apps/Samples/Asteroids/AsteroidsArray.cpp index 2cea98e65..b4a324939 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.cpp +++ b/Apps/Samples/Asteroids/AsteroidsArray.cpp @@ -392,7 +392,7 @@ bool AsteroidsArray::Update(double elapsed_seconds, double /*delta_seconds*/) return true; } - + void AsteroidsArray::Draw(gfx::RenderCommandList &cmd_list, gfx::MeshBufferBindings& buffer_bindings) { ITT_FUNCTION_TASK(); diff --git a/Apps/Samples/Asteroids/AsteroidsArray.h b/Apps/Samples/Asteroids/AsteroidsArray.h index 0fabf73bf..db3aa1eae 100644 --- a/Apps/Samples/Asteroids/AsteroidsArray.h +++ b/Apps/Samples/Asteroids/AsteroidsArray.h @@ -132,7 +132,6 @@ class AsteroidsArray final : protected gfx::TexturedMeshBufferscpuDescriptor = GetRenderTargetTextureCpuDescriptor(m_settings.depth_attachment.wp_texture); - } - else - { - const AccessDesc depth_access(m_settings.depth_attachment, m_settings.stencil_attachment); - const AccessDesc stencil_access(m_settings.stencil_attachment, m_settings.depth_attachment); - - m_depth_stencil_desc = D3D12_RENDER_PASS_DEPTH_STENCIL_DESC{ - depth_access.descriptor, - depth_access.beginning, stencil_access.beginning, - depth_access.ending, stencil_access.ending - }; - } + m_depth_stencil_desc->cpuDescriptor = GetRenderTargetTextureCpuDescriptor(m_settings.depth_attachment.wp_texture); + } + else + { + const AccessDesc depth_access(m_settings.depth_attachment, m_settings.stencil_attachment); + const AccessDesc stencil_access(m_settings.stencil_attachment, m_settings.depth_attachment); + + m_depth_stencil_desc = D3D12_RENDER_PASS_DEPTH_STENCIL_DESC{ + depth_access.descriptor, + depth_access.beginning, stencil_access.beginning, + depth_access.ending, stencil_access.ending + }; } } - - if (!m_is_native_render_pass_available.has_value() || !m_is_native_render_pass_available.value()) + +} + +void RenderPassDX::UpdateNativeClearDesc() +{ + ITT_FUNCTION_TASK(); + + m_rt_clear_infos.clear(); + for (const RenderPassBase::ColorAttachment& color_attach : m_settings.color_attachments) { - m_rt_clear_infos.clear(); - for (const RenderPassBase::ColorAttachment& color_attach : m_settings.color_attachments) + if (color_attach.load_action != RenderPassBase::Attachment::LoadAction::Clear) + continue; + + if (color_attach.wp_texture.expired()) { - if (color_attach.load_action != RenderPassBase::Attachment::LoadAction::Clear) - continue; - - if (color_attach.wp_texture.expired()) - { - throw std::invalid_argument("Can not clear render target attachment without texture."); - } - m_rt_clear_infos.emplace_back(color_attach); + throw std::invalid_argument("Can not clear render target attachment without texture."); } - - m_ds_clear_info = DSClearInfo(m_settings.depth_attachment, m_settings.stencil_attachment); + m_rt_clear_infos.emplace_back(color_attach); } + + m_ds_clear_info = DSClearInfo(m_settings.depth_attachment, m_settings.stencil_attachment); + } void RenderPassDX::Begin(RenderCommandListBase& command_list) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h index 266ed0a2e..f3bcf0d9e 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.h @@ -96,6 +96,9 @@ class RenderPassDX : public RenderPassBase DSClearInfo(const RenderPassBase::DepthAttachment& depth_attach, const RenderPassBase::StencilAttachment& stencil_attach); }; + void UpdateNativeRenderPassDesc(bool settings_changed); + void UpdateNativeClearDesc(); + // D3D12 Render-Pass description std::optional m_is_native_render_pass_available; std::vector m_render_target_descs; diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h index 979ef1f89..fe2652544 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/Native/RenderPassNT.h @@ -31,7 +31,7 @@ Native implementation alias of the render pass interface. #include -#elif // Linux +#elif defined __linux__ #include diff --git a/README.md b/README.md index 7305e41ce..4b8b7fa43 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Click **"Open in Gitpod" button** above to explore Methane Kit codebase right aw 1. [Hello Triangle](#hello-triangle) 2. [Textured Cube](#textured-cube) 3. [Shadow Cube](#shadow-cube) - 3. [Samples](#samples) + 2. [Samples](#samples) 1. [Asteroids](#asteroids) 5. [Development Tools](#development-tools) 6. [External Dependencies](#external-dependencies) From 8cac67e0ba6ca96ef5d66ea75202e9ba40cc0881 Mon Sep 17 00:00:00 2001 From: Evgeny Gorodetsky Date: Thu, 16 Jan 2020 19:08:56 +0300 Subject: [PATCH 129/129] Removed excessive empty lines and added common Build topic in ReadMe --- .../Methane/Graphics/DirectX12/RenderPassDX.cpp | 2 -- README.md | 15 +++++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp index 516dc686d..eb5d27746 100644 --- a/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp +++ b/Modules/Graphics/Core/Sources/Methane/Graphics/DirectX12/RenderPassDX.cpp @@ -264,7 +264,6 @@ void RenderPassDX::UpdateNativeRenderPassDesc(bool settings_changed) }; } } - } void RenderPassDX::UpdateNativeClearDesc() @@ -285,7 +284,6 @@ void RenderPassDX::UpdateNativeClearDesc() } m_ds_clear_info = DSClearInfo(m_settings.depth_attachment, m_settings.stencil_attachment); - } void RenderPassDX::Begin(RenderCommandListBase& command_list) diff --git a/README.md b/README.md index 4b8b7fa43..ccc09f349 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,10 @@ Click **"Open in Gitpod" button** above to explore Methane Kit codebase right aw 3. [Getting Started](#getting-started) 1. [Prerequisites](#prerequisites) 2. [Fetch Sources](#fetch-sources) - 3. [Windows Build](#windows-build) - 4. [MacOS Build](#macos-build) - 5. [Linux Build](#linux-build) + 3. [Build](#build) + 1. [Windows Build](#windows-build) + 2. [MacOS Build](#macos-build) + 3. [Linux Build](#linux-build) 4. [Demo Applications](#demo-applications) 1. [Tutorials](#tutorials) 1. [Hello Triangle](#hello-triangle) @@ -130,7 +131,9 @@ git clone --recurse-submodules --depth 1 https://github.com/egorodet/MethaneKit. git pull && git submodule update --init --depth 1 --recursive ``` -### Windows Build +### Build + +#### Windows Build Start **"x64 Native Tools Command Prompt for VS2017"** (it initializes environment with VS path to Windows SDK, etc), then go to MethaneKit root directory (see instructions above to initialize repository and get latest code with submodules) and either start auxiliary build script [Build/Windows/Build.bat](Build/Windows/Build.bat) or build with cmake manually: ```console @@ -143,7 +146,7 @@ Alternatively you can open root [CMakeLists.txt](CMakeLists.txt) directly in Vis Run applications from the installation directory `Build\Output\VisualStudio\Install\Apps`. -### MacOS Build +#### MacOS Build Start terminal, then go to MethaneKit root directory (see instructions above to initialize repository and get latest code with submodules) and either start auxiliary build script [Build/Posix/Build.sh](Build/Posix/Build.sh) or build with cmake manually: ```console @@ -156,7 +159,7 @@ Alternatively you can open root [CMakeLists.txt](CMakeLists.txt) directly in VSC Run applications from the installation directory `Build/Output/XCode/Install/Apps` -### Linux Build +#### Linux Build Build on Linux with GCC works fine using "Unix Makefiles" generator, but the platform abstraction layer and graphics API implementation are currently stubbed. So in spite of it builds, do not expect anything to work on Linux now. ```console

-
-
Asteroids sample demonstrating multi-threaded rendering with Methane Graphics API -