Added glfw as git submodule + Catch2

Made the physical device, device, and swapchain builders take the required
parameters as constructor arugments.

Made tests optional using a cmake bool
This commit is contained in:
Charles Giessen 2020-01-30 01:15:10 -07:00
parent d9ca075c86
commit 155677ec0f
9 changed files with 51 additions and 34 deletions

6
.gitmodules vendored Normal file
View File

@ -0,0 +1,6 @@
[submodule "ext/glfw"]
path = ext/glfw
url = https://github.com/glfw/glfw
[submodule "ext/Catch2"]
path = ext/Catch2
url = https://github.com/catchorg/Catch2

View File

@ -3,10 +3,12 @@ project(VulkanBootstrap)
find_package(Vulkan REQUIRED)
find_package(glfw3)
add_library(vk-bootstrap
src/VkBootstrap.h
src/Util.h
src/Instance.h
src/Device.h
src/Swapchain.h
src/Instance.cpp
src/Device.cpp
src/Swapchain.cpp)
@ -18,12 +20,16 @@ target_link_libraries(vk-bootstrap PRIVATE ${Vulkan_LIBRARIES})
target_compile_features(vk-bootstrap PUBLIC cxx_std_11)
target_compile_options(vk-bootstrap PUBLIC -fsanitize=address)
target_link_options(vk-bootstrap PUBLIC -fsanitize=address)
option(VK_BOOTSTRAP_TEST "Test Vk-Bootstrap with glfw and Catch2" OFF)
if (VK_BOOTSTRAP_TEST)
add_subdirectory(ext/glfw)
add_subdirectory(ext/Catch2)
add_executable(vk-bootstrap-test tests/run_tests.cpp)
target_link_libraries(vk-bootstrap-test vk-bootstrap)
target_link_libraries(vk-bootstrap-test glfw)
endif(VK_BOOTSTRAP_TEST)

1
ext/Catch2 Submodule

@ -0,0 +1 @@
Subproject commit 2d172dc688ffab0867a94928159e93384475a870

1
ext/glfw Submodule

@ -0,0 +1 @@
Subproject commit d973acc123826666ecc9e6fd475682e3d84c54a6

View File

@ -276,6 +276,13 @@ PhysicalDeviceSelector::Suitable PhysicalDeviceSelector::is_device_suitable (VkP
return suitable;
}
PhysicalDeviceSelector::PhysicalDeviceSelector (Instance instance)
{
info.instance = instance.instance;
info.headless = instance.headless;
criteria.require_present = !instance.headless;
}
detail::Expected<PhysicalDevice, VkResult> PhysicalDeviceSelector::select ()
{
auto physical_devices = detail::get_vector<VkPhysicalDevice> (vkEnumeratePhysicalDevices, info.instance);
@ -311,13 +318,6 @@ detail::Expected<PhysicalDevice, VkResult> PhysicalDeviceSelector::select ()
return physical_device;
}
PhysicalDeviceSelector& PhysicalDeviceSelector::set_instance (Instance instance)
{
info.instance = instance.instance;
info.headless = instance.headless;
criteria.require_present = !instance.headless;
return *this;
}
PhysicalDeviceSelector& PhysicalDeviceSelector::set_surface (VkSurfaceKHR surface)
{
info.surface = surface;
@ -399,6 +399,8 @@ struct QueueFamily
int32_t family;
uint32_t count;
};
DeviceBuilder::DeviceBuilder (PhysicalDevice device) { info.physical_device = device; }
detail::Expected<Device, VkResult> DeviceBuilder::build ()
{
auto& queue_properties = info.physical_device.queue_family_properties;
@ -449,12 +451,6 @@ detail::Expected<Device, VkResult> DeviceBuilder::build ()
return device;
}
DeviceBuilder& DeviceBuilder::set_physical_device (PhysicalDevice const& phys_device)
{
info.physical_device = phys_device;
return *this;
}
template <typename T> DeviceBuilder& DeviceBuilder::add_pNext (T* structure)
{
if (info.pNext_chain == nullptr)

View File

@ -67,9 +67,10 @@ void populate_physical_device_details (PhysicalDevice physical_device);
struct PhysicalDeviceSelector
{
public:
PhysicalDeviceSelector (Instance instance);
detail::Expected<PhysicalDevice, VkResult> select ();
PhysicalDeviceSelector& set_instance (Instance instance);
PhysicalDeviceSelector& set_surface (VkSurfaceKHR instance);
PhysicalDeviceSelector& prefer_discrete (bool prefer_discrete = true);
@ -145,10 +146,9 @@ void destroy_device (Device device);
class DeviceBuilder
{
public:
DeviceBuilder (PhysicalDevice device);
detail::Expected<Device, VkResult> build ();
DeviceBuilder& set_physical_device (PhysicalDevice const& phys_device);
template <typename T> DeviceBuilder& add_pNext (T* structure);
private:

View File

@ -52,6 +52,14 @@ VkExtent2D choose_swap_extent (
}
}
} // namespace detail
SwapchainBuilder::SwapchainBuilder (Device const& device)
{
info.device = device.device;
info.physical_device = device.physical_device;
info.surface = device.surface;
}
detail::Expected<Swapchain, VkResult> SwapchainBuilder::build ()
{
auto surface_support =

View File

@ -26,12 +26,12 @@ struct Swapchain
class SwapchainBuilder
{
public:
SwapchainBuilder (Device const& device);
detail::Expected<Swapchain, VkResult> build ();
detail::Expected<Swapchain, VkResult> recreate (Swapchain const& swapchain);
void destroy (Swapchain const& swapchain);
SwapchainBuilder& set_device (Device const& device);
SwapchainBuilder& set_desired_format (VkFormat format);
SwapchainBuilder& set_fallback_format (VkFormat format);

View File

@ -37,13 +37,13 @@ int test_happy_path ()
auto surface = create_surface_glfw (instance.instance, window);
vkbs::PhysicalDeviceSelector phys_device_selector;
auto phys_device_ret = phys_device_selector.set_instance (instance).set_surface (surface).select ();
vkbs::PhysicalDeviceSelector phys_device_selector (instance);
auto phys_device_ret = phys_device_selector.set_surface (surface).select ();
if (!phys_device_ret) return -2; // couldn't select physical device
vkbs::PhysicalDevice physical_device = phys_device_ret.value ();
vkbs::DeviceBuilder device_builder;
auto device_ret = device_builder.set_physical_device (physical_device).build ();
vkbs::DeviceBuilder device_builder (physical_device);
auto device_ret = device_builder.build ();
if (!device_ret) return -3; // couldn't create device
vkbs::Device device = device_ret.value ();
@ -110,9 +110,8 @@ int test_physical_device_selection ()
auto window = create_window_glfw ();
auto surface = create_surface_glfw (instance.instance, window);
vkbs::PhysicalDeviceSelector selector;
auto phys_dev_ret = selector.set_instance (instance)
.set_surface (surface)
vkbs::PhysicalDeviceSelector selector (instance);
auto phys_dev_ret = selector.set_surface (surface)
.add_desired_extension (VK_KHR_MULTIVIEW_EXTENSION_NAME)
.add_required_extension (VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)
.set_minimum_version (1, 0)
@ -135,12 +134,12 @@ int test_device_creation ()
auto window = create_window_glfw ();
auto surface = create_surface_glfw (instance.instance, window);
vkbs::PhysicalDeviceSelector selector;
auto phys_dev_ret = selector.set_instance (instance).set_surface (surface).select ();
vkbs::PhysicalDeviceSelector selector (instance);
auto phys_dev_ret = selector.set_surface (surface).select ();
auto phys_dev = phys_dev_ret.value ();
vkbs::DeviceBuilder device_builder;
auto dev_ret = device_builder.set_physical_device (phys_dev).build ();
vkbs::DeviceBuilder device_builder (phys_dev);
auto dev_ret = device_builder.build ();
if (!dev_ret.has_value ())
{
printf ("%s\n", dev_ret.error ().msg);