Skip to content

Commit

Permalink
Add opt-in robustness2 support.
Browse files Browse the repository at this point in the history
  • Loading branch information
Themaister committed Feb 20, 2025
1 parent a1c8a36 commit 83f380f
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 1 deletion.
3 changes: 3 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ endif()
add_granite_offline_tool(sampler-precision sampler_precision.cpp)
target_compile_definitions(sampler-precision PRIVATE ASSET_DIRECTORY=\"${CMAKE_CURRENT_SOURCE_DIR}/assets\")

add_granite_offline_tool(robustness2-test robustness2.cpp)
target_compile_definitions(robustness2-test PRIVATE ASSET_DIRECTORY=\"${CMAKE_CURRENT_SOURCE_DIR}/assets\")

add_granite_offline_tool(thread-group-test thread_group_test.cpp)
add_granite_offline_tool(intrusive-test intrusive_ptr_test.cpp)
add_granite_offline_tool(lru-cache-test lru_cache_test.cpp)
Expand Down
19 changes: 19 additions & 0 deletions tests/assets/shaders/robustness2.comp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#version 450

layout(local_size_x = 1) in;

layout(set = 0, binding = 0) readonly buffer Buf0
{
layout(offset = 16) mat2x4 m;
};

layout(set = 0, binding = 1) writeonly buffer Output
{
mat2x4 data;
};

void main()
{
mat2x4 loaded = m;
data = loaded;
}
80 changes: 80 additions & 0 deletions tests/robustness2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#include "application.hpp"
#include "global_managers_init.hpp"
#include "os_filesystem.hpp"
#include "device.hpp"
#include "thread_group.hpp"
#include "context.hpp"
#include "environment.hpp"

using namespace Granite;
using namespace Vulkan;

static int main_inner()
{
if (!Context::init_loader(nullptr))
return 1;

Context ctx;

Context::SystemHandles handles;
handles.filesystem = GRANITE_FILESYSTEM();
handles.thread_group = GRANITE_THREAD_GROUP();
ctx.set_system_handles(handles);

if (!ctx.init_instance_and_device(nullptr, 0, nullptr, 0, CONTEXT_CREATION_ENABLE_ROBUSTNESS_2_BIT))
return 1;

Device dev;
dev.set_context(ctx);

dev.init_renderdoc_capture();
dev.begin_renderdoc_capture();

auto cmd = dev.request_command_buffer();
cmd->set_program("assets://shaders/robustness2.comp");

static const vec4 input_data[] = {
vec4(10, 11, 12, 13),
vec4(14, 15, 16, 17),
vec4(20, 21, 22, 23),
vec4(24, 25, 26, 27),
};

BufferCreateInfo buf;
buf.size = sizeof(input_data);
buf.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
buf.domain = BufferDomain::CachedHost;
auto input_ssbo = dev.create_buffer(buf, input_data);

buf.size = sizeof(vec4) * 2;
auto output_ssbo = dev.create_buffer(buf);

cmd->set_storage_buffer(0, 0, *input_ssbo, 0, 28);
cmd->set_storage_buffer(0, 1, *output_ssbo);
cmd->dispatch(1, 1, 1);
cmd->barrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
VK_PIPELINE_STAGE_HOST_BIT, VK_ACCESS_HOST_READ_BIT);
dev.submit(cmd);
dev.wait_idle();

auto *ptr = static_cast<const float *>(dev.map_host_buffer(*output_ssbo, MEMORY_ACCESS_READ_BIT));
for (unsigned i = 0; i < 8; i++)
LOGI("Output %u = %f\n", i, ptr[i]);

dev.end_renderdoc_capture();

return 0;
}

int main()
{
Global::init();

#ifdef ASSET_DIRECTORY
auto asset_dir = Util::get_environment_string("ASSET_DIRECTORY", ASSET_DIRECTORY);
GRANITE_FILESYSTEM()->register_protocol("assets", std::unique_ptr<FilesystemBackend>(new OSFilesystem(asset_dir)));
#endif
int ret = main_inner();
Global::deinit();
return ret;
}
5 changes: 5 additions & 0 deletions vulkan/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1481,6 +1481,9 @@ bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface,
ADD_CHAIN(ext.pipeline_binary_features, PIPELINE_BINARY_FEATURES_KHR);
}

if ((flags & CONTEXT_CREATION_ENABLE_ROBUSTNESS_2_BIT) != 0 && has_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME))
ADD_CHAIN(ext.robustness2_features, ROBUSTNESS_2_FEATURES_EXT);

if ((flags & CONTEXT_CREATION_ENABLE_ADVANCED_WSI_BIT) != 0 && requires_swapchain)
{
if (has_extension(VK_KHR_PRESENT_ID_EXTENSION_NAME))
Expand Down Expand Up @@ -1597,6 +1600,8 @@ bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface,
// Enable device features we might care about.
{
VkPhysicalDeviceFeatures enabled_features = *required_features;
if (pdf2.features.robustBufferAccess && (flags & CONTEXT_CREATION_ENABLE_ROBUSTNESS_2_BIT) != 0)
enabled_features.robustBufferAccess = VK_TRUE;
if (pdf2.features.textureCompressionETC2)
enabled_features.textureCompressionETC2 = VK_TRUE;
if (pdf2.features.textureCompressionBC)
Expand Down
4 changes: 3 additions & 1 deletion vulkan/context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ struct DeviceFeatures
VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT image_compression_control_swapchain_features = {};
VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT device_generated_commands_features = {};
VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT device_generated_commands_properties = {};
VkPhysicalDeviceRobustness2FeaturesEXT robustness2_features = {};

// Vendor
VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV descriptor_pool_overallocation_features = {};
Expand Down Expand Up @@ -154,7 +155,8 @@ enum ContextCreationFlagBits
CONTEXT_CREATION_ENABLE_VIDEO_H264_BIT = 1 << 3,
CONTEXT_CREATION_ENABLE_VIDEO_H265_BIT = 1 << 4,
CONTEXT_CREATION_ENABLE_PIPELINE_BINARY_BIT = 1 << 5,
CONTEXT_CREATION_ENABLE_PUSH_DESCRIPTOR_BIT = 1 << 6
CONTEXT_CREATION_ENABLE_PUSH_DESCRIPTOR_BIT = 1 << 6,
CONTEXT_CREATION_ENABLE_ROBUSTNESS_2_BIT = 1 << 7
};
using ContextCreationFlags = uint32_t;

Expand Down

0 comments on commit 83f380f

Please sign in to comment.