Skip to content

Commit bfcc1b1

Browse files
committed
Added support for events, improved texture loading further
1 parent eea314b commit bfcc1b1

17 files changed

+410
-227
lines changed

RenderCore/render/backend/buffer_usage_token.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,24 @@
44

55
#include <volk.h>
66

7+
#include "render/backend/handles.hpp"
8+
79
struct BufferUsageToken {
810
VkPipelineStageFlags2KHR stage;
911

1012
VkAccessFlags2KHR access;
1113
};
1214

15+
struct BufferBarrier {
16+
BufferHandle buffer = BufferHandle::None;
17+
18+
BufferUsageToken src = {};
19+
20+
BufferUsageToken dst = {};
21+
22+
uint32_t offset = 0;
23+
24+
uint32_t size = 0;
25+
};
26+
1327
using BufferUsageMap = std::unordered_map<BufferHandle, BufferUsageToken>;

RenderCore/render/backend/command_buffer.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,53 @@ void CommandBuffer::dispatch(const uint32_t width, const uint32_t height, const
288288
vkCmdDispatch(commands, width, height, depth);
289289
}
290290

291+
void CommandBuffer::reset_event(const VkEvent event, const VkPipelineStageFlags stages) const {
292+
vkCmdResetEvent2KHR(commands, event, stages);
293+
}
294+
295+
void CommandBuffer::set_event(const VkEvent event, const std::vector<BufferBarrier>& buffers) {
296+
auto& allocator = backend->get_global_allocator();
297+
298+
auto buffer_barriers = std::vector<VkBufferMemoryBarrier2KHR>{};
299+
buffer_barriers.reserve(buffers.size());
300+
for (const auto& buffer_barrier : buffers) {
301+
const auto& buffer_actual = allocator.get_buffer(buffer_barrier.buffer);
302+
const auto barrier = VkBufferMemoryBarrier2{
303+
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2_KHR,
304+
.srcStageMask = buffer_barrier.src.stage,
305+
.srcAccessMask = buffer_barrier.src.access,
306+
.dstStageMask = buffer_barrier.dst.stage,
307+
.dstAccessMask = buffer_barrier.dst.access,
308+
.buffer = buffer_actual.buffer,
309+
.offset = buffer_barrier.offset,
310+
.size = buffer_barrier.size
311+
};
312+
buffer_barriers.emplace_back(barrier);
313+
}
314+
315+
const auto dependency = VkDependencyInfoKHR{
316+
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR,
317+
.bufferMemoryBarrierCount = static_cast<uint32_t>(buffer_barriers.size()),
318+
.pBufferMemoryBarriers = buffer_barriers.data()
319+
};
320+
vkCmdSetEvent2KHR(commands, event, &dependency);
321+
322+
event_buffer_barriers.emplace(event, std::move(buffer_barriers));
323+
}
324+
325+
void CommandBuffer::wait_event(const VkEvent event) {
326+
const auto& buffer_barriers = event_buffer_barriers.at(event);
327+
328+
const auto dependency = VkDependencyInfoKHR{
329+
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR,
330+
.bufferMemoryBarrierCount = static_cast<uint32_t>(buffer_barriers.size()),
331+
.pBufferMemoryBarriers = buffer_barriers.data()
332+
};
333+
vkCmdWaitEvents2KHR(commands, 1, &event, &dependency);
334+
335+
event_buffer_barriers.erase(event);
336+
}
337+
291338
void CommandBuffer::begin_label(const std::string& event_name) const {
292339
if (vkCmdBeginDebugUtilsLabelEXT == nullptr) {
293340
return;

RenderCore/render/backend/command_buffer.hpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <volk.h>
88
#include <tracy/TracyVulkan.hpp>
99

10+
#include "buffer_usage_token.hpp"
1011
#include "render/backend/handles.hpp"
1112
#include "render/backend/pipeline.hpp"
1213
#include "render/backend/framebuffer.hpp"
@@ -68,7 +69,8 @@ class CommandBuffer {
6869
* Issues a batch of pipeline barriers
6970
*/
7071
void barrier(
71-
const std::vector<VkMemoryBarrier2KHR>& memory_barriers, const std::vector<VkBufferMemoryBarrier2>& buffer_barriers,
72+
const std::vector<VkMemoryBarrier2KHR>& memory_barriers,
73+
const std::vector<VkBufferMemoryBarrier2>& buffer_barriers,
7274
const std::vector<VkImageMemoryBarrier2>& image_barriers
7375
) const;
7476

@@ -148,6 +150,12 @@ class CommandBuffer {
148150

149151
void dispatch(uint32_t width, uint32_t height, uint32_t depth);
150152

153+
void reset_event(VkEvent event, VkPipelineStageFlags stages) const;
154+
155+
void set_event(VkEvent event, const std::vector<BufferBarrier>& buffers);
156+
157+
void wait_event(VkEvent);
158+
151159
void begin_label(const std::string& event_name) const;
152160

153161
void end_label() const;
@@ -157,7 +165,7 @@ class CommandBuffer {
157165
tracy::VkCtx* const get_tracy_context() const;
158166

159167
VkCommandBuffer get_vk_commands() const;
160-
168+
161169
VkRenderPass get_current_renderpass() const;
162170

163171
uint32_t get_current_subpass() const;
@@ -185,6 +193,14 @@ class CommandBuffer {
185193

186194
bool are_bindings_dirty = false;
187195

196+
/**
197+
* Cache of buffer barriers for events
198+
*
199+
* The spec states that the dependency info for each set/wait event call for the same event must match. The backend
200+
* should handle that noise
201+
*/
202+
std::unordered_map<VkEvent, std::vector<VkBufferMemoryBarrier2KHR>> event_buffer_barriers;
203+
188204
void commit_bindings();
189205
};
190206

RenderCore/render/backend/render_backend.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ void RenderBackend::create_instance_and_device() {
238238
throw std::runtime_error{error_message};
239239
}
240240
physical_device = phys_device_ret.value();
241-
241+
242242

243243
auto multiview_features = VkPhysicalDeviceMultiviewFeatures{
244244
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES,
@@ -327,6 +327,10 @@ VkPhysicalDevice RenderBackend::get_physical_device() const {
327327
return physical_device.physical_device;
328328
}
329329

330+
bool RenderBackend::supports_etc2() const { return physical_device.features.textureCompressionETC2; }
331+
332+
bool RenderBackend::supports_bc() const { return physical_device.features.textureCompressionBC; }
333+
330334
vkb::Device RenderBackend::get_device() const {
331335
return device;
332336
}

RenderCore/render/backend/render_backend.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ class RenderBackend {
4646
VkInstance get_instance() const;
4747

4848
VkPhysicalDevice get_physical_device() const;
49+
50+
bool supports_etc2() const;
51+
52+
bool supports_bc() const;
4953

5054
vkb::Device get_device() const;
5155

RenderCore/render/scene_renderer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ SceneRenderer::SceneRenderer() :
4848
}
4949

5050
void SceneRenderer::set_render_resolution(const glm::uvec2& resolution) {
51+
ZoneScoped;
52+
5153
if (resolution == scene_render_resolution) {
5254
return;
5355
}

0 commit comments

Comments
 (0)