Skip to content

Commit

Permalink
vulkan: Enable VULKAN_HPP_NO_EXCEPTIONS broadly.
Browse files Browse the repository at this point in the history
  • Loading branch information
squidbus committed Sep 20, 2024
1 parent 048b8ae commit 26dd3bd
Show file tree
Hide file tree
Showing 20 changed files with 172 additions and 92 deletions.
1 change: 0 additions & 1 deletion src/imgui/renderer/imgui_impl_vulkan.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

#pragma once

#define VULKAN_HPP_NO_EXCEPTIONS
#include "video_core/renderer_vulkan/vk_common.h"

struct ImDrawData;
Expand Down
6 changes: 4 additions & 2 deletions src/video_core/buffer_cache/buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,11 @@ vk::BufferView Buffer::View(u32 offset, u32 size, bool is_written, AmdGpu::DataF
.range = size,
};
const auto view = instance->GetDevice().createBufferView(view_ci);
ASSERT_MSG(view.result == vk::Result::eSuccess, "Failed to create buffer view: {}",
vk::to_string(view.result));
scheduler->DeferOperation(
[view, device = instance->GetDevice()] { device.destroyBufferView(view); });
return view;
[view, device = instance->GetDevice()] { device.destroyBufferView(view.value); });
return view.value;
}

constexpr u64 WATCHES_INITIAL_RESERVE = 0x4000;
Expand Down
10 changes: 8 additions & 2 deletions src/video_core/renderer_vulkan/renderer_vulkan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,10 @@ RendererVulkan::RendererVulkan(Frontend::WindowSDL& window_, AmdGpu::Liverpool*
present_frames.resize(num_images);
for (u32 i = 0; i < num_images; i++) {
Frame& frame = present_frames[i];
frame.present_done = device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled});
auto fence_result = device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled});
ASSERT_MSG(fence_result.result == vk::Result::eSuccess,
"Failed to create present done fence: {}", vk::to_string(fence_result.result));
frame.present_done = fence_result.value;
free_queue.push(&frame);
}

Expand Down Expand Up @@ -157,7 +160,10 @@ void RendererVulkan::RecreateFrame(Frame* frame, u32 width, u32 height) {
.layerCount = 1,
},
};
frame->image_view = device.createImageView(view_info);
auto view_result = device.createImageView(view_info);
ASSERT_MSG(view_result.result == vk::Result::eSuccess, "Failed to create frame image view: {}",
vk::to_string(view_result.result));
frame->image_view = view_result.value;
frame->width = width;
frame->height = height;
}
Expand Down
1 change: 1 addition & 0 deletions src/video_core/renderer_vulkan/vk_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#define VULKAN_HPP_NO_CONSTRUCTORS
#define VULKAN_HPP_NO_STRUCT_SETTERS
#define VULKAN_HPP_HAS_SPACESHIP_OPERATOR
#define VULKAN_HPP_NO_EXCEPTIONS
#include <vulkan/vulkan.hpp>

#define VMA_STATIC_VULKAN_FUNCTIONS 0
Expand Down
22 changes: 14 additions & 8 deletions src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,12 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler
.bindingCount = static_cast<u32>(bindings.size()),
.pBindings = bindings.data(),
};
desc_layout = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
auto descriptor_set_result =
instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
ASSERT_MSG(descriptor_set_result.result == vk::Result::eSuccess,
"Failed to create compute descriptor set layout: {}",
vk::to_string(descriptor_set_result.result));
desc_layout = std::move(descriptor_set_result.value);

const vk::DescriptorSetLayout set_layout = *desc_layout;
const vk::PipelineLayoutCreateInfo layout_info = {
Expand All @@ -86,19 +91,20 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler
.pushConstantRangeCount = 1U,
.pPushConstantRanges = &push_constants,
};
pipeline_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info);
auto layout_result = instance.GetDevice().createPipelineLayoutUnique(layout_info);
ASSERT_MSG(layout_result.result == vk::Result::eSuccess,
"Failed to create compute pipeline layout: {}", vk::to_string(layout_result.result));
pipeline_layout = std::move(layout_result.value);

const vk::ComputePipelineCreateInfo compute_pipeline_ci = {
.stage = shader_ci,
.layout = *pipeline_layout,
};
auto result =
auto pipeline_result =
instance.GetDevice().createComputePipelineUnique(pipeline_cache, compute_pipeline_ci);
if (result.result == vk::Result::eSuccess) {
pipeline = std::move(result.value);
} else {
UNREACHABLE_MSG("Graphics pipeline creation failed!");
}
ASSERT_MSG(pipeline_result.result == vk::Result::eSuccess,
"Failed to create compute pipeline: {}", vk::to_string(pipeline_result.result));
pipeline = std::move(pipeline_result.value);
}

ComputePipeline::~ComputePipeline() = default;
Expand Down
21 changes: 13 additions & 8 deletions src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
.pushConstantRangeCount = 1,
.pPushConstantRanges = &push_constants,
};
pipeline_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info);
auto layout_result = instance.GetDevice().createPipelineLayoutUnique(layout_info);
ASSERT_MSG(layout_result.result == vk::Result::eSuccess,
"Failed to create graphics pipeline layout: {}",
vk::to_string(layout_result.result));
pipeline_layout = std::move(layout_result.value);

boost::container::static_vector<vk::VertexInputBindingDescription, 32> bindings;
boost::container::static_vector<vk::VertexInputAttributeDescription, 32> attributes;
Expand Down Expand Up @@ -280,12 +284,10 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
.layout = *pipeline_layout,
};

auto result = device.createGraphicsPipelineUnique(pipeline_cache, pipeline_info);
if (result.result == vk::Result::eSuccess) {
pipeline = std::move(result.value);
} else {
UNREACHABLE_MSG("Graphics pipeline creation failed!");
}
auto pipeline_result = device.createGraphicsPipelineUnique(pipeline_cache, pipeline_info);
ASSERT_MSG(pipeline_result.result == vk::Result::eSuccess,
"Failed to create graphics pipeline: {}", vk::to_string(pipeline_result.result));
pipeline = std::move(pipeline_result.value);
}

GraphicsPipeline::~GraphicsPipeline() = default;
Expand Down Expand Up @@ -343,7 +345,10 @@ void GraphicsPipeline::BuildDescSetLayout() {
.bindingCount = static_cast<u32>(bindings.size()),
.pBindings = bindings.data(),
};
desc_layout = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
auto result = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
ASSERT_MSG(result.result == vk::Result::eSuccess,
"Failed to create graphics descriptor set layout: {}", vk::to_string(result.result));
desc_layout = std::move(result.value);
}

void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
Expand Down
41 changes: 28 additions & 13 deletions src/video_core/renderer_vulkan/vk_instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,23 @@ namespace Vulkan {

namespace {

std::vector<vk::PhysicalDevice> EnumeratePhysicalDevices(vk::UniqueInstance& instance) {
auto devices_result = instance->enumeratePhysicalDevices();
ASSERT_MSG(devices_result.result == vk::Result::eSuccess,
"Failed to enumerate physical devices: {}", vk::to_string(devices_result.result));
return std::move(devices_result.value);
}

std::vector<std::string> GetSupportedExtensions(vk::PhysicalDevice physical) {
const std::vector extensions = physical.enumerateDeviceExtensionProperties();
const auto extensions = physical.enumerateDeviceExtensionProperties();
if (extensions.result != vk::Result::eSuccess) {
LOG_ERROR(Render_Vulkan, "Could not query supported extensions: {}",
vk::to_string(extensions.result));
return {};
}
std::vector<std::string> supported_extensions;
supported_extensions.reserve(extensions.size());
for (const auto& extension : extensions) {
supported_extensions.reserve(extensions.value.size());
for (const auto& extension : extensions.value) {
supported_extensions.emplace_back(extension.extensionName.data());
}
return supported_extensions;
Expand All @@ -52,13 +64,13 @@ std::string GetReadableVersion(u32 version) {
Instance::Instance(bool enable_validation, bool enable_crash_diagnostic)
: instance{CreateInstance(Frontend::WindowSystemType::Headless, enable_validation,
enable_crash_diagnostic)},
physical_devices{instance->enumeratePhysicalDevices()} {}
physical_devices{EnumeratePhysicalDevices(instance)} {}

Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index,
bool enable_validation /*= false*/, bool enable_crash_diagnostic /*= false*/)
: instance{CreateInstance(window.getWindowInfo().type, enable_validation,
enable_crash_diagnostic)},
physical_devices{instance->enumeratePhysicalDevices()} {
physical_devices{EnumeratePhysicalDevices(instance)} {
if (enable_validation) {
debug_callback = CreateDebugCallback(*instance);
}
Expand Down Expand Up @@ -385,15 +397,13 @@ bool Instance::CreateDevice() {
device_chain.unlink<vk::PhysicalDeviceVertexInputDynamicStateFeaturesEXT>();
}

try {
device = physical_device.createDeviceUnique(device_chain.get());
} catch (vk::ExtensionNotPresentError& err) {
LOG_CRITICAL(Render_Vulkan, "Some required extensions are not available {}", err.what());
return false;
} catch (vk::FeatureNotPresentError& err) {
LOG_CRITICAL(Render_Vulkan, "Some required features are not available {}", err.what());
auto device_result = physical_device.createDeviceUnique(device_chain.get());
if (device_result.result != vk::Result::eSuccess) {
LOG_CRITICAL(Render_Vulkan, "Failed to create device: {}",
vk::to_string(device_result.result));
return false;
}
device = std::move(device_result.value);

VULKAN_HPP_DEFAULT_DISPATCHER.init(*device);

Expand Down Expand Up @@ -478,7 +488,12 @@ void Instance::CollectToolingInfo() {
return;
}
const auto tools = physical_device.getToolPropertiesEXT();
for (const vk::PhysicalDeviceToolProperties& tool : tools) {
if (tools.result != vk::Result::eSuccess) {
LOG_ERROR(Render_Vulkan, "Could not get Vulkan tool properties: {}",
vk::to_string(tools.result));
return;
}
for (const vk::PhysicalDeviceToolProperties& tool : tools.value) {
const std::string_view name = tool.name;
LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", name);
has_renderdoc = has_renderdoc || name == "RenderDoc";
Expand Down
13 changes: 11 additions & 2 deletions src/video_core/renderer_vulkan/vk_master_semaphore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include "video_core/renderer_vulkan/vk_instance.h"
#include "video_core/renderer_vulkan/vk_master_semaphore.h"

#include "common/assert.h"

namespace Vulkan {

constexpr u64 WAIT_TIMEOUT = std::numeric_limits<u64>::max();
Expand All @@ -17,7 +19,10 @@ MasterSemaphore::MasterSemaphore(const Instance& instance_) : instance{instance_
.initialValue = 0,
},
};
semaphore = instance.GetDevice().createSemaphoreUnique(semaphore_chain.get());
auto result = instance.GetDevice().createSemaphoreUnique(semaphore_chain.get());
ASSERT_MSG(result.result == vk::Result::eSuccess, "Failed to create master semaphore: {}",
vk::to_string(result.result));
semaphore = std::move(result.value);
}

MasterSemaphore::~MasterSemaphore() = default;
Expand All @@ -27,7 +32,11 @@ void MasterSemaphore::Refresh() {
u64 counter{};
do {
this_tick = gpu_tick.load(std::memory_order_acquire);
counter = instance.GetDevice().getSemaphoreCounterValue(*semaphore);
auto counter_result = instance.GetDevice().getSemaphoreCounterValue(*semaphore);
ASSERT_MSG(counter_result.result == vk::Result::eSuccess,
"Failed to get master semaphore value: {}",
vk::to_string(counter_result.result));
counter = counter_result.value;
if (counter < this_tick) {
return;
}
Expand Down
5 changes: 4 additions & 1 deletion src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,10 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_,
.subgroup_size = instance.SubgroupSize(),
.support_explicit_workgroup_layout = true,
};
pipeline_cache = instance.GetDevice().createPipelineCacheUnique({});
auto cache_result = instance.GetDevice().createPipelineCacheUnique({});
ASSERT_MSG(cache_result.result == vk::Result::eSuccess, "Failed to create pipeline cache: {}",
vk::to_string(cache_result.result));
pipeline_cache = std::move(cache_result.value);
}

PipelineCache::~PipelineCache() = default;
Expand Down
37 changes: 23 additions & 14 deletions src/video_core/renderer_vulkan/vk_platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,11 +135,13 @@ vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::WindowSDL& e

std::vector<const char*> GetInstanceExtensions(Frontend::WindowSystemType window_type,
bool enable_debug_utils) {
const auto properties = vk::enumerateInstanceExtensionProperties();
if (properties.empty()) {
LOG_ERROR(Render_Vulkan, "Failed to query extension properties");
const auto properties_result = vk::enumerateInstanceExtensionProperties();
if (properties_result.result != vk::Result::eSuccess || properties_result.value.empty()) {
LOG_ERROR(Render_Vulkan, "Failed to query extension properties: {}",
vk::to_string(properties_result.result));
return {};
}
const auto& properties = properties_result.value;

// Add the windowing system specific extension
std::vector<const char*> extensions;
Expand Down Expand Up @@ -208,14 +210,16 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e
#endif
VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr);

const u32 available_version = VULKAN_HPP_DEFAULT_DISPATCHER.vkEnumerateInstanceVersion
? vk::enumerateInstanceVersion()
: VK_API_VERSION_1_0;

ASSERT_MSG(available_version >= TargetVulkanApiVersion,
const auto available_version = VULKAN_HPP_DEFAULT_DISPATCHER.vkEnumerateInstanceVersion
? vk::enumerateInstanceVersion()
: vk::ResultValue(vk::Result::eSuccess, VK_API_VERSION_1_0);
ASSERT_MSG(available_version.result == vk::Result::eSuccess,
"Failed to query Vulkan API version: {}", vk::to_string(available_version.result));
ASSERT_MSG(available_version.value >= TargetVulkanApiVersion,
"Vulkan {}.{} is required, but only {}.{} is supported by instance!",
VK_VERSION_MAJOR(TargetVulkanApiVersion), VK_VERSION_MINOR(TargetVulkanApiVersion),
VK_VERSION_MAJOR(available_version), VK_VERSION_MINOR(available_version));
VK_VERSION_MAJOR(available_version.value),
VK_VERSION_MINOR(available_version.value));

const auto extensions = GetInstanceExtensions(window_type, true);

Expand All @@ -224,7 +228,7 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e
.applicationVersion = VK_MAKE_VERSION(1, 0, 0),
.pEngineName = "shadPS4 Vulkan",
.engineVersion = VK_MAKE_VERSION(1, 0, 0),
.apiVersion = available_version,
.apiVersion = available_version.value,
};

u32 num_layers = 0;
Expand Down Expand Up @@ -342,11 +346,13 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e
},
};

auto instance = vk::createInstanceUnique(instance_ci_chain.get());
auto instance_result = vk::createInstanceUnique(instance_ci_chain.get());
ASSERT_MSG(instance_result.result == vk::Result::eSuccess, "Failed to create instance: {}",
vk::to_string(instance_result.result));

VULKAN_HPP_DEFAULT_DISPATCHER.init(*instance);
VULKAN_HPP_DEFAULT_DISPATCHER.init(*instance_result.value);

return instance;
return std::move(instance_result.value);
}

vk::UniqueDebugUtilsMessengerEXT CreateDebugCallback(vk::Instance instance) {
Expand All @@ -360,7 +366,10 @@ vk::UniqueDebugUtilsMessengerEXT CreateDebugCallback(vk::Instance instance) {
vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance,
.pfnUserCallback = DebugUtilsCallback,
};
return instance.createDebugUtilsMessengerEXTUnique(msg_ci);
auto result = instance.createDebugUtilsMessengerEXTUnique(msg_ci);
ASSERT_MSG(result.result == vk::Result::eSuccess, "Failed to create debug callback: {}",
vk::to_string(result.result));
return std::move(result.value);
}

} // namespace Vulkan
1 change: 0 additions & 1 deletion src/video_core/renderer_vulkan/vk_rasterizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ Rasterizer::Rasterizer(const Instance& instance_, Scheduler& scheduler_,
liverpool->BindRasterizer(this);
}
memory->SetRasterizer(this);
wfi_event = instance.GetDevice().createEventUnique({});
}

Rasterizer::~Rasterizer() = default;
Expand Down
1 change: 0 additions & 1 deletion src/video_core/renderer_vulkan/vk_rasterizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ class Rasterizer {
AmdGpu::Liverpool* liverpool;
Core::MemoryManager* memory;
PipelineCache pipeline_cache;
vk::UniqueEvent wfi_event;
};

} // namespace Vulkan
10 changes: 8 additions & 2 deletions src/video_core/renderer_vulkan/vk_resource_pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ CommandPool::CommandPool(const Instance& instance, MasterSemaphore* master_semap
.queueFamilyIndex = instance.GetGraphicsQueueFamilyIndex(),
};
const vk::Device device = instance.GetDevice();
cmd_pool = device.createCommandPoolUnique(pool_create_info);
auto result = device.createCommandPoolUnique(pool_create_info);
ASSERT_MSG(result.result == vk::Result::eSuccess, "Failed to create command pool: {}",
vk::to_string(result.result));
cmd_pool = std::move(result.value);
if (instance.HasDebuggingToolAttached()) {
SetObjectName(device, *cmd_pool, "CommandPool");
}
Expand Down Expand Up @@ -182,7 +185,10 @@ void DescriptorHeap::CreateDescriptorPool() {
.poolSizeCount = static_cast<u32>(pool_sizes.size()),
.pPoolSizes = pool_sizes.data(),
};
curr_pool = device.createDescriptorPool(pool_info);
auto result = device.createDescriptorPool(pool_info);
ASSERT_MSG(result.result == vk::Result::eSuccess, "Failed to create descriptor pool: {}",
vk::to_string(result.result));
curr_pool = result.value;
}

} // namespace Vulkan
7 changes: 2 additions & 5 deletions src/video_core/renderer_vulkan/vk_scheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,8 @@ void Scheduler::SubmitExecution(SubmitInfo& info) {
.pSignalSemaphores = info.signal_semas.data(),
};

try {
instance.GetGraphicsQueue().submit(submit_info, info.fence);
} catch (vk::DeviceLostError& err) {
UNREACHABLE_MSG("Device lost during submit: {}", err.what());
}
auto submit_result = instance.GetGraphicsQueue().submit(submit_info, info.fence);
ASSERT_MSG(submit_result != vk::Result::eErrorDeviceLost, "Device lost during submit");

master_semaphore.Refresh();
AllocateWorkerCommandBuffers();
Expand Down
Loading

0 comments on commit 26dd3bd

Please sign in to comment.