From 99d0ec6f31ef18deb98b1fead4204879713819ed Mon Sep 17 00:00:00 2001 From: shg8 Date: Thu, 15 Feb 2024 02:21:10 -0800 Subject: [PATCH 1/2] Support for MSVC --- 3dgs/GSScene.h | 3 ++- 3dgs/Renderer.cpp | 4 ++-- 3dgs/Renderer.h | 5 ----- CMakeLists.txt | 45 +++++++++++++++++++++++++++++++--------- vulkan/VulkanContext.cpp | 3 +++ 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/3dgs/GSScene.h b/3dgs/GSScene.h index f24768e..b308149 100644 --- a/3dgs/GSScene.h +++ b/3dgs/GSScene.h @@ -24,7 +24,8 @@ class GSScene { public: explicit GSScene(const std::string& filename) : filename(filename) { - if (!std::filesystem::exists(filename)) { + std::filesystem::path file = std::filesystem::current_path() / filename; + if (!std::filesystem::exists(file)) { throw std::runtime_error("File does not exist"); } } diff --git a/3dgs/Renderer.cpp b/3dgs/Renderer.cpp index fc39fbe..1a4cb2a 100644 --- a/3dgs/Renderer.cpp +++ b/3dgs/Renderer.cpp @@ -12,7 +12,6 @@ #include #include "../vulkan/Utils.h" -#include "radix_sort/platforms/vk/radix_sort_vk.h" #define SORT_ALLOCATE_MULTIPLIER 1000 @@ -74,6 +73,7 @@ void Renderer::initializeVulkan() { vk::PhysicalDeviceVulkan11Features pdf11{}; vk::PhysicalDeviceVulkan12Features pdf12{}; pdf.shaderInt64 = true; + pdf12.shaderFloat16 = true; pdf12.shaderBufferInt64Atomics = true; pdf12.shaderSharedInt64Atomics = true; @@ -569,5 +569,5 @@ void Renderer::updateUniforms() { } Renderer::~Renderer() { - radix_sort_vk_destroy(radixSortPipeline, context->device.get(), nullptr); + } diff --git a/3dgs/Renderer.h b/3dgs/Renderer.h index c83c197..0da0a71 100644 --- a/3dgs/Renderer.h +++ b/3dgs/Renderer.h @@ -10,7 +10,6 @@ #include "../vulkan/pipelines/ComputePipeline.h" #include "../vulkan/Swapchain.h" #include -#include struct RendererConfiguration { bool enableVulkanValidationLayers = false; @@ -117,10 +116,6 @@ class Renderer { vk::UniqueCommandBuffer preprocessCommandBuffer; vk::UniqueCommandBuffer renderCommandBuffer; - const radix_sort_vk_target_t* radixSortTarget; - radix_sort_vk_t* radixSortPipeline; - radix_sort_vk_memory_requirements_t radixSortRequirements = {}; - uint32_t currentImageIndex; std::vector renderFinishedSemaphores; diff --git a/CMakeLists.txt b/CMakeLists.txt index 967981a..6b496c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,14 +3,42 @@ project(vulkan_splatting) include(FetchContent) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) find_package(Vulkan COMPONENTS glslc) -find_package(glfw3 3.3 REQUIRED) -find_package(glm REQUIRED) +if (MSVC) + FetchContent_Declare( + glfw + GIT_REPOSITORY https://github.com/glfw/glfw + GIT_TAG 3.3.9 + ) + + FetchContent_GetProperties(glfw) + if (NOT glfw_POPULATED) + FetchContent_Populate(glfw) + + set(GLFW_INSTALL OFF CACHE INTERNAL "Create GLFW installation target") + set(GLFW_BUILD_DOCS OFF CACHE INTERNAL "Build GLFW documentation") + set(GLFW_BUILD_TESTS OFF CACHE INTERNAL "Build GLFW test programs") + set(GLFW_BUILD_EXAMPLES OFF CACHE INTERNAL "Build GLFW examples") + + add_subdirectory(${glfw_SOURCE_DIR} ${glfw_BINARY_DIR}) + endif() + + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup") + + FetchContent_Declare( + glm + GIT_REPOSITORY https://github.com/g-truc/glm + GIT_TAG 1.0.0 + ) + FetchContent_MakeAvailable(glm) +else () + find_package(glfw3 3.3 REQUIRED) + find_package(glm REQUIRED) +endif () -find_program(glslc_executable NAMES glslc HINTS Vulkan::glslc) FetchContent_Declare(libenvpp GIT_REPOSITORY https://github.com/ph3at/libenvpp.git @@ -18,9 +46,6 @@ FetchContent_Declare(libenvpp ) FetchContent_MakeAvailable(libenvpp) -FetchContent_Declare(fuchsia_radix_sort GIT_REPOSITORY https://github.com/juliusikkala/fuchsia_radix_sort.git GIT_TAG main) -FetchContent_MakeAvailable(fuchsia_radix_sort) - if (APPLE) add_compile_definitions(__APPLE__) endif () @@ -45,7 +70,7 @@ foreach (GLSL ${GLSL_SOURCE_FILES}) add_custom_command( OUTPUT ${SPIRV} COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/shaders/" - COMMAND ${glslc_executable} ${GLSL} -o ${SPIRV} ${GLSLC_DEFINE} "--target-env=vulkan1.2" + COMMAND ${Vulkan_GLSLC_EXECUTABLE} ${GLSL} -o ${SPIRV} ${GLSLC_DEFINE} "--target-env=vulkan1.2" DEPENDS ${GLSL}) list(APPEND SPIRV_BINARY_FILES ${SPIRV}) endforeach (GLSL) @@ -79,9 +104,9 @@ add_executable(vulkan_splatting main.cpp add_dependencies(vulkan_splatting Shaders) -target_include_directories(vulkan_splatting PUBLIC ${Vulkan_INCLUDE_DIRS} ${GLM_INCLUDE_DIRS} ${VK_RADIX_SORT_INCLUDE_DIRS}) +target_include_directories(vulkan_splatting PUBLIC ${Vulkan_INCLUDE_DIRS} ${GLM_INCLUDE_DIRS}) -target_link_libraries(vulkan_splatting PUBLIC glfw libenvpp::libenvpp vk-radix-sort) +target_link_libraries(vulkan_splatting PUBLIC glfw libenvpp::libenvpp) target_link_libraries(vulkan_splatting PUBLIC Vulkan::Vulkan) add_custom_command(TARGET vulkan_splatting POST_BUILD diff --git a/vulkan/VulkanContext.cpp b/vulkan/VulkanContext.cpp index 7c30d7b..0e8b6eb 100644 --- a/vulkan/VulkanContext.cpp +++ b/vulkan/VulkanContext.cpp @@ -44,6 +44,9 @@ VulkanContext::VulkanContext(const std::vector &instance_extensions deviceExtensions.push_back("VK_KHR_portability_subset"); deviceExtensions.push_back(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME); #endif + if (validation_layers_enabled) { + instanceExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } auto getInstanceProcAddr = dl.getProcAddress( "vkGetInstanceProcAddr"); VULKAN_HPP_DEFAULT_DISPATCHER.init(getInstanceProcAddr); From 8c43270b54427cd3ea97b42b8a085a047fef3303 Mon Sep 17 00:00:00 2001 From: shg8 Date: Thu, 15 Feb 2024 03:30:56 -0800 Subject: [PATCH 2/2] Support for MSVC & various fixes --- 3dgs/GSScene.cpp | 4 +++- 3dgs/Renderer.cpp | 2 +- shaders/preprocess_sort.comp | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/3dgs/GSScene.cpp b/3dgs/GSScene.cpp index adef72f..9a4caab 100644 --- a/3dgs/GSScene.cpp +++ b/3dgs/GSScene.cpp @@ -23,7 +23,7 @@ struct VertexStorage { void GSScene::load(const std::shared_ptr&context) { auto startTime = std::chrono::high_resolution_clock::now(); - std::ifstream plyFile(filename); + std::ifstream plyFile(filename, std::ios::binary); loadPlyHeader(plyFile); vertexBuffer = createBuffer(context, header.numVertices * sizeof(Vertex)); @@ -32,6 +32,8 @@ void GSScene::load(const std::shared_ptr&context) { for (auto i = 0; i < header.numVertices; i++) { static_assert(sizeof(VertexStorage) == 62 * sizeof(float)); + assert(plyFile.is_open()); + assert(!plyFile.eof()); VertexStorage vertexStorage; plyFile.read(reinterpret_cast(&vertexStorage), sizeof(VertexStorage)); verteces[i].position = glm::vec4(vertexStorage.position, 1.0f); diff --git a/3dgs/Renderer.cpp b/3dgs/Renderer.cpp index 1a4cb2a..5cad722 100644 --- a/3dgs/Renderer.cpp +++ b/3dgs/Renderer.cpp @@ -13,7 +13,7 @@ #include "../vulkan/Utils.h" -#define SORT_ALLOCATE_MULTIPLIER 1000 +#define SORT_ALLOCATE_MULTIPLIER 100 void Renderer::initialize() { initializeVulkan(); diff --git a/shaders/preprocess_sort.comp b/shaders/preprocess_sort.comp index 053da13..f793d3c 100644 --- a/shaders/preprocess_sort.comp +++ b/shaders/preprocess_sort.comp @@ -48,7 +48,7 @@ void main() { uint64_t tileIndex = i + j * tileX; // assert(tileIndex <= 1900, "key <= 1900 %d", tileIndex); - uint depthBits = floatBitsToUint(float16_t(attr[index].depth)); + uint depthBits = floatBitsToUint(attr[index].depth); uint64_t k = (tileIndex << 32) | uint64_t(depthBits); keys[ind] = k; payloads[ind] = index;