Enable VK_EXT_image_2d_view_of_3d and create 2D view compatible images if supported (#4397)

This commit is contained in:
Marcin Mikołajczyk
2026-05-12 05:13:08 +02:00
committed by GitHub
parent 89b886348e
commit b3bb383982
3 changed files with 29 additions and 1 deletions
+18 -1
View File
@@ -203,7 +203,8 @@ bool Instance::CreateDevice() {
vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT,
vk::PhysicalDevicePortabilitySubsetFeaturesKHR,
vk::PhysicalDeviceShaderAtomicFloat2FeaturesEXT,
vk::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>();
vk::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR,
vk::PhysicalDeviceImage2DViewOf3DFeaturesEXT>();
features = feature_chain.get().features;
const vk::StructureChain properties_chain = physical_device.getProperties2<
@@ -313,6 +314,15 @@ bool Instance::CreateDevice() {
Render_Vulkan, "- workgroupMemoryExplicitLayout16BitAccess: {}",
workgroup_memory_explicit_layout_features.workgroupMemoryExplicitLayout16BitAccess);
}
image_2d_view_of_3d = add_extension(VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME);
if (image_2d_view_of_3d) {
image_2d_view_of_3d_features =
feature_chain.get<vk::PhysicalDeviceImage2DViewOf3DFeaturesEXT>();
LOG_INFO(Render_Vulkan, "- image2DViewOf3D: {}",
image_2d_view_of_3d_features.image2DViewOf3D);
LOG_INFO(Render_Vulkan, "- sampler2DViewOf3D: {}",
image_2d_view_of_3d_features.sampler2DViewOf3D);
}
const bool calibrated_timestamps =
TRACY_GPU_ENABLED ? add_extension(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME) : false;
@@ -490,6 +500,10 @@ bool Instance::CreateDevice() {
.workgroupMemoryExplicitLayout16BitAccess =
workgroup_memory_explicit_layout_features.workgroupMemoryExplicitLayout16BitAccess,
},
vk::PhysicalDeviceImage2DViewOf3DFeaturesEXT{
.image2DViewOf3D = image_2d_view_of_3d_features.image2DViewOf3D,
.sampler2DViewOf3D = image_2d_view_of_3d_features.sampler2DViewOf3D,
},
#ifdef __APPLE__
vk::PhysicalDevicePortabilitySubsetFeaturesKHR{
.constantAlphaColorBlendFactors = portability_features.constantAlphaColorBlendFactors,
@@ -556,6 +570,9 @@ bool Instance::CreateDevice() {
if (!workgroup_memory_explicit_layout) {
device_chain.unlink<vk::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>();
}
if (!image_2d_view_of_3d) {
device_chain.unlink<vk::PhysicalDeviceImage2DViewOf3DFeaturesEXT>();
}
auto [device_result, dev] = physical_device.createDeviceUnique(device_chain.get());
if (device_result != vk::Result::eSuccess) {
@@ -427,6 +427,12 @@ public:
return supports_block_texel_view;
}
/// Returns whether VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT is supported on 3D images
bool Is2dViewOf3dSupported() const {
return image_2d_view_of_3d && image_2d_view_of_3d_features.image2DViewOf3D &&
image_2d_view_of_3d_features.sampler2DViewOf3D;
}
/// Returns whether the device can report memory usage.
bool CanReportMemoryUsage() const {
return supports_memory_budget;
@@ -478,6 +484,7 @@ private:
vk::PhysicalDeviceShaderAtomicFloat2FeaturesEXT shader_atomic_float2_features;
vk::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR
workgroup_memory_explicit_layout_features;
vk::PhysicalDeviceImage2DViewOf3DFeaturesEXT image_2d_view_of_3d_features;
vk::DriverIdKHR driver_id;
vk::UniqueDebugUtilsMessengerEXT debug_callback{};
std::string vendor_name;
@@ -513,6 +520,7 @@ private:
bool portability_subset{};
bool maintenance_8{};
bool attachment_feedback_loop{};
bool image_2d_view_of_3d{};
bool supports_memory_budget{};
bool supports_block_texel_view{};
u64 total_memory_budget{};
+3
View File
@@ -126,6 +126,9 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_,
vk::ImageCreateFlagBits::eExtendedUsage};
if (info.props.is_volume) {
flags |= vk::ImageCreateFlagBits::e2DArrayCompatible;
if (instance->Is2dViewOf3dSupported()) {
flags |= vk::ImageCreateFlagBits::e2DViewCompatibleEXT;
}
}
if (info.props.is_block && instance->IsBlockTexelViewSupported()) {
flags |= vk::ImageCreateFlagBits::eBlockTexelViewCompatible;