Skip to content

Commit 0fcb7a4

Browse files
committed
Add ring buffering for encoders
1 parent 67c569c commit 0fcb7a4

9 files changed

Lines changed: 29 additions & 8 deletions

File tree

demo/native/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ int main() {
5050
}
5151

5252
device->begin_frame();
53+
queue->begin_frame(device->get_current_frame_index());
5354

5455
auto current_window_size = window->get_physical_size();
5556

pathfinder/core/d3d9/renderer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ RendererD3D9::RendererD3D9(const std::shared_ptr<Device> &_device, const std::sh
5959
quad_vertex_data_size,
6060
QUAD_VERTEX_POSITIONS);
6161

62-
queue->submit(encoder, fence);
62+
queue->submit(encoder, nullptr);
6363
}
6464

6565
void RendererD3D9::set_dest_texture(const std::shared_ptr<Texture> &texture) {
@@ -365,7 +365,7 @@ void RendererD3D9::draw(const std::shared_ptr<SceneBuilder> &_scene_builder, boo
365365

366366
upload_and_draw_tiles(scene_builder->tile_batches, encoder);
367367

368-
queue->submit(encoder, fence);
368+
queue->submit(encoder, nullptr);
369369

370370
// Clean up.
371371
if (fill_vertex_buffer_id) {

pathfinder/core/paint/palette.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ std::vector<PaintMetadata> Palette::build_paint_info(Renderer *renderer) {
162162
}
163163
}
164164

165-
renderer->queue->submit(encoder, renderer->fence);
165+
renderer->queue->submit(encoder, nullptr);
166166

167167
// Free transient locations and unused images, now that they're no longer needed.
168168
free_transient_locations(*paint_texture_manager, transient_paint_locations);

pathfinder/core/renderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Renderer::Renderer(const std::shared_ptr<Device> &_device, const std::shared_ptr
3333

3434
encoder->write_texture(allocator->get_texture(area_lut_texture_id), {}, image_buffer->get_data());
3535

36-
queue->submit(encoder, fence);
36+
queue->submit(encoder, nullptr);
3737
}
3838

3939
Renderer::~Renderer() {

pathfinder/gpu/device.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class Device : public std::enable_shared_from_this<Device> {
9898
}
9999
}
100100

101-
int get_frames_in_flight() const {
101+
uint32_t get_frames_in_flight() const {
102102
return frames_in_flight_;
103103
}
104104

@@ -126,7 +126,7 @@ class Device : public std::enable_shared_from_this<Device> {
126126

127127
std::vector<StagingBucket> staging_buckets_;
128128

129-
int frames_in_flight_;
129+
uint32_t frames_in_flight_;
130130

131131
uint32_t current_frame_index_ = 0;
132132

pathfinder/gpu/queue.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ class Queue {
1818
virtual ~Queue() = default;
1919

2020
virtual void submit(const std::shared_ptr<CommandEncoder> &encoder, const std::shared_ptr<Fence> &fence) = 0;
21+
22+
virtual void begin_frame(uint32_t current_frame_index) {}
23+
24+
protected:
25+
uint32_t current_frame_index_{};
2126
};
2227

2328
} // namespace Pathfinder

pathfinder/gpu/vk/queue.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,17 @@ void QueueVk::submit(const std::shared_ptr<CommandEncoder> &encoder, const std::
3939
// A simple way is to wait for the queue to be idle.
4040
if (!encoder->callbacks_.empty()) {
4141
vkQueueWaitIdle(vk_graphics_queue_);
42+
} else {
43+
encoders_in_flight_[current_frame_index_ % frames_in_flight_].push_back(encoder);
4244
}
4345
}
4446

4547
encoder->invoke_callbacks();
4648
}
4749

50+
void QueueVk::begin_frame(uint32_t current_frame_index) {
51+
current_frame_index_ = current_frame_index;
52+
encoders_in_flight_[current_frame_index_ % frames_in_flight_].clear();
53+
}
54+
4855
} // namespace Pathfinder

pathfinder/gpu/vk/queue.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,26 @@ class QueueVk : public Queue {
1212
public:
1313
void submit(const std::shared_ptr<CommandEncoder> &encoder, const std::shared_ptr<Fence> &fence) override;
1414

15+
void begin_frame(uint32_t current_frame_index) override;
16+
1517
private:
1618
VkDevice vk_device_{};
1719

1820
VkQueue vk_graphics_queue_{};
1921

2022
VkQueue vk_present_queue_{};
2123

24+
std::vector<std::vector<std::shared_ptr<CommandEncoder>>> encoders_in_flight_;
25+
26+
uint32_t frames_in_flight_{};
27+
2228
public:
23-
QueueVk(VkDevice vk_device, VkQueue vk_graphics_queue, VkQueue vk_present_queue) {
29+
QueueVk(VkDevice vk_device, VkQueue vk_graphics_queue, VkQueue vk_present_queue, uint32_t frames_in_flight) {
2430
vk_device_ = vk_device;
2531
vk_graphics_queue_ = vk_graphics_queue;
2632
vk_present_queue_ = vk_present_queue;
33+
frames_in_flight_ = frames_in_flight;
34+
encoders_in_flight_.resize(frames_in_flight);
2735
}
2836
};
2937

pathfinder/gpu/vk/window_builder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ std::shared_ptr<Device> WindowBuilderVk::request_device() {
155155
}
156156

157157
std::shared_ptr<Queue> WindowBuilderVk::create_queue() {
158-
auto queue = std::shared_ptr<QueueVk>(new QueueVk(device_, graphics_queue_, present_queue_));
158+
auto queue = std::shared_ptr<QueueVk>(new QueueVk(device_, graphics_queue_, present_queue_, MAX_FRAMES_IN_FLIGHT));
159159
return queue;
160160
}
161161

0 commit comments

Comments
 (0)