-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
ParallelRenderingApp.h
119 lines (90 loc) · 3.76 KB
/
ParallelRenderingApp.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/******************************************************************************
Copyright 2022 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: ParallelRenderingApp.h
Tutorial demonstrating parallel rendering with Methane graphics API
******************************************************************************/
#pragma once
#include <Methane/Kit.h>
#include <Methane/UserInterface/App.hpp>
#include <thread>
namespace hlslpp // NOSONAR
{
#pragma pack(push, 16)
#include "Shaders/ParallelRenderingUniforms.h" // NOSONAR
#pragma pack(pop)
}
namespace Methane::Tutorials
{
namespace gfx = Methane::Graphics;
namespace rhi = Methane::Graphics::Rhi;
struct ParallelRenderingFrame final
: Graphics::AppFrame
{
gfx::InstancedMeshBufferBindings cubes_array;
rhi::ParallelRenderCommandList parallel_render_cmd_list;
rhi::RenderCommandList serial_render_cmd_list;
rhi::CommandListSet execute_cmd_list_set;
using gfx::AppFrame::AppFrame;
};
using UserInterfaceApp = UserInterface::App<ParallelRenderingFrame>;
class ParallelRenderingApp final // NOSONAR - destructor required
: public UserInterfaceApp
{
public:
struct Settings
{
uint32_t cubes_grid_size = 12U; // total_cubes_count = pow(cubes_grid_size, 3)
uint32_t render_thread_count = std::thread::hardware_concurrency();
bool parallel_rendering_enabled = true;
bool operator==(const Settings& other) const noexcept;
uint32_t GetTotalCubesCount() const noexcept;
uint32_t GetActiveRenderThreadCount() const noexcept;
};
ParallelRenderingApp();
~ParallelRenderingApp() override;
// GraphicsApp overrides
void Init() override;
bool Resize(const gfx::FrameSize& frame_size, bool is_minimized) override;
bool Update() override;
bool Render() override;
// UserInterface::App overrides
std::string GetParametersString() override;
const Settings& GetSettings() const noexcept { return m_settings; }
void SetSettings(const Settings& settings);
protected:
// IContextCallback override
void OnContextReleased(rhi::IContext& context) override;
private:
struct CubeParameters
{
hlslpp::float4x4 model_matrix;
double rotation_speed_y = 0.25f;
double rotation_speed_z = 0.5f;
uint32_t thread_index = 0;
};
using CubeArrayParameters = std::vector<CubeParameters>;
using MeshBuffers = gfx::MeshBuffers<hlslpp::Uniforms>;
CubeArrayParameters InitializeCubeArrayParameters() const;
bool Animate(double elapsed_seconds, double delta_seconds);
void RenderCubesRange(const rhi::RenderCommandList& remder_cmd_list,
const std::vector<rhi::ProgramBindings>& program_bindings_per_instance,
uint32_t begin_instance_index, const uint32_t end_instance_index) const;
Settings m_settings;
gfx::Camera m_camera;
rhi::RenderState m_render_state;
rhi::Texture m_texture_array;
rhi::Sampler m_texture_sampler;
Ptr<MeshBuffers> m_cube_array_buffers_ptr;
CubeArrayParameters m_cube_array_parameters;
};
} // namespace Methane::Tutorials