-
-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
Copy pathParallelRenderingApp.h
More file actions
125 lines (96 loc) · 4.13 KB
/
ParallelRenderingApp.h
File metadata and controls
125 lines (96 loc) · 4.13 KB
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
120
121
122
123
124
125
/******************************************************************************
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
{
using InstancedProgramBindings = gfx::MeshBuffersBase::InstancedProgramBindings;
using InstancedUniformArgumentBindings = std::vector<rhi::IProgramArgumentBinding*>;
using gfx::AppFrame::AppFrame;
#ifdef ROOT_CONSTANTS_ENABLED
InstancedProgramBindings cubes_program_bindings;
InstancedUniformArgumentBindings cubes_uniform_argument_binding_ptrs;
#else
gfx::InstancedMeshBufferBindings cubes_array;
#endif
rhi::ParallelRenderCommandList parallel_render_cmd_list;
rhi::RenderCommandList serial_render_cmd_list;
rhi::CommandListSet execute_cmd_list_set;
};
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;
friend bool operator==(const Settings& left, const Settings& right) noexcept = default;
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);
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;
// IContextCallback override
void OnContextReleased(rhi::IContext& context) override;
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