Skip to content

Commit 0ffefc4

Browse files
committed
Unify vkb::RenderContext and vkb::rendering::HPPRenderContext into vkb::rendering::RenderContext<bindingType>
1 parent b996179 commit 0ffefc4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1266
-1651
lines changed

app/plugins/screenshot/screenshot.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <chrono>
2222
#include <iomanip>
2323

24+
#include "common/utils.h"
2425
#include "rendering/render_context.h"
2526

2627
namespace plugins
@@ -79,7 +80,7 @@ void Screenshot::on_app_start(const std::string &name)
7980
current_frame = 0;
8081
}
8182

82-
void Screenshot::on_post_draw(vkb::RenderContext &context)
83+
void Screenshot::on_post_draw(vkb::rendering::RenderContextC &context)
8384
{
8485
if (current_frame == frame_number)
8586
{
@@ -99,7 +100,7 @@ void Screenshot::on_post_draw(vkb::RenderContext &context)
99100
output_path = stream.str();
100101
}
101102

102-
screenshot(context, output_path);
103+
vkb::screenshot(context, output_path);
103104
}
104105
}
105106
} // namespace plugins

app/plugins/screenshot/screenshot.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class Screenshot : public ScreenshotTags
4444

4545
void on_update(float delta_time) override;
4646
void on_app_start(const std::string &app_info) override;
47-
void on_post_draw(vkb::RenderContext &context) override;
47+
void on_post_draw(vkb::rendering::RenderContextC &context) override;
4848

4949
bool handle_option(std::deque<std::string> &arguments) override;
5050

framework/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ set(RENDERING_FILES
110110
rendering/render_target.h
111111
rendering/subpass.h
112112
rendering/hpp_pipeline_state.h
113-
rendering/hpp_render_context.h
114113
rendering/hpp_render_pipeline.h
115114
rendering/hpp_render_target.h
116115
# Source files
@@ -119,10 +118,8 @@ set(RENDERING_FILES
119118
rendering/postprocessing_pass.cpp
120119
rendering/postprocessing_renderpass.cpp
121120
rendering/postprocessing_computepass.cpp
122-
rendering/render_context.cpp
123121
rendering/render_pipeline.cpp
124122
rendering/render_target.cpp
125-
rendering/hpp_render_context.cpp
126123
rendering/hpp_render_target.cpp)
127124

128125
set(RENDERING_SUBPASSES_FILES

framework/common/hpp_utils.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved.
1+
/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved.
22
*
33
* SPDX-License-Identifier: Apache-2.0
44
*
@@ -17,10 +17,8 @@
1717

1818
#pragma once
1919

20-
#include <common/utils.h>
21-
22-
#include <rendering/hpp_render_context.h>
23-
#include <scene_graph/hpp_scene.h>
20+
#include "common/utils.h"
21+
#include "scene_graph/hpp_scene.h"
2422

2523
/**
2624
* @brief facade helper functions around the functions in common/utils.h, providing a vulkan.hpp-based interface
@@ -34,9 +32,9 @@ inline sg::Node &add_free_camera(vkb::scene_graph::HPPScene &scene, const std::s
3432
return vkb::add_free_camera(reinterpret_cast<vkb::sg::Scene &>(scene), node_name, static_cast<VkExtent2D>(extent));
3533
}
3634

37-
inline void screenshot(vkb::rendering::HPPRenderContext &render_context, const std::string &filename)
35+
inline void screenshot(vkb::rendering::RenderContextCpp &render_context, const std::string &filename)
3836
{
39-
vkb::screenshot(reinterpret_cast<vkb::RenderContext &>(render_context), filename);
37+
vkb::screenshot(reinterpret_cast<vkb::rendering::RenderContextC &>(render_context), filename);
4038
}
4139
} // namespace common
4240
} // namespace vkb

framework/common/hpp_vk_common.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,16 @@ inline vk::Format choose_blendable_format(vk::PhysicalDevice gpu, const std::vec
203203
throw std::runtime_error("No suitable blendable format could be determined");
204204
}
205205

206+
inline vk::ImageCompressionPropertiesEXT query_applied_compression(vk::Device device, vk::Image image)
207+
{
208+
vk::ImageSubresource2EXT image_subresource{
209+
.imageSubresource = {.aspectMask = vk::ImageAspectFlagBits::eColor, .mipLevel = 0, .arrayLayer = 0}};
210+
211+
auto imageSubresourceLayout = device.getImageSubresourceLayout2EXT<vk::SubresourceLayout2EXT, vk::ImageCompressionPropertiesEXT>(image, image_subresource);
212+
213+
return imageSubresourceLayout.get<vk::ImageCompressionPropertiesEXT>();
214+
}
215+
206216
// helper functions not backed by vk_common.h
207217
inline vk::CommandBuffer
208218
allocate_command_buffer(vk::Device device, vk::CommandPool command_pool, vk::CommandBufferLevel level = vk::CommandBufferLevel::ePrimary)

framework/common/utils.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include <queue>
2121
#include <stdexcept>
2222

23+
#include "core/command_buffer.h"
24+
#include "rendering/render_frame.h"
2325
#include "scene_graph/components/material.h"
2426
#include "scene_graph/components/perspective_camera.h"
2527
#include "scene_graph/components/sub_mesh.h"
@@ -40,7 +42,7 @@ std::string get_extension(const std::string &uri)
4042
return uri.substr(dot_pos + 1);
4143
}
4244

43-
void screenshot(RenderContext &render_context, const std::string &filename)
45+
void screenshot(vkb::rendering::RenderContextC &render_context, const std::string &filename)
4446
{
4547
assert(render_context.get_format() == VK_FORMAT_R8G8B8A8_UNORM ||
4648
render_context.get_format() == VK_FORMAT_B8G8R8A8_UNORM ||

framework/common/utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ std::string to_snake_case(const std::string &name);
5454
* @param render_context The RenderContext to use
5555
* @param filename The name of the file to save the output to
5656
*/
57-
void screenshot(RenderContext &render_context, const std::string &filename);
57+
void screenshot(vkb::rendering::RenderContextC &render_context, const std::string &filename);
5858

5959
/**
6060
* @brief Adds a light to the scene with the specified parameters

framework/core/command_buffer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "rendering/hpp_pipeline_state.h"
3131
#include "rendering/hpp_render_target.h"
3232
#include "rendering/subpass.h"
33+
#include "resource_cache.h"
3334

3435
namespace vkb
3536
{

framework/core/hpp_swapchain.cpp

Lines changed: 141 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ constexpr const T &clamp(const T &v, const T &lo, const T &hi)
2929
return (v < lo) ? lo : ((hi < v) ? hi : v);
3030
}
3131

32+
inline uint32_t choose_image_count(uint32_t request_image_count, uint32_t min_image_count, uint32_t max_image_count)
33+
{
34+
return clamp(request_image_count, min_image_count, (max_image_count != 0) ? max_image_count : request_image_count);
35+
}
36+
3237
vk::Extent2D choose_extent(vk::Extent2D request_extent,
3338
const vk::Extent2D &min_image_extent,
3439
const vk::Extent2D &max_image_extent,
@@ -111,6 +116,11 @@ vk::SurfaceFormatKHR choose_surface_format(const vk::SurfaceFormatKHR
111116
}
112117
}
113118

119+
inline uint32_t choose_image_array_layers(uint32_t request_image_array_layers, uint32_t max_image_array_layers)
120+
{
121+
return clamp(request_image_array_layers, 1u, max_image_array_layers);
122+
}
123+
114124
vk::SurfaceTransformFlagBitsKHR choose_transform(vk::SurfaceTransformFlagBitsKHR request_transform,
115125
vk::SurfaceTransformFlagsKHR supported_transform,
116126
vk::SurfaceTransformFlagBitsKHR current_transform)
@@ -221,7 +231,8 @@ vk::ImageUsageFlags composite_image_flags(std::set<vk::ImageUsageFlagBits> &imag
221231
namespace core
222232
{
223233
HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const vk::Extent2D &extent) :
224-
HPPSwapchain{old_swapchain.device,
234+
HPPSwapchain{old_swapchain,
235+
old_swapchain.device,
225236
old_swapchain.surface,
226237
old_swapchain.properties.present_mode,
227238
old_swapchain.present_mode_priority_list,
@@ -230,11 +241,13 @@ HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const vk::Extent2D &exte
230241
old_swapchain.properties.image_count,
231242
old_swapchain.properties.pre_transform,
232243
old_swapchain.image_usage_flags,
233-
old_swapchain.get_handle()}
244+
old_swapchain.requested_compression,
245+
old_swapchain.requested_compression_fixed_rate}
234246
{}
235247

236248
HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const uint32_t image_count) :
237-
HPPSwapchain{old_swapchain.device,
249+
HPPSwapchain{old_swapchain,
250+
old_swapchain.device,
238251
old_swapchain.surface,
239252
old_swapchain.properties.present_mode,
240253
old_swapchain.present_mode_priority_list,
@@ -243,11 +256,13 @@ HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const uint32_t image_cou
243256
image_count,
244257
old_swapchain.properties.pre_transform,
245258
old_swapchain.image_usage_flags,
246-
old_swapchain.get_handle()}
259+
old_swapchain.requested_compression,
260+
old_swapchain.requested_compression_fixed_rate}
247261
{}
248262

249263
HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const std::set<vk::ImageUsageFlagBits> &image_usage_flags) :
250-
HPPSwapchain{old_swapchain.device,
264+
HPPSwapchain{old_swapchain,
265+
old_swapchain.device,
251266
old_swapchain.surface,
252267
old_swapchain.properties.present_mode,
253268
old_swapchain.present_mode_priority_list,
@@ -256,11 +271,13 @@ HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const std::set<vk::Image
256271
old_swapchain.properties.image_count,
257272
old_swapchain.properties.pre_transform,
258273
image_usage_flags,
259-
old_swapchain.get_handle()}
274+
old_swapchain.requested_compression,
275+
old_swapchain.requested_compression_fixed_rate}
260276
{}
261277

262278
HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const vk::Extent2D &extent, const vk::SurfaceTransformFlagBitsKHR transform) :
263-
HPPSwapchain{old_swapchain.device,
279+
HPPSwapchain{old_swapchain,
280+
old_swapchain.device,
264281
old_swapchain.surface,
265282
old_swapchain.properties.present_mode,
266283
old_swapchain.present_mode_priority_list,
@@ -269,21 +286,58 @@ HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const vk::Extent2D &exte
269286
old_swapchain.properties.image_count,
270287
transform,
271288
old_swapchain.image_usage_flags,
272-
old_swapchain.get_handle()}
289+
old_swapchain.requested_compression,
290+
old_swapchain.requested_compression_fixed_rate}
291+
{}
292+
293+
HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain,
294+
const vk::ImageCompressionFlagsEXT requested_compression,
295+
const vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate) :
296+
HPPSwapchain{old_swapchain,
297+
old_swapchain.device,
298+
old_swapchain.surface,
299+
old_swapchain.properties.present_mode,
300+
old_swapchain.present_mode_priority_list,
301+
old_swapchain.surface_format_priority_list,
302+
old_swapchain.properties.extent,
303+
old_swapchain.properties.image_count,
304+
old_swapchain.properties.pre_transform,
305+
old_swapchain.image_usage_flags,
306+
requested_compression,
307+
requested_compression_fixed_rate}
308+
{
309+
}
310+
311+
HPPSwapchain::HPPSwapchain(vkb::core::DeviceCpp &device,
312+
vk::SurfaceKHR surface,
313+
const vk::PresentModeKHR present_mode,
314+
const std::vector<vk::PresentModeKHR> &present_mode_priority_list,
315+
const std::vector<vk::SurfaceFormatKHR> &surface_format_priority_list,
316+
const vk::Extent2D &extent,
317+
const uint32_t image_count,
318+
const vk::SurfaceTransformFlagBitsKHR transform,
319+
const std::set<vk::ImageUsageFlagBits> &image_usage_flags,
320+
const vk::ImageCompressionFlagsEXT requested_compression,
321+
const vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate) :
322+
HPPSwapchain{*this, device, surface, present_mode, present_mode_priority_list, surface_format_priority_list, extent, image_count, transform, image_usage_flags}
273323
{}
274324

275-
HPPSwapchain::HPPSwapchain(vkb::core::DeviceCpp &device,
276-
vk::SurfaceKHR surface,
277-
const vk::PresentModeKHR present_mode,
278-
const std::vector<vk::PresentModeKHR> &present_mode_priority_list,
279-
const std::vector<vk::SurfaceFormatKHR> &surface_format_priority_list,
280-
const vk::Extent2D &extent,
281-
const uint32_t image_count,
282-
const vk::SurfaceTransformFlagBitsKHR transform,
283-
const std::set<vk::ImageUsageFlagBits> &image_usage_flags,
284-
vk::SwapchainKHR old_swapchain) :
325+
HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain,
326+
vkb::core::DeviceCpp &device,
327+
vk::SurfaceKHR surface,
328+
const vk::PresentModeKHR present_mode,
329+
std::vector<vk::PresentModeKHR> const &present_mode_priority_list,
330+
const std::vector<vk::SurfaceFormatKHR> &surface_format_priority_list,
331+
const vk::Extent2D &extent,
332+
const uint32_t image_count,
333+
const vk::SurfaceTransformFlagBitsKHR transform,
334+
const std::set<vk::ImageUsageFlagBits> &image_usage_flags,
335+
const vk::ImageCompressionFlagsEXT requested_compression,
336+
const vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate) :
285337
device{device},
286-
surface{surface}
338+
surface{surface},
339+
requested_compression{requested_compression},
340+
requested_compression_fixed_rate{requested_compression_fixed_rate}
287341
{
288342
this->present_mode_priority_list = present_mode_priority_list;
289343
this->surface_format_priority_list = surface_format_priority_list;
@@ -305,13 +359,11 @@ HPPSwapchain::HPPSwapchain(vkb::core::DeviceCpp &device,
305359
// Choose best properties based on surface capabilities
306360
vk::SurfaceCapabilitiesKHR const surface_capabilities = device.get_gpu().get_handle().getSurfaceCapabilitiesKHR(surface);
307361

308-
properties.old_swapchain = old_swapchain;
309-
properties.image_count = clamp(image_count,
310-
surface_capabilities.minImageCount,
311-
surface_capabilities.maxImageCount ? surface_capabilities.maxImageCount : std::numeric_limits<uint32_t>::max());
362+
properties.old_swapchain = old_swapchain.get_handle();
363+
properties.image_count = choose_image_count(image_count, surface_capabilities.minImageCount, surface_capabilities.maxImageCount);
312364
properties.extent = choose_extent(extent, surface_capabilities.minImageExtent, surface_capabilities.maxImageExtent, surface_capabilities.currentExtent);
313365
properties.surface_format = choose_surface_format(properties.surface_format, surface_formats, surface_format_priority_list);
314-
properties.array_layers = 1;
366+
properties.array_layers = choose_image_array_layers(1U, surface_capabilities.maxImageArrayLayers);
315367

316368
vk::FormatProperties const format_properties = device.get_gpu().get_handle().getFormatProperties(properties.surface_format.format);
317369
this->image_usage_flags = choose_image_usage(image_usage_flags, surface_capabilities.supportedUsageFlags, format_properties.optimalTilingFeatures);
@@ -321,21 +373,75 @@ HPPSwapchain::HPPSwapchain(vkb::core::DeviceCpp &device,
321373
properties.composite_alpha = choose_composite_alpha(vk::CompositeAlphaFlagBitsKHR::eInherit, surface_capabilities.supportedCompositeAlpha);
322374
properties.present_mode = choose_present_mode(present_mode, present_modes, present_mode_priority_list);
323375

324-
vk::SwapchainCreateInfoKHR const create_info{.surface = surface,
325-
.minImageCount = properties.image_count,
326-
.imageFormat = properties.surface_format.format,
327-
.imageColorSpace = properties.surface_format.colorSpace,
328-
.imageExtent = properties.extent,
329-
.imageArrayLayers = properties.array_layers,
330-
.imageUsage = properties.image_usage,
331-
.preTransform = properties.pre_transform,
332-
.compositeAlpha = properties.composite_alpha,
333-
.presentMode = properties.present_mode,
334-
.oldSwapchain = properties.old_swapchain};
376+
vk::SwapchainCreateInfoKHR create_info{.surface = surface,
377+
.minImageCount = properties.image_count,
378+
.imageFormat = properties.surface_format.format,
379+
.imageColorSpace = properties.surface_format.colorSpace,
380+
.imageExtent = properties.extent,
381+
.imageArrayLayers = properties.array_layers,
382+
.imageUsage = properties.image_usage,
383+
.preTransform = properties.pre_transform,
384+
.compositeAlpha = properties.composite_alpha,
385+
.presentMode = properties.present_mode,
386+
.oldSwapchain = properties.old_swapchain};
387+
388+
auto fixed_rate_flags = requested_compression_fixed_rate;
389+
vk::ImageCompressionControlEXT compression_control;
390+
compression_control.flags = requested_compression;
391+
if (device.is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME))
392+
{
393+
create_info.pNext = &compression_control;
394+
395+
if (vk::ImageCompressionFlagBitsEXT::eFixedRateExplicit == requested_compression)
396+
{
397+
// Do not support compression for multi-planar formats
398+
compression_control.compressionControlPlaneCount = 1;
399+
compression_control.pFixedRateFlags = &fixed_rate_flags;
400+
}
401+
else if (vk::ImageCompressionFlagBitsEXT::eDisabled == requested_compression)
402+
{
403+
LOGW("(Swapchain) Disabling default (lossless) compression, which can negatively impact performance")
404+
}
405+
}
406+
else
407+
{
408+
if (vk::ImageCompressionFlagBitsEXT::eDefault != requested_compression)
409+
{
410+
LOGW("(Swapchain) Compression cannot be controlled because VK_EXT_image_compression_control_swapchain is not enabled")
411+
412+
this->requested_compression = vk::ImageCompressionFlagBitsEXT::eDefault;
413+
this->requested_compression_fixed_rate = vk::ImageCompressionFixedRateFlagBitsEXT::eNone;
414+
}
415+
}
335416

336417
handle = device.get_handle().createSwapchainKHR(create_info);
337418

338419
images = device.get_handle().getSwapchainImagesKHR(handle);
420+
421+
if (device.is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME) &&
422+
vk::ImageCompressionFlagBitsEXT::eFixedRateDefault == requested_compression)
423+
{
424+
// Check if fixed-rate compression was applied
425+
const auto applied_compression_fixed_rate = vkb::common::query_applied_compression(device.get_handle(), images[0]).imageCompressionFixedRateFlags;
426+
427+
if (applied_compression_fixed_rate != requested_compression_fixed_rate)
428+
{
429+
LOGW("(Swapchain) Requested fixed-rate compression ({}) was not applied, instead images use {}",
430+
vk::to_string(requested_compression_fixed_rate),
431+
vk::to_string(applied_compression_fixed_rate));
432+
433+
this->requested_compression_fixed_rate = applied_compression_fixed_rate;
434+
435+
if (vk::ImageCompressionFixedRateFlagBitsEXT::eNone == applied_compression_fixed_rate)
436+
{
437+
this->requested_compression = vk::ImageCompressionFlagBitsEXT::eDefault;
438+
}
439+
}
440+
else
441+
{
442+
LOGI("(Swapchain) Applied fixed-rate compression: {}", vk::to_string(applied_compression_fixed_rate));
443+
}
444+
}
339445
}
340446

341447
HPPSwapchain::~HPPSwapchain()

0 commit comments

Comments
 (0)