Skip to content

Commit 56209ff

Browse files
committed
dev
1 parent 40bcef0 commit 56209ff

7 files changed

Lines changed: 399 additions & 237 deletions

File tree

modules/stormkit/engine/renderer.cppm

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ export namespace stormkit::engine {
134134

135135
auto build_frame(BuildFrameClosure build_frame) noexcept -> void;
136136

137+
auto current_frame() const noexcept -> u32;
138+
auto buffering_count() const noexcept -> u32;
139+
137140
private:
138141
auto do_init(std::string_view, OptionalRef<const wsi::Window>) noexcept -> gpu::Expected<void>;
139142
auto do_init_instance(std::string_view) noexcept -> gpu::Expected<void>;
@@ -342,4 +345,18 @@ namespace stormkit::engine {
342345
auto frame_builders = m_frame_builders.write();
343346
frame_builders->push(std::move(frame_builder));
344347
}
348+
349+
/////////////////////////////////////
350+
/////////////////////////////////////
351+
STORMKIT_FORCE_INLINE
352+
inline auto Renderer::current_frame() const noexcept -> u32 {
353+
return m_current_frame;
354+
}
355+
356+
/////////////////////////////////////
357+
/////////////////////////////////////
358+
STORMKIT_FORCE_INLINE
359+
inline auto Renderer::buffering_count() const noexcept -> u32 {
360+
return m_surface->buffering_count();
361+
}
345362
} // namespace stormkit::engine

modules/stormkit/engine/renderer/framegraph.cppm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ export namespace stormkit::engine {
7070

7171
std::vector<std::byte> data = {};
7272

73+
std::vector<std::pair<ResourceID, gpu::ClearValue>> clear_values;
74+
7375
bool root = false;
7476
};
7577

@@ -318,6 +320,8 @@ namespace stormkit::engine {
318320
m_task.writes |= image_id;
319321
node.wrote_by |= m_task.id;
320322
node.attached_in |= m_task.id;
323+
324+
m_task.clear_values.emplace_back(image_id, std::move(*clear_value));
321325
}
322326

323327
/////////////////////////////////////

modules/stormkit/engine/sprite_renderer.cppm

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,27 @@ export namespace stormkit::engine {
5151

5252
private:
5353
struct Sprite {
54-
std::array<SpriteVertex, 4> vertices = {
55-
SpriteVertex { { 0.f, 0.f }, { 0.f, 0.f } },
56-
SpriteVertex { { 0.f, 1.f }, { 0.f, 1.f } },
57-
SpriteVertex { { 1.f, 0.f }, { 1.f, 0.f } },
58-
SpriteVertex { { 1.f, 1.f }, { 1.f, 1.f } },
59-
};
6054
gpu::ImageView texture;
55+
gpu::Sampler sampler;
6156
};
6257

6358
auto do_init(Application&) noexcept -> gpu::Expected<void>;
59+
auto do_init_scene_data(Application&) noexcept -> gpu::Expected<void>;
60+
auto do_init_buffered_scene_data(Application&) noexcept -> gpu::Expected<void>;
61+
62+
auto insert_update_camera_task(const Renderer&, FrameBuilder&, FrameBuilder::ResourceID) noexcept -> void;
63+
auto insert_update_sprites_task(const Renderer&, FrameBuilder&) noexcept -> void;
64+
auto insert_render_sprites_task(const Renderer&,
65+
FrameBuilder&,
66+
FrameBuilder::ResourceID,
67+
FrameBuilder::ResourceID) noexcept -> void;
6468

6569
auto on_message_received(const Renderer&,
6670
const entities::EntityManager&,
6771
const entities::Message&,
6872
const entities::Entities&) noexcept -> void;
6973

70-
struct RenderData {
74+
struct SceneData {
7175
DeferInit<gpu::Shader> vertex_shader;
7276
DeferInit<gpu::Shader> fragment_shader;
7377

@@ -77,20 +81,28 @@ export namespace stormkit::engine {
7781
gpu::RasterPipelineState pipeline_state;
7882
DeferInit<gpu::Pipeline> pipeline;
7983

80-
DeferInit<gpu::DescriptorPool> descriptor_pool;
81-
DeferInit<gpu::DescriptorSetLayout> descriptor_set_layout;
84+
DeferInit<gpu::DescriptorPool> descriptor_pool;
85+
} m_scene_data;
86+
87+
struct BufferedSceneData {
88+
DeferInit<gpu::DescriptorSetLayout> camera_descriptor_layout;
8289
DeferInit<gpu::DescriptorSet> camera_descriptor_set;
90+
DeferInit<gpu::Buffer> camera_buffer;
91+
u32 camera_current_offset = 0;
8392

84-
DeferInit<gpu::Buffer> camera_buffer;
85-
} m_render_data;
93+
DeferInit<gpu::DescriptorSetLayout> sprite_descriptor_layout;
94+
DeferInit<gpu::DescriptorSet> sprite_descriptor_set;
95+
DeferInit<gpu::Buffer> sprite_buffer;
96+
u32 sprite_current_offset = 0;
97+
} m_buffered_scene_data;
8698

8799
struct Camera {
88100
math::fmat4 projection = math::fmat4::identity();
89101
math::fmat4 view = math::fmat4::identity();
90102

91103
static constexpr auto layout_binding() -> gpu::DescriptorSetLayoutBinding {
92104
return { .binding = 0,
93-
.type = gpu::DescriptorType::UNIFORM_BUFFER,
105+
.type = gpu::DescriptorType::UNIFORM_BUFFER_DYNAMIC,
94106
.stages = gpu::ShaderStageFlag::VERTEX,
95107
.descriptor_count = 1 };
96108
}
@@ -99,6 +111,26 @@ export namespace stormkit::engine {
99111
math::fextent2 m_viewport;
100112

101113
Locked<std::vector<std::pair<entities::Entity, Sprite>>> m_sprites;
114+
115+
struct Dirty {
116+
inline Dirty() noexcept = default;
117+
inline ~Dirty() noexcept = default;
118+
119+
inline Dirty(Dirty&& other) noexcept : camera { other.camera.load() }, sprites { other.sprites.load() } {}
120+
121+
inline auto operator=(Dirty&& other) noexcept -> Dirty& {
122+
if (this == &other) [[unlikely]]
123+
return *this;
124+
125+
camera.store(other.camera.load());
126+
sprites.store(other.sprites.load());
127+
128+
return *this;
129+
}
130+
131+
std::atomic_bool camera = true;
132+
std::atomic_bool sprites = true;
133+
} m_dirty;
102134
};
103135
} // namespace stormkit::engine
104136

shaders/sprite_renderer/quad_sprite.wgsl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,20 @@ struct Camera {
1313
view: mat4x4f,
1414
}
1515

16-
@binding(0) @group(0)
16+
struct SpriteData {
17+
model: mat4x4f,
18+
}
19+
20+
@group(0) @binding(0)
1721
var<uniform> camera: Camera;
1822

23+
@group(1) @binding(0)
24+
var<uniform> sprite_data: SpriteData;
25+
1926
@vertex fn vert_main(input: VertIn) -> VertOut {
2027
var output: VertOut;
2128

22-
output.position = camera.proj * camera.view * vec4f(input.position, 0., 1.);
29+
output.position = camera.proj * camera.view * vec4f(input.position, 1., 1.);
2330
output.uv = input.uv;
2431

2532
return output;

src/renderer.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -407,25 +407,32 @@ namespace stormkit::engine {
407407

408408
const auto format = image->format();
409409

410+
const auto& clear_value = stdr::find_if(task.clear_values, [image_id](const auto& pair) {
411+
return pair.first == image_id;
412+
})->second;
413+
410414
if (gpu::is_stencil_only_format(format)) {
411415
rendering_info.stencil_attachment = gpu::RenderingInfo::Attachment {
412-
.image_view = as_ref(view),
413-
.load_op = load_op,
414-
.store_op = store_op,
416+
.image_view = as_ref(view),
417+
.load_op = load_op,
418+
.store_op = store_op,
419+
.clear_value = clear_value,
415420
};
416421
inheritance_info.stencil_attachment = format;
417422
} else if (gpu::is_depth_format(format)) {
418423
rendering_info.depth_attachment = gpu::RenderingInfo::Attachment {
419-
.image_view = as_ref(view),
420-
.load_op = load_op,
421-
.store_op = store_op,
424+
.image_view = as_ref(view),
425+
.load_op = load_op,
426+
.store_op = store_op,
427+
.clear_value = clear_value,
422428
};
423429
inheritance_info.depth_attachment = format;
424430
} else {
425431
rendering_info.color_attachments.emplace_back(gpu::RenderingInfo::Attachment {
426-
.image_view = as_ref(view),
427-
.load_op = load_op,
428-
.store_op = store_op,
432+
.image_view = as_ref(view),
433+
.load_op = load_op,
434+
.store_op = store_op,
435+
.clear_value = clear_value,
429436
});
430437
inheritance_info.color_attachments.emplace_back(format);
431438
}

0 commit comments

Comments
 (0)